查看: 379|回复: 3

[每日一题] PL/SQL Challenge 每日一题:2019-11-4 动态SQL中引用标识符

[复制链接]
论坛徽章:
530
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-11-7 05:55 | 显示全部楼层 |阅读模式
(原发表于 2012-1-24)


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

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

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

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

作者:Steven Feuerstein

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


我定义了这个函数来动态获取一个标识符的日期值:

FUNCTION plch_date_value (identifier_in IN VARCHAR2) RETURN DATE
IS
   l_value   DATE;
BEGIN
   EXECUTE IMMEDIATE
      'BEGIN :actual_value := ' || identifier_in || '; END;'
      USING OUT l_value;
   RETURN l_value;
END;

下列哪些选项执行之后会显示"New Year"?

(A)
DECLARE
   dt   DATE := TO_DATE ('2009-01-01', 'YYYY-MM-DD');
BEGIN
   IF TO_CHAR (plch_date_value ('dt'), 'MM-DD') = '01-01'
   THEN
      DBMS_OUTPUT.put_line ('New Year');
   END IF;
END;
/

(B)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   dt   DATE := TO_DATE ('2009-01-01', 'YYYY-MM-DD');
END;
/

BEGIN
   IF TO_CHAR (plch_date_value ('plch_pkg.dt'), 'MM-DD') =
         '01-01'
   THEN
      DBMS_OUTPUT.put_line ('New Year');
   END IF;
END;
/

(C)
DECLARE
   dt   DATE := TO_DATE ('2009-01-01', 'YYYY-MM-DD');
BEGIN
   IF TO_CHAR (plch_date_value (dt), 'MM-DD') = '01-01'
   THEN
      DBMS_OUTPUT.put_line ('New Year');
   END IF;
END;
/

(D)
CREATE OR REPLACE PACKAGE plch_pkg
IS
   FUNCTION dt
      RETURN DATE;
END;
/

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   FUNCTION dt
      RETURN DATE
   IS
   BEGIN
      RETURN TO_DATE ('2009-01-01', 'YYYY-MM-DD');
   END;
END;
/

BEGIN
   IF TO_CHAR (plch_date_value ('plch_pkg.dt'), 'MM-DD') = '01-01'
   THEN
      DBMS_OUTPUT.put_line ('New Year');
   END IF;
END;
/

论坛徽章:
529
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:22海蓝宝石
日期:2012-02-20 19:24:27铁扇公主
日期:2012-02-21 15:03:13
发表于 2019-11-7 13:45 | 显示全部楼层
答案:BD
A: 标识符dt不能转化为DATE型
B: 现在包头中定义了DATE型变量dt,plch_date_value ('plch_pkg.dt'),动态PLSQL中可以识别
C: plch_date_value 过程要求字符型输入参数,这里dt为日期型
D: 动态PLSQL中调用包中的日期型函数

使用道具 举报

回复
论坛徽章:
530
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2019-11-8 05:52 | 显示全部楼层
答案 BD. 2楼得奖。

A: 这个选项会出现错误:
PLS-00201: identifier 'DT' must be declared
虽然函数plch_date_value是在DT定义的范围之内执行,但是对于动态PLSQL块来说,变量DT不在其范围之内。
B: 动态PLSQL块可以引用SCHEMA级别的元素。既然DT现在是在一个包的声明中被定义,动态PLSQL块可以引用它并显示其值。
C: 这个选项试图传入变量值而不是变量名。ORACLE会隐式把DATE转换为字符串,然后替换到动态PLSQL中并试图执行它,变成这样:(日期格式取决于nls_date_format设定)

BEGIN :actual_value := 01-JAN-09; END;

这个语法是错误的。
D: 这个选项把日期值作为函数返回,动态PLSQL可以正确访问这个包里定义的函数。

使用道具 举报

回复
认证徽章
论坛徽章:
210
弗兰奇
日期:2016-05-31 16:31:17妮可·罗宾
日期:2016-07-04 11:53:09托尼托尼·乔巴
日期:2016-05-31 16:31:17山治
日期:2016-05-31 16:31:17乌索普
日期:2016-05-31 16:31:17娜美
日期:2016-05-31 16:31:17罗罗诺亚·索隆
日期:2016-05-31 16:31:17蒙奇·D·路飞
日期:2016-05-31 16:31:17乌索普
日期:2016-08-03 10:26:32娜美
日期:2016-08-08 14:57:54
发表于 2019-11-14 15:10 | 显示全部楼层
本期从10-22到11-4期,情况如下:
每10期题目发一次奖,10期内获奖最多的再奖励一本技术图书〜原有的秀才系列徽章继续根据兑换规则兑换礼品〜
大家多多努力哦〜
本期获奖情况如下:(其中10-24无人获奖)
solomon_007
stelfzhangxian
solomon_007
solomon_007
solomon_007
solomon_007
solomon_007
solomon_007
solomon_007
恭喜solomon_007同学获得一本技术图书,图书徽章已发,可以到书单换任意一本〜
各位其他童鞋继续加油哦

使用道具 举报

回复

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

本版积分规则 发表回复

PostgreSQL中国大会,参会票抢购!

由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。
----------------------------------------
时间:2019年11月29~11月30日

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