我没有在下面给出的Oracle的包代码中得到错误:

时间:2013-12-09 16:03:48

标签: oracle plsql syntax-error packages

当我尝试执行此代码时,我收到以下错误。我无法解决这个问题 - 我错过了什么?

SHOW ERRORS;
Errors for PACKAGE BODY PKG_VIEW_LEDGER:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
1/14     PLS-00304: cannot compile body of 'PKG_VIEW_LEDGER' without its
         specification

1/14     PLS-00905: object SYSTEM.PKG_VIEW_LEDGER is invalid

---下面的代码---

CREATE OR REPLACE  PACKAGE PKG_VIEW_LEDGER AS
        TYPE cur_view_data is REF CURSOR;

        PROCEDURE sp_view_ledger(person IN VARCHAR2, cur_inout IN OUT cur_view_data);
END PRG_VIEW_LEDGER;
/

CREATE OR REPLACE PACKAGE BODY PKG_VIEW_LEDGER AS
PROCEDURE sp_view_ledger( person IN VARCHAR2, cur_inout IN OUT cur_view_data)
IS
    tmp_cursor cur_view_data;
BEGIN
    OPEN tmp_cursor FOR
        select * from ledger where person like '%" + myArg.ToUpper + "%';

    cur_inout := tmp_cursor;
END sp_view_ledger;
END PKG_VIEW_LEDGER;
/

2 个答案:

答案 0 :(得分:1)

首先,根据错误,您将在SYSTEM架构中创建包。不要那样做。 SYSSYSTEM是特殊的,只有Oracle才能用于Oracle提供的对象。您需要一个新架构,您可以在其中创建自己的对象。 SYSSYSTEM是特殊的,并且总是与普通模式的行为方式相同,因此如果使用这些模式,各种功能将无法正常工作。

其次,当您定义包规范时,END与您的CREATE不符。在结束PKG_VIEW_LEDGER时,您正在创建PRG_VIEW_LEDGERPKG!= PRG。如果在创建包规范后有show errors,则错误会告诉您。

答案 1 :(得分:0)

我修改了代码并且工作正常。请在您身边尝试并告诉我。谢谢。

CREATE OR REPLACE  PACKAGE PKG_VIEW_LEDGER AS
        TYPE cur_view_data is REF CURSOR;

        PROCEDURE sp_view_ledger(person IN VARCHAR2, cur_inout IN OUT cur_view_data);
        END PkG_VIEW_LEDGER;
--------------------------------------------------------------
Package  created.
--------------------------------------------------------------
        CREATE OR REPLACE  PACKAGE PKG_VIEW_LEDGER AS
                TYPE cur_view_data is REF CURSOR;

                PROCEDURE sp_view_ledger(person IN VARCHAR2, cur_inout IN OUT cur_view_data);
        END PRG_VIEW_LEDGER;
        /

        CREATE OR REPLACE PACKAGE BODY PKG_VIEW_LEDGER AS
        PROCEDURE sp_view_ledger( person IN VARCHAR2, cur_inout IN OUT cur_view_data)
        IS
            tmp_cursor cur_view_data;
        BEGIN
            OPEN tmp_cursor FOR
                select * from avrajit;

            cur_inout := tmp_cursor;
        END sp_view_ledger;
        END PKG_VIEW_LEDGER;
    /
    -----------------------------------------------------

    Package Body created.

    0.04 seconds