查看: 328|回复: 3

[每日一题] PL/SQL Challenge 每日一题:2020-6-9 VALUE

[复制链接]
论坛徽章:
526
奥运会纪念徽章:垒球
日期: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
发表于 2020-6-29 21:13 | 显示全部楼层 |阅读模式
本帖最后由 newkid 于 2020-6-30 23:26 编辑

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

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

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

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

作者:Kim Berg Hansen

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

我有一个人员信息的对象类型,还有一张基于此类型的表,里面含有一个人的信息:

create or replace type qz_person_t as object (
   id    integer
, name  varchar2(10)
);
/

create table qz_person of qz_person_t;

insert into qz_person values (qz_person_t(42, 'James'));

commit;

我想要查出表中的这个人,作为对象返回,为此写了这个未完成的查询:

select
##REPLACE##
from qz_person p;

哪些选项包含了一个表达式,可以用来取代##REPLACE## 使得查询执行不出错,并且产生一个只有一列的输出(列名无关紧要),包含这个人的信息,像下面这个SQL*Plus的输出:

QZ_PERSON_T(42, 'James')

(A)
*

(B)
p

(C)
p.*

(D)
value(p)

(E)
qz_person_t(p)

(F)
qz_person_t(value(p))


(G)
qz_person_t(id, name)


(H)
qz_person_t(p.id, p.name)


(I)
qz_person_t(value(p).id, value(p).name)


论坛徽章:
142
秀才
日期:2016-01-06 14:01:09秀才
日期:2016-02-18 10:06:46秀才
日期:2016-02-18 10:08:02秀才
日期:2016-02-18 10:08:14秀才
日期:2016-03-01 09:57:08天蝎座
日期:2016-03-18 14:23:56秀才
日期:2016-03-24 09:10:24秀才
日期:2016-03-24 09:20:52秀才
日期:2016-04-21 14:08:53秀才
日期:2016-04-21 14:11:59
发表于 2020-6-30 09:15 | 显示全部楼层
苏大侠答案都贴出来了

使用道具 举报

回复
论坛徽章:
535
生肖徽章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
发表于 2020-6-30 09:45 | 显示全部楼层
呵呵,答案也一同贴出来了

答案:DGHI       
A: 楼上已经解释了
B: ORA-00904: "P": invalid identifier,别名后面用点记号带上字段则可以访问
C: 与A同
D: 在SQL语句中,VALUE 函数,为对象表或对象视图,采用表别名作为变量,并返回表或视图的行相对应的对象实例       
E: ORA-02315: incorrect number of arguments for default constructor ,qz_person_t是构造函数,对应对象定义,需要两个参数
F: value(p) 返回行相对应的对象实例,又在外面套一层qz_person_t构造函数,这是多余的步骤;相反加了报与E同样的错
G: 对象表的字段本身也可以直接访问,外面套一层qz_person_t构造函数返回对象,但不如VALUE简洁
H: 相较G,带是别名访问字段也是可以的
I: 可以,但很愚蠢,参考D

使用道具 举报

回复
论坛徽章:
526
奥运会纪念徽章:垒球
日期: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
 楼主| 发表于 2020-6-30 23:26 | 显示全部楼层
嗯,好几年没闹乌龙了,说明确实是老了。

答案DGHI,3楼得奖。
A:
虽然是对象表,但*并不是指对象本身,而是指所有的对象属性,在这个错误的输出中,这些属性变成了列:

        ID NAME
---------- ----------
        42 James

        
B:
不能用表的别名直接检索对象,会引发错误:
ORA-00904: "P": invalid identifier.


C:
在表的别名中使用*是完全有效的,但它的意思和选项A一样,给我们带来了同样错误的输出。

D:
函数VALUE从对象表中给我们提供对象本身,而不是属性,所以这正是我们想要的。

E:
这里我们试图构造一个类型为QZ_PERSON_T的对象,但仅仅在构造函数中使用表的别名P是行不通的,会引发错误:
ORA-02315: incorrect number of arguments for default constructor.

F:
从选项D中可以看出,函数VALUE返回的是对象本身,所以这也是调用对象构造函数的错误方式,会引起与上一个选项相同的错误。

G:
当从对象表中执行SELECT时,对象的属性是作为列来使用的(就像你在选项A和C的输出中看到的那样),所以我们可以在调用QZ_PERSON_T对象构造函数时使用这些属性。

H:
当然,我们也可以用表的别名来修饰属性/列名,得到同样的结果。

I:
由于VALUE(P)返回的是对象,所以我们可以在VALUE函数的输出上使用圆点符号来检索属性ID和NAME。它最终给出的结果和前面两个选项一样,但它是复杂的和不必要的代码。

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年9月21日~23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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