Oracle Procedure使用声明的游标编译错误

时间:2013-12-26 18:53:37

标签: sql oracle procedure

我正在尝试创建一个程序,它给了我“没有错误”然后“ORA-24344成功编译错误” 如果我在程序中运行所有内容它正确执行但是当我尝试创建包体时它不起作用。我把它缩小到这个程序:

CREATE OR REPLACE PACKAGE TEG.SPCKG_AEC_CIS_SVC_PIPE_COMP IS

    TYPE OUT_CURSOR IS REF CURSOR;    
    PROCEDURE CreateRptTables;

END;

GRANT EXECUTE ON TEG.SPCKG_AEC_CIS_SVC_PIPE_COMP TO TEG_USER;

CREATE OR REPLACE PACKAGE BODY TEG.SPCKG_AEC_CIS_SVC_PIPE_COMP IS
--------------------------------------------------------------------------------
    PROCEDURE CreateRptTables IS
    /*==========================================================================
    12/20/2013 TFS 24446 - Created function
    ==========================================================================*/
    DECLARE 
        CURSOR Cur_Comp IS 
            SELECT * FROM TEG.AEC_CIS_SVC_PIPE_COMP;  
    BEGIN 
        FOR compRow in Cur_Comp LOOP
            If (compRow.cis_bus_res_loop <> compRow.cis_bus_res_loop_c) Then
                --Insert information into the details table
                INSERT INTO TEG.AEC_CIS_SVC_PIPE_DET( Facility_id, Serv_Pipe_Num)
                VALUES(compRow.Facility_ID, compRow.Serv_Pipe_Num); 
            End If;
        END LOOP;
    END; 
END;

SHOW ERRORS 

3 个答案:

答案 0 :(得分:4)

您需要删除“DECLARE”关键字。这只在匿名PL / SQL块中需要。

答案 1 :(得分:2)

如果user_errors由于某种原因没有显示任何内容,您可以查询all_errorsshow errors以查看问题。

您的程序中的一个明显问题是您拥有DECLARE关键字。您只能将其用于匿名块。 PROCEDURE ... ISBEGIN之间的所有内容都是在命名块中声明。

答案 2 :(得分:0)

为什么使用显式游标?只需做

INSERT INTO TEG.AEC_CIS_SVC_PIPE_DET( Facility_id, Serv_Pipe_Num)
SELECT Facility_ID, Serv_Pipe_Num
FROM TEG.AEC_CIS_SVC_PIPE_COMP
WHERE cis_bus_res_loop <> cis_bus_res_loop_c;