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

 
 注册
热搜:
查看: 187|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2017-11-27 NVL函数

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
跳转到指定楼层
1#
发表于 2017-11-30 08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(原发表于 2011-8-31)

最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

原始出处:


作者:Steven Feuerstein

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

我创建了下列函数:

CREATE OR REPLACE FUNCTION plch_one
   RETURN INTEGER
IS
BEGIN
   DBMS_OUTPUT.put_line ('One');
   RETURN 1;
END;
/

哪些选项包含了一个代码块,在执行之后会显示下列文本?

One
One

(A)
DECLARE
   l_number1   NUMBER;
   l_number2   NUMBER;
BEGIN
   l_number2 := NVL (l_number1, plch_one ());
   l_number1 := NVL (l_number2, plch_one ());
END;
/


(B)
DECLARE
   l_number1   NUMBER;
   l_number2   NUMBER;
BEGIN
   IF l_number1 IS NULL
   THEN
      l_number2 := plch_one ();
   ELSE
      l_number2 := l_number1;
   END IF;

   IF l_number2 IS NULL
   THEN
      l_number1 := plch_one ();
   ELSE
      l_number1 := l_number2;
   END IF;
END;
/

(C)
DECLARE
   l_number1   NUMBER;
   l_number2   NUMBER;
BEGIN
   l_number2 :=
      CASE
         WHEN l_number1 IS NULL THEN plch_one ()
         ELSE l_number1
      END;
   l_number1 :=
      CASE
         WHEN l_number2 IS NULL THEN plch_one ()
         ELSE l_number2
      END;
END;
/


认证徽章
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-20 16:06:45娜美
日期:2017-12-15 13:56:33技术图书徽章
日期:2017-11-17 09:13:02妮可·罗宾
日期:2017-11-17 10:43:23
2#
发表于 2017-11-30 08:40 | 只看该作者
A正確,
A. NVL (l_numberN, plch_one ()) ,不論 l_numberN 是否為null, plch_one ()都會被執行,只輸出兩個 ONE
B. 第一段IF 中 l_number2 := plch_one (); 被賦值1 后第二段 IF 中不會執行 l_number1 := plch_one ();  ,只輸出一個 ONE
C. 情況case when else 情形和 B中IF邏輯類似, 只輸出一個 ONE

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
3#
 楼主| 发表于 2017-12-1 05:07 | 只看该作者
答案A, 2楼得奖。

The PL/SQL language implements most of the built-in SQL functions as native PL/SQL functions. It then adds some of its own. Either way, you should be as familiar as possible with these built-ins so that you can avoid writing programs to perform calculations that are already done for you (and likely to run much faster, since the built-ins are implemented in C).

NVL接受两个参数。如果第一个参数不是NULL,就会被返回;否则,它会返回第二个参数。

Oracle 会对两个表达式进行求值然后传递给NVL函数,即使第一个表达式不是NULL。换言之,即使第二个参数没有被使用,它也会被求值。

只有选项A会导致plch_one被显示两次。对于IF和CASE, 函数仅仅当l_number1的值为NULL时才会调用。

使用道具 举报

回复

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

本版积分规则

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 |
  | | |
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
 北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表