PL/SQL Challenge 每周一题:2021-12-11 PLS_INTEGER, BINARY_INTEGER 以及相关子类型

[复制链接]
查看11 | 回复1 | 2008-9-15 01:28:12 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。
每两周的优胜者可获得itpub奖励的技术图书一本。
以往旧题索引:
http://www.itpub.net/forum.php?m ... eid&typeid=1808
原始出处:
https://devgym.oracle.com/
作者:Kim Berg Hansen
运行环境:SQLPLUS, SERVEROUTPUT已打开, 最低版本要求:11.2
注:本题给出答案时候要求给予简要说明才能得到奖品
我有个未完成的匿名代码块,带有一个声明部分以及一个块体,如果代码块能够编译并且成功执行,它就简单地产生一个输出:
declare
##REPLACE##
begin
dbms_output.put_line('Success!');
end;
/
哪些选项包含了一个变量声明以及赋值语句,能够用来取代 ##REPLACE##,完成这个匿名块使得它能够编译并且执行不出错,产生这个所要求的输出:
Success!

(A)
my_var NATURAL := - power(2, 31) - 1;
(B)
my_var NATURAL := - power(2, 31);
(C)
my_var NATURAL := -1;
(D)
my_var NATURAL := 0;
(E)
my_var NATURAL := power(2, 31) - 1;
(F)
my_var NATURAL := power(2, 31);
(G)
my_var NATURAL := NULL;
(H)
my_var POSITIVEN := - power(2, 31) - 1;
(I)
my_var POSITIVEN := - power(2, 31);
(J)
my_var POSITIVEN := -1;
(K)
my_var POSITIVEN := 0;
(L)
my_var POSITIVEN := power(2, 31) - 1;
(M)
my_var POSITIVEN := power(2, 31);
(N)
my_var POSITIVEN := NULL;

回复

使用道具 举报

千问 | 2008-9-15 01:28:12 | 显示全部楼层
答案DEGL, 本期无人参与。
A:
NATURAL数据类型被定义为一个PLS_INTEGER, 取值范围0 至 power(2, 31) - 1 (即 2147483647)。基础类型PLS_INTEGER本身的取值范围是- power(2, 31) 至 power(2, 31) - 1,而我们在此处试图赋值的数字甚至超出了基础类型的取值范围,所以会报错:
ORA-01426: numeric overflow.
B:
此处我们试图赋予一个值,落在基础类型PLS_INTEGER的取值范围内,所以我们不会得到前一选项那样的ORA-01426。但是既然我们试图赋予的值超出了约束子类型NATURAL的取值范围,我们得到另外一个错误:
ORA-06502: PL/SQL: numeric or value error.
C:
-1 也在NATURAL的取值约束之外,所以我们得到了和前一选项一样的错误:
ORA-06502: PL/SQL: numeric or value error.
D:
零落在NATURAL的取值范围之内,所以这个赋值成功了。
E:
power(2, 31) - 1 (即2147483647)是NATURAL允许的最大值(也是基础类型PLS_INTEGER所允许的最大值),所以这个赋值也成功了。
F:
但是 power(2, 31)比NATURAL的取值范围大1, 并且它也落在基础类型PLS_INTEGER的取值范围之外,我们不会得到ORA-06502, 而是会得到和A选项同样的错误:
ORA-01426: numeric overflow.
G:
NATURAL子类型定义的时候并没有带NOT NULL约束,所以这个是可行的。
H:
数据类型POSITIVEN被定义为PLS_INTEGER,取值约束从1至power(2, 31) - 1 (即 2147483647),同时带有NOT NULL约束。如同选项A, 此处赋值落在基础类型PLS_INTEGER的取值范围之外,所以我们得到同样的错误:
ORA-01426: numeric overflow.
I:
如同选项B, 这是落在基础类型PLS_INTEGER的取值范围之内,但是在POSITIVEN的约束范围之外,所以我们得到错误:
ORA-06502: PL/SQL: numeric or value error.
J:
如同选项C,这也落在POSITIVEN的取值范围之外并且报同样的错:
ORA-06502: PL/SQL: numeric or value error
K:
选项D对于NATURAL是可行的,NATURAL的下限是零,但是POSITIVEN的约束下限是1,所以这落在取值范围之外并且报错:
ORA-06502: PL/SQL: numeric or value error.
L:
如同选项E, 这个赋予POSITIVEN的最高正数值并且成功了。
M:
但是如同选项F, 这比POSITIVEN的上限大1, 也超出了基础类型PLS_INTEGER的上限,所以导致这个错误:
ORA-01426: numeric overflow.
N:
POSITIVEN 被定义为约束子类型,同时有取值约束和NOT NULL约束,所以我们不能够赋予NULL值。但是因为NULL缺省是字符型,我们得到另外一个错误:
PLS-00382: expression is of wrong type.
我们可以将NULL转换类型到数值型,如下:
my_var POSITIVEN := cast(NULL as NUMBER);
那么我们就会得到通常的错误:
ORA-06502: PL/SQL: numeric or value error.
在G选项,我们没有将NULL转换成数值类型,但是它也能工作,因为NULL被隐式转换了。在本选项中,NULL赋值不可行,所以没有任何针对NULL的隐式转换,因此这个选择的错误信息稍微有点神秘。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行