根据字段值确定要调用的过程

时间:2013-04-11 15:03:34

标签: postgresql stored-procedures postgresql-9.2

我的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 :-))计算一个列来创建一个视图,并根据存储在我算法表中的名称决定调用哪个程序,但这对我来说太糟糕了。 :(

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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