22. 函数
22.1 数字函数
大多数数字函数的精度能到38位,COS、COSH、EXP、LN、LOG、SIN、SINH、SQRT、TAN、TANH能到36位
而函数ACOS、ASIN、ATAN、ATAN2只能精确到30位。
ABS(n):返回数字n的绝对值
SQL> select abs(-12.22) from dual; ABS(-12.22) ----------- 12.22
ACOS(n):返回数字n的反余弦值。 n只能是-1到1之间的数字。
SQL> select acos(12.22) from dual; select acos(12.22) from dual * 第 1 行出现错误: ORA-01428: 参数 '12.22' 超出范围 SQL> select acos(.22),acos(-0.22) from dual; ACOS(.22) ACOS(-0.22) ---------- ----------- 1.34898186 1.7926108
ASIN(n):返回数字n的反正弦值。 n只能是-1到1之间的数字
ATAN(n):返回数字n的反正切值。 n可以为任何数字
ATAN2(n,m):返回数字n/m的反正弦值。 n,m为任意数字,当m=0时,正负1.57079633
SQL> select atan2(22.223,0) from dual; ATAN2(22.223,0) --------------- 1.57079633 SQL> select atan2(-92.223,0) from dual; ATAN2(-92.223,0) ---------------- -1.5707963 --正常 SQL> select atan2(22,-11) from dual; ATAN2(22,-11) ------------- 2.03444394
CEIL(n):返回大于等于n的最小整数
SQL> select ceil(-11.123) from dual; CEIL(-11.123) ------------- -11 SQL> select ceil(11.123) from dual; CEIL(11.123) ------------ 12
COS(n): 返回n的余弦值。
SIN(n): 返回n的正弦值.
TAN(n): 返回n的正切值.
COSH(n):返回n的双曲余弦值
SINH(n):返回n的双曲正弦值
TANH(n):返回n的双曲正切值
EXP(n): 返回e的n次幂
FLOOR(n):返回小于等于n的最大整数
SQL> select FLOOR(11.123) from dual; FLOOR(11.123) ------------- 11 SQL> select FLOOR(-11.123) from dual; FLOOR(-11.123) -------------- -12
LN(n):返回n的自然对数,n必须大于0.
SQL> select LN(2) from dual; LN(2) ---------- .693147181 SQL> select LN(-11.123) from dual; select LN(-11.123) from dual * 第 1 行出现错误: ORA-01428: 参数 '-11.123' 超出范围
LOG(m,n):返回以m为底的n的对数,m可以是除0和1以外的任何正整数,n为任意正整数
SQL> select LOG(2,-2) from dual; select LOG(2,-2) from dual * 第 1 行出现错误: ORA-01428: 参数 '-2' 超出范围 SQL> select LOG(-2,2) from dual; select LOG(-2,2) from dual * 第 1 行出现错误: ORA-01428: 参数 '-2' 超出范围 SQL> select LOG(2,2) from dual; LOG(2,2) ---------- 1
MOD(m,n):返回m/n的余数.如果n为0,则返回m
SQL> select MOD(8,3.33) from dual; MOD(8,3.33) ----------- 1.34 SQL> select MOD(2,0) from dual; MOD(2,0) ---------- 2
POWER(m,n):返回m的n次幂.
SQL> select power(-2,-3) from dual; POWER(-2,-3) ------------ -.125 SQL> select power(-2,3) from dual; POWER(-2,3) ----------- -8
ROUND(n,[m]):四舍五入n。如果省略m,则四舍五入到整数位;
如果m为负数,则四舍五入到小数点前m位,如果m为正数,则四舍五入到小数点后m位。
SQL> select round(2.123,-1) from dual; ROUND(2.123,-1) --------------- 0 SQL> select round(2.123,1) from dual; ROUND(2.123,1) -------------- 2.1 SQL> select round(2.123) from dual; ROUND(2.123) ------------ 2
TRUNC(n,[m]):截取数字.如果省略m,则将n的小数部分截断.
若m为正数,则将n截取到小数点后第m位;若m为负,则将n截取到小数点前m位.
SQL> select trunc(12.123,-1) from dual; TRUNC(12.123,-1) ---------------- 10 SQL> select trunc(12.123,1) from dual; TRUNC(12.123,1) --------------- 12.1 SQL> select trunc(12.123) from dual; TRUNC(12.123) ------------- 12
SIGN(n): 检测数字的正负。若n小于0,则返回-1;n等于0,返回0;n大于0,返回1.
SQRT(n): 返回n的平方根.n必须大于0.
SQL> select sqrt(4) from dual; SQRT(4) ---------- 2 SQL> select sqrt(-4) from dual; select sqrt(-4) from dual * 第 1 行出现错误: ORA-01428: 参数 '-4' 超出范围
22.2 字符函数
ASCII(char): 返回字符串字符的ASCII码值.
SQL> SELECT ASCII('acv') from dual; ASCII('ACV') ------------ 97
CHR(n): 将ASCII码值变为字符.n必须为大于等于0的数字
SQL> SELECT chr(97) from dual; CH -- a SQL> SELECT chr(-97.8456) from dual; SELECT chr(-97.8456) from dual * 第 1 行出现错误: ORA-01426: 数字溢出 SQL> SELECT chr(97.8456) from dual; CH -- a
CONCAT:该函数用于连接字符串,与||一样。
SQL> SELECT CONCAT('Hello',' PL/SQL') FROM dual; CONCAT('HELLO','PL/SQL') ------------------------ Hello PL/SQL
INITCAP(char):该函数用于将字符串中每个单词的首字符大写,其他字符小写,单词直接用空格
和非字母字符分隔。
SQL> SELECT INITCAP('hello,my pl/sql!') FROM dual; INITCAP('HELLO,MYPL/SQL!') -------------------------------- Hello,My Pl/Sql!
INSTR(char1,char2[,n[,m]]):用于取得子串char2在字符串char1中的位置,n为起始搜索位置,m为出现的次数,
若n为负数,则从尾部开始搜索,m必须为正整数,n和m默认为1.
SQL> SELECT INSTR('hello,my pl/sql!','l',5,2) FROM dual; INSTR('HELLO,MYPL/SQL!','L',5,2) -------------------------------- 15 SQL> SELECT INSTR('hello,my pl/sql!','l',5.212,2.464) FROM dual; INSTR('HELLO,MYPL/SQL!','L',5.212,2.464) ---------------------------------------- 15 SQL> SELECT INSTR('hello,my pl/sql!','l',5,-2) FROM dual; SELECT INSTR('hello,my pl/sql!','l',5,-2) FROM dual * 第 1 行出现错误: ORA-01428: 参数 '-2' 超出范围
LENGTH(char):返回字符串的长度,包括空格.若字符串为NULL,则返回NULL。
SQL> SELECT LENGTH(NULL) FROM dual; LENGTH(NULL) ------------ SQL> SELECT LENGTH(' ') FROM dual; LENGTH('') ---------- 3
LOWER(char): 将字符串转换为小写.
UPPER(char): 将字符串转换为大写.
SQL> select UPPER(' aaksal2324saim2a1') a from dual; A ------------------- AAKSAL2324SAIM2A1 SQL> select LOWER(' aaKSal2324sIAm2a1') a from dual; A ------------------- aaksal2324siam2a1
LPAD(char1,n,char2):在字符串char1的左边填充字符串char2,直到字符串总长度为n,char2默认为空格.
如果char1长度大于n,则返回char1左边的n个字符.
RPAD(char1,n,char2):在字符串char1的右边填充字符串char2,直到字符串总长度为n,char2默认为空格.
如果char1长度大于n,则返回char1左边的n个字符.
SQL> SELECT LPAD('hello,My PL/SQL',20,'*') FROM dual; LPAD('HELLO,MYPL/SQL',20,'*') ---------------------------------------- *****hello,My PL/SQL SQL> SELECT LPAD('hello,My PL/SQL',3) a FROM dual; A ------ hel SQL> SELECT RPAD('hello,My PL/SQL',20) a FROM dual; A -------------------- hello,My PL/SQL SQL> SELECT RPAD('hello,My PL/SQL',20,'*') a FROM dual; A -------------------- hello,My PL/SQL*****
TRIM([char1 FROM ]char):从字符串char的头、尾截去指定的字符char1.默认截去首尾空格.
SQL> select trim('a' from 'aaksal2324saim2a') a from dual; A ------------- ksal2324saim2
LTRIM(char1[,set]):该函数用于去掉字符串char1左边所包含的set中的任何字符.
oracle从左边第一个字符开始扫描,逐个去掉在set中出现的字符,当遇到不是set中的字符时终止,
没有SET,默认是去掉空格.
RLRIM(char1[,set]):该函数用于去掉字符串char1右边所包含的set中的任何字符.
oracle从右边第一个字符开始扫描,逐个去掉在set中出现的字符,当遇到不是set中的字符时终止,
没有SET,默认是去掉空格.
SQL> SELECT LTRIM('**H e l l o ','**Hw') from dual; LTRIM('**HELLO','**HW' ---------------------- e l l o SQL> SELECT LTRIM(' H e l l o ') from dual; LTRIM('HELLO') ------------------------ H e l l o SQL> SELECT RTRIM('**H e l l o','mopl') a from dual; A ---------- **H e l l
NLS_INITCAP(char,'nls_param'): 该函数用于将字符串char的首字符大写,其他字符小写,其中
char用于指定NCHAR或NVARCHAR2类字符串,其前面加n,用单引号括起来,nls_param格式为"nls_sort=sort",
用于指定语言特征,没有'nls_param'的话和INITCAP一样.
(有SCHINESE_RADICAL_M(汉语部首、笔画排序)、SCHINESE_STROKE_M(笔画、部首)、SCHINESE_PINYIN_M(汉语拼音)、
XDutch(荷兰语)、XGERMAN(德语)等等)
SQL> select NLS_INITCAP('hello,my pl/sql','nls_sort=SCHINESE_PINYIN_M') a from dual; A ------------------------------ Hello,My Pl/Sql
NLS_LOWER(char,'nls_param'):函数用于将字符串转变为小写,其中nls_param参数同上,用于指定特定语言特征。
NLS_SORT(char,'nls_param'): 用于按特定语言的要求进行排序,其中nls_param参数同NLS_INITCAP的。
NLS_UPPER(char,'nls_param'):函数用于将字符串转变为大写,其中nls_param参数同NLS_INITCAP的
REGEXP_REPLACE(char,pattern[,replace_string[,position[,occurrence[,match_param]]]]):
把原字符串char使用正则表达式去匹配,将匹配到的字符串用replace_string去替换,position指定开始搜索位置,occurrence用于
指定替换出现的第几个字符串.
SQL> select regexp_replace('广州市天河区1001号123幢102室', '\d+幢', 'aaaa') a from dual; A --------------------------- 广州市天河区1001号aaaa102室 SQL> select regexp_replace('广州市天河区1001号123幢12幢1幢102室', '\d+幢', 'aaaa',4,2) a from dual; A ----------------------------------- 广州市天河区1001号123幢aaaa1幢102室 SQL> select regexp_replace('广州市天河区1001号123幢12幢1幢102室', '\d+幢') a from dual; A ----------------------- 广州市天河区1001号102室
SUBSTR(char,m[,n]):获得字符串char的子串,m是开始位置,n是子字符串的长度,若m为负数,则从尾部开始.
SQL> select substr('广州市天河区1001号123幢12幢1幢102室',-1) from dual; SU -- 室 SQL> select substr('广州市天河区1001号123幢12幢1幢102室',2,6) a from dual; A ----------- 州市天河区1
REGEXP_SUBSTR(char,pattern[,position[,occurrence[,match_param]]]):
在原字符串中按正则表达式匹配到的字符串返回,不指定position的话就返回匹配到的字符串,指定position表开始搜的位置,occurrence
表示第几次匹配到的字符串.
SQL> select regexp_substr('广州市天河区1001号123幢12幢1幢102室','\d+幢',1,3) from dual; REG --- 1幢 SQL> select regexp_substr('广州市天河区1001号123幢12幢1幢102室','\d+幢') from dual; REGEX ----- 123幢
REPLACE(char,char1[,char2]):使用char2代替char1,如果char内不包含char1,那么返回char字符串,如果包含那么全部替换成char2
如果省略char2,那么将在char中去掉包含的char1.
SQL> select replace('hello ,pl/sql!','hello','Bye Bye') a from dual; A ---------------- Bye Bye ,pl/sql! SQL> select replace('hello ,pl/sql!','hello') a from dual; A --------- ,pl/sql!
SOUNDEX(char):返回字符串的语音表示,可以比较两个字符串的发音是否一样。
SQL> select soundex('cry'),soundex('crai') from dual; SOUN SOUN ---- ---- C600 C600
TRANSLATE(char,char1,char2):如果char中包含char1的任意一个字符,那么将char2对应char1位置的字符替换到char中,
如果char1有,而char2没有改字符且char有此字符,那么结果中此字符会被去掉。
SQL> select translate('abdecfssghijk','abcs','123') a from dual; A ----------- 12de3fghijk
22.3 日期时间函数
oracle中有2种时间类型:DATE和TIMESTAMP.
ADD_MONTHS(d,n):返回特定日期时间d之后的n个月所对应的日期时间.(n为正表之后,为负表之前)。
--n输入小数,会自动截断 SQL> select add_months(sysdate,-1.5) from dual; ADD_MONTHS(SYS -------------- 30-7月 -12 SQL> select add_months(sysdate,2) from dual; ADD_MONTHS(SYS -------------- 30-10月-12
SYSDATE: 返回当前系统的日期时间。
CURRENT_DATE:返回当前会话时区所对应的日期时间.
--改会话的时间显示格式 SQL> ALTER SESSION SET nls_date_format='yyyy-MM-dd HH24:mi:ss'; 会话已更改。 SQL> select current_date from dual; CURRENT_DATE ------------------- 2012-08-30 05:05:03 --改会话的时区 SQL> ALTER SESSION SET TIME_ZONE='8:0'; 会话已更改。 SQL> select current_date from dual; CURRENT_DATE ------------------- 2012-08-30 21:05:14
SYSTIMESTAMP:返回当前系统的日期时间及时区.
CURRENT_TIMESTAMP:返回当前会话时区的日期时间
SQL> select current_timestamp from dual; CURRENT_TIMESTAMP ------------------------------------------ 30-8月 -12 09.10.19.022000 下午 +08:00 TO_TIMESTAMP(char[fmt[,'nls_param']]):将符合特定日期和时间格式的字符串变为TIMESTAMP类型。 SQL> select TO_TIMESTAMP('02-3月-11 11:01:02') a from dual; A --------------------------------------------------------- 02-3月 -11 11.01.02.000000000 上午
DBTIMEZONE:返回数据库所在时区。
SQL> select DBTIMEZONE from dual; DBTIMEZONE ------------ +08:00
SESSIONTIMEZONE:返回当前会话所在的时区.
SQL> select sessiontimezone from dual; SESSIONTIMEZONE -------------------------------------- +08:00
EXTRACT:用于从日期时间值取得所需要的特定数据.
1 SELECT extract(DAY FROM SYSDATE) A, 2 extract(MONTH FROM SYSDATE) B, 3 extract(YEAR FROM SYSDATE) C 4* FROM DUAL SQL> / A B C ---------- ---------- ---------- 30 8 2012
FROM_TZ:将特定时区的TIMESTAMP变为指定时区的TIMESTAMP WITH TIME ZONE类型)。
SQL> select from_tz(timestamp '2003-03-29 08:01:02','8:00') from dual; FROM_TZ(TIMESTAMP'2003-03-2908:01:02','8:00') --------------------------------------------------------------------------- 29-3月 -03 08.01.02.000000000 上午 +08:00 SQL> select from_tz(timestamp '2003-03-29 08:01:02 -8:00','8:00') from dual; select from_tz(timestamp '2003-03-29 08:01:02 -8:00','8:00') from dual * 第 1 行出现错误: ORA-00932: 数据类型不一致: 应为 TIMESTAMP, 但却获得 TIMESTAMP WITH TIME ZONE
LAST_DAY(d):返回特定日期所在月份的最后一天。
SQL> SELECT last_day(sysdate+2) from dual; LAST_DAY(SYSDATE+2) ------------------- 2012-09-30 22:33:13
LOCALTIMESTAMP:返回当前会话时区的日期时间。
SQL> select LOCALTIMESTAMP from dual; LOCALTIMESTAMP -------------------------------------- 30-8月 -12 10.34.27.472000 下午
MONTHS_BETWEEN(d1,d2):返回日期d1和d2之间相差的月数.若d1小于d2,返回为负数。
若d1和d2的天数一样,或者都是月底那么返回为整数,否则以每月31来计算结果的小数部分.
SQL> select MONTHS_BETWEEN(sysdate,sysdate-30) from dual; MONTHS_BETWEEN(SYSDATE,SYSDATE-30) ---------------------------------- .967741935 SQL> select MONTHS_BETWEEN(sysdate,sysdate-31) from dual; MONTHS_BETWEEN(SYSDATE,SYSDATE-31) ---------------------------------- 1
NEW_TIME(date,zone1,zone2):返回时区zone1的日期时间date在时区zone2时的时间。
SQL> select new_time(sysdate,'BST','EST') a from dual; A ------------------- 2012-08-31 04:50:10
NEXT_DAY(d,char):返回指定日期d之后的指定的星期的日期。
SQL> select next_day(sysdate,'星期三') a from dual; A ------------------- 2012-09-05 23:19:04
TO_DSINTERVAL(char[,'nls_param']):将符合特定日期和时间格式的字符串变为INTERVAL DAY TO SECONDE类型
SQL> select TO_DSINTERVAL('1 21:10:10') from dual; TO_DSINTERVAL('121:10:10') -------------------------------------------------- +000000001 21:10:10.000000000
NUMTODSINTERVAL(n,char_expr):将数字n转换为INTERVAL DAY TO SECOND格式.
char_expr可以是DAY,HOUR,MINUTE或SECOND。
--10000秒等于2个小时46分钟40秒 SQL> select NUMTODSINTERVAL(10000,'SECOND') FROM dual; NUMTODSINTERVAL(10000,'SECOND') ------------------------------------------------------ +000000000 02:46:40.000000000 --10000分钟等于22个小时40分钟 SQL> select NUMTODSINTERVAL(10000,'MINUTE') FROM dual; NUMTODSINTERVAL(10000,'MINUTE') ------------------------------------------------------ +000000006 22:40:00.000000000 --10000小时等于416天16小时 SQL> select NUMTODSINTERVAL(10000,'HOUR') FROM dual; NUMTODSINTERVAL(10000,'HOUR') ------------------------------------------------------ +000000416 16:00:00.000000000
TO_YMINTERVAL(char):用于将字符串变为INTERVAL YEAR TO MONTH类型。
SQL> select TO_YMINTERVAL('09-08') from dual; TO_YMINTERVAL('09-08') ---------------------------------------------- +000000009-08
NUMTOYMINTERVAL(n,char_expr):将数字n转换为INTERVAL YEAR TO MONTH格式.
char_expr可以是YEAR或MONTH。
SQL> select NUMTOYMINTERVAL(50,'MONTH') FROM dual; NUMTOYMINTERVAL(50,'MONTH') --------------------------------------------------- +000000004-02
TRUNC(d[,fmt]):截断日期时间函数。如果fmt指定年度,则结果为本年度1月1日;如果fmt指定为月,则结果为本月1日.
如果指定日,则为上周日.
SQL> select TRUNC(sysdate,'MONTH') a from dual; A ------------------- 2012-08-01 00:00:00 SQL> select TRUNC(sysdate,'YEAR') a from dual; A ------------------- 2012-01-01 00:00:00 SQL> select TRUNC(sysdate,'DAY') from dual; TRUNC(SYSDATE,'DAY' ------------------- 2012-08-26 00:00:00
ROUND(d[,fmt]):返回日期的四舍五入.如果fmt指定年度,则7月1日为分界线;如果指定月,则16日为分界线,
如果指定日,则中午12:00为分界线.
SQL> select ROUND(sysdate,'MONTH') a from dual; A ------------------- 2012-09-01 00:00:00 SQL> select ROUND(sysdate,'YEAR') a from dual; A ------------------- 2013-01-01 00:00:00 SQL> select ROUND(sysdate,'DAY') from dual; ROUND(SYSDATE,'DAY' ------------------- 2012-09-02 00:00:00
SYS_EXTRACT_UTC(datetime_with_timezone):返回指定时区时间所对应的格林威治时间
SQL> SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) FROM DUAL; SYS_EXTRACT_UTC(SYSTIMESTAMP) ---------------------------------------------------- 30-8月 -12 03.59.55.544000 下午
TZ_OFFSET(time_zone_name||SESSIONTIMEZONE||DBTIMEZONE):返回特定时区与UTC相比的时区偏移.
SQL> SELECT TZ_OFFSET('EST') a FROM DUAL; A -------------- -05:00
22.4 转换函数
转换函数用于将一种数据类型转换为另一种数据类型。
ASCIISTR(string):将任意字符集的字符串转换为ASCII字符串.
SQL> select ASCIISTR('你好') from dual; ASCIISTR('你好') -------------------- \4F60\597D
BIN_TO_NUM(expr[,expr][,expr]...):将位向量值(2进制)转变为实际的数字.
SQL> select BIN_TO_NUM(1,1,0,1) from dual; BIN_TO_NUM(1,1,0,1) ------------------- 13
CAST(expr AS type_name):内置类型转换.
SQL> declare 2 v_cast varchar2(25); 3 begin 4 v_cast:=cast(sysdate as varchar2); 5 dbms_output.put_line(v_cast); 6 end; 7 / 31-8月 -12 PL/SQL 过程已成功完成。
CHARTOROWID(char):将字符串值转变为ROWID数据类型,字符串必须符合ROWID格式.
SQL> SELECT CHARTOROWID('AAAFd1AAFAAAABSAA/') a from dual; A ------------------ AAAFd1AAFAAAABSAA/
COMPOSE(string):将输入字符串变为UNICODE字符串值。
SQL> SELECT COMPOSE('w'||UNISTR('\0308')) FROM DUAL; CO -- ?
CONVERT(char,dest_set,source_set):将字符串char从字符集dest_set转变为source_set.
SQL> select convert('中国','US7ASCII','WE8ISO8859P1') A FROM DUAL; A ------------ a?-???
DECOMPOSE(string):分解字符串string并返回对应的UNICODE字符串。
09:20:39 SYS@orcl> SELECT DECOMPOSE('Châteaux') FROM DUAL; DECOMPOS -------- Chateaux
HEXTORAW(char):将十六进制字符串转变为RAW数据类型.
RAWTOHEX(char):将RAW数值转变为16进制字符串。
RAWTONHEX(char):将RAW数值转变为NVARCHAR2的16进制字符串。
SQL> select rawtohex('AA') a from dual; A -------- 4141
ROWIDTOCHAR(rowid):将ROWID值转变为VARCHAR2类型。
ROWIDTONCHAR(rowid):将ROWID值转变为NVARCHAR2类型
SQL> select ROWIDTOCHAR('AAAFFDBCSSAAQAAAAA') A from dual; A ------------------------------------ AAAFFDAKSAAAQAAAAA
SCN_TO_TIMESTAMP(number):根据输入的SCN值返回所对应的日期时间.
SQL> select SCN_TO_TIMESTAMP(ORA_ROWSCN) FROM EMP ; SCN_TO_TIMESTAMP(ORA_ROWSCN) --------------------------------------------------- 27-8月 -12 10.31.40.000000000 下午 27-8月 -12 10.31.40.000000000 下午
TIMESTAMP_TO_SCN(timestamp):根据输入的TIMESTAMP返回对应的SCN值。
SQL> select TIMESTAMP_TO_SCN(sysdate) from dual; TIMESTAMP_TO_SCN(SYSDATE) ------------------------- 1054165106
TO_NCHAR(char):将字符串由数据库字符集转为民族字符集.
TO_CHAR(char):将NCHAR、NVARCHAR2、CLOB和NCLOB数据转换为数据库字符集数据。
当用于NCHAR、NVARCHAR2、NCLOB时,字符串用单引号括起来,前面加n。
SQL> select to_char(n'aaa') from dual; TO_CHA ------ aaa
TO_NCHAR(date[,fmt[,nls_param]]):将日期时间值转为民族字符集的字符串。
TO_CHAR(date[,fmt[,nls_param]]):将日期值转换为字符串,fmt指定转换后的日期格式,
nls_param指定NLS语言参数。
SQL> select to_char(sysdate,'YYYY/MM/DD') A from dual; A -------------------- 2012/09/01
TO_CLOB(char):将字符串转变为CLOB类型.
TO_NCLOB(clob_column|char):将CLOB列或字符串变为NCLOB类型。
TO_LOB(long_column):将LONG或LONG RAW列的数据转为LOB类型。
TO_DATE(char[,fmt[,nls_param]]):将符合特定日期格式的字符串转为DATE类型。
SQL> select to_date('1999-12-12','yy-mm-dd') A from dual; A -------------- 12-12月-99
TO_SINGLE_BYTE(char):将多字节字符串转为单字节字符串.
TO_MULTI_BYTE(char):将单字节字符串转为多字节字符串.
SQL> select TO_MULTI_BYTE('abcde') from dual; TO_MULTI_BYTE('ABCDE') ------------------------------ abcde
TO_NUMBER(char[,fmt[,nls_param]]):将符合特定数字格式的字符串值转为数字。
SQL> SELECT TO_NUMBER('123') from dual; TO_NUMBER('123') ---------------- 123
TRANSLATE...USING:将字符串转为数据库字符集(CHAR_CS)或民族字符集(NCHAR_CS).
SQL> SELECT translate('asc' USING CHAR_CS) from dual; TRANSL ------ asc
UNISTR(string):将输入字符串返回其对应的UNICODE字符。
SQL> select UNISTR('\0041') from dual; UN -- A
22.5 集合函数
CARDINALITY(nested_table):返回嵌套表的实际元素个数.
SQL> select deptno,CARDINALITY(employee) from em_test; 未选定行
COLLECT(column):根据输入列和被选择行建立嵌套表结果。
POWERMULTISET(expr):生成嵌套表的超集(包含所有非空的嵌套表).
POWERMULTISET_BY_CARDINALITY(expr,cardinatility?:根据嵌套表和元素个数,生成嵌套表的超集(包含所有非空的嵌套表)
SET(nested_table):取消嵌套表中的重复结果,并生成新的嵌套表.
22.6 分组函数
AVG([ALL|DISTINCT]expr):计算平均值.
SQL> select avg(3+2+1) from dual; AVG(3+2+1) ---------- 6
CORR(expr1,expr2):返回成对数值的相关系数.
SQL> select corr(sal,comm) from emp; CORR(SAL,COMM) -------------- -.69920974
COVAR_POP(expr1,expr2):返回成对数字的协方差.
SQL> select COVAR_POP(sal,comm) from emp; COVAR_POP(SAL,COMM) ------------------- -56250
COVAR_SAMP(expr1,expr2):返回成对数字的协方差.与COVAR_POP的计算方法有点差别.
SQL> select COVAR_SAMP(sal,comm) from emp; COVAR_SAMP(SAL,COMM) -------------------- -75000
CUME_DIST(expr1,expr2...) WITHIN GROUP(ORDER BY expr1,expr2...):返回特定数值在一组行数据中的累积分布比例.
SQL> select CUME_DIST(1250) WITHIN GROUP 2 (ORDER BY sal) a 3 FROM emp; A ---------- .384615385
DENSE_RANK(expr1,expr2...)WITHIN GROUP(ORDER BY expr1,expr2...):返回特定数据在一组行数据中的等级.
SQL> select DENSE_RANK(1250) WITHIN GROUP 2 (ORDER BY sal) a 3 FROM emp; A ---------- 3
DENSE_RANK()over([PARTITION BY ..] ORDER BY ...):分析函数
09:28:13 SCOTT@orcl> select empno,sal,dense_rank()over(order by empno) from emp; EMPNO SAL DENSE_RANK()OVER(ORDERBYEMPNO) ---------- ---------- ------------------------------ 110 <null> 1 110 <null> 1 111 <null> 2 111 <null> 2 7369 1200 3 7369 1200 3 7499 2400 4 7499 2400 4 7521 1875 5 7521 1875 5 7566 4462.5 6 7566 4462.5 6 7654 1875 7 7654 1875 7 7698 4275 8 7698 4275 8
GROUP_ID():用于区分分组结果中的重复行.
SQL> SELECT deptno,job,sum(sal),group_id() 2 FROM emp 3 GROUP BY deptno,cube(deptno,job); DEPTNO JOB SUM(SAL) GROUP_ID() ---------- ------------------ ---------- ---------- 10 CLERK 1300 0 10 MANAGER 2450 0 10 PRESIDENT 5000 0 20 CLERK 800 0 20 ANALYST 3000 0 20 MANAGER 2975 0 30 CLERK 950 0 30 MANAGER 2850 0 30 SALESMAN 5600 0 10 CLERK 1300 1 10 MANAGER 2450 1 DEPTNO JOB SUM(SAL) GROUP_ID() ---------- ------------------ ---------- ---------- 10 PRESIDENT 5000 1 20 CLERK 800 1 20 ANALYST 3000 1 20 MANAGER 2975 1 30 CLERK 950 1 30 MANAGER 2850 1 30 SALESMAN 5600 1 10 8750 0 20 6775 0 30 9400 0 10 8750 1 DEPTNO JOB SUM(SAL) GROUP_ID() ---------- ------------------ ---------- ---------- 20 6775 1 30 9400 1
GROUPING(expr):确定分组结果是否用到了特定的表达式,用到了该表达式,返回值为0,否则为1.
SQL> SELECT deptno,job,sum(sal),grouping(job) 2 FROM emp 3 GROUP BY cube(deptno,job); DEPTNO JOB SUM(SAL) GROUPING(JOB) ---------- ------------------ ---------- ------------- 24925 1 CLERK 3050 0 ANALYST 3000 0 MANAGER 8275 0 SALESMAN 5600 0 PRESIDENT 5000 0 10 8750 1 10 CLERK 1300 0 10 MANAGER 2450 0 10 PRESIDENT 5000 0 20 6775 1 DEPTNO JOB SUM(SAL) GROUPING(JOB) ---------- ------------------ ---------- ------------- 20 CLERK 800 0 20 ANALYST 3000 0 20 MANAGER 2975 0 30 9400 1 30 CLERK 950 0 30 MANAGER 2850 0 30 SALESMAN 5600 0 已选择18行。
GROUPING_ID(expr1[,expr2]...):返回对应特定行的GROUPING位向量的值。
SQL> SELECT deptno,job,sum(sal),grouping(job),grouping_id(job,deptno) 2 FROM emp 3 GROUP BY cube(deptno,job); DEPTNO JOB SUM(SAL) GROUPING(JOB) GROUPING_ID(JOB,DEPTNO) ---------- ------------------ ---------- ------------- ----------------------- 24925 1 3 CLERK 3050 0 1 ANALYST 3000 0 1 MANAGER 8275 0 1 SALESMAN 5600 0 1 PRESIDENT 5000 0 1 10 8750 1 2 10 CLERK 1300 0 0 10 MANAGER 2450 0 0 10 PRESIDENT 5000 0 0 20 6775 1 2 DEPTNO JOB SUM(SAL) GROUPING(JOB) GROUPING_ID(JOB,DEPTNO) ---------- ------------------ ---------- ------------- ----------------------- 20 CLERK 800 0 0 20 ANALYST 3000 0 0 20 MANAGER 2975 0 0 30 9400 1 2 30 CLERK 950 0 0 30 MANAGER 2850 0 0 30 SALESMAN 5600 0 0 已选择18行。
RANK(expr1,expr2...) WITHIN GROUP(ORDER BY expr1,expr2...):返回特定数值在统计数值中所在的等级.
SQL> SELECT RANK(1500) WITHIN GROUP (ORDER BY sal) rank 2 FROM EMP; RANK ---------- 6
PERCENT_RANK(expr1,expr2...) WITHIN GROUP(ORDER BY expr1,expr2...):返回特定数值在统计级别中所在比例.
SQL> SELECT PERCENT_RANK(1500) WITHIN GROUP(ORDER BY sal) percent 2 FROM EMP; PERCENT ---------- .416666667
PERCENTILE_CONT(percent_expr) WITHIN GROUP(ORDER BY expr):返回在统计级别中处于某个百分点的特定数值(按连续分布模型确定).
SQL> SELECT PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY sal) a 2 FROM EMP; A ---------- 2110
PERCENTILE_DISC(percent_expr) WITHIN GROUP(ORDER BY expr):返回在统计级别中处于某个百分点的特定数值(按照离散分布模型确定).
SQL> SELECT PERCENTILE_DISC(0.6) WITHIN GROUP(ORDER BY sal) a 2 FROM EMP; A ---------- 2450
VARIANCE([ALL|DISTINCT]expr):返回列或表达式的方差,与采样方差一致.
SQL> SELECT VARIANCE(sal) FROM emp; VARIANCE(SAL) ------------- 1488347.54
STDDEV([ALL|DISTINCT]expr):取得标准偏差,也就是取标准方差的平方根.
SQL> SELECT STDDEV(sal) FROM emp; STDDEV(SAL) ----------- 1219.9785
VAR_POP(expr):返回统计方差.
SQL> SELECT VAR_POP(sal) FROM emp; VAR_POP(SAL) ------------ 1364318.58
STDDEV_POP(expr):返回统计标准偏差,返回统计方差的平方根.
SQL> SELECT STDDEV_POP(sal) FROM emp; STDDEV_POP(SAL) --------------- 1168.04049
VAR_SAMP(expr):返回采样方差.
SQL> SELECT VAR_SAMP(sal) FROM emp; VAR_SAMP(SAL) ------------- 1488347.54
STDDEV_SAMP(expr):返回采样标准偏差,返回采样方差的平方根
SQL> SELECT STDDEV_SAMP(sal) FROM emp; STDDEV_SAMP(SAL) ---------------- 1219.9785
22.7 对象函数
对象函数用于操纵REF对象。REF对象实际就是指向对象类型数据的指针.
DEREF(expr):返回参照对象expr所引用的对象实例.
MAKE_REF(object_table|object_view,key):基于对象视图的一行数据或基于对象表的一行数据建立REF。
REF(expr):返回对象行所对应的REF值.
REFTOHEX(expr):将REF值转变为16进制字符串.
VALUE(expr):返回对象所对应的对象实例数据,expr用于指定行对象的别名.
22.8 其他函数
NULLIF(expr1,expr2):比较表达式expr1和expr2.如果相等,则返回NULL,否则返回expr1.
SQL> SELECT NULLIF('a','a') from dual; NU -- SQL> SELECT NULLIF('a','b') from dual; NU -- a
NVL(expr1,expr2):将NULL转为指定值.如果expr1是null,则返回expr2;如果expr1不是null,则返回expr1.
注意二者数据类型要匹配.
SQL> select nvl(1,'a') from dual; select nvl(1,'a') from dual * 第 1 行出现错误: ORA-01722: 无效数字 SQL> select nvl(null,'a') from dual; NV -- a SQL> select nvl('ac','a') from dual; NVL( ---- ac
NVL2(expr1,expr2,expr3):如果expr1不是null,则返回expr2;如果expr1是null,则返回expr3.expr1可以是任意数据类型.
expr2、expr3是除LONG之外的任何数据类型.
SQL> select nvl2(null+2,'No','Yes') from dual; NVL2(N ------ Yes SQL> select nvl2(2,'No','Yes') from dual; NVL2 ---- No
BFILENAME('directory','filename'):初始化BFILE,directory是操作系统相关的路径对象.filename是文件名.
COALESCE(expr1[,expr2][,expr3]...):返回表达式列表中第一个NOT NULL的结果。
SQL> select COALESCE(null+2,null*2,null-null,1+2) A from dual; A ---------- 3
DECODE(expr,search1,result[,search2,result2...][,default]):返回匹配于特定表达式的结果。
如果表达式expr结果匹配search1,则返回result1;如果表达式expr结果匹配search2,则返回result2,
否则返回default。
SQL> SELECT deptno,ename,sal, 2 DECODE(deptno,10,sal*1.2,20,sal*1.3,30,sal*1.4,sal) new_sal 3 FROM emp ORDER BY deptno; DEPTNO ENAME SAL NEW_SAL ---------- -------------------- ---------- ---------- 10 KING 5000 6000 10 CLARK 2450 2940 10 MILLER 1300 1560 20 FORD 3000 3900 20 SMITH 800 1040 20 JONES 2975 3867.5 30 JAMES 950 1330 30 TURNER 1500 2100 30 MARTIN 1250 1750 30 WARD 1250 1750 30 ALLEN 1600 2240 DEPTNO ENAME SAL NEW_SAL ---------- -------------------- ---------- ---------- 30 BLAKE 2850 3990 已选择12行。
PATH(correction_integer):返回特定XML资源所对应的相对路径.
DEPTH(n):用于返回XML方案中UNDER_PATH路径所对应的相对层数。n用于指定相对层数.
DUMP(expr,return_fmt):返回表达式所对应的数据类型代码、长度及内部表示格式。
return_fmt用于指定返回格式(8:8进制符号;10:10进制符号;16:16进制;17:单字符).
注意:此函数只能使用在SQL语句.
SQL> select dump('hellp',17) from dual; DUMP('HELLP',17) --------------------------------------- Typ=96 Len=5: h,e,l,l,p SQL> select dump('hellp',16) from dual; DUMP('HELLP',16) --------------------------------------- Typ=96 Len=5: 68,65,6c,6c,70
EMPTY_BLOB():初始化BLOB变量.
EMPTY_CLOB():初始化CLOB变量.
EXISTSNODE(XMLtype_instance,Xpath_string):用于确定XML节点路径是否存在,0表示不存在;1表示存在.
EXTRACT(XMLtype_instance,Xpath_string):返回XML节点路径下的内容.
EXTRACTVALUE(XMLtype_instance,Xpath_string):返回XML节点路径下的值.
UPDATEXML(XMLType_instance,Xpath_string,value_expr):更新特定XMLType实例相应节点路径的内容.
XMLSEQUENCE(xmltype_instance):返回XMLType实例中顶级节点以下的VARRAY元素.
XMLTRANSFORM(xmltype_instance,xsl_ss):将XMLType实例按照XSL样式进行转行,并生成新的XMLType实例.
APPENDCHILDXML(XMLTpe_instance,XPath_string,value_expr[,namespace_string]):给XML增加子节点值
XMLType_instance:XMLType的一个实例
XPath_string:XPath_string是一个Xpath表达式指示其上的一个或多个节点的一个或多个的子节点以被追加.可以是绝对路径也可以是相对路径.
value_expr:指定XMLType的一个或多个节点
namespace_string:给XPath_string提供命名空间信息.
例如: --当/Building节点值是Rented的时候,给/Warehouse/Building节点增加/Owner子节点 UPDATE warehouses SET warehouse_spec = APPENDCHILDXML(warehouse_spec, 'Warehouse/Building', XMLType('<Owner>Grandco</Owner>')) WHERE EXTRACTVALUE(warehouse_spec, '/Warehouse/Building') = 'Rented';
SYS_XMLGEN(expr[,fmt]):根据数据库表的行和列生成一个XMLType实例.
SQL> select SYS_XMLGEN(ename) FROM emp where deptno=20; SYS_XMLGEN(ENAME) ------------------------------------------------------- <?xml version="1.0"?> <ENAME>SMITH</ENAME> <?xml version="1.0"?> <ENAME>JONES</ENAME> <?xml version="1.0"?> <ENAME>FORD</ENAME>
SYS_XMLAGG(expr[,fmt]):汇总所有XML文档,并生成一个XML文档.
SQL> SELECT SYS_XMLAGG(SYS_XMLGEN(ename)) 2 FROM emp 3 WHERE deptno=20; SYS_XMLAGG(SYS_XMLGEN(ENAME)) ------------------------------------------ <?xml version="1.0"?> <ROWSET> <ENAME>SMITH</ENAME> <ENAME>JONES</ENAME> <ENAME>FORD</ENAME> </ROWSET>
XMLELEMENT(identifier[,xml_attribute_clause][,value_expr]):返回XMLType的实例,参数identifier指定元素名.
参数xml_attribute_clause指定元素属性子句,参数value_expr指定元素值.
SQL> SELECT xmlelement("today",sysdate) from dual; XMLELEMENT("TODAY",SYSDATE) -------------------------------------------------- <today>2012-09-01</today> SQL> SELECT xmlelement("today",xmlattributes(sysdate as "sysdate")) a from dual; A -------------------------------------------------------------------------------- <today sysdate="2012-09-01"></today>
XMLFOREST(value_expr1[,value_expr2]...):返回XML块.
SQL> SELECT xmlelement("employee",XMLFOREST(ename,sal)) 2 FROM emp WHERE empno=7900; XMLELEMENT("EMPLOYEE",XMLFOREST(ENAME,SAL)) -------------------------------------------------------- <employee><ENAME>JAMES</ENAME><SAL>950</SAL></employee>
XMLCOLATTVAL(value_expr1[,value_expr2]...):生成XML块,并增加'column'作为属性名.
SQL> SELECT xmlelement("emp",XMLCOLATTVAL(ename,sal)) 2 FROM emp WHERE empno=7900; XMLELEMENT("EMP",XMLCOLATTVAL(ENAME,SAL)) -------------------------------------------------------------------------------- <emp><column name = "ENAME">JAMES</column><column name = "SAL">950</column></emp>
XMLCONCAT(XMLType_instance1[,XMLType_instance2]...):用于连接多个XMLType实例,生成一个新的XMLType实例.
SQL> SELECT XMLCONCAT(xmlelement("name",ename), 2 xmlelement("sal",sal)) 3 FROM emp WHERE deptno=20; XMLCONCAT(XMLELEMENT("NAME",ENAME),XMLELEMENT("SAL",SAL)) ---------------------------------------------------------- <name>SMITH</name><sal>800</sal> <name>JONES</name><sal>2975</sal> <name>FORD</name><sal>3000</sal>
XMLAGG(XMLType_instance[ORDER BY sort_list]):汇总多个XML块,并生成XML文档.
SQL> SELECT XMLAGG(xmlelement("name",ename||' '||sal)) 2 FROM emp WHERE deptno=20; XMLAGG(XMLELEMENT("NAME",ENAME||''||SAL)) -------------------------------------------------------------------- <name>SMITH 800</name><name>JONES 2975</name><name>FORD 3000</name>
GREATEST(expr1[,expr2]...):返回列表表达式expr1,expr2...中值最大的一个.
SQL> select GREATEST(1+2,1*2,2/3,3-4) A FROM DUAL; A ---------- 3
LEAST(expr1[,expr2]...):返回列表表达式expr1,expr2...中值最小的一个.
SQL> select LEAST(1+2,1*2,2/3,3-4) A FROM DUAL; A ---------- -1
SYS_CONNECT_BY_PATH(column,char):只适用于层次查询,返回从根到节点的列值路径。
SQL> select ename,job,SYS_CONNECT_BY_PATH(ename,'/') path 2 from emp 3 where level<=2 4 start with mgr is null 5 connect by mgr=prior empno; ENAME JOB PATH -------------------- ------------------ --------------- KING PRESIDENT /KING JONES MANAGER /KING/JONES BLAKE MANAGER /KING/BLAKE CLARK MANAGER /KING/CLARK
NLS_CHARSET_DECL_LEN(byte_count,charset_id):返回字节数在特定字符集中占用的字符数.
SQL> select NLS_CHARSET_DECL_LEN(200,nls_charset_id('ZHS16GBKFIXED')) a 2 FROM DUAL; A ---------- 100
NLS_CHARSET_ID(text):返回字符集的ID号。
SQL> select NLS_CHARSET_ID('ZHS16GBKFIXED') a from dual; A ---------- 1852
NLS_CHARSET_NAME(number):返回特定ID号对应的字符集名。
SQL> select NLS_CHARSET_NAME(1) from dual; NLS_CHARSET_NAME ---------------- US7ASCII
SYS_CONTEXT('context','attribute'):返回应用上下文的特定属性值,context指定应用上下文名.
SQL> select SYS_CONTEXT('userenv','session_user') "user" , 2 SYS_CONTEXT('USERENV', 'IP_ADDRESS') "ip" 3 from dual; user ip ---------- --------------- SCOTT 201.85.202.74
SYS_DBURIGEN():根据列或属性生成类型为DBUriType的URL。
SQL> select SYS_DBURIGEN(deptno) from emp 2 where deptno=10; SYS_DBURIGEN(DEPTNO)(URL, SPARE) ------------------------------------------------------ DBURITYPE('/PUBLIC/EMP/ROW[DEPTNO='10']/DEPTNO', NULL) DBURITYPE('/PUBLIC/EMP/ROW[DEPTNO='10']/DEPTNO', NULL) DBURITYPE('/PUBLIC/EMP/ROW[DEPTNO='10']/DEPTNO', NULL)
SYS_GUID():生成类型为RAW的16字节的唯一标识符,每次调用都会生产不同的RAW数据。
SQL> select SYS_GUID() from dual; SYS_GUID() -------------------------------- AC9CAC0484094ABDB4E0D280C81CC81A SQL> select SYS_GUID() from dual; SYS_GUID() -------------------------------- C92BE92B343141AC97820FAF45FB08B6
SYS_TYPEID(object_type_value):返回唯一的类型的ID值.
UID:返回当前会话所对应的用户ID号.
SQL> select uid from dual; UID ---------- 55
USERENV(param):返回当前会话上下文的属性信息.param参数取值如下:
ISDBA:如果用户是DBA权限,则返回TRUE,否则返回FALSE.
LANGUAGE:返回当前会话的语言、地区和字符集.
TERMINAL:返回当前会话所在终端的OS标识符.
CLIENT_INFO:返回由包DBMS_APPLICATION_INFO所存储的用户会话信息.
SQL> SELECT USERENV('ISDBA') a FROM DUAL; A ------------ FALSE SQL> SELECT USERENV('LANGUAGE') a FROM DUAL; A --------------------------------------------- SIMPLIFIED CHINESE_CHINA.AL32UTF8 SQL> SELECT USERENV('TERMINAL') a FROM DUAL; A -------------------------------- PC-2012080707
VSIZE(expr):返回oracle内部存储expr的实际字节数.如果expr是null,则返回null.
SQL> select vsize('an') from dual; VSIZE('AN') ----------- 2 SQL> select vsize('中国') from dual; VSIZE('中国') ------------- 6