oracle 几个特殊函数dump()、convert()、substrb()、lengthb().docVIP

oracle 几个特殊函数dump()、convert()、substrb()、lengthb().doc

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
oracle 几个特殊函数dump()、convert()、substrb()、lengthb()

一、DUMP()函数DUMP(w[,x[,y[,z]]])【功能】返回数据类型、字节长度和在内部的存储位置.【参数】 w为各种类型的字符串(如字符型、数值型、日期型……) x为返回位置用什么方式表达,可为:8,10,16或17,分别表示:8/10/16进制和字符型,默认为10。 y和z决定了内部参数位置【返回】类型 [长度],符号/指数位 [数字1,数字2,数字3,......,数字20]如:Typ=2 Len=7: 60,89,67,45,23,11,102SELECT DUMP(ABC,1016) FROM dual;  返回结果为:Typ=96 Len=3 CharacterSet=ZHS16GBK: 41,42,43   代码 数据类型  0 对应 VARCHAR2  1 对应 NUMBER  8 对应 LONG  12 对应 DATE  23 对应 RAW  24 对应 LONG RAW  69 对应 ROWID  96 对应 CHAR  106 对应 MSSLABEL 各位的含义如下:1.类型: Number型,Type=2 (类型代码可以从Oracle的文档上查到)2.长度:指存储的字节数3.符号/指数位在存储上,Oracle对正数和负数分别进行存储转换:正数:加1存储(为了避免Null)负数:被101减,如果总长度小于21个字节,最后加一个102(是为了排序的需要)指数位换算:正数:指数=符号/指数位 - 193 (最高位为1是代表正数) 负数:指数=62 - 第一字节4.从数字1开始是有效的数据位从数字1开始是最高有效位,所存储的数值计算方法为:将下面计算的结果加起来:每个数字位乘以100^(指数-N) (N是有效位数的顺序位,第一个有效位的N=0)5、举例说明SQL select dump(123456.789) from dual;返回:Typ=2 Len=6: 195,13,35,57,79,91 指数: 195 - 193 = 2 数字1 13 - 1 = 12 *100^(2-0) 120000 数字2 35 - 1 = 34 *100^(2-1) 3400 数字3 57 - 1 = 56 *100^(2-2) 56 数字4 79 - 1 = 78 *100^(2-3) .78 数字5 91 - 1 = 90 *100^(2-4) .009   123456.789 SQL select dump(-123456.789) from dual;返回:Typ=2 Len=7: 60,89,67,45,23,11,102算法:指数 62 - 60 = 2(最高位是0,代表为负数) 数字1 101 - 89 = 12 *100^(2-0) 120000 数字2 101 - 67 = 34 *100^(2-1) 3400 数字3 101 - 45 = 56 *100^(2-2) 56 数字4 101 - 23 = 78 *100^(2-3) .78 数字5 101 - 11 = 90 *100^(2-4) .009   123456.789(-) 现在再考虑一下为什么在最后加102是为了排序的需要,-123456.789在数据库中实际存储为60,89,67,45,23,11 而-123456.78901在数据库中实际存储为 60,89,67,45,23,11,91 可见,如果不在最后加上102,在排序时会出现-123456.789-123456.78901的情况。 二、substrb函数substr和substrb 以前知道有substrb,lengthb等函数,也知道它们是以byte来计算长度,可没用过,也不太明白什么地方需要用到它们。一直就是用substr,length,以字符来计算长度,在我看来varchar2和char里面存的都是字符,那么自然也就不可能以byte为单位来计算长度,也就用不到这些函数了,但事实证明我错了。最近有个procedure出错,往表里insert时总是报1401错误,看了一下程序,觉得问题很奇怪,目标表出错字段的长度是50,insert的对应这个字段的取法也是substr(**,1,50),怎么会出错呢?有些怀疑是汉字字符为双字节的原因,于是试着将substr(**,1,50)改为了substr(**,1,25),果然ok。上网找原因,在asktom上找到了解答。数据库里的varchar2和char字段长度定义是有两种方式,按字节或按字符,按字节定义长度的方式是varchar2

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档