ORA-24344:编译包时Oracle Apex中的编译错误成功

时间:2018-01-06 02:33:26

标签: oracle plsql

我正在使用Oracle Apex中的大学数据库项目,并且在尝试使用以下代码编译正文包时获得ORA-24344: success with compilation error

CREATE OR REPLACE PACKAGE BODY band_price_package AS 
-- Function that checks if a band has a manager 
FUNCTION agent_present(band_id BAND.Band_id%TYPE)
RETURN BOOLEAN
IS
BEGIN
 IF BAND.Agent_firstname IS NULL
    AND BAND.Agent_lastname IS NULL
    AND BAND.Agent_phone IS NULL
    AND BAND.Agent_email IS NULL
 THEN
  RETURN FALSE;
 ELSE
  RETURN TRUE;
 END IF;
END agent_present;
-- Procedure that gets the band hire price including agent fee 
PROCEDURE get_band_cost(band_id IN BAND.Band_id%TYPE, 
                        band_cost OUT BOOKING.Agreed_band_price%TYPE) 
IS 
BEGIN 
 IF agent_present(band_id) 
 THEN
  band_cost := BOOKING.Agreed_band_price * 1.25;
 ELSE
  band_cost := BOOKING.Agreed_band_price;
 END IF;
END get_band_cost;

END band_price_package; 
/

以下规范编译时没有任何错误:

CREATE OR REPLACE PACKAGE band_price_package AS 
-- Function that checks if a band has a manager 
FUNCTION agent_present(band_id   BAND.Band_id%TYPE)
RETURN BOOLEAN;
-- Procedure that gets the band hire price including agent fee 
PROCEDURE get_band_cost(band_id IN BAND.Band_id%TYPE, 
                        band_cost OUT BOOKING.Agreed_band_price%TYPE); 

END band_price_package; 
/

2 个答案:

答案 0 :(得分:0)

您无法直接在PL / SQL中访问表格;所以

git config --global diff.colorMoved default

语法无效。您需要在PL / SQL块中使用SQL语句,如下所示:

SQL Fiddle

Oracle 11g R2架构设置

 IF BAND.Agent_firstname IS NULL
    AND BAND.Agent_lastname IS NULL
    AND BAND.Agent_phone IS NULL
    AND BAND.Agent_email IS NULL

然后你可以这样做:

CREATE TABLE BAND(
  band_id INTEGER PRIMARY KEY,
  Agent_firstname VARCHAR2(200),
  Agent_lastname  VARCHAR2(200),
  Agent_phone     VARCHAR2(20),
  Agent_email     VARCHAR2(100)
)
/

CREATE TABLE BOOKING(
  Agreed_band_price NUMBER(10,2)
)
/

CREATE OR REPLACE PACKAGE band_price_package AS 
  -- Function that checks if a band has a manager 
  FUNCTION agent_present(
    i_band_id   BAND.Band_id%TYPE
  )
  RETURN BOOLEAN;

  -- Procedure that gets the band hire price including agent fee 
  PROCEDURE get_band_cost(
    i_band_id   IN  BAND.Band_id%TYPE, 
    o_band_cost OUT BOOKING.Agreed_band_price%TYPE
  );
END band_price_package; 
/

答案 1 :(得分:-1)

您使用哪种工具来访问数据库?在SQLPlus中,您应该运行SHOW ERR,它会告诉您代码有什么问题。例如:

SQL> create or replace function f_test return boolean is
  2  begin
  3    return 1 = 2   --> missing semi-colon
  4  end;
  5  /

Warning: Function created with compilation errors.

SQL> show err
Errors for FUNCTION F_TEST:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/1      PLS-00103: Encountered the symbol "END" when expecting one of the
         following:
         * & - + ; / at mod remainder rem <an exponent (**)> and or ||
         multiset
         The symbol ";" was substituted for "END" to continue.

SQL>

GUI工具通常有&#34;错误&#34; “对象导航器”中的选项卡显示相同的内容。

从您的代码开始,我会做一些盲目的猜测(因为我们没有您的桌子并且无法自己测试):

  • function AGENT_PRESENT接受BAND_ID作为参数,该参数被声明为BAND.BAND_ID列数据类型。您不能像以下那样引用其他BAND表列 - 您应该将这些列选择为变量(或者,如果需要,声明一个rowtype变量并使用它),然后检测它们是否存在。< / LI>
  • 过程GET_BAND_COST调用未知的BOOKING.AGREED_BAND_PRICE(至少,它未在该包中声明)。那么,它是什么?它是表格栏吗?如果是这样,您无法以这种方式修改它 - 请改用UPDATE。