使用for循环插入表中

时间:2014-12-15 15:22:44

标签: sql postgresql for-loop plpgsql

我正在尝试编写一个循环,它将读取一个临时表,然后将该记录插入另一个表中。我需要进行单个记录处理的原因是我需要在每次插入目标表后找到Sequence的值。我没有将该功能添加到SQL(稍后会出现)。我将记录插入目标表时遇到困难。

我收到语法错误,但我认为还有更多问题需要解决。

CREATE OR REPLACE FUNCTION test_insert()
  RETURNS SETOF varchar AS
$func$
DECLARE
    rec record;
BEGIN   
   FOR rec IN
        SELECT * FROM   TBL_stg01
   LOOP INSERT  INTO target_tbl
        SELECT * FROM TBL_stg01
;
      END IF;
   END LOOP;
END
$func$  LANGUAGE plpgsql STABLE;

2 个答案:

答案 0 :(得分:0)

您需要在插页中专门提及您的专栏名称,而且您不需要重新选择"重新选择"你的数据。

CREATE OR REPLACE FUNCTION test_insert()
  RETURNS SETOF varchar AS
$func$
DECLARE
    rec record;
BEGIN   
   FOR rec IN
        SELECT * FROM   TBL_stg01
   LOOP INSERT  INTO target_tbl (colaname1, colname2, colname3...)
        values (rec.col1, rec.col2, rec.col3...);
      END IF;
   END LOOP;
END
$func$  LANGUAGE plpgsql STABLE;

答案 1 :(得分:0)

审核了PL / pgSQL函数

有几个问题:

CREATE OR REPLACE FUNCTION test_insert()
   RETURNS SETOF varchar AS   -- what do you want to return?
$func$
DECLARE
    rec record;
BEGIN   
   FOR rec IN
      SELECT col1, col2, col3 FROM tbl_stg01  -- only needed columns
   LOOP
      INSERT INTO target_tbl (col1, col2, col3)
      VALUES (rec.col1, rec.col2, rec.col3)
      -- SELECT (rec).*  -- possible shorthand
   END LOOP;
END
$func$  LANGUAGE plpgsql;
  • 如果tbl_stg01target_tbl共享相同的行类型,并且您想要从源表中INSERT 所有可以在没有明确目标列表的情况下工作。但是,由于你显然有一个自动增加的id,你很可能不会。你不应该在任何情况下。像Joe already provided一样 请注意我首先只选择所需的列。

  • 您有END IF没有开始IF阻止。

  • 无法声明写入表的函数STABLE。我删除了关键字,因此默认function volatility VOLATILE开始了。

  • 您的函数被声明为RETURNS SETOF varchar,但您没有返回任何内容......

正确的解决方案

你提到你need to find the value of the Sequence after every insert,但是你没有提供你的表定义,澄清你需要它的顺序或者你需要它。

无论哪种方式,这都是在INSERT

之后返回自动生成的默认值的方式
INSERT INTO target_tbl (col1, col2, col3)
SELECT col1, col2, col3
FROM   tbl_stg01
RETURNING *

相关答案:

您可以使用data-modifying CTEs之类的

在单个语句中使用更多命令进行链接
WITH ins AS (
   INSERT INTO target_tbl (col1, col2, col3)
   SELECT col1, col2, col3
   FROM   tbl_stg01
   RETURNING target_tbl_id
   )
INSERT INTO tbl3 (some_id)
SELECT target_tbl_id
FROM   ins;

更多有解释的例子: