删除非现有行oracle的过程

时间:2015-11-29 22:31:09

标签: oracle

我在PL / SQL中编写了一个删除表中行的过程,但是,如果该记录不存在,则抛出一些错误:DBMS_OUTPUT.PUT_LINE('没有这样的记录');我的程序是:

CREATE OR REPLACE PROCEDURE del_cn2
                   (c_cntry_id IN 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;

  /

但是,当我执行此过程并提供我的表中不存在的记录时,它会给出消息"过程成功完成"我用这个来执行:

Execute procedure del_cn2('JJ');

有人可以建议吗?

2 个答案:

答案 0 :(得分:2)

如果希望在传入表中不存在的值时抛出异常,则需要实际抛出异常。您不应该使用dbms_output进行任何类型的错误输出。这是一个非常简单的调试工具 - 您不应该假设调用者将能够看到该输出。

我的猜测是你需要像

这样的东西
CREATE OR REPLACE PROCEDURE del_cn2
               (c_cntry_id IN COUNTRIES.COUNTRY_ID%TYPE
               )
IS
BEGIN
    DELETE from countries
    WHERE country_id =c_cntry_id;

    IF SQL%ROWCOUNT = 0 
    THEN
      raise_application_error( -20001, c_cntry_id || ' no such value.' );
    END IF;
END;

答案 1 :(得分:0)

尝试将x设置为serverout

示例:

ON

然后在SqlPlus中调用该过程

create table tst_delete (col1 int); 

create procedure p_test_delete  as
BEGIN
    DELETE FROM tst_delete
    WHERE       col1 = 1;
    IF (SQL%NOTFOUND)
    THEN
        dbms_output.put_line('No records found');
    END IF;
  END;

你描述的同一个问题 - 没有信息...... 接下来尝试激活输出

SQL> exec p_test_delete;

PL/SQL procedure successfully completed