ITPUB论坛-中国专业的IT技术社区

标题: PL/SQL Challenge 每日一题:2018-7-4 动态SQL [打印本页]

作者: newkid    时间: 2018-7-7 04:09
标题: PL/SQL Challenge 每日一题:2018-7-4 动态SQL
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

每两周的优胜者可获得itpub奖励的技术图书一本。

以往旧题索引:
/forum.php?m ... eid&typeid=1808

原始出处:
http://www.plsqlchallenge.com/

作者:Steven Feuerstein

运行环境:SQLPLUS, SERVEROUTPUT已打开
注:本题给出答案时候要求给予简要说明才能得到奖品

哪些选项在执行之后屏幕上会显示文本 "total dummy" ?

(A)
DECLARE
   l_sum   INTEGER;
BEGIN
   EXECUTE IMMEDIATE 'SELECT SUM (dummy) FROM DUAL';
   dbms_output.put_line ('total dummy');
END;
/

(B)
DECLARE
   l_sum   INTEGER;
BEGIN
   EXECUTE IMMEDIATE 'SELECT SUM (dummy) FROM DUAL' INTO l_sum;
   dbms_output.put_line ('total dummy');
END;
/
(C)
DECLARE
   l_sum   INTEGER;
BEGIN
   SELECT SUM (dummy) INTO l_sum FROM DUAL;
   dbms_output.put_line ('total dummy');
END;
/

(D)
DECLARE
   l_sum   INTEGER;
   l_cur integer := dbms_sql.open_cursor;
BEGIN
   dbms_sql.parse (l_cur, 'SELECT SUM (dummy) FROM DUAL' ,dbms_sql.native);
   l_sum := dbms_sql.execute(l_cur);
   dbms_output.put_line ('total dummy');
   dbms_Sql.close_cursor (l_cur);
END;
/



作者: YuBinTAMU    时间: 2018-7-7 04:53
A

From dual data type of column dummy is varchar2(1), value is 'X', it's can't implicitly convert to number, so sum(dummy) will raise error In B, C and D.

^_^


作者: 却早已分离    时间: 2018-7-7 21:43
A和D是一样的
作者: hai503    时间: 2018-7-9 09:30
(A)(D)
SQL> desc dual;
Name  Type        Nullable Default Comments
----- ----------- -------- ------- --------
DUMMY VARCHAR2(1) Y
作者: newkid    时间: 2018-7-10 04:29
答案AD, 3楼得奖。

如果一个动态SQL语句是一个SELECT语句,并且你没有fetch其结果数据行(在EXECUTE IMMEDIATE中忽略了into子句以及bulk collect into子句,或者没有调用DBMS_SQL.fetch_rows),那么这个动态语句就不会被执行。
dual.dummy的值是"X",因此SUM ('X') 是无效的,BC选项会报错。但是在AD这两个选项中,动态SQL没有读取SUM (dummy)的值,所以语句永远不被执行,错误也不会发生。





欢迎光临 ITPUB论坛-中国专业的IT技术社区 (/) Powered by Discuz! X3.2
http://www.vxiaotou.com