【问题标题】:Insert into table using for loop使用for循环插入表格
【发布时间】:2015-02-13 17:49:36
【问题描述】:

我正在尝试编写一个循环来读取临时表,然后将该记录插入到另一个表中。我需要进行单条记录处理的原因是我需要在每次插入目标表后找到序列的值。我还没有将该功能添加到 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;

【问题讨论】:

  • 这似乎是与圆顶类型的数据库交互,但您忽略了识别。
  • 如果您需要有关如何修复它的帮助,您可能想确定语法错误是什么。
  • 不需要循环或函数:insert into target_tbl select * from tbl_stg01 returning id.
  • 我看到了END IF 声明,但没有看到IF;我看到了 FOR 声明,但没有看到 END FOR
  • @ScottHunter:没有END FOR。只有LOOP 需要END LOOP。不过,END IF 是对的。

标签: sql postgresql for-loop plpgsql


【解决方案1】:

您需要在插入中特别提及您的列名,并且您不需要“重新选择”您的数据。

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;

【讨论】:

    【解决方案2】:

    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 like 在单个语句中将更多命令链接起来

    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;
    

    更多示例说明:

    【讨论】:

      猜你喜欢
      • 2019-11-14
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2020-02-08
      • 2021-01-17
      • 1970-01-01
      相关资源
      最近更新 更多