最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
http://www.itpub.net/thread-1499223-1-1.html
原始出处:
http://www.plsqlchallenge.com/
作者:Steven Feuerstein
运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品
在PL/SQL Challenge网站,我们想要在2014年加入年度冠军赛,所以是时候将我们许多比赛相关的逻辑(以前只是为季度赛)变得更通用了。下面这个函数就是这个重构过程的一部分。
哪些选项提供了这个函数的函数体:
CREATE OR REPLACE FUNCTION plch_start_date (
frequency_in IN VARCHAR2,
date_inIN DATE DEFAULT SYSDATE)
RETURN VARCHAR2
IS
使得我执行下面这个代码块之后:
BEGIN
DBMS_OUTPUT.put_line (
plch_start_date ('Y', DATE '2014-01-01'));
DBMS_OUTPUT.put_line (
plch_start_date ('Q', DATE '2014-01-01'));
DBMS_OUTPUT.put_line (
plch_start_date ('M', DATE '2013-11-01'));
END;
/
我在屏幕上会看到这个输出:
2013-01-01
2013-10-01
2013-10-01
(A)
BEGIN
IF frequency_in = 'Y'
THEN
RETURN TO_CHAR (ADD_MONTHS (date_in, -12), 'YYYY-MM-DD');
ELSIF frequency_in = 'Q'
THEN
RETURN TO_CHAR (ADD_MONTHS (date_in, -3), 'YYYY-MM-DD');
ELSIF frequency_in = 'M'
THEN
RETURN TO_CHAR (ADD_MONTHS (date_in, -1), 'YYYY-MM-DD');
END IF;
END;
/
(B)
BEGIN
RETURN TO_CHAR (
CASE frequency_in
WHEN 'Y' THEN ADD_MONTHS (date_in, -12)
WHEN 'Q' THEN ADD_MONTHS (date_in, -3)
WHEN 'M' THEN ADD_MONTHS (date_in, -1)
END,
'YYYY-MM-DD');
END;
/
(C)
TYPE shifts_t IS TABLE OF PLS_INTEGER
INDEX BY VARCHAR2 (1);
l_shifts shifts_t;
BEGIN
l_shifts ('M') := 1;
l_shifts ('Q') := 3;
l_shifts ('Y') := 12;
RETURN TO_CHAR (
ADD_MONTHS (date_in, -1 * l_shifts (frequency_in)),
'YYYY-MM-DD');
END;
/
(D)
BEGIN
RETURN TO_CHAR (
ADD_MONTHS (
date_in,
CASE frequency_in
WHEN 'Y' THEN -12
WHEN 'Q' THEN -3
WHEN 'M' THEN -1
END),
'YYYY-MM-DD');
END;
/
(E)
BEGIN
RETURN TO_CHAR ( TRUNC (date_in - 1,
REPLACE (frequency_in, 'M', 'MM')), 'YYYY-MM-DD');
END;
/
|