我在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');
有人可以建议吗?
答案 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