我对PL / SQL很陌生,我在显示我无法理解的异常时遇到问题。
我使用两个存储过程和一个匿名块来调用它们。我已经用这种方式做了一些其他的程序,它们都运行得很好。
这是更新我的表的第一个程序。
create or replace procedure UPD_CUST_SALESYTD_IN_DB (pcustid number, pamt number) AS
err_pamt exception;
err_pcustid exception;
vcount number;
begin
select count(*) into vcount from customer where
custid = pcustid;
if vcount = 0 then raise err_pcustid;
end if;
if pamt <-999.99 or pamt >999.99 then raise err_pamt;
end if;
update customer set sales_ytd = sales_ytd + pamt
where custid = pcustid;
exception
when err_pcustid then
RAISE_APPLICATION_ERROR(-20031, 'Customer ID not found');
when err_pamt then
RAISE_APPLICATION_ERROR(-20032, 'Amount out of range');
when others then
RAISE_APPLICATION_ERROR(-20000, SQLERRM);
end;
这是调用上述过程的过程。这只是显示我要做的事情,并确认它有效。
create or replace procedure UPD_CUST_SALESYTD_VIASQLDEV (pcustid number, pamt number) AS
begin
dbms_output.put_line('--------------------------------------------');
dbms_output.put_line('Updating SalesYTD. Customer Id: ' || pcustid || ' Amount: ' || pamt);
UPD_CUST_SALESYTD_IN_DB(pcustid, pamt);
commit;
dbms_output.put_line('Udpate OK');
exception
when others then
RAISE_APPLICATION_ERROR(-20000, SQLERRM);
end;
这是我用来调用上述程序的匿名程序段,然后调用上面的程序。
set serveroutput on;
begin
UPD_CUST_SALESYTD_VIASQLDEV(3,999.9);
end;
如果我传递的参数不会给我一个错误,那么所有代码都可以正常工作。
例如,如果我输入;
set serveroutput on;
begin
upd_cust_salesytd_viasqldev(3,400);
end;
我得到了正确的输出,并且已在表格中进行了更改。
--------------------------------------------
Updating SalesYTD. Customer Id: 3 Amount: 400
Udpate OK
但是,如果我传递的参数会导致错误,或者客户ID不存在或者数量超出范围,则不会发生任何事情。 我明白了:
--------------------------------------------
Updating SalesYTD. Customer Id: 3 Amount: 1000
别无其他。
在类似的程序中,我的例外情况正常。此示例使用插入表中的过程。
--------------------------------------------
Adding Customer. ID: 500 Name: Helen Nolan
ORA-20002: Customer ID out of range
我不确定为什么这个程序根本没有返回我的例外情况。在我的其他程序中,如果引发异常,Oracle SQL Developer中的脚本输出只显示我的异常。
但是,在我的更新过程中,如果某些内容应引发异常,则在dbms输出行上方,脚本输出将打印此错误报告
Error report -
ORA-20000: ORA-20032: Amount out of range
ORA-06512: at "S4931645.UPD_CUST_SALESYTD_VIASQLDEV", line 10
ORA-06512: at line 2
20000. 00000 - "%s"
*Cause: The stored procedure 'raise_application_error'
was called which causes this error to be generated.
*Action: Correct the problem as described in the error message or contact
the application administrator or DBA for more information.
所以它承认我的异常已被提出,但没有显示。
非常感谢任何帮助,我对此深感困惑。我是否犯了一些真正明显的错误?
答案 0 :(得分:0)
这里不是专家 - 只是帮助头脑风暴。听起来你得到了一个响应,但你只需要编写一个自定义错误语句。超出范围意味着在使用参数设置选择的列表中,它不存在于该查询的范围内。例如,如果list为0-100,那么响应来自0-10,并且在该范围内找不到0。