我正在尝试加薪例外

时间:2019-12-15 20:28:53

标签: sql oracle plsql plsql-package

我正在尝试使用PL / SQL中的RAISE进行例外处理。我做了脚本,但是当我想运行它时,它不会向我显示两个消息之一,而只是给我“匿名块已完成”。

list.remove(x): x not in list

我尝试用日期('01 -May-2019')手动替换sysdate,但无法正常工作。

1 个答案:

答案 0 :(得分:2)

  

我正在尝试使用PL / SQL中的RAISE进行例外处理...但是当我要运行它时,它不会向我显示两条消息之一

您没有看到这些消息,因为您正在不显示DBMS_OUTPUT的环境中运行程序。您已经编写了一个EXCEPTION处理程序,该处理程序禁止您的异常并且不重新引发它们。这是一种不好的做法,因为DBMS_OUTPUT不是传播异常的机制:当输出被抑制或程序作为自治的后台例程运行(这是PL / SQL的主要用途)时,无法得知程序失败。

您可以启用SEVEROUTPUT(在SQL * Plus中)或配置DBMS_OUTPUT选项卡(在类似SQL Developer的IDE中)。这样做意味着您下次运行程序时会看到消息。

但是最好只引发异常并让调用程序处理它们。鉴于此,您可能应该像这样重新编写程序:

Accept cititor prompt 'Introduceti un cititor'; 

DECLARE 
  data_la_limita EXCEPTION; 
  data_returnare    varchar(10);
    --cititor varchar(10); 
BEGIN 

  SELECT s.data_dereturnat 
  INTO data_returnare 
  FROM fisa_imprumuturi s 
       left join legitimatii s1 on s1.nrlegitimatie = s.nr_legitimatie left 
       join cititori s2 on s2.codcititor = s1.codcititor 
    WHERE s2.numecititor like '%&cititor%'; 

  IF (data_returnare > sysdate ) THEN
         RAISE data_la_limita;
  END IF; 

EXCEPTION

  WHEN data_la_limita THEN
    raise_application_error(-20000, 'Cititorul a trecut peste data returnarii!');

END;

最好不要编写WHEN OTHERS处理程序的代码,除非我们正在记录消息。即使这样,我们也应该执行一次RAISE来传递实际错误,而不是无用的通用消息。调用程序需要知道出了什么问题,以便可以对下一步的操作做出正确的决定(例如,忽略并继续,中止和重新引发等等)。