我的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 :-))计算一个列来创建一个视图,并根据存储在我算法表中的名称决定调用哪个程序,但这对我来说太糟糕了。 :(
没有数据控制(您可以向算法表写入任何内容,并且无法确保此字符串是过程的名称,返回正确的数据类型等。)
当然我可以自己填写表格,也不会让任何人改变它的数据: - )
但也许有更优雅的方式来完成整个事情?
答案 0 :(得分:2)
听起来你想要PL / PgSQL EXECUTE
语句。您可以使用它来调用动态SQL,例如,对于具有动态名称的2参数过程:
EXECUTE format('SELECT %I($1,$2)', func_name) USING arg1, arg2;
这是一个PL / PgSQL语句。它在常规SQL中不可用。您当然可以创建一个简单的PL / PgSQL过程来执行此语句并从SQL中调用它。