【问题标题】:postgres SQL state: P0001 error in when running functionpostgres SQL状态:运行函数时出现P0001错误
【发布时间】:2017-04-21 19:23:27
【问题描述】:

Postgres 数据库

如果我使用查询 SELECT sms.somefunc(); 运行以下函数,则会出现错误 SQL state: P0001

我在这个函数中调用了另一个函数。

有人可以帮我解决这个问题吗?不知道为什么会出现这个错误。

提前致谢。

--DROP FUNCTION SMS.somefunc();

CREATE FUNCTION SMS.somefunc() RETURNS void AS $BODY$

DECLARE

    wk_rows INT :=0;
    work_plan_id_val INT :=0;
    DECLARE wp_rows     INT DEFAULT 0;
BEGIN

    DECLARE wk_plan_id CURSOR FOR 

        SELECT COUNT(work_plan_id) FROM sms.work_plan 
            WHERE class_general_id = 8 AND
            subject_general_id = 18;

        BEGIN
            OPEN wk_plan_id;
                FETCH wk_plan_id INTO wk_rows;
            CLOSE wk_plan_id;
        END;

    DECLARE wp CURSOR FOR 

        SELECT work_plan_id FROM sms.work_plan 
            WHERE class_general_id = 8 AND
            subject_general_id = 18;  --442

        BEGIN
            OPEN wp;
            IF wk_rows > 0 THEN
                wp_rows = 0;
                WHILE wp_rows < wk_rows LOOP
                    FETCH wp INTO work_plan_id_val;

                    RAISE NOTICE 'work_plan_id_val %', work_plan_id_val;
                    EXECUTE SMS.P_DELETE_X (work_plan_id_val,'admin');
                    RAISE EXCEPTION 'Something happen %', work_plan_id_val;

                    wp_rows = wp_rows + 1;
                    --DBMS_OUTPUT.PUT_LINE('TEST');
                END LOOP;
            END IF;
            CLOSE wp;
        END;

END;

$BODY$ 
LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION SMS.somefunc()
  OWNER TO postgres;

【问题讨论】:

    标签: sql database postgresql function


    【解决方案1】:

    您可能会使用声明PERFORM 而不是EXECUTE

    EXECUTE SMS.P_DELETE_X (work_plan_id_val,'admin');
    

    应该是

    PERFORM SMS.P_DELETE_X (work_plan_id_val,'admin');
    

    EXECUTE 语句应该用于动态 SQL,而不是函数执行。

    还有另一个较小的问题 - 您应该使用 EXISTS 而不是 count(*) - 还有另一个问题 - 它是慢 ISAM 风格的经典示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      相关资源
      最近更新 更多