Cool SQL function: DUMP

征求了Eddie Awad的意见,计划以后不定期地翻译一些他的文章,这次先来一个比较简单的,也是Eddie昨天刚写的 – Cool SQL function: DUMP

Cool SQL function:DUMP

我注意到在Tom Kyte的新书中,他多次使用了DUMP函数来获得一些内部的存储样式以及指定表达式的大小。老实说,我不怎么常使用这个函数,但是在某些情况下这个函数确实很有用。

语法摘自Oracle documentation

DUMP(expr[, return_fmt
            [, start_position [, length ] ]
         ]
    )

DUMP函数返回一个包含了数据类型,字节长度和内部存储形式的VARCHAR2值。返回值通常是符合自己数据库的字符集类型的。

比如:


HR@XE> select dump('hello') from dual;

DUMP('HELLO')
---------------------------------
Typ=96 Len=5: 104,101,108,108,111

返回值告诉我们”hello”字串的长度是5ge字节,内部存储格式是”104,101,108,108,111″,数据类型是96,表示是字符串。Oracle文档给出了完整的类型代码以及说明

默认是10进制格式,我们当然也可以转化成八进制,十六进制,甚至转成单个字符的样式。

比如,转成8进制

HR@XE> select dump('hello',8) from dual;

DUMP('HELLO',8)
---------------------------------
Typ=96 Len=5: 150,145,154,154,157

转成16进制:

HR@XE> c/8/16
  1* select dump('hello',16) from dual
HR@XE> /

DUMP('HELLO',16)
----------------------------
Typ=96 Len=5: 68,65,6c,6c,6f

转成单个字符:

HR@XE> c/16/17
  1* select dump('hello',17) from dual
HR@XE> /

DUMP('HELLO',17)
-----------------------
Typ=96 Len=5: h,e,l,l,o

默认情况下,返回值不包含字符集信息,如果我们想获得字符集信息的话,可以在转化字上加1000。比如,1017(用以替换17)表示返回单个字符样式并且同时返回字符集信息。

HR@XE> c/17/1017
  1* select dump('hello',1017) from dual
HR@XE> /

DUMP('HELLO',1017)
-------------------------------------------------
Typ=96 Len=5 CharacterSet=WE8MSWIN1252: h,e,l,l,o

只要指定开始位置和长度,你也同样可以要求Oracle只返回内部存储值的一部分。

HR@XE> select dump('hello',17,1,3) from dual;

DUMP('HELLO',17,1,3
-------------------
Typ=96 Len=5: h,e,l

注意返回值里面的长度仍然是5,也就是说只有内部存储值这个部分才被截取了。

有些好奇,又没有人在自己的产品环境中使用了DUMP函数,并且整个程序的逻辑都是根据这个函数的返回值来运行的呢?

— 全文完

译者注:Eddie的blog上提供了多种语言的翻译,使用的应该是一个WP的插件,但是实际上翻译效果是让人忍俊不禁的,比如翻成中文,那么这篇blog的题目就变成了“凉快 SQL 作用: 转储”,OMG,凉快的作用…… 我倒是建议Eddie去掉这个功能算了。

另外,Eddie原创的几个Firefox Search Plugin for Oracle还是比较方便的,用Firefox的Oracle DBA们可以去下载来尝试一下。

4 thoughts on “Cool SQL function: DUMP

Leave a Reply

Your email address will not be published. Required fields are marked *