我正在尝试在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”列
虽然我使用的语法似乎对我有用。我不能使用静态选择(在示例中注释),因为我想以dinamically方式引用列名。
那么......有人知道上面代码有什么问题吗?
答案 0 :(得分:7)
这是真的。你不能在PL / pgSQL空间之外使用类型记录。
RECORD值仅在plpgsql中有效。
你可以做到
EXECUTE 'SELECT $1.descr' INTO d USING r::text::xx;
答案 1 :(得分:2)
$1
应该在||
内,与|| $1 ||
一样,并且正确地提供空格然后它就能正常工作。
BEGIN
EXECUTE ' delete from ' || quote_ident($1) || ' where condition ';
END;