在plpgsql函数中不能使用带有EXECUTE命令的变量

时间:2018-02-27 05:57:51

标签: 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 format('INSERT INTO f_t(a, b) values (r.a, r.b)');
    END LOOP;
    RETURN;
end

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

1 个答案:

答案 0 :(得分:2)

how to prevent a touch event passed to a UIView's superview?中的函数变量和参数 不可见 。 (因此错误消息“列r.a不存在”。)您必须传递值,最好使用USING子句。这将工作

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;

但它没有多大意义,因为你可以简单地用EXECUTE替换它:

CREATE TABLE f_t AS TABLE t;

相关: