【问题标题】:Package body created with compilation error due to Function body in Oracle由于 Oracle 中的函数体而创建的包体编译错误
【发布时间】:2017-07-25 02:59:05
【问题描述】:

我使用的是 Oracle 10g Express 版本。

这是我的包创建代码:-

CREATE OR REPLACE PACKAGE ticketBooking 
   AS 
      PROCEDURE bookOrder(id IN NUMBER, key IN VARCHAR2, fname IN VARCHAR2, lname IN VARCHAR2, age IN NUMBER, address IN VARCHAR2, adate IN VARCHAR2, status OUT NUMBER);
      PROCEDURE bookTicket(id IN NUMBER, orderID IN NUMBER, mID IN NUMBER, mRow IN NUMBER, mSeat IN NUMBER, mDate IN VARCHAR2, mTime IN NUMBER, status OUT NUMBER);
      FUNCTION maxOrderID RETURN NUMBER; 
      FUNCTION maxTransactionID RETURN NUMBER;
   END ticketBooking; 
/

现在,这里是包体的创建:-

    CREATE OR REPLACE PACKAGE BODY ticketBooking
    IS
        PROCEDURE 
        bookOrder (id IN NUMBER, key IN VARCHAR2, fname IN VARCHAR2, lname IN VARCHAR2, age IN NUMBER, address IN VARCHAR2, adate IN VARCHAR2, status OUT NUMBER) 
        IS
          BEGIN
            INSERT INTO tbl_order (order_id, order_key, order_fname, order_lname, order_age, order_address, order_add_date) 
            VALUES ( id, key, fname, lname, age, address, TO_DATE(adate, 'YYYY-MM-DD hh24:mi:ss'));
            status := 1;
          EXCEPTION
            WHEN OTHERS THEN
            status := 0;
          END bookOrder;

        PROCEDURE 
        bookTicket (id IN NUMBER, orderID IN NUMBER, mID IN NUMBER, mRow IN NUMBER, mSeat IN NUMBER, mDate IN VARCHAR2, mTime IN NUMBER, status OUT NUMBER)
        IS
          BEGIN
            INSERT INTO tbl_transaction (transaction_id, order_id, movie_id, movie_row, movie_seat, movie_date, movie_time) 
            VALUES ( id, orderID, mID, mRow, mSeat, mDate, mTime);
            status := 1;
          EXCEPTION
            WHEN OTHERS THEN
            status := 0;
          END bookTicket;

        FUNCTION 
        maxOrderID RETURN NUMBER
        IS
          mOID NUMBER:=0;
          BEGIN
            SELECT CASE WHEN MAX(order_id) > 0 THEN MAX(order_id) ELSE 0 END INTO mOID FROM tbl_order;
            return (mOID);
          END maxOrderID; 

        FUNCTION 
        maxTransactionID RETURN NUMBER 
        IS
          mTID NUMBER:=0;
          BEGIN
            SELECT CASE WHEN MAX(transaction_id) > 0 THEN MAX(transaction_id) ELSE 0 END INTO mTID FROM tbl_transaction;
            return (mTID);
          END maxTransactionID;

    END ticketBooking;
/

我收到包主体创建的错误,其中包含编译错误。 我究竟做错了什么? 当我删除函数时,不会显示任何警告或编译错误。

【问题讨论】:

  • 如果你做show errors或者查询user_errors视图,你可以看到实际的编译错误是什么。

标签: oracle oracle10g package


【解决方案1】:

你不见了:

  • 函数的返回子句。加return number
  • thenend ififs

试试这个:

create or replace PACKAGE BODY ticketBooking
    IS
        PROCEDURE 
        bookOrder (id IN NUMBER, key IN VARCHAR2, fname IN VARCHAR2, lname IN VARCHAR2, age IN NUMBER, address IN VARCHAR2, adate IN VARCHAR2, status OUT NUMBER) 
        IS
          BEGIN
            INSERT INTO tbl_order (order_id, order_key, order_fname, order_lname, order_age, order_address, order_add_date) 
            VALUES ( id, key, fname, lname, age, address, TO_DATE(adate, 'YYYY-MM-DD hh24:mi:ss'));
            status := 1;
          EXCEPTION
            WHEN OTHERS THEN
            status := 0;
          END bookOrder;

        PROCEDURE 
        bookTicket (id IN NUMBER, orderID IN NUMBER, mID IN NUMBER, mRow IN NUMBER, mSeat IN NUMBER, mDate IN VARCHAR2, mTime IN NUMBER, status OUT NUMBER)
        IS
          BEGIN
            INSERT INTO tbl_transaction (transaction_id, order_id, movie_id, movie_row, movie_seat, movie_date, movie_time) 
            VALUES ( id, orderID, mID, mRow, mSeat, mDate, mTime);
            status := 1;
          EXCEPTION
            WHEN OTHERS THEN
            status := 0;
          END bookTicket;

        FUNCTION 
        maxOrderID return number
        IS
          mOID NUMBER:=0;
          dReturn NUMBER:=0; 
          BEGIN
            SELECT MAX(order_id) INTO mOID FROM tbl_order;
            if(mOID > 0) then
               return (mOID);
            else
               return (dReturn);   
              end if;
          END maxOrderID; 

        FUNCTION 
        maxTransactionID return number
        IS
          mTID NUMBER:=0;
          dReturn NUMBER:=0; 
          BEGIN
            SELECT MAX(transaction_id) INTO mTID FROM tbl_transaction;
            if(mTID > 0) then
               return (mTID);
            else
               return (dReturn);   
              end if;
          END maxTransactionID;

    END ticketBooking;

【讨论】:

  • 我已经编辑了我的问题。请你帮帮我好吗?
  • @Saswat,你需要告诉我们编译错误是什么——我们看不到你的屏幕。
猜你喜欢
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多