原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
哪些选项创建了一个名为PLCH_IS_WONDERFUL的函数,使得下列代码块执行之后:
BEGIN
DBMS_OUTPUT.put_line (plch_is_wonderful ('CHOCOLATE'));
DBMS_OUTPUT.put_line (plch_is_wonderful ('BROKEN LEG'));
END;
/
你会在屏幕上按所示顺序看到如下的文本:
YES
NO
(A)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
IF thing_in = 'CHOCOLATE'
THEN
RETURN 'YES';
END IF;
RAISE PROGRAM_ERROR;
EXCEPTION
WHEN PROGRAM_ERROR
THEN
RETURN 'NO';
END plch_is_wonderful;
/
(B)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
IF thing_in = 'CHOCOLATE'
THEN
RETURN 'YES';
ELSE
RETURN 'NO';
END IF;
END plch_is_wonderful;
/
(C)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN C ASE thing_in WHEN 'CHOCOLATE' THEN 'YES' ELSE 'NO' END;
END plch_is_wonderful;
/
(D)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
e_is_wonderful EXCEPTION;
e_is_not_wonderful EXCEPTION;
BEGIN
IF thing_in = 'CHOCOLATE'
THEN
RAISE e_is_wonderful;
ELSE
RAISE e_is_not_wonderful;
END IF;
EXCEPTION
WHEN e_is_wonderful
THEN
RETURN 'NO';
WHEN e_is_not_wonderful
THEN
RETURN 'YES';
END plch_is_wonderful;
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
哪些选项创建了一个名为PLCH_IS_WONDERFUL的函数,使得下列代码块执行之后:
BEGIN
DBMS_OUTPUT.put_line (plch_is_wonderful ('CHOCOLATE'));
DBMS_OUTPUT.put_line (plch_is_wonderful ('BROKEN LEG'));
END;
/
你会在屏幕上按所示顺序看到如下的文本:
YES
NO
(A)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
IF thing_in = 'CHOCOLATE'
THEN
RETURN 'YES';
END IF;
RAISE PROGRAM_ERROR;
EXCEPTION
WHEN PROGRAM_ERROR
THEN
RETURN 'NO';
END plch_is_wonderful;
/
(B)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
IF thing_in = 'CHOCOLATE'
THEN
RETURN 'YES';
ELSE
RETURN 'NO';
END IF;
END plch_is_wonderful;
/
(C)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
RETURN C ASE thing_in WHEN 'CHOCOLATE' THEN 'YES' ELSE 'NO' END;
END plch_is_wonderful;
/
(D)
CREATE OR REPLACE FUNCTION plch_is_wonderful (thing_in IN VARCHAR2)
RETURN VARCHAR2
IS
e_is_wonderful EXCEPTION;
e_is_not_wonderful EXCEPTION;
BEGIN
IF thing_in = 'CHOCOLATE'
THEN
RAISE e_is_wonderful;
ELSE
RAISE e_is_not_wonderful;
END IF;
EXCEPTION
WHEN e_is_wonderful
THEN
RETURN 'NO';
WHEN e_is_not_wonderful
THEN
RETURN 'YES';
END plch_is_wonderful;
/
A: (不推荐)
第一个问题是我依赖于异常部分来处理我程序的一个逻辑分支。
第二个问题是我把这个方法和更常见也更好的条件逻辑混合使用。
极其令人迷惑!
B:
不依赖于异常,非常直接的IF。唯一不受推荐的理由是在这个情况下,CASE表达式更好。
C:(推荐)
没有将异常用于条件逻辑。简洁地使用CASE来避免冗余代码(此处指重复的RETURN)
D: 如同推特上常说的"OMG"(天哪)。声明了两个异常。在IF语句中,抛出了不同的异常。
然后在异常部分,处理每个异常并且返回所需的值。
啊哦,返回的值是错的!
你得仔细读这代码!
并且别再写这么复杂的代码。