BEGIN
_table_name := 'mytable';
CREATE TEMPORARY TABLE _table_name (
id integer NOT NULL,
name character varying,
active boolean
) ON COMMIT DROP';
-- logic here
RETURN QUERY SELECT table1.id, table1.name FROM _table_name AS table1;
END;
我简化了我的问题。我正在尝试使用变量作为表名。
我知道您可以执行SELECT * FROM table1 WHERE id = _id
之类的事情,其中_id
已声明为可变。
我知道我可以这样做EXECUTE
,但后来我有一个查询:
INSERT INTO table2 (id) SELECT id FROM unnest(_ids) as id
其中_ids是一个数组。
无论如何使用变量作为表名来解决问题1?问题2,在unnest
内使用EXECUTE
?
所以问题是查询将_table_name
作为文字表名,而不是使用'mytable'作为表名。
答案 0 :(得分:2)
如果您动态更改表名(即通过变量),则需要使用EXECUTE
。只要将数组转换为TEXT
表示形式,就可以将它用于数组和不必要的数据。
DECLARE
_ids INT[] = ARRAY[ 1, 2, 3, 4, 5 ];
_table_name TEXT = 'mytable';
BEGIN
EXECUTE
'INSERT INTO ' || QUOTE_IDENT( _table_name ) || ' (id)
SELECT id
FROM unnest( ' || QUOTE_LITERAL( _ids::TEXT ) || '::INT[] ) AS id';
END;
答案 1 :(得分:1)
你被告知dynamic SQL with EXECUTE
in plpgsql。您可以动态构建查询字符串,包括不变的代码和标识符。
但 不 连接值。请改用 USING
子句:
DECLARE
_ids INT[] = ARRAY[ 1, 2, 3, 4, 5 ];
_table_name TEXT = 'mytable';
BEGIN
EXECUTE
'INSERT INTO ' || quote_ident(_table_name) || ' (id)
SELECT * FROM unnest($1)'
USING ids;
END;
来回避免容易出错的演员。