PostgreSQL中不带execute命令的表变量

PostgreSQL中不带execute命令的表变量,sql,postgresql,variables,plpgsql,dynamic-sql,Sql,Postgresql,Variables,Plpgsql,Dynamic Sql,我想在下面的sql脚本中使用变量作为表名。有没有可能以不同于我在下面向你们展示的方式做到这一点?我的意思是没有执行命令?我的脚本从一个表中选择数据并移动到另一个表。我希望避免在脚本中转义引号 DO $proc$ DECLARE v_table_name VARCHAR(100) := 'selected_customers'; BEGIN EXECUTE 'INSERT INTO ' || v_table_name || '(name, surname, address)

我想在下面的sql脚本中使用变量作为表名。有没有可能以不同于我在下面向你们展示的方式做到这一点?我的意思是没有
执行
命令?我的脚本从一个表中选择数据并移动到另一个表。我希望避免在脚本中转义引号

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

SQL严格隔离代码和数据。要将变量转换为代码,需要动态SQL。唯一的其他方法是使用至少两次到服务器的往返,并在客户机中连接代码,但这样做实际上毫无意义

无论何时将数据转换为代码,都要小心可能的错误

“为了避免转义引号”,有许多可能性。(Postgres 9.1+)可以为您处理标识符和文字

并用它来让你的生活更轻松——就像你在
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$;
还有更多选择:


否。SQL语句要求在
from
/
to
/
update
子句中明确定义表名。要使用变量名,需要动态SQL。