【问题标题】:Create package with procedure Oracle使用过程 Oracle 创建包
【发布时间】:2016-03-03 14:24:20
【问题描述】:

我创建了一个包,其中包含一个程序,可以从表中删除不存在country_ID 的任何国家/地区。我写了这段代码:

CREATE PACKAGE cust_sa AS
  PROCEDURE del_cn3(c_cntry_id COUNTRIES.COUNTRY_ID%TYPE)
  IS
      v_error_code NUMBER;
  BEGIN
     DELETE from countries WHERE country_id =c_cntry_id;
        
    IF SQL%NOTFOUND THEN
      DBMS_OUTPUT.PUT_LINE('No such record');
    END IF;
  EXCEPTION WHEN OTHERS THEN
    v_error_code :=SQLCODE;
    IF v_error_code =-2292 THEN
      RAISE_APPLICATION_ERROR(-20004,'Organization ' ||
                                     TO_CHAR(c_cntry_id) ||
                                     ' site details defined for it.');
    END IF;
  END del_cn3;
END cust_sa;
/

但是,我在创建此包时收到以下两个错误:

(第 4 行)在期望其中之一时遇到符号 V_ERROR_CODE 以下:语言

(最后一行)遇到符号 CUST_SA 预期以下情况之一时:;

为什么会出现错误以及如何解决?

【问题讨论】:

  • 你的包(规范)应该只有过程头 - 你也有过程的实现 - 放在包体中。
  • 我希望你能添加一个“ELSE RAISE;”到您的 WHEN OTHERS 异常处理程序。

标签: oracle syntax plsql package


【解决方案1】:

您应该像这样在规范和正文上拆分代码:

CREATE OR REPLACE PACKAGE cust_sa AS
  PROCEDURE del_cn3(c_cntry_id COUNTRIES.COUNTRY_ID%TYPE);
END cust_sa;
/

CREATE OR REPLACE PACKAGE BODY cust_sa AS

  PROCEDURE del_cn3(c_cntry_id COUNTRIES.COUNTRY_ID%TYPE) IS
    v_error_code NUMBER;
  BEGIN
    DELETE FROM clients WHERE country_id = c_cntry_id;

    IF SQL%NOTFOUND THEN
      dbms_output.put_line('No such record');
    END IF;
  EXCEPTION WHEN OTHERS THEN
      v_error_code := SQLCODE;
      IF v_error_code = -2292 THEN
        raise_application_error(-20004, 'Organization ' || to_char(c_cntry_id) || ' ...');
      END IF;
  END del_cn3;

END cust_sa;
/

【讨论】:

    【解决方案2】:
    We should always foolow some old school defined steps before creating Packages 
    
    1) Create Package Specs
    2) Create Package Body.
    
    CREATE OR REPLACE PACKAGE cust_sa
    AS
      PROCEDURE del_cn3(
          c_cntry_id IN EMP.EMPNO%TYPE);
    END cust_sa;
    
    
    CREATE OR REPLACE PACKAGE BODY cust_sa
    AS
    PROCEDURE del_cn3(
        c_cntry_id IN EMP.EMPNO%TYPE)
    IS
      v_error_code NUMBER;
    BEGIN
      DELETE FROM EMP WHERE EMPNO =c_cntry_id;
      IF SQL%NOTFOUND THEN
        DBMS_OUTPUT.PUT_LINE('No such record');
      END IF;
    EXCEPTION
    WHEN OTHERS THEN
      v_error_code   :=SQLCODE;
      IF v_error_code =         -2292 THEN
        RAISE_APPLICATION_ERROR(-20004,'Organization ' || TO_CHAR(c_cntry_id) || ' site details defined for it.');
      END IF;
    END del_cn3;
    END cust_sa;
    

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 2020-05-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      相关资源
      最近更新 更多