Postgresql 无法将变量与plpgsql函数中的EXECUTE命令一起使用

Postgresql 无法将变量与plpgsql函数中的EXECUTE命令一起使用,postgresql,sql-insert,plpgsql,dynamic-sql,Postgresql,Sql Insert,Plpgsql,Dynamic Sql,我有以下plpgsql代码。我试图使用r.a作为要插入到新表中的字段之一,但它返回的错误是r.a列不存在 create or replace function function1() returns void as $$ declare r t%rowtype; begin EXECUTE format('CREATE TABLE f_t(a INT, b INT)'); for r in select * from t LOOP EXECUTE for

我有以下plpgsql代码。我试图使用
r.a
作为要插入到新表中的字段之一,但它返回的错误是
r.a
列不存在

create or replace function function1() returns void as $$
declare r t%rowtype;
begin
    EXECUTE format('CREATE TABLE f_t(a INT, b INT)');
    for r in select * from t
    LOOP
         EXECUTE format('INSERT INTO f_t(a, b) values (r.a, r.b)');
    END LOOP;
    RETURN;
end

t
的结构也是
(a int,b int)

函数变量和参数在内部不可见。(因此错误消息“column r.a不存在”。)您必须传递值,最好使用
USING
子句。这将有助于:

但这没有多大意义,因为您可以简单地用以下内容替换它:

相关的:


能否共享表的结构
t
?不能在动态查询中使用plpgsql变量-它是在不同的上下文中执行的。使用
使用
子句
CREATE OR REPLACE FUNCTION function1()
  RETURNS void AS
$func$
DECLARE
   r t%rowtype;
BEGIN
   EXECUTE format('CREATE TABLE f_t(a INT, b INT)');
   FOR r IN
      SELECT * FROM t
   LOOP
      EXECUTE format('INSERT INTO f_t(a, b) SELECT $1.*') -- !!
      USING r;
   END LOOP;
   RETURN;
END
$func$  LANGUAGE plpgsql;
CREATE TABLE f_t AS TABLE t;