




如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
一、DUMP()函数 DUMP(w[,x[,y[,z]]]) 【功能】返回数据类型、字节长度和在内部的存储位置. 【参数】 w为各种类型的字符串(如字符型、数值型、日期型……) x为返回位置用什么方式表达,可为:8,10,16或17,分别表示:8/10/16进制和字符型,默认为10。 y和z决定了内部参数位置 【返回】类型<[长度]>,符号/指数位[数字1,数字2,数字3,......,数字20] 如:Typ=2Len=7:60,89,67,45,23,11,102 SELECTDUMP('ABC',1016)FROMdual; 返回结果为:Typ=96Len=3CharacterSet=ZHS16GBK:41,42,43 代码数据类型 0对应VARCHAR2 1对应NUMBER 8对应LONG 12对应DATE 23对应RAW 24对应LONGRAW 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>selectdump(123456.789)fromdual; 返回:Typ=2Len=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>selectdump(-123456.789)fromdual; 返回:Typ=2Len=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(nbyte)或者char(nbyte),这也是缺省的长度定义方式,也就是说,平时我们用到的varchar2(n)或者char(n)都是按字节定义长度的,按字符定义长度的方式是varchar2(nchar)或者char(nchar),这样的定义方式可以确保字段有足够的空间储存需要的字符,无论这些字

ys****39
实名认证
内容提供者


最近下载