查看: 1416|回复: 3

[每日一题] PL/SQL Challenge 每日一题:2018-12-21 NUMBER类型

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
跳转到指定楼层
1#
发表于 2018-12-27 08:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

作者:Kim Berg Hansen

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

我有一个不完整的CREATE TABLE建表语句


create table qz_some_numbers (
##REPLACE##
)
/

哪些选项包含了一个小数点后三位的NUMBER型列,可以取代##REPLACE##使得CREATE TABLE 执行不出错,在创建表之后下列的INSERT执行不出错,并且查询会返回所示的输出(注意最后一个值被舍入到小数点后三位):

insert into qz_some_numbers values (12.34  )
/
insert into qz_some_numbers values (12.345 )
/
insert into qz_some_numbers values (12.3456)
/
select a_number from qz_some_numbers order by a_number
/

  A_NUMBER
----------
     12.34
    12.345
    12.346

(A)
a_number    number(0, 3)

(B)
a_number    number(3, 3)

(C)
a_number    number(5, 3)

(D)
a_number    number(38, 3)

(E)
   a_number    number(100, 3)

(F)
   a_number    number(*, 3)

(G)
  a_number    number(data_scale => 3)
  
(H)
  a_number    number(3)

(I)
a_number    number(3, 0)

(J)
a_number    number(3, *)      
论坛徽章:
548
生肖徽章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:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
2#
发表于 2018-12-27 10:47 | 只看该作者
答案: CDF

you can also specify a precision (total number of digits) and scale (number of digits to the right of the decimal point):
column_name NUMBER (precision, scale)

A: 精度范围 1~38,0 不对
B: (3,3)精度为3,小数范围也为3,整数部分插不进
C: (5, 3) 精度为5,小数范围为3,整数部分长度就为2 正确
D: 精度最多38,小数范围为3,也对
E: 精度最大38
F:  number(*, 3),可以这样定义,只指定小数范围,而没有精度;应该就是38,默认精度
G: 这个可不是函数传参,不能这样用 data_scale => 3
H:  number(3) 等价于 number(3,0)
I : number(3, 0) 只能存3位及以内的整数
J:  ORA-01728: numeric scale specifier is out of range (-84 to 127)

使用道具 举报

回复
论坛徽章:
72
秀才
日期:2019-05-24 13:29:27秀才
日期:2019-03-04 14:02:03秀才
日期:2019-03-04 14:02:03秀才
日期:2019-03-04 14:02:03秀才
日期:2019-03-04 14:01:25秀才
日期:2018-12-05 13:58:28秀才
日期:2018-12-05 13:52:27秀才
日期:2018-11-13 15:18:40秀才
日期:2018-11-13 15:18:40秀才
日期:2018-11-13 15:18:40
3#
发表于 2018-12-27 15:23 | 只看该作者
统一楼上,但是我的结果是: 第一个会自动补零
A_NUMBER
----------
    12.340
    12.345
    12.346

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期: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
4#
 楼主| 发表于 2018-12-27 23:54 | 只看该作者
答案CDF, 2楼得奖。

A: 将精度指定为0是无效的,所以CREATE TABLE会报错:
ORA-01727: numeric precision specifier is out of range (1 to 38).
B: 此处CREATE TABLE 成功了,但是我们指定了的精度为3, 而我们想要插入的值需要更大的精度,所以所有的INSERT语句报错:
ORA-01438: value larger than specified precision allowed for this column.
所以测试查询不会返回数据。
C: 当指定精度为5我们就可以插入所有三个值,不会出问题,并且得到所要的输出。
D: 38位是允许的最大值,当然满足了我们的要求,所以我们得到了所要的输出。
E: 100位精度太大了,这是不允许的。CREATE TABLE会报错:
ORA-01727: numeric precision specifier is out of range (1 to 38).
F: 用 * 号指定精度是可以的,意味着最大的精度而不用说明。
G: 如果是一个PL/SQL函数,你可以用参数名来指定位数而不是前一选项中的*,但是这里是不允许这种语法的,所以CREATE TABLE会报错:
ORA-01727: numeric precision specifier is out of range (1 to 38).
H: 当我们只指定一个参数,那么它就是精度,小数点之后位数缺省为0,所以这就正如指定NUMBER(3, 0), 于是会得到这个错误输出:

  A_NUMBER
----------
        12
        12
        12

I: 手动指定小数点位数为0不会有任何区别,这和前一选项一样,得到相同的错误输出。
J:小数点位数不能用*来指明“最大可能位数”。这是无效的,CREATE TABLE会报错:
error: ORA-01728: numeric scale specifier is out of range (-84 to 127).

使用道具 举报

回复

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

本版积分规则 发表回复

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