我正在尝试使用PL / SQL中的RAISE进行例外处理。我做了脚本,但是当我想运行它时,它不会向我显示两个消息之一,而只是给我“匿名块已完成”。
list.remove(x): x not in list
我尝试用日期('01 -May-2019')手动替换sysdate,但无法正常工作。
答案 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来传递实际错误,而不是无用的通用消息。调用程序需要知道出了什么问题,以便可以对下一步的操作做出正确的决定(例如,忽略并继续,中止和重新引发等等)。