PL / SQL异常处理和更新语句

时间:2014-09-08 13:40:03

标签: sql oracle stored-procedures plsql

我对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.

所以它承认我的异常已被提出,但没有显示。

非常感谢任何帮助,我对此深感困惑。我是否犯了一些真正明显的错误?

1 个答案:

答案 0 :(得分:0)

这里不是专家 - 只是帮助头脑风暴。听起来你得到了一个响应,但你只需要编写一个自定义错误语句。超出范围意味着在使用参数设置选择的列表中,它不存在于该查询的范围内。例如,如果list为0-100,那么响应来自0-10,并且在该范围内找不到0。