postgresql PL/pgSQL函数未按预期插入数据

dddzy1tm  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

下面的函数编译成功。当我执行select schema.funtion_name();时,函数被执行,但没有行插入到表schema.table_insert中:

CREATE OR REPLACE FUNCTION schema.function_name()
RETURNS void AS
$BODY$
DECLARE cur_1 CURSOR FOR
    Select col1 from schema.table1
    union
    select col1 from schema.table2
    union
    select col1 from schema.table3
    union
    select col1 from schema.table4; 

BEGIN
    FOR rec_i in cur_1 LOOP
        insert into schema.table_insert (col1,col2,col3) 
        select col1,col2,col3 
        from schema.view 
        where col1=rec_i.col1

        commit;
    END LOOP;     
END;
$BODY$
LANGUAGE plpgsql STABLE

游标cur_1中的选择返回超过900 000条记录。当我对单个记录单独使用insert语句时,记录被插入到表中。

pdtvr36n

pdtvr36n1#

下面的函数编译成功。
不你没有
PL/pgSQL函数不是“编译”的。在创建时,只进行表面的语法检查,函数体按原样存储。没有汇编。延迟绑定。嵌套的SQL语句被视为准备好的语句。
除此之外,您显示的函数根本无法创建。这是语法上的废话。在INSERT之后缺少子文件。COMMIT不允许在PL/pgSQL函数中使用。你不需要一个光标。也不是循环。使用简单的SQL语句:

INSERT INTO schema.table_insert (col1, col2, col3) 
SELECT v.col1, v.col2, v.col3 
FROM   schema.view v
JOIN  (
   SELECT col1 FROM schema.table1
   UNION
   SELECT col1 FROM schema.table2
   UNION
   SELECT col1 FROM schema.table3
   UNION
   SELECT col1 FROM schema.table4; 
   ) sub USING (col1);

等效,更快:

INSERT INTO schema.table_insert (col1, col2, col3) 
SELECT v.col1, v.col2, v.col3 
FROM   schema.view v
WHERE  EXISTS (SELECT FROM schema.table1 WHERE col1 = v.col1)
OR     EXISTS (SELECT FROM schema.table2 WHERE col1 = v.col1)
OR     EXISTS (SELECT FROM schema.table3 WHERE col1 = v.col1)
OR     EXISTS (SELECT FROM schema.table4 WHERE col1 = v.col1);
  • 可以 * Package 在一个函数中,但PL/pgSQL是矫枉过正。和STABLE,对于包含INSERT的函数来说是错误的。我建议使用一个简单的SQL函数。VOLATILE是默认的波动率设置,并对此进行了校正。
CREATE OR REPLACE FUNCTION schema.function_name()
  RETURNS void
  LANGUAGE sql AS
$func$
INSERT ...  -- statement from above
$func$;

相关问题