我正在尝试编写一个循环,它将读取一个临时表,然后将该记录插入另一个表中。我需要进行单个记录处理的原因是我需要在每次插入目标表后找到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;
答案 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)
有几个问题:
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_stg01
和target_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;
更多有解释的例子: