PL/SQL Challenge 每日一题:2015-6-30 RAISE_APPLICATION_ERROR

[复制链接]
查看11 | 回复5 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2015-7-3 03:27 编辑
(原发表于2010-11-30)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
HR模式下的员工表(employees)是这样子的:

CREATE TABLE our_employees (
last_name VARCHAR2(100),
date_of_birth DATE
)
/
我需要实现一个触发器,使得员工年龄至少为18岁。所以我写了如下代码:

CREATE OR REPLACE TRIGGER employees_too_young_tr
AFTER INSERT OR UPDATE
ON our_employees
FOR EACH ROW
BEGIN
IF :NEW.date_of_birth > ADD_MONTHS (SYSDATE, -12 * 18)
THEN
/*STOP!*/
END IF;
END employees_too_young_tr;
哪些选项可用来取代/*STOP!*/注释,使得触发器编译之后,我执行下列代码块,屏幕上显示的文本将会含有 "Employee must be 18"字样? 假设在选项中除了我抛出的那个错误之外,ORACLE不会抛出其他错误。
BEGIN
INSERT INTO our_employees
VALUES ('Feuerstein', SYSDATE);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
(A)
RAISE_APPLICATION_ERROR (-20000, 'Employee must be 18');
(B)
DBMS_STANDARD.RAISE_APPLICATION_ERROR (-20000, 'Employee must be 18');
(C)
RAISE (-20000, 'Employee must be 18');
(D)
RAISE 'Employee must be 18';
(E)
DECLARE

e_too_young EXCEPTION;

BEGIN

RAISE e_too_young;

END;
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
AB可以,而且我没用过那么细,觉得都一样
C和D没这种写法
E的话语法是可以的,但是好像没有输出18岁的信息,加一个吧。

DECLARE

e_too_young EXCEPTION;
PRAGMA EXCEPTION_INIT(e_too_young,-20000);
BEGIN
RAISE_APPLICATION_ERROR(-20000,'Employee must be 18');

END;

--啦啦啦啦我的18岁。。。。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
A,B
RAISE_APPLICATION_ERROR是缺省在DBMS_STANDARD包里定义的用来抛出一个异常,并且可以附加一段异常消息。
RAISE是用来抛出一个被命名的异常,它只能是系统命名的异常或是自定义的异常变量,不能附加异常消息,E抛出异常,但是没有异常消息。

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
answer: A、 B
PROCEDURE RAISE_APPLICATION_ERROR(value1 , value2)里面的错误代码和内容,都是自定义的。value1是 -20000 到 -20999 之间,这样就不会与 ORACLE 的任何错误代码发生冲突,是属于一种自定义事务错误类型,才调用此函数。
RAISE 应该是抛出异常给数据库数,不限于所声明的异常。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
AB是正解
E的话的确需要用2#的写法才能奏效
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案AB, 2楼得奖。
A: RAISE_APPLICATION_ERROR(在DBMS_STANDARD中被定义)是一个过程,我们可以用它来将一个错误和应用的相关信息发生关联,然后回传给调用的块。对SQLCODE的调用将会返回那个被传递给RAISE_APPLICATION_ERROR的第一个参数。对SQLERRM或者DBMS_UTILITY.FORMAT_ERROR_STACK 的调用将会返回那个被传递给RAISE_APPLICATION_ERROR的第二个参数。
B: RAISE_APPLICATION_ERROR在DBMS_STANDARD中被定义, DBMS_STANDARD是PL/SQL的两个缺省包之一(另一个是STANDARD包)。结果你
可以调用这个内置过程,带不带称量都没关系。不论是哪种方法的调用,它都会停止插入或者修改,并且将一个异常回传给调用的块。对SQLERRM 的调用将会返回那个被传递给RAISE_APPLICATION_ERROR的第二个参数。
C,D: 这是RAISE语句的无效语法,你应该改用RAISE_APPLICATION_ERROR。
E: 这个选项确实中止了插入或者修改,并且将一个异常回传给调用的块。但是错误信息仅仅是 "User-defined exception."
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行