答案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的隐式转换,因此这个选择的错误信息稍微有点神秘。 |