下面的函数编译成功。当我执行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语句时,记录被插入到表中。
1条答案
按热度按时间pdtvr36n1#
下面的函数编译成功。
不你没有
PL/pgSQL函数不是“编译”的。在创建时,只进行表面的语法检查,函数体按原样存储。没有汇编。延迟绑定。嵌套的SQL语句被视为准备好的语句。
除此之外,您显示的函数根本无法创建。这是语法上的废话。在
INSERT
之后缺少子文件。COMMIT
不允许在PL/pgSQL函数中使用。你不需要一个光标。也不是循环。使用简单的SQL语句:等效,更快:
STABLE
,对于包含INSERT
的函数来说是错误的。我建议使用一个简单的SQL函数。VOLATILE
是默认的波动率设置,并对此进行了校正。