我想在下面的sql脚本中使用变量作为表名。有可能以不同于我在下面显示的方式做到这一点吗?我的意思是没有 EXECUTE
命令?我的脚本从一个表中选择数据并移动到另一个表。我想避免在我的脚本中转义引号。
DO $proc$
DECLARE
v_table_name VARCHAR(100) := 'selected_customers';
BEGIN
EXECUTE 'INSERT INTO ' || v_table_name || '(name, surname, address)
SELECT name, surname, address FROM customers
WHERE name ILIKE ''mon%''';
END;
$proc$;
答案 0 :(得分:1)
SQL严格隔离代码和数据。要将变量转换为代码,您需要动态SQL。唯一的另一种方法是使用至少两次往返服务器并在客户端连接代码,但这样做真的没有意义。
每当您将数据转换为代码时,请注意可能的SQL injection。
“为避免逃避报价”,有很多可能性。 format()
(Postgres 9.1+)可以为您处理标识符和文字。
并使用dollar-quoting让您的生活更轻松 - 就像您已经为DO
声明的主体所做的那样。
你的例子:
DO
$proc$
DECLARE
v_table_name text := 'selected_customers';
BEGIN
EXECUTE format($$
INSERT INTO %I
(name, surname, address)
SELECT name, surname, address
FROM customers
WHERE name ILIKE 'mon%'$$
,v_table_name text);
END
$proc$;
还有更多选择: