2017-04-21 46 views
0

的Postgres數據庫Postgres的SQL狀態:P0001錯誤運行功能時

如果我使用查詢SELECT sms.somefunc()運行下面功能;,得到錯誤SQL狀態: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; 

回答

0

也許你會使用說法PERFORMEXECUTE

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樣式的典型例子。

+0

謝謝帕維爾。它現在工作很好。 – Parthiban