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

[复制链接]
查看11 | 回复8 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
本帖最后由 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_FromDateDATE

,p_TillDateDATE

)
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;
/

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案:A
APLSQL 直接调用函数plch_Term,OK
B动态SQL :_Date 占位符带下划线,好像一直编译出错, 改成 :1,:2 B,C,D都OK
C动态PLSQL
D动态PLSQL相同的值传入或传出,只用同样一个占位符即可
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
忘记去掉自动表情符了,我刚刚编辑了题目,请继续答题。
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案:ABD
APLSQL 直接调用函数plch_Term,OK
B动态SQL函数的两个参数的站位符相同

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

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案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值就足够了。

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
才知道动态sql和动态pl/sql还有这种区别
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
〇〇 发表于 2018-4-29 20:45
才知道动态sql和动态pl/sql还有这种区别

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

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
学习了
回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
solomon_007 发表于 2018-4-30 21:07
还有个显著的一个不重要的一点是:动态SQL语句结尾没有分号,动态PLSQL结尾要带分号

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

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行