【问题标题】:plpgsql function not inserting data as intendedplpgsql 函数未按预期插入数据
【发布时间】:2018-06-04 06:32:19
【问题描述】:

我已成功编译以下函数。当我执行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 条记录。当我对单个记录单独使用插入语句时,记录会插入到表中。

【问题讨论】:

标签: postgresql sql-insert plpgsql


【解决方案1】:

我已经成功编译了下面的函数。

不,你没有。

对于初学者来说,plpgsql 函数不是“编译”的。创建时,只进行表面语法检查,然后按原样存储函数体。没有编译。后期装订。嵌套的 SQL 语句被视为准备好的语句。

除此之外,您显示的功能根本无法创建。这是句法上的废话。 INSERT 后缺少分号。 COMMIT 没有意义,并且不允许在 plpgsql 中使用。为此,您不需要光标。也不循环。使用简单的 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 1 schema.table1 WHERE col1 = v.col1)
OR     EXISTS (SELECT 1 schema.table2 WHERE col1 = v.col1)
OR     EXISTS (SELECT 1 schema.table3 WHERE col1 = v.col1)
OR     EXISTS (SELECT 1 schema.table4 WHERE col1 = v.col1);

可以包裹在一个函数中,但是 plpgsql 是矫枉过正。而STABLE,对于包含INSERT 的函数来说是错误的。我建议使用普通的 SQL 函数,VOLATILE 是默认值,并且对此是正确的。

CREATE OR REPLACE FUNCTION schema.function_name()
  RETURNS void AS
$func$
INSERT ...
$func$  LANGUAGE sql;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多