oracle 几个特殊函数dump()、convert()、substrb()、lengthb().doc 立即下载
2024-08-19
约4千字
约5页
0
42KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

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

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

预览

在线预览结束,喜欢就下载吧,查找使用更方便

10 金币

下载文档

如果您无法下载资料,请参考说明:

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),这样的定义方式可以确保字段有足够的空间储存需要的字符,无论这些字
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

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

文档大小:42KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用