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

 找回密码
 注册
查看: 27301|回复: 4

[每日一题] PL/SQL Challenge 每日一题:2017-3-1 对象类型

[复制链接]
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
发表于 2017-3-4 04:57 | 显示全部楼层 |阅读模式
最先答对且答案未经编辑的puber将获得纪念章一枚(答案不可编辑但可发新贴补充或纠正),其他会员如果提供有价值的分析、讨论也可获得纪念章一枚。

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

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

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

作者:Steven Feuerstein

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

我执行了下列语句:

CREATE TYPE qz_address_ot AS OBJECT
(
   street_address VARCHAR2 (40),
   postal_code VARCHAR2 (10),
   city VARCHAR2 (30),
   state_province VARCHAR2 (10),
   country_id VARCHAR2 (10)
)
/

CREATE TABLE qz_customers
(
   id                 NUMBER PRIMARY KEY,
   customer_name      VARCHAR2 (255),
   customer_address   qz_address_ot
)
/

哪些选项会在执行之后导致屏幕上显示 "Count=1" ?

(A)
DECLARE
   l_address   qz_address_ot
                  := qz_address_ot ('100 Main',
                                    '06896',
                                    'Redding',
                                    'CT',
                                    'US');
   l_count integer;
BEGIN
   INSERT INTO qz_customers (id, customer_name, customer_address)
        VALUES (1, 'ACME', l_address);

   SELECT COUNT (*) INTO l_count FROM qz_customers;

   DBMS_OUTPUT.put_line ('Count=1');
END;
/

(B)
DECLARE
   l_address   qz_address_ot;
   l_count integer;
BEGIN
   l_address.street_address := '100 Main';
   l_address.postal_code := '06896';
   l_address.city := 'Redding';
   l_address.state_province := 'CT';
   l_address.country_id := 'US';

   INSERT INTO qz_customers (id, customer_name, customer_address)
        VALUES (1, 'ACME', l_address);

   SELECT COUNT (*) INTO l_count FROM qz_customers;

   DBMS_OUTPUT.put_line ('Count=1');
END;
/

(C)
DECLARE
   l_address   qz_address_ot;
   l_count integer;
BEGIN
   l_address.EXTEND;
   l_address.street_address := '100 Main';
   l_address.postal_code := '06896';
   l_address.city := 'Redding';
   l_address.state_province := 'CT';
   l_address.country_id := 'US';

   INSERT INTO qz_customers (id, customer_name, customer_address)
        VALUES (1, 'ACME', l_address);

   SELECT COUNT (*) INTO l_count FROM qz_customers;

   DBMS_OUTPUT.put_line ('Count=1');
END;
/

(D)
DECLARE
   l_address   qz_address_ot;
   l_count integer;
BEGIN
   l_address := qz_address_ot ();
   l_address.street_address := '100 Main';
   l_address.postal_code := '06896';
   l_address.city := 'Redding';
   l_address.state_province := 'CT';
   l_address.country_id := 'US';

   INSERT INTO qz_customers (id, customer_name, customer_address)
        VALUES (1, 'ACME', l_address);

   SELECT COUNT (*) INTO l_count FROM qz_customers;

   DBMS_OUTPUT.put_line ('Count=1');
END;
/

(E)
DECLARE
   l_address   qz_address_ot;
   l_count integer;
BEGIN
   l_address :=
      qz_address_ot (NULL,
                     NULL,
                     NULL,
                     NULL,
                     NULL);
   l_address.street_address := '100 Main';
   l_address.postal_code := '06896';
   l_address.city := 'Redding';
   l_address.state_province := 'CT';
   l_address.country_id := 'US';

   INSERT INTO qz_customers (id, customer_name, customer_address)
        VALUES (1, 'ACME', l_address);

   SELECT COUNT (*) INTO l_count FROM qz_customers;

   DBMS_OUTPUT.put_line ('Count=1');
END;
/


认证徽章
论坛徽章:
3
蒙奇·D·路飞
日期:2016-06-30 14:41:43秀才
日期:2017-04-05 13:18:06秀才
日期:2017-04-05 13:22:59
发表于 2017-3-4 12:45 | 显示全部楼层
答案:AE

B没有初始化,C中应该是extend用法不对,D调用类型qz_address_ot()参数个数不够。

使用道具 举报

回复
论坛徽章:
1
2016猴年福章
日期:2016-02-23 09:58:34
发表于 2017-3-5 11:06 | 显示全部楼层
应该是二楼得奖,答案是:AE,不过我来补充一下,不知道对不对,
A:在声明嵌套表变量的时候用构造器(同嵌套表类型)进行初始化,最常用的方法。
B:嵌套表必须使用构造器进行初始化后才可以使用,没有初始化的嵌套表被自动赋值 为null.如果引用一个没有初始化的嵌套表,会产生collection_is_null异常
c,没有初始化就不能使用.extend扩展进行元素的添加,不过extend的用法是:1extend:在当前嵌套表的末尾添加一个元素,值 为null;2,entend(n)在当前嵌套表的末尾添加n个元素,值 为null 3,extend(n,i)在当前嵌套表的末尾添加n个元素,值 为索引值为i的元素的值。
d,没有在声明时初始化,但在程序体运用了不带参数的构造器,会创建一个没有元素的嵌套表,没有进行元素的扩展,不对。
e:在程序体运用带null参数的构造器,null的个数与嵌套表类型元素分量的个数一致,在插入嵌套表第一条记录时不需要扩展,如再插入则需再扩展。

使用道具 举报

回复
论坛徽章:
394
阿斯顿马丁
日期:2014-01-03 13:53:522014年世界杯参赛球队:喀麦隆
日期:2014-07-11 12:10:53马上有对象
日期:2014-04-09 16:19:542014年世界杯参赛球队: 洪都拉斯
日期:2014-06-25 08:25:55itpub13周年纪念徽章
日期: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
发表于 2017-3-5 21:38 | 显示全部楼层
总觉得对象很麻烦,直接用表结构不挺好,省得表变了就改代码

使用道具 举报

回复
论坛徽章:
480
榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12秀才
日期:2015-11-23 10:03:12状元
日期:2015-11-23 10:04:09举人
日期:2015-11-23 10:04:09
 楼主| 发表于 2017-3-7 05:58 | 显示全部楼层
答案AE, 2楼得奖。

A:(推荐)
我用了一个构建函数来为一个实例的每个属性赋值,然后把它用于INSERT
B: 看起来都不错,但你必须在调用构建函数对一个对象类型实例进行初始化之后,才能为它的属性赋值。
C: EXTEND方法只能适用于嵌套表和可变数组,而不是对象类型。
D: 我调用了构建函数,但是我没有向它传入任何值。这对于集合的构建函数是没问题的,但是对于对象类型实例,你必须为每个属性提供一个值,才能调用缺省的构建函数。
E:(不推荐)
现在我调用了构建函数,为每个属性传入NULL,然后我用所需的值覆盖了这些NULL。你可以这么做,但为什么不直接在构建函数直接传入这些值呢?

使用道具 举报

回复

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

本版积分规则

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