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 では使用できません。もちろん、このステートメントを実行して SQL から呼び出す単純な PL/PgSQL プロシージャを作成することもできます。

于 2013-04-12T01:40:42.357 に答える