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" を識別できませんでした
私が使用した構文は有効に思えますが。列名を動的に参照したいので、静的選択 (例でコメント) を使用できません。
だから..誰かが上記のコードの何が問題なのか知っていますか?