我正在尝试在 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”
尽管我使用的语法对我来说似乎是有效的。我不能使用静态选择(在示例中注释),因为我想动态地引用列名。
所以..有人知道上面的代码有什么问题吗?