【问题标题】:Decide which procedure to call, depending on field value根据字段值决定调用哪个过程
【发布时间】:2013-04-03 20:28:59
【问题描述】:

我的 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 :-)),并根据存储在我的算法表中的名称来决定调用哪个过程,但这对我来说看起来很糟糕。 :(

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

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

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

【问题讨论】:

    标签: postgresql stored-procedures postgresql-9.2


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2018-01-28
      相关资源
      最近更新 更多