0

我的 PostgreSQL 9.2 DB 中有大约 20 个(并且还会有更多)特定存储过程。它们用于进行一些计算,一些财务“报告”(不幸的是,我不能只将数据存储在表格中并在程序代码中实现算法)。

过程彼此非常不同,它们在不同的表、列上运行,实现不同的算法等。

每个过程都返回相同的数据类型(数值)。

现在,我的客户想要创建功能,用户可以在其中选择特定的过程(或它们的组合,例如过程 1 返回值的 10% + 过程 2 返回值的 90%),并将其用作“基础”后期建模。他还希望我的用户以后能够更改他的选择,而无需每次都调用程序员。;-)

我想过制作一些表格:

Table: base_models
id <PK>,
user_id, <FK from users table>
model_name (varchar, or sth.)


Table: base_models_algorithms
base_model_id <FK from base_models>
algorithm_id <FK from algorithms>
percent_value (percent value of specific algorithm in model, eg. 10)

...然后,我还需要将我的算法名称(= 存储过程)存储在某个表中:

Table: algorithms
name: (stored procedure name, varchar?)

...这就是问题所在。

当然,我稍后可以创建一些视图,其中包含由另一个过程计算的列(model_current_value :-)),并根据存储在我的算法表中的名称决定调用哪个过程,但这对我来说看起来很糟糕。:(

将没有数据控制(您可以向算法表中写入任何内容,并且无法确保该字符串是过程名称,返回正确的数据类型等)。

当然我可以自己填表,不会让任何人改变它的数据:-)

但也许有更优雅的方式来完成整个事情?

4

1 回答 1

2

听起来您想要 PL/PgSQLEXECUTE语句。您可以使用它来调用动态 SQL,例如对于具有动态名称的 2 参数过程:

EXECUTE format('SELECT %I($1,$2)', func_name) USING arg1, arg2;

这是一个 PL/PgSQL 语句。它在常规 SQL 中不可用。您当然可以创建一个简单的 PL/PgSQL 过程来执行此语句并从 SQL 中调用它。

于 2013-04-12T01:40:42.357 回答