7

PL/PgSQL で、パラメーターとして受け取るテーブルを操作する必要がある関数を作成しようとしています。

関数定義内で EXECUTE..INTO..USING ステートメントを使用して動的クエリを作成します (これが唯一の方法です) が、RECORD データ型で問題が発生しました。

次の(非常に単純化された)例を考えてみましょう。

 -- A table with some values.
 DROP TABLE IF EXISTS table1;
 CREATE TABLE table1 (
     code INT,
     descr TEXT
 );

INSERT INTO table1 VALUES ('1','a');
INSERT INTO table1 VALUES ('2','b');


-- The function code. 
DROP FUNCTION IF EXISTS foo (TEXT);
CREATE FUNCTION foo (tbl_name TEXT) RETURNS VOID AS $$
DECLARE 
    r RECORD;
    d TEXT;
BEGIN
    FOR r IN
    EXECUTE 'SELECT * FROM ' || tbl_name
    LOOP
    --SELECT r.descr INTO d; --IT WORK
    EXECUTE 'SELECT ($1)' || '.descr' INTO d USING r; --IT DOES NOT WORK
    RAISE NOTICE '%', d;
END LOOP;

END;
$$ LANGUAGE plpgsql STRICT;

-- Call foo function on table1
SELECT foo('table1');

次のエラーが出力されました。

エラー: レコード データ型の列 "descr" を識別できませんでした

私が使用した構文は有効に思えますが。列名を動的に参照したいので、静的選択 (例でコメント) を使用できません。

だから..誰かが上記のコードの何が問題なのか知っていますか?

4

2 に答える 2

8

それは本当です。PL/pgSQL 空間の外では type record を使用できません。

RECORD 値は plpgsql でのみ有効です。

できるよ

EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;
于 2010-01-21T07:21:09.730 に答える
2

$1||,likeの中に|| $1 ||あり、スペースを適切に指定すると機能します。

BEGIN

EXECUTE ' delete from  ' ||  quote_ident($1)  || ' where condition ';

END;
于 2013-04-25T12:14:26.817 に答える