函数是具有一定功能,被事先封装好的功能块,通过在PL/SQL或SQL语句中使用函数可以完成以下的一系列功能:
ORACLE提供很多功能强大的内置函数,在进行数据库操作的时候,可以很方便地使用这些函数来操纵数据。
在SQL中,函数分为两种类型:
本节笔记介绍了单行函数。多行函数将会在下一节笔记中进行介绍。
字符型函数的作用是接受字符输入,可以返回字符或数字值。字符型函数包括大小写转换函数和字符处理函数:
示例如下:
-- LOWER(),将特定的字符串转换为小写,只影响字母字符串
SELECT LOWER('ABCDE1323FxcdG') FROM dual;
-- UPPER(),将特定的字符串转换为大写,只影响字母字符串
SELECT UPPER('ABCDE1323FxcdG') FROM dual;
-- INITCAP(),将字符串中每一个单词的第一个字母转换为大写,其他的均为小写,只影响字母字符串
SELECT INITCAP('this is a strings!') FROM dual;
SELECT table_name,owner FROM dba_tables WHERE lower(table_name)='emp';
SELECT INITCAP('morgan freeman') FROM dual;
-- CONCAT(x,y),用来连接两个特定的字符,与"||"的功能相同(只能连接两个特定字符)
SELECT CONCAT('abc','def','efg') FROM dual;
-- SUBSTR(),返回字符串的一部分
SELECT SUBSTR('THIS IS A STRINGS!',1,5) FROM dual;
SELECT SUBSTR('THIS IS A STRINGS!',5) FROM dual;
SELECT SUBSTR('THIS IS A STRINGS!',5,LENGTH('THIS IS A STRINGS!')-1) FROM dual;
-- LENGTH(),返回字符串的长度,包括填充的字符
SELECT LENGTH('THIS IS A STRINGS!') FROM dual;
-- INSTR(x,y),返回y在x中的位置,如果y不在x中,则返回0
SELECT INSTR('THIS IS A STRINGS!','H') FROM dual;
-- LPAD(x,i,y),用字符串y按照指定填充数i填充x的左边
SELECT LPAD(ename,6,' ') FROM scott.emp;
-- RPAD(x,i,y),用字符串y按照指定填充数i填充x的右边
SELECT RPAD(ename,6,' ') FROM scott.emp;
-- LTRIM(),裁剪字符串左边的字符
SELECT LTRIM(' asdff ') FROM dual;
-- RTRIM(),裁剪字符串右边的字符
SELECT RTRIM(' asdff ') FROM dual;
-- TRIM(),裁剪字符串两边的字符,可以说是LTRIM和RTRIM的组合
SELECT TRIM(' asdff ') FROM dual;
数字型函数的作用是接受数字的输入,并且返回数字值。数字型函数包括:
示例如下:
-- ROUND(x,y),四舍五入x的值为y位的小数位;如果y忽略,则无小数位;如果y为负数,则小数点左边的数将被四舍五入
SELECT ROUND(12345.67) FROM dual;
SELECT ROUND(12345.67,1) FROM dual;
SELECT ROUND(12345.67,-1) FROM dual;
-- TRUNC(x,y),截断x的值到y位的小数,如果y被忽略,那么y的默认值是0
SELECT TRUNC(12345.67) FROM dual;
SELECT TRUNC(12345.67,1) FROM dual;
SELECT TRUNC(12345.67,-1) FROM dual;
-- MOD(x,y),取模,即求余,求得x除以y的余数
SELECT MOD(100,3) FROM dual;
SELECT TRUNC(100/3) FROM dual;
-- POWER(x,y),返回x的y次幂
SELECT POWER(2,10) FROM dual;
-- SIGN(x),返回x的正负值,如果正值返回1,负值返回-1,0返回0
SELECT SIGN(-100 ) FROM dual;
SELECT SIGN(100 ) FROM dual;
SELECT SIGN(0 ) FROM dual;
日期函数用于日期的格式化显示。ORACLE默认的日期格式是’DD-MON-RR’:
SELECT * FROM v$nls_parameters WHERE parameter='NLS_DATE_PARAMETER';
我们可以更改nls_date_format参数来更改当前会话显示的日期格式:
alter SESSION SET nls_date_format='yyyy-mm-dd hh24:mi:ss';
日期函数主要包括:
日期的运算:
常用的ORACLE日期格式:
基于日期函数的日期显示示例如下:
-- 常用的ORACLE日期格式:
-- cc,世纪
-- q,季度
-- yyyy,四位数的年份
-- yy,两位数的年份
-- rrrr,四位数的年份
-- rr,两位数的年份
SELECT TO_DATE('05/01/02','YYYY-MM-DD') YYYY ,TO_DATE ('05/01/02','RRRR-MM-DD') RRRR FROM dual;
-- RRRR,如果输入的是2位数字则会转换为四位年,如果是四位年,则保持不变
-- YYYY,只是将同一位置上的字符转换为要求的字符,如果位数数不够则用0补充
-- year,年份的全拼
SELECT to_char(SYSDATE,'year') FROM dual;
-- mm,月份
SELECT to_char(SYSDATE,'mm') FROM dual;
-- month,月份的全拼
SELECT to_char(SYSDATE,'month') FROM dual;
SELECT to_char(SYSDATE,'Month') FROM dual;
SELECT to_char(SYSDATE,'MONTH') FROM dual;
-- mon,月份的前三个字母
-- ww/w,当前所属年的第几周
SELECT to_char(SYSDATE,'ww') FROM dual;
-- ddd,当前所属年的第几天
SELECT to_char(SYSDATE,'ddd') FROM dual;
-- dd,当前所属月的第几天
SELECT to_char(SYSDATE,'dd') FROM dual;
-- d,当前所属周的第几天
SELECT to_char(SYSDATE,'d') FROM dual;
-- day,周几的全拼
-- dy,周几的前三个字母
-- hh24,24小时格式的小时
-- hh,12小时格式的小时
-- mi,分
-- ss,秒
-- ms,毫秒
SELECT to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM dual;
-- am,上午
-- pm,下午
-- ORACLE默认的日期格式是'DD-MON-RR'
SELECT SYSDATE FROM dual;
SELECT * FROM v$nls_parameters WHERE parameter='NLS_DATE_FORMAT';
-- 可以更改nls_date_format参数来更改当前会话显示的日期格式
ALTER SESSION SET nls_date_format='yyyy-mm-dd hh24:mi:ss';
基于日期函数的日期运算示例如下:
-- SYSDATE,返回当前数据库服务器的日期和时间
SELECT SYSDATE FROM dual;
-- 日期加减一个数,得到一个日期值;两个日期相减得到两个日期之间的天数;用小时数除以24,可以将小时数加到日期上;
SELECT SYSDATE+7 FROM dual;
SELECT SYSDATE-to_date('1997-12-01','yyyy-mm-dd') FROM dual
SELECT SYSDATE+10/24 FROM dual;
-- MONTHS_BETWEEN(date1,date2),计算date1和date2之间的月数,他们两个之间的差可以为正也可以为负
SELECT months_between(SYSDATE,to_date('1997-12-01','yyyy-mm-dd')) FROM dual;
-- ADD_MONTHS(date,n),添加n个月到date,n必须是整数(可以是负数)
SELECT add_months(SYSDATE,3) FROM dual;
SELECT add_months(SYSDATE,-4) FROM dual;
-- NEXT_DAY(date,'char'),计算在date之后的下一个周('char')的指定天的日期,char的值可能是一个表示一天的数或者是一个字符串
SELECT next_day(SYSDATE,1) FROM dual;
SELECT next_day(SYSDATE,'FRIDAY') FROM dual;
-- 注:在oracle当中对星期的表示中,星期天是一个星期的第一天即为1,以此类推星期六是7
-- LAST_DAY(date),计算包含date的月的最后一天的日期
SELECT last_day(SYSDATE) FROM dual;
-- ROUND(date,['format']),返回格式化模式format四舍五入到指定单位的date,如果format忽略,那么四舍五入到最近的天
SELECT SYSDATE 当时日期,
round(SYSDATE) 最近零点日期,
round(SYSDATE,'day') 最近的星期日,
round(SYSDATE,'month') 最近的月初第一天,
round(SYSDATE,'q') 最近季度的第一天,
round(SYSDATE,'year') 最近年初日期 from dual;
-- TRUNC(date,['format']),返回格式化模式format截断到指定单位的带天的时间部分的date,如果format忽略,date被截断到最近的天
select sysdate 当时日期,
trunc(sysdate) 今天日期,
trunc(sysdate,'day') 本周星期日,
trunc(sysdate,'month') 本月初,
trunc(sysdate,'q') 本季初日期,
trunc(sysdate,'year') 本年初日期 from dual;
转换函数在PL/SQL的程序设计当中使用非常频繁的一个功能:
转换函数的示例如下:
-- 字符型 向 日期型转换
SELECT * FROM scott.emp WHERE hiredate<'01-JAN-82';
SELECT * FROM V$NLS_PARAMETERS WHERE parameter='NLS_DATE_FORMAT';
-- 字符型 向 数字型转换
SELECT * FROM scott.emp WHERE sal<'2000';
-- ASCII(),将一个char类型的字符转换为对应的ASCII值
SELECT ASCII('a') FROM dual;
SELECT ASCII('b') FROM dual;
-- CHR(),和ASCII函数相反,将一个ASCII值转换为对应的char类型的值
SELECT CHR(97) FROM dual;
SELECT * FROM scott.emp WHERE 'a'>'b';
SELECT * FROM scott.emp WHERE 'b'>'a';
-- TO_CHAR(),将日期或者数字类型的值转换为varchar2类型的值
-- 将日期型转换为字符串
SELECT to_char(SYSDATE,'cc q yyyy-mm-dd hh:mi:ss am') FROM dual;
-- 将数字型转换为字符串
SELECT to_char(sal,'$009,999') FROM scott.emp;
-- 9 每一个9表示一个有效位,转换至的有效位应该和9的各位相同
-- 0 显示前导的0或后继的0
-- , 在指定的位置上返回一个逗号
-- . 在指定的位置上返回一个小数点
-- $ 返回带有前导货币符号的数值
-- L 在指定的位置上返回本地的货币符号
SELECT to_char(sal,'L999,999','NLS_CURRENCY=¥') FROM scott.emp;
SELECT * FROM v$nls_parameters WHERE parameter='NLS_CURRENCY';
-- TO_DATE(),将char或varchar2类型的字符串强制转换为日期值
SELECT SYSDATE-to_date('1997-07-07','yyyy-mm-dd') FROM dual;
-- TO_NUMBER(),将char或varchar2类型强制转换为number值
SELECT * FROM scott.emp WHERE empno=to_number('7788');
SELECT to_number('$1234,5678','$9999,9999') FROM dual;