没有执行命令的PostgreSQL中的表变量

时间:2014-08-03 12:53:39

标签: sql postgresql variables plpgsql dynamic-sql

我想在下面的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$;

1 个答案:

答案 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$;

还有更多选择: