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

 找回密码
 注册
查看: 3315|回复: 8

[每日一题] PL/SQL Challenge 每日一题:2018-4-23 动态SQL中的占位符

[复制链接]
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期: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:53
发表于 2018-4-26 21:51 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2018-4-27 22:36 编辑

(原发表于 2011-9-16)

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

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

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

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

作者:koko

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

我创建了如下函数:

CREATE OR REPLACE FUNCTION plch_Term(p_FromDate  DATE
                                    ,p_TillDate  DATE
                                    )
  RETURN NUMBER
IS
BEGIN
  RETURN p_TillDate - p_FromDate + 1;
END;
/

哪些选项中的代码块执行之后会显示 "1" ?


(A)
BEGIN
  dbms_output.put_line(TO_CHAR(plch_Term(SYSDATE, SYSDATE)));
END;
/

(B)
DECLARE
  lnTerm   NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT plch_Term(:p_Date, :p_Date)
                       FROM SYS.DUAL
                    '
               INTO lnTerm
              USING SYSDATE, SYSDATE;

  dbms_output.put_line(TO_CHAR(lnTerm));
END;
/

(C)
DECLARE
  lnTerm   NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'BEGIN
                       :p_Term := plch_Term(:p_Date, :p_Date);
                     END;
                    '
              USING OUT lnTerm, SYSDATE, SYSDATE;

  dbms_output.put_line(TO_CHAR(lnTerm));
END;
/

(D)
DECLARE
  lnTerm   NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'BEGIN
                       :p_Term := plch_Term(:p_Date, :p_Date);
                     END;
                    '
               USING OUT lnTerm, SYSDATE;

  dbms_output.put_line(TO_CHAR(lnTerm));
END;
/

论坛徽章:
293
生肖徽章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
发表于 2018-4-27 17:19 | 显示全部楼层
答案:  A

A  PLSQL 直接调用函数plch_Term,OK
B  动态SQL :_Date 占位符带下划线,好像一直编译出错, 改成 :1,:2 B,C,D都OK
C  动态PLSQL
D  动态PLSQL  相同的值传入或传出,只用同样一个占位符即可

使用道具 举报

回复
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期: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:53
 楼主| 发表于 2018-4-27 22:38 | 显示全部楼层
忘记去掉自动表情符了,我刚刚编辑了题目,请继续答题。

使用道具 举报

回复
论坛徽章:
293
生肖徽章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
发表于 2018-4-28 09:42 | 显示全部楼层
答案:  ABD

A  PLSQL 直接调用函数plch_Term,OK
B  动态SQL  函数的两个参数的站位符相同_Date,传的都是sysdate, 但动态SQL占位符在 USING 子句后,传入用一个报错,要对应
C  动态PLSQL,与动态SQL不同,相同的占位符只需要用一个参数即可
D  动态PLSQL  相同的值传入或传出,只用同样一个占位符即可 (学习了,原来动态SQL和动态PLSQL还有这种差别)

使用道具 举报

回复
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期: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:53
 楼主| 发表于 2018-4-28 11:59 | 显示全部楼层
答案ABD, 4楼得奖。

A:
这是一个普通的对plch_Term函数的非动态调用。它运作得很好,同一个值被传入两次。
B: 在动态SQL中,占位符的命名并不重要,位置才重要。这就是为什么我们必须为:p_Date 的每次出现都提供一个值。
C: 对于动态PL/SQL而言,占位符的名字确实重要。在这个代码块中,:p_Term 被影射到lnTerm,而两个:p_Date 都被影射到第一个SYSDATE。这就是为什么代码块会出错:
ORA-01006: bind variable does not exist. (没有一个占位符可以用来接收第二个 SYSDATE 值)
D: 这个动态PL/SQL考虑到:p_Date 是一个被使用两次的占位符。于是,一个SYSDATE值就足够了。

使用道具 举报

回复
论坛徽章:
400
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2018-4-29 20:45 | 显示全部楼层
才知道动态sql和动态pl/sql还有这种区别

使用道具 举报

回复
论坛徽章:
293
生肖徽章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
发表于 2018-4-30 21:07 | 显示全部楼层
〇〇 发表于 2018-4-29 20:45
才知道动态sql和动态pl/sql还有这种区别

还有个显著的一个不重要的一点是:动态SQL语句结尾没有分号,动态PLSQL结尾要带分号

使用道具 举报

回复
认证徽章
论坛徽章:
21
林肯
日期:2013-07-30 18:00:55秀才
日期:2018-05-22 15:17:21秀才
日期:2018-05-22 15:21:20技术图书徽章
日期:2018-05-22 15:21:47秀才
日期:2018-05-22 15:21:47秀才
日期:2018-05-22 16:13:08秀才
日期:2018-05-22 16:13:21技术图书徽章
日期:2018-05-22 16:13:30秀才
日期:2018-05-22 16:13:30技术图书徽章
日期:2018-05-22 15:17:21
发表于 2018-5-2 09:34 | 显示全部楼层
学习了

使用道具 举报

回复
论坛徽章:
496
紫蜘蛛
日期:2007-09-26 17:05:56奥运会纪念徽章:垒球
日期: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:53
 楼主| 发表于 2018-5-2 17:40 | 显示全部楼层
solomon_007 发表于 2018-4-30 21:07
还有个显著的一个不重要的一点是:动态SQL语句结尾没有分号,动态PLSQL结尾要带分号

动态PLSQL是一个匿名块,必须要套上BEGIN ... END;

使用道具 举报

回复

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

本版积分规则

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