感于L些网友提Z些非常基的问题,比如有没有实现某某功能的函数啊,某某函数是做什么用的啊Q格式是什么等{,同时也感受到自己对oracle函数认识的不I于是集中月余旉专注于oracle函数Q小有心(j)得不敢私藏,发之与诸公共享?
本文q不准备介绍全部的oracle函数Q当前情势下Q俺也还没这个时_(d)需要学?fn)的东西太多了(jin),要把多数旉花在学?fn)l常能用上的技术方?)Q所以如果是准备深入?jin)解所有oracle函数的朋友,q是d注:(x)Oracle SQL Reference官方文档更靠׃些?
本文更多会(x)介绍三思在日常中经怼(x)用到的,或者虽然很用刎ͼ但是感觉挺有意思的一些函数。分二类介绍Q分别是Q?
著名函数 Q经常用到的函数
非著名函数篇Q即虽然很少用到Q但某些情况下却很实?
注:(x)N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略Qfmt表示格式?
单值函数在查询中返回单个|可被应用到selectQwhere子句Qstart with以及(qing)connect by 子句和having子句?
(一).数值型函数(Number Functions)
数值型函数输入数字型参数ƈq回数值型的倹{多数该cd数的q回值支?8位小数点Q诸如:(x)COS, COSH, EXP, LN, LOG,
SIN, SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and
ATAN2支持30位小数点?
1、MOD(n1,n2) q回n1除n2的余敎ͼ如果n2=0则返回n1的倹{?
例如QSELECT MOD(24,5) FROM DUAL;
2?
ROUND(n1[,n2])
q回四舍五入数点右边n2位后n1的|n2~省gؓ(f)0Q如果n2数就舍入到小数点左边相应的位?虽然oracle
documents上提到n2的值必Mؓ(f)整数Q事实上执行时此处的判断q不严}Q即使n2为非整数Q它也会(x)自动n2取整后做处理Q但是我文档中其它提到必Mؓ(f)整的地方需要特别注意,如果不ؓ(f)整执行时?x)报错??
例如QSELECT ROUND(23.56),ROUND(23.56,1),ROUND(23.56,-1) FROM DUAL;
3、TRUNC(n1[,n2] q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时?x)将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?
例如QSELECT TRUNC(23.56),TRUNC(23.56,1),TRUNC(23.56,-1) FROM DUAL;
(?.字符型函数返回字W?Character Functions Returning Character Values)
该类函数q回与输入类型相同的cd?
q回的CHARcd值长度不过2000字节Q?
q回的VCHAR2cd值长度不过4000字节Q?
如果上述应返回的字符长度出Qoracleq不?x)报错而是直接截断x大可支持长度q回?
q回的CLOBcd值长度不过4GQ?
对于CLOBcd的函敎ͼ如果q回值长度超出,oracle不会(x)q回M错误而是直接抛出错误?
1、LOWER(c) 指定字W串内字W变为小写,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOBcd
例如QSELECT LOWER('WhaT is tHis') FROM DUAL;
2、UPPER(c) 指定字W串内字W变为大写,支持CHAR,VARCHAR2,NCHAR,NVARCHAR2,CLOB,NCLOBcd
例如QSELECT UPPER('WhaT is tHis') FROM DUAL;
3、LPAD(c1,n[,c2]) q回指定长度=n的字W串Q需要注意的有几点:(x)
如果n<c1.length则从叛_左截取指定长度返回;
如果n>c1.length and c2 is nullQ以I格从左向右补充字符长度至nq返回;
如果n>c1.length and c2 is not nullQ以指定字符c2从左向右补充c1长度至nq返回;
例如QSELECT LPAD('WhaT is tHis',5),LPAD('WhaT is tHis',25),LPAD('WhaT is tHis',25,'-') FROM DUAL;
最后大家再猜一猜,如果n<0Q结果会(x)怎么?
4、RPAD(c1,n[,c2]) q回指定长度=n的字W串Q基本与上同Q不q补充字W是从右向左方向正好与上相反Q?
例如QSELECT RPAD('WhaT is tHis',5),RPAD('WhaT is tHis',25),RPAD('WhaT is tHis',25,'-') FROM DUAL;
5、TRIM([[LEADING||TRAILING||BOTH] c2 FROM] c1) 哈哈Q被俺无敌的形容方式搞晕头了(jin)吧,q个地方q是看图更明?jin)一些?
看v来很复杂Q理解v来很单:(x)
如果没有指定M参数则oracle去除c1头尾I格
例如QSELECT TRIM(' WhaT is tHis ') FROM DUAL;
如果指定?jin)c2参数Q则oracleLc1头尾c2(q个l致试Q有多种不同情Ş的哟)
例如QSELECT TRIM('W' FROM 'WhaT is tHis w W') FROM DUAL;
如果指定?jin)leading参数则会(x)Lc1头部c2
例如QSELECT TRIM(leading 'W' FROM 'WhaT is tHis w W') FROM DUAL;
如果指定?jin)trailing参数则会(x)Lc1Nc2
例如QSELECT TRIM(trailing 'W' FROM 'WhaT is tHis w W') FROM DUAL;
如果指定?jin)both参数则会(x)Lc1头尾c2(跟不指定有区别吗Q没区别Q?
例如QSELECT TRIM(both 'W' FROM 'WhaT is tHis w W') FROM DUAL;
注意Qc2长度=1
6、LTRIM(c1[,c2]) 千万表以Z上面那个长的像,功能也与上面的类|本函数是从字W串c1左侧截取掉与指定字符串c2相同的字Wƈq回。如果c2为空则默认截取空根{?
例如QSELECT LTRIM('WWhhhhhaT is tHis w W','Wh') FROM DUAL;
7、RTRIM(c1,c2)与上同,不过方向相反
例如QSELECT RTRIM('WWhhhhhaT is tHis w W','W w') FROM DUAL;
8、REPLACE(c1,c2[,c3]) c1字符串中的c2替换为c3Q如果c3为空Q则从c1中删除所有c2?
例如QSELECT REPLACE('WWhhhhhaT is tHis w W','W','-') FROM DUAL;
9、SOUNDEX(c) 奇的函数啊Q该函数q回字符串参数的语音表示形式Q对于比较一些读音相同,但是拼写不同的单词非常有用。计语音的法如下Q?
保留字符串首字母Q但删除a、e、h、i、o、w、y?
下表中的数字赋l相对应的字母:(x)
1Qb、f、p、v
2Qc、g、k、q、s、x、z
3Qd、t
4Ql
5Qm、n
6QR
如果字符串中存在拥有相同数字?个以上(包含2个)(j)的字母在一P例如b和fQ,或者只有h或wQ则删除其他的,只保?个;
只返回前4个字节,不够?填充
例如QSELECT SOUNDEX('dog'),soundex('boy') FROM DUAL;
10、SUBSTR(c1,n1[,n2]) 截取指定长度的字W串。稍不注意就可能充满?jin)陷q函数?
n1=开始长度;
n2=截取的字W串长度Q如果ؓ(f)I,默认截取到字W串l尾Q?
?如果n1=0 then n1=1
?如果n1>0Q则oracle从左向右认起始位置截取
例如QSELECT SUBSTR('What is this',5,3) FROM DUAL;
?如果n1<0Q则oracle从右向左数确认v始位|?
例如QSELECT SUBSTR('What is this',-5,3) FROM DUAL;
?如果n1>c1.length则返回空
例如QSELECT SUBSTR('What is this',50,3) FROM DUAL;
然后再请你猜猜,如果n2<1Q会(x)如何q回值呢
11?
TRANSLATE(c1,c2,c3)
功能而言Q此函数与replace有些怼。但需要注意的一Ҏ(gu)Qtranslate是绝对匹配替换,q点与replace函数h非常大区别。什么是l对匚w替换呢?单的_(d)是将字符串c1中按一定的格式c2替换为c3。如果文字Ş容仍然无法理解,我们通过几具实例来说明:(x)
例如Q?
SELECT TRANSLATE('What is this','','-') FROM DUAL;
SELECT TRANSLATE('What is this','-','') FROM DUAL;
l果都是I。来试试q个Q?
SELECT TRANSLATE('What is this',' ',' ') FROM DUAL;
再来看这个:(x)
SELECT TRANSLATE('What is this','ait','-*') FROM DUAL;
是否明白?jin)点呢?Replace函数理解比较单,它是字W串中指定字W替换成其它字符Q它的字W必Lq箋的。而translate中,则是指定字符?
c1中出现的c2Q将c2中各个字W替换成c3中位|顺序与其相同的c3中的字符。明白了(jin)QReplace是替换,而translate则像是过?/p>
(?.字符型函数返回数字?Character Functions Returning Number Values)
本类函数支持所有的数据cd
1、INSTR(c1,c2[,n1[,n2]]) q回c2在c1中位|?
c1:原字W串
c2:要寻扄字符?
n1:查询起始位置Q正DCZ左到叻I负DCZ叛_?(大小表示位置,比如3表示左面W?处开?-3表示右面W?处开?。黑黑,如果?的话Q则q回的也?
n2:W几个匹配项。大?
例如QSELECT INSTR('abcdefg','e',-3) FROM DUAL;
2、LENGTH(c) q回指定字符串的长度。如?
例如QSELECT LENGTH('A123?) FROM DUAL;
猜猜SELECT LENGTH('') FROM DUAL;的返回值是什?
(?.日期函数(Datetime Functions)
本类函数中,除months_betweenq回数值外Q其它都返回日期?
1、ADD_MONTHS() q回指定日期月䆾+n之后的|n可以ZQ何整数?
例如QSELECT ADD_MONTHS(sysdate,12),ADD_MONTHS(sysdate,-12) FROM DUAL;
2、CURRENT_DATE q回当前session所在时区的默认旉
例如Q?
SQL> alter session set nls_date_format = 'mm-dd-yyyy' ;
SQL> select current_date from dual;
3?
SYSDATE
功能与上相同Q返回当前session所在时区的默认旉。但是需要注意的一Ҏ(gu)Q如果同时用sysdate与current_date获得的时间不一
定相同,某些情况下current_date?x)比sysdate快一U。经q与xyf_tck(兄台的大作ORACLE的工作机制写的很好,深入出)?
短暂交流Q我们认为current_date是将current_timestamp中毫U四舍五入后的返回,虽然没有扑ֈ文档支持Q但是想来应该八?ji)?
d。同Ӟ仅是某些情况下会(x)有一U的误差Q一般情况下q不?x)对你的操作造成影响Q所以了(jin)解即可?
例如QSELECT SYSDATE,CURRENT_DATE FROM DUAL;
4、LAST_DAY(d) q回指定旉所在月的最后一?
例如QSELECT last_day(SYSDATE) FROM DUAL;
5、NEXT_DAY(d,n) q回指定日期后第一个n的日期,nZ周中的某一天。但是,需要注意的是n如果为字W的话,它的星期形式需要与当前session默认时区中的星期形式相同?
例如Q三思用的中文ntQnls_languagegؓ(f)SIMPLIFIED CHINESE
SELECT NEXT_DAY(SYSDATE,5) FROM DUAL;
SELECT NEXT_DAY(SYSDATE,'星期?) FROM DUAL;
两种方式都可以取到正的q回Q但是:(x)
SELECT NEXT_DAY(SYSDATE,'Thursday') FROM DUAL;
则会(x)执行出错Q提供你说周中的日无效,是q个原因?jin)?
6、MONTHS_BETWEEN(d1,d2) q回d1与d2间的月䆾差,视d1,d2的值大,l果可正可负Q当然也有可能ؓ(f)0
例如Q?
SELECT months_between(SYSDATE, sysdate),
months_between(SYSDATE, add_months(sysdate, -1)),
months_between(SYSDATE, add_months(sysdate, 1))
FROM DUAL;
7、ROUND(d[,fmt]) 前面讲数值型函数的时候介l过ROUNDQ此处与上功能基本相|不过此处操作的是日期。如果不指定fmt参数Q则默认q回距离指定日期最q的日期?
例如QSELECT ROUND(SYSDATE,'HH24') FROM DUAL;
8、TRUNC(d[,fmt]) 与前面介l的数值型TRUNC原理相同Q不q此处也是操作的日期型?
例如QSELECT TRUNC(SYSDATE,'HH24') FROM DUAL;
(?.转换函数(Conversion Functions)
转换函数指定字W从一U类型{换ؓ(f)另一U,通常q类函数遵@如下惯例Q函数名U后面跟着待{换类型以?qing)输出类型?
1、TO_CHAR() 本函数又可以分三类Q分别是
转换字符->字符TO_CHAR(c)Q将nchar,nvarchar2,clob,nclobcd转换为charcdQ?
例如QSELECT TO_CHAR('AABBCC') FROM DUAL;
转换旉->字符TO_CHAR(d[,fmt])Q将指定的时?data,timestamp,timestamp with time zone)按照指定格式转换为varchar2cdQ?
例如QSELECT TO_CHAR(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
转换数?>字符TO_CHAR(n[,fmt])Q将指定数值n按照指定格式fmt转换为varchar2cdq返回;
例如QSELECT TO_CHAR(-100, 'L99G999D99MI') FROM DUAL;
2?
TO_DATE(c[,fmt[,nls]])
char,nchar,varchar2,nvarchar2转换为日期类型,如果fmt参数不ؓ(f)I,则按照fmt中指定格式进行{换。注意这里的
fmt参数。如果ftm?J'则表C按照公元制(Julian day)转换Qc则必Mؓ(f)大于0q小?373484的正整数?
例如Q?
SELECT TO_DATE(2454336, 'J') FROM DUAL;
SELECT TO_DATE('2007-8-23 23:25:00', 'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
Z么公元制的话Qc的值必M大于5373484呢?因ؓ(f)Oracle的DATEcd的取D围是公元?712q??日至公元9999q?2?1日。看看下面这个语句:(x)
SELECT TO_CHAR(TO_DATE('9999-12-31','yyyy-mm-dd'),'j') FROM DUAL;
3、TO_NUMBER(c[,fmt[,nls]]) char,nchar,varchar2,nvarchar2型字串按照fmt中指定格式{换ؓ(f)数值类型ƈq回?
例如QSELECT TO_NUMBER('-100.00', '9G999D99') FROM DUAL;
(?.其它辅助函数(Miscellaneous Single-Row Functions)
1、DECODE(exp,s1,r1,s2,r2..s,r[,def]) 可以把它理解成一个增强型的if elseQ只不过它ƈ不通过多行语句Q而是在一个函数内实现if else的功能?
exp做ؓ(f)初始参数。s做ؓ(f)Ҏ(gu)|相同则返回rQ如果s有多个,则持l遍历所有sQ直到某个条件ؓ(f)真ؓ(f)止,否则q回默认值def(如果指定?jin)的?Q如果没有默认|q且前面的对比也都没有ؓ(f)真,则返回空?
毫无疑问Qdecode是个非常重要的函敎ͼ在实现行转列{功能时都会(x)用到Q需要牢记和熟练使用?
例如Qselect decode('a2','a1','true1','a2','true2','default') from dual;
2、GREATEST(n1,n2,...n) q回序列中的最大?
例如QSELECT GREATEST(15,5,75,8) "Greatest" FROM DUAL;
3、LEAST(n1,n2....n) q回序列中的最?
例如QSELECT LEAST(15,5,75,8) LEAST FROM DUAL;
4、NULLIF(c1,c2)
Nullif也是个很有意思的函数。逻辑{h(hun)于:(x)CASE WHEN c1 = c2 THEN NULL ELSE c1 END
例如QSELECT NULLIF('a','b'),NULLIF('a','a') FROM DUAL;
5、NVL(c1,c2) 逻辑{h(hun)于IF c1 is null THEN c2 ELSE c1 END。c1,c2可以是Q何类型。如果两者类型不同,则oracle?x)自动将c2转换为c1的类型?
例如QSELECT NVL(null, '12') FROM DUAL;
6、NVL2(c1,c2,c3) 大家可能都用到nvlQ但你用qnvl2吗?如果c1非空则返回c2,如果c1为空则返回c3
例如Qselect nvl2('a', 'b', 'c') isNull,nvl2(null, 'b', 'c') isNotNull from dual;
7、SYS_CONNECT_BY_PATH(col,c) 该函数只能应用于?wi)状查询。返回通过c1q接的从根到节点的\径。该函数必须与connect by 子句共同使用?
例如Q?
create table tmp3(
rootcol varchar2(10),
nodecol varchar2(10)
);
insert into tmp3 values ('','a001');
insert into tmp3 values ('','b001');
insert into tmp3 values ('a001','a002');
insert into tmp3 values ('a002','a004');
insert into tmp3 values ('a001','a003');
insert into tmp3 values ('a003','a005');
insert into tmp3 values ('a005','a008');
insert into tmp3 values ('b001','b003');
insert into tmp3 values ('b003','b005');
select lpad(' ', level*10,'=') ||'>'|| sys_connect_by_path(nodecol,'/')
from tmp3
start with rootcol = 'a001'
connect by prior nodecol =rootcol;
8、SYS_CONTEXT(c1,c2[,n]) 指定命名空间c1的指定参数c2的值按照指定长度n截取后返回?
Oracle9i提供内置?jin)一个命名空间USERENVQ描qC(jin)当前session的各信息,其拥有下列参敎ͼ(x)
?CURRENT_SCHEMA:当前模式名;
?CURRENT_USER:当前用户Q?
?IP_ADDRESS:当前客户端IP地址Q?
?OS_USER:当前客户?a title="操作pȝ" target="_blank" style="color: #000000;">操作pȝ用户Q?
{等数十,更详l的参数列还请大家直接参考Oracle Online Documents
例如QSELECT SYS_CONTEXT('USERENV', 'SESSION_USER') FROM DUAL;
注:(x)N表示数字型,C表示字符型,D表示日期型,[]表示内中参数可被忽略Qfmt表示格式?
单值函数在查询中返回单个|可被应用到selectQwhere子句Qstart with以及(qing)connect by 子句和having子句?
(一).数值型函数(Number Functions)
?
值型函数输入数字型参数ƈq回数值型的倹{多数该cd数的q回值支?8位小数点Q诸如:(x)COS, COSH, EXP, LN, LOG, SIN,
SINH, SQRT, TAN, and TANH 支持36位小数点。ACOS, ASIN, ATAN, and ATAN2支持30位小数点?
1、ABS(n) q回数字的绝对?
例如QSELECT ABS(-1000000.01) FROM DUAL;
2、COS(n) q回n的余弦?
例如QSELECT COS(-2) FROM DUAL;
3、ACOS(n) 反余弦函敎ͼn between -1 and 1Q返回值between 0 and pi?
例如QSELECT ACOS(0.9) FROM DUAL;
4、BITAND(n1,n2) 位与q算Q这个太有意思了(jin)Q虽然没惛_可能用到哪里Q详l说明一下:(x)
假设3,9做位与运,3的二q制形式为:(x)0011Q?的二q制形式为:(x)1001Q则l果?001Q{换成10q制Cؓ(f)1?
例如QSELECT BITAND(3,9) FROM DUAL;
5、CEIL(n) q回大于或等于n的最的整数?
例如QSELECT ceil(18.2) FROM DUAL;
考你一下,猜猜ceil(-18.2)的g(x)是什么呢
6、FLOOR(n) q回于{于n的最大整数?
例如QSELECT FLOOR(2.2) FROM DUAL;
再猜猜floor(-2.2)的g(x)是什么呢
7、BIN_TO_NUM(n1,n2,....n) 二进制{向十q制
例如QSELECT BIN_TO_NUM(1),BIN_TO_NUM(1,0),BIN_TO_NUM(1,1) FROM DUAL;
8、SIN(n) q回n的正玄?n为弧度?
例如QSELECT SIN(10) FROM DUAL;
9、SINH(n) q回n的双曲正玄?n为弧度?
例如QSELECT SINH(10) FROM DUAL;
10、ASIN(n) 反正玄函敎ͼn between -1 and 1Q返回值between pi/2 and -pi/2?
例如QSELECT ASIN(0.8) FROM DUAL;
11、TAN(n) q回n的正切?n为弧?
例如QSELECT TAN(0.8) FROM DUAL;
12、TANH(n) q回n的双曲正切?n为弧?
例如QSELECT TANH(0.8) FROM DUAL;
13、ATAN(n) 反正切函敎ͼn表示弧度Q返回值between pi/2 and -pi/2?
例如QSELECT ATAN(-444444.9999999) FROM DUAL;
14、EXP(n) q回e的nơ幂Qe = 2.71828183 ...
例如QSELECT EXP(3) FROM DUAL;
15、LN(n) q回n的自然对敎ͼn>0
例如QSELECT LN(0.9) FROM DUAL;
16、LOG(n1,n2) q回以n1为底n2的对敎ͼn1 >0 and not 1 Qn2>0
例如QSELECT LOG(1.1,2.2) FROM DUAL;
17、POWER(n1,n2) q回n1的n2ơ方。n1,n2可以ZQ意数|不过如果m是负敎ͼ则n必须为整?
例如QSELECT POWER(2.2,2.2) FROM DUAL;
18、SIGN(n) 如果n<0q回-1,如果n>0q回1Q如果n=0q回0.
例如QSELECT SIGN(14),SIGN(-14),SIGN(0) FROM DUAL;
19、SQRT(n) q回n的^Ҏ(gu),n为弧度。n>=0
例如QSELECT SQRT(0.1) FROM DUAL;
(?.字符型函数返回字W?Character Functions Returning Character Values)
该类函数q回与输入类型相同的cd?
?q回的CHARcd值长度不过2000字节Q?
?q回的VCHAR2cd值长度不过4000字节Q?
如果上述应返回的字符长度出Qoracleq不?x)报错而是直接截断x大可支持长度q回?
?q回的CLOBcd值长度不过4GQ?
对于CLOBcd的函敎ͼ如果q回值长度超出,oracle不会(x)q回M错误而是直接抛出错误?
1、CHR(N[ USING NCHAR_CS]) q回指定数值在当前字符集中对应的字W?
例如QSELECT CHR(95) FROM DUAL;
2、CONCAT(c1,c2) q接字符Ԍ{同于||
例如QSELECT concat('aa','bb') FROM DUAL;
3、INITCAP(c) 字W串中单词的W一个字母{换ؓ(f)大写Q其它则转换为小?
例如QSELECT INITCAP('whaT is this') FROM DUAL;
4、NLS_INITCAP(c) q回指定字符Ԍq将字符串中W一个字母变大写Q其它字母变写
例如QSELECT NLS_INITCAP('中华miNZHu') FROM DUAL;
它还h一个参敎ͼ(x)Nlsparam用来指定排序规则Q可以忽略,默认状态该参数为当前session的排序规则?
(?.字符型函数返回数字?Character Functions Returning Number Values)
本类函数支持所有的数据cd
1、ASCII(c) 与chr函数的用途刚刚相反,本函数返回指定字W在当前字符集下对应的数倹{?
例如QSELECT ASCII('_') FROM DUAL;
(?.日期函数(Datetime Functions)
本类函数中,除months_betweenq回数值外Q其它都返回日期?
1、CURRENT_TIMESTAMP([n]) q回当前session所在时区的日期和时间。n表示毫秒U的_ֺQ不大于6
例如QSELECT CURRENT_TIMESTAMP(3) FROM DUAL;
2、LOCALTIMESTAMP([n]) 与上同,q回当前session所在时区的日期和时间。n表示毫秒U的_ֺQ不大于6
例如QSELECT LOCALTIMESTAMP(3) FROM DUAL;
3、SYSTIMESTAMP([n]) 与上同,q回当前数据库所在时区的日期和时_(d)n表示毫秒U的_ֺQ?gt;0 and <6
例如QSELECT SYSTIMESTAMP(4) FROM DUAL;
4、DBTIMEZONE q回数据库的当前时区
例如QSELECT DBTIMEZONE FROM DUAL;
5、SESSIONTIMEZONE q回当前session所在时?
例如QSELECT SESSIONTIMEZONE FROM DUAL;
6、EXTRACT(key from date) key=(year,month,day,hour,minute,second) 从指定时间提到指定日期列
例如QSELECT EXTRACT(year from sysdate) FROM DUAL;
7、TO_TIMESTAMP(c1[,fmt]) 指定字W按指定格式转换为timestamp格式?
例如QSELECT TO_TIMESTAMP('2007-8-22', 'YYYY-MM-DD HH:MI:SS') FROM DUAL;
(?.转换函数(Conversion Functions)
转换函数指定字W从一U类型{换ؓ(f)另一U,通常q类函数遵@如下惯例Q函数名U后面跟着待{换类型以?qing)输出类型?
1、BIN_TO_NUM(n1,n2...n) 一l位向量转换为等L(fng)十进制Ş式?
例如QSELECT BIN_TO_NUM(1,1,0) FROM DUAL;
2、CAST(c as newtype) 指定字串{换ؓ(f)指定cdQ基本只对字W类型有效,比如char,number,date,rowid{。此c{换有一个专门的表列明了(jin)哪种cd可以转换为哪U类型,此处׃作酹q?
例如QSELECT CAST('1101' AS NUMBER(5)) FROM DUAL;
3、CHARTOROWID(c) 字W串转换为rowidcd
例如QSELECT CHARTOROWID('A003D1ABBEFAABSAA0') FROM DUAL;
4、ROWIDTOCHAR(rowid) 转换rowidgؓ(f)varchar2cd。返回串长度?8个字节?
例如QSELECT ROWIDTOCHAR(rowid) FROM DUAL;
5、TO_MULTI_BYTE(c) 指定字W{换ؓ(f)全角q返回charcd字串
例如QSELECT TO_MULTI_BYTE('ABC abc 中华') FROM DUAL;
6、TO_SINGLE_BYTE(c) 指定字W{换ؓ(f)半角q返回charcd字串
例如QSELECT TO_SINGLE_BYTE('QQ abc中?) FROM DUAL;
(?.其它辅助函数(Miscellaneous Single-Row Functions)
1、COALESCE(n1,n2,....n) q回序列中的W一个非I?
例如QSELECT COALESCE(null,5,6,null,9) FROM DUAL;
2、DUMP(exp[,fmt[,start[,length]]])
dump是个功能非常强?zhn)的函敎ͼ对于深入了(jin)解oracle存储的h而言相当有用。所以对于我们这些仅仅只是应用的言׃知道能将其应用于何处?jin)。此处仅介绍用法Q不对其功能做深入分析?br />
如上所C,dump拥有不少参数。其本质是以指定格式Q返回指定长度的exp的内部表CŞ式的varchar2倹{fmt?U格
式:(x)8||10||16||17Q分别表C?q制Q?0q制Q?6q制和单字符Q默认ؓ(f)10q制。start参数表示开始位|,length表示?分隔
的字串数?
例如QSELECT DUMP('abcdefg',17,2,4) FROM DUAL;
3、EMPTY_BLOB,EMPTY_CLOB q两个函数都是返回空lobcdQ通常被用于insert和update{语句以初始化lob列,或者将其置为空。EMPTY表示LOB已经被初始化Q只不过q没有用来存储数据?
4、NLS_CHARSET_NAME(n) q回指定数值对应的字符集名U?
例如QSELECT NLS_CHARSET_NAME(1) FROM DUAL;
5、NLS_CHARSET_ID(c) q回指定字符对应的字W集id?
例如QSELECT NLS_CHARSET_ID('US7ASCII') FROM DUAL;
6、NLS_CHARSET_DECL_LEN(n1,n2) q回一个NCHAR值的声明宽度(以字Wؓ(f)单位).n1是该g字节为单位的长度Qn2是该值的字符集ID
例如QSELECT NLS_CHARSET_DECL_LEN(100, nls_charset_id('US7ASCII')) FROM DUAL;
7、SYS_EXTRACT_UTC(timestamp) q回标准通用旉x林威L间?
例如QSELECT SYS_EXTRACT_UTC(current_timestamp) FROM DUAL;
8、SYS_TYPEID(object_type) q回对象cd对应的id?
例如Q这个这个,没有建立q自定义对象Q咋做示例?
9、UID q回一个唯一标识当前数据库用L(fng)整数?
例如QSELECT UID FROM DUAL;
10、USER q回当前session用户
例如QSELECT USER FROM DUAL;
11、USERENV(c) 该函数用来返回当前session的信息,据oracle文档的说明,userenv是ؓ(f)?jin)保持向下兼容的遗留函数。oracle公司推荐你用sys_context函数调用USERENV命名I间来获取相关信息,所以大家了(jin)解下p?jin)?
例如QSELECT USERENV('LANGUAGE') FROM DUAL;
12、VSIZE(c) q回c的字节数?
例如QSELECT VSIZE('abc中华') FROM DUAL;