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

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

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

[复制链接]
论坛徽章:
496
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
发表于 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;
/

论坛徽章:
288
秀才
日期:2017-03-02 10:30:47布鲁克
日期:2016-10-08 10:06:50秀才
日期:2016-09-27 15:16:21秀才
日期:2016-09-27 15:11:30奥运会纪念徽章:自行车
日期:2016-09-26 15:54:59举人
日期:2016-06-24 09:25:21秀才
日期:2016-06-24 09:21:04双鱼座
日期:2016-06-15 17:14:38射手座
日期:2016-05-26 14:02:50白羊座
日期:2016-05-23 11:49:19
发表于 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
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
 楼主| 发表于 2018-4-27 22:38 | 显示全部楼层
忘记去掉自动表情符了,我刚刚编辑了题目,请继续答题。

使用道具 举报

回复
论坛徽章:
288
秀才
日期:2017-03-02 10:30:47布鲁克
日期:2016-10-08 10:06:50秀才
日期:2016-09-27 15:16:21秀才
日期:2016-09-27 15:11:30奥运会纪念徽章:自行车
日期:2016-09-26 15:54:59举人
日期:2016-06-24 09:25:21秀才
日期:2016-06-24 09:21:04双鱼座
日期:2016-06-15 17:14:38射手座
日期:2016-05-26 14:02:50白羊座
日期:2016-05-23 11:49:19
发表于 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
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
 楼主| 发表于 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值就足够了。

使用道具 举报

回复
论坛徽章:
399
优秀写手
日期:2013-12-18 09:29:08itpub13周年纪念徽章
日期:2014-09-28 10:55:55itpub13周年纪念徽章
日期:2014-10-01 15:27:22itpub13周年纪念徽章
日期:2014-10-09 12:04:18马上有钱
日期:2014-10-14 21:37:37马上有钱
日期:2015-01-22 00:39:13喜羊羊
日期:2015-02-20 22:26:07懒羊羊
日期:2015-02-21 22:03:31懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
发表于 2018-4-29 20:45 | 显示全部楼层
才知道动态sql和动态pl/sql还有这种区别

使用道具 举报

回复
论坛徽章:
288
秀才
日期:2017-03-02 10:30:47布鲁克
日期:2016-10-08 10:06:50秀才
日期:2016-09-27 15:16:21秀才
日期:2016-09-27 15:11:30奥运会纪念徽章:自行车
日期:2016-09-26 15:54:59举人
日期:2016-06-24 09:25:21秀才
日期:2016-06-24 09:21:04双鱼座
日期:2016-06-15 17:14:38射手座
日期:2016-05-26 14:02:50白羊座
日期:2016-05-23 11:49:19
发表于 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
目光如炬
日期:2015-11-22 22:00:00秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21秀才
日期:2016-01-06 14:10:21探花
日期:2016-01-06 14:11:18进士
日期:2016-01-06 14:11:18
 楼主| 发表于 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号
  
快速回复 返回顶部 返回列表