【问题标题】:Oracle Procedure compile error with declared cursor声明游标的 Oracle 过程编译错误
【发布时间】:2013-12-27 03:12:57
【问题描述】:

我正在尝试创建一个程序,它给了我“无错误”,然后是“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 

【问题讨论】:

  • 你是说“显示错误”什么也没显示,但你得到编译错误?没有意义。您为什么不使用现代 IDE(而不是 SQLPLUS)进行开发?获取oracle的sql developer。它是免费的,而且在查找和编辑错误方面效率更高。
  • 我认为如果你在另一个模式中创建对象是有意义的;即,如果您没有以 TEG 身份登录。您可以查询user_errors,或者在这种情况下更像all_errors,以获取详细信息。
  • 相信我,我希望我可以使用更现代的 IDE,但在公司业务中,作为一个对甲骨文一无所知的新人,我对软件方面没有太多发言权。我尝试搜索 user_errors 并没有带回任何东西。 All_errors 成功了(这是 DECLARE 关键字)

标签: sql oracle procedure


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果show errors 出于某种原因没有显示任何内容,您可以查询user_errorsall_errors 来查看问题。

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

    【讨论】:

    • 小修正。不仅在匿名块声明部分由 declare 关键字分隔,在触发器(命名 PL/SQL 块)中也是如此。
    • @NicholasKrasnov - 是的,完全正确。那么触发器是命名块吗? *8-)
    • So is a trigger a named block? 是的,是:)
    【解决方案3】:

    为什么要使用显式游标?简单的做

    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;
    

    【讨论】:

    • 这段代码不完整,连同 bus_res_loop 我还有 43 个其他字段要比较。我只是在删减代码以缩小问题的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多