查看: 642|回复: 2

[每日一题] PL/SQL Challenge 每日一题:2019-1-29 非空约束和VALUE_ERROR异常

[复制链接]
论坛徽章:
540
奥运会纪念徽章:垒球
日期: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:532009日食纪念
日期:2009-07-22 09:30:00
发表于 2019-2-1 09:36 | 显示全部楼层 |阅读模式
(原发表于 2011-12-6)


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

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

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

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

作者:Steven Feuerstein

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

2011-12-6 非空约束和VALUE_ERROR异常
作者:Steven Feuerstein
难度:中

下面这些代码块哪些执行之后会导致未处理的VALUE_ERROR异常?
(A)
DECLARE
   l_string   VARCHAR2 (10);

   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt   nt := nt (l_string);
BEGIN
   l_nt (1) := NULL;
END;


(B)
DECLARE
   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt   nt := nt (NULL);
BEGIN
   l_nt (1) := NULL;
END;

(C)
DECLARE
   TYPE aa IS TABLE OF VARCHAR2 (10) NOT NULL
                 INDEX BY PLS_INTEGER;
   l_aa   aa;
BEGIN
   l_aa (1) := NULL;
END;

(D)
DECLARE
   l_string   VARCHAR2 (10);

   TYPE aa IS TABLE OF VARCHAR2 (10) NOT NULL
                 INDEX BY PLS_INTEGER;
   l_aa       aa;
BEGIN
   l_aa (1) := l_string;
END;


(E)
DECLARE
   l_string   VARCHAR2 (10);

   TYPE nt IS TABLE OF VARCHAR2 (10) NOT NULL;

   l_nt       nt := nt ();
BEGIN
   l_nt.EXTEND;
   l_nt (1) := l_string;
END;


论坛徽章:
417
生肖徽章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
发表于 2019-2-1 16:51 | 显示全部楼层
答案: DE

A:  nt 是嵌套表类型,l_nt 需要先 EXTEND 扩展,然后才可以给 l_nt(1) 赋值 ,报错 PLS-00382: expression is of wrong type

B:  与A 又一个相同的错,另外,构造函数部分赋值,传的NULL,应该是赋给  l_nt(1),报两个错
    ORA-06550: line 4, column 21:
PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter
ORA-06550: line 4, column 11:
PL/SQL: Item ignored
ORA-06550: line 6, column 4:
PLS-00320: the declaration of the type of this expression is incomplete or malformed

C:  关联数组可以直接赋值,不需要扩展,但定义了 NOT NULL,依然不对元素赋予空值
PLS-00382: expression is of wrong type

D: 定义部分是对的,关联数组定义了 NOT NULL,不对元素赋予空值
ORA-06502: PL/SQL: numeric or value error

E: EXTEND 语句之前都是OK的,嵌套表定义了 NOT NULL,不对元素赋予空值
ORA-06502: PL/SQL: numeric or value error

使用道具 举报

回复
论坛徽章:
540
奥运会纪念徽章:垒球
日期: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:532009日食纪念
日期:2009-07-22 09:30:00
 楼主| 发表于 2019-2-2 04:31 | 显示全部楼层
答案:DE, 2楼得奖。

AC: 这个选项会报编译错误:
"PLS-00382: expression is of wrong type"

换言之,编译器注意到我有NOT NULL约束又有一个NULL字面量的赋值,它甚至不会试图去执行代码块,它知道肯定行不通的。

B: 这个选项会报编译错误:
"PLS-00567: cannot pass NULL to a NOT NULL constrained formal parameter"
换言之,编译器注意到我在集合类型上有NOT NULL约束,然后又试图将NULL传递给构建函数。它甚至不会试图去执行代码块。

DE: 在这种情况下,我将NULL值“隐藏”在一个变量l_string之后。所以在编译时,Oracle不会检测到对NOT NULL约束有这么一个“明显”的违例。代码块可以编译并且执行,然后会抛出运行错误 VALUE_ERROR

使用道具 举报

回复

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

本版积分规则 发表回复

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