4

更新ルールから呼び出している関数のレコード変数から列を選択しようとすると、次のエラーが発生します。

'レコードデータ型の列"name"を識別できませんでした'

エラーを生成するために私が行っていることは次のとおりです。

更新ルール内から:

SELECT * INTO TEMPORARY TABLE TempTable FROM NEW;
SELECT MyFunction();

MyFunction()内から

DECLARE RecordVar Record;
SELECT * INTO STRICT RecordVar FROM TempTable;
EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar;

注:上記のコードが達成していることを達成するためのより簡単な方法があることを認識していますが、実際の実装を単純化して、私が抱えている問題に焦点を当てています。上記のコードは、可能であれば機能します。

4

2 に答える 2

4

私はそれを理解しました。NEWの列を一時テーブルに挿入するのではなく、NEWレコードを単一の列として一時テーブルに挿入し、関数内でRecordVar。"NEW"と呼びます。私のルールと関数は次のようになります。

更新ルール内から:

SELECT NEW AS "NEW" INTO TEMPORARY TABLE TempTable;
SELECT MyFuction();

MyFunction()内から

DECLARE RecordVar Record;
SELECT * INTO STRICT RecordVar FROM TempTable;
EXECUTE 'UPDATE AnotherTable SET column = $1.name' USING RecordVar."NEW";
于 2012-07-25T00:16:49.383 に答える
2

2番目の部分は次のように機能します。

DO
$BODY$
DECLARE
   RecordVar TempTable;
BEGIN
   SELECT * INTO STRICT RecordVar FROM TempTable LIMIT 1;
   EXECUTE 'UPDATE AnotherTable  SET column = $1.name'
   USING RecordVar;
END;
$BODY$

テーブル名をタイプとして使用する方法に注意してください。PostgreSQLは、システム内のすべてのテーブルに対して複合型を自動的に作成します。

変数は1つの行を保持し、はSELECT多くの行を返すことができます。最初のものを除くすべてが破棄されます。LIMIT 1効果を明確にするために追加しました。私はそれがあなたが望むものではないかと思います。

そもそも、ルールで一時テーブルを使用する必要はないでしょう。あなたはあなたの完全なセットアップを投稿したいかもしれません...

于 2012-07-23T13:06:50.543 に答える