创建函数的的语法:
create [or replace] function
function_name [(param1,param2)] --函数名、参数
return param_type is|as --返回值类型
[local declarations] --变量声明
begin
executable statements;
return result; --返回值
exception
exception handlers;
end function_name
9.1.TO_CHAR
将一个数值转换成与之等价的字符串.如果不指定格式,将转换成最简单的字符串形式.如果为负数就在前面加一个减号.
9.1.1.TO_CHAR(number[,format])
Oracle为数值提供了很多格式,下表列出了部分可接受的格式:
元素 描述 示例 值 结果
9 返回指定位数的数值,前面为0,显示为空格 99999 784 ‘ 784’
9 返回指定位数的数值,前面为0,显示为空格 99999 -578 ‘ -578’
9 返回指定位数的数值,前面为0,显示为空格 99999 1234567 ‘######’
9 返回指定位数的数值,前面为0,显示为空格 99999 45.895 ‘ 46’
9 插入小数点 9999.99 784 ‘784.00’
9 插入小数点 9999.99 45.3482 ’45.35’
9 在结果串的指定位置插入逗号 9,999,999 784 ‘ 784’
9 在结果串的指定位置插入逗号 9,999,999 1234567 ‘1,234,567’
9 在结果串的指定位置插入逗号 9,999,999 0.44 ‘ 0’
$ 返回值前面加一个元符号 $99,999 784 ‘$784’
$ 返回值前面加一个元符号 $99,999 -578 ‘-$578’
B 结果的整数部分如果是0,就显示成空格 B9999.9 784 ‘ 784.0’
B 结果的整数部分如果是0,就显示成空格 B9999.9 0.44 ‘ .4’
S 返回 有正负号的数值 S9999 784 ‘+784’
EEEE 以科 计数法表示数值 9.9EEEE 45 ‘ 4.5E+01’
EEEE 以科 计数法表示数值 9.9EEEE 0.0666 ‘ 6.7E-02’
9.1.2.TO_CHAR(date[,format])
用途:
将按format参数指定的格式将日期值转换成相应的字符串形式.同样,Oracle提供许多的格式模型,
用户可以用它们的组合来表示最终的输出格式.唯一限制就是最终的掩码不能超过22个字符.
格式 意义
D 用数字表示星期几(1,2,3,4,5,6,7)
DY 用三个字符表示星期几的缩写形式(MON)
DAY 星期几的完整表示(MONDAY)
DD 用数字表示一月中的几号
DDD 用数字表示年份中的天数
W 一月中的星期数
WW 一年中的星期数
MM 用数字表示月数
MON 用三个字母表示月的缩写(APR)
MONTH 月的完整英文表示(FEBRUARY)
Y 年份中的最后一个数字(9)
YY 年份中的最后二个数字(99)
YYY 年份中的最后三个数字(999)
YYYY 年份用四个数字表示(1999)
YEAR 年份的字母全部拼写(NINETEEN-NINETY-NINE)
AM或PM 午前或午后表示符
HH 用小时表示日期
MI 分钟表示小时
SS 秒钟表示分钟
SSSS 自午夜以来的秒数(这个数字经常在0-86399之间)
9.1.3. TO_DATE(string,format)
用途:
根据给定的格式将一个字符串转换成Oracle的日期值.
该函数的主要用途是用来验证输入的日期值.在应用程序中,
用户必须验证输入日期是否有效,如月份是否在1~12之间和日期中的天数是否在指定月份的天数内.
9.2. TO_NUMBER(string[,format])
用途:
该函数将一个字符串转换成相应的数值.对于简单的字符串转换数值(例如几位数字加上小数点).格式是可选的.
9.3. ADD_MONTHS(date,number)
用途:
在日期date上加指定的月数,返回一个新日期.如果给定为负数,返回值为日期date之前几个月的日期.number应当是个整数,如果是小数,
正数被截为小于该数的最大整数,负数被截为大于该数的最小整数.
--例如:
SELECT TO_CHAR(ADD_MONTHS(sysdate,1),'DD-MON-YYYY') "Next month";
FROM dual
Next month
-----------
19-FEB-2000
9.4. LAST_DAY(date)
用途: 返回日期date所在月份的最后一天的日期.
--例如:
SELECT SYSDATE, LAST_DAY(SYSDATE) "Last",LAST_DAY(SYSDATE) - SYSDATE "Days Left"
FROM DUAL
SYSDATE Last Days Left
--------- --------- ----------
19-JAN-00 31-JAN-00 12
9.5. MONTHS_BETWEEN(date1,date2)
用途:返回两个日期之间的月份.如果两个日期月份内的天数相同(或者都是某个月的最后一天),返回值是整数.否则,返回值是小数,
每于1/31月来计算月中剩余天数.如果第二个日期比第一个日期还早,则返回值是负数.
--例如:
SELECT MONTHS_BETWEEN(TO_DATE('02-02-1992', 'MM-DD-YYYY'), TO_DATE('01-01-1992', 'MM-DD-YYYY')) "Months"
FROM DUAL
Months
----------
1.03225806
--例如:
SELECT MONTHS_BETWEEN(TO_DATE('02-29-1992', 'MM-DD-YYYY'), TO_DATE('01-31-1992', 'MM-DD-YYYY')) "Months" FROM DUAL
Months
----------
1
9.6.NEXT_DAY(date,day)
用途:该函数返回日期date指定若天后的日期.注意:参数day必须为星期,可以星期几的英文完整拼写,或前三个字母缩写,或数字1,2,3,4,5,6,7分别表示星期日到星期六.例如,查询返回本月最后一个星期五的日期.
--例如:
SELECT NEXT_DAY((last_day(sysdate)-7),'FRIDAY')
FROM dual
NEXT_DAY(
---------
28-JAN-00
9.7. NEXT_DAY(date[,format])
用途:该函数把一个日期四舍五入到最接近格式元素指定的形式.如果省略format,只返回date的日期部分.
--例如,如果想把时间(24/01/00 14:58:41)四舍五入到最近的小时.下表显示了所有可用格式元素对日期的影响.
Format Element Result
SS 24/01/00 14:58:41
MI 24/01/00 14:59:00
HH 24/01/00 15:00:00
DD 25/01/00 00:00:00
MM 01/02/01 00:00:00
YY 01/01/00 00:00:00
CC 01/01/00 00:00:00
--例如:
SELECT to_char(ROUND(sysdate,'HH'),'DD-MON-YY HH24:MI:SS')
FROM dual
TO_CHAR(ROUND(SYSDATE,'HH'),'DD-MON-YYHH24:MI:SS')
-----------------------------------------------------------------
24-JAN-00 15:00:00
9.8. TRUNC(date[,format])
用途:TRUNC函数与ROUND很相似,它根据指定的格式掩码元素,只返回输入日期用户所关心的那部分,与ROUND有所不同,它删除更精确的时间部分,而不是将其四舍五入.
--例如:
SELECT TRUNC(sysdate)
FROM dual
TRUNC(SYS
---------
24-JAN-00
9.9. FLOOR 求两个日期之间的天数用;
select floor(sysdate - to_date('20080805','yyyymmdd')) from dual;
9.10. ASCII(character)
用途:返回指定字符的ASCII码值.如果为字符串时,返回第一个字符的ASCII码值.
--例如:
SELECT ASCII('Z')
FROM dual
ASCII('Z')
----------
90
9.11. CHR(number)
用途:该函数执行ASCII函数的反操作,返回其ASCII码值等于数值number的字符.该函数通常用于向字符串中添加不可打印字符.
--例如:
SELECT CHR(65)||'BCDEF'
FROM dual
CHR(65
------
ABCDEF
9.12. CONCAT(string1,string2)
用途:该函数用于连接两个字符串,将string2跟在string1后面返回,它等价于连接操作符(||).
--例如:
SELECT CONCAT(‘This is a’,’ computer’)
FROM dual
CONCAT('THISISA',
------------------
This is a computer
它也可以写成这样:
SELECT ‘This is a’||’computer’
FROM dual
'THISISA'||'COMPUT'
------------------
This is a computer
这两个语句的结果是完全相同的,但应尽可能地使用||操作符.
9.13. INITCAP(string)
用途:该函数将字符串string中每个单词的第1个字母变成大写字母,其它字符为小写字母.
--例如:
SELECT INITCAP(first_name||'.'||last_name)
FROM employee
WHERE department_id=12
INITCAP(FIRST_NAME||'.'||LAST_N
-------------------------------
Chris.Alberts Matthew.Fisher Grace.Roberts Michael.Douglas
9.14. INSTR(input_string,search_string[,n[,m]])
用途:该函数是从字符串input_string的第n个字符开始查找搜索字符串的第m次出现,如果没有找到搜索的字符串,函数将返回0.如果找到,函数将返回位置.
--例如:
SELECT INSTR('the quick sly fox jumped over the lazy brown dog','the',2,1) FROM dual
INSTR('THEQUICKSLYFOXJUMPEDOVERTHELAZYBROWNDOG','THE',2,1)
----------------------------------------------------------
9.15. INSTRB(input_string,search_string[,n[,m]])
用途:该函数类似于INSTR函数,不同之处在于INSTRB函数返回搜索字符串出现的字节数,而不是字符数.在NLS字符集中仅包含单字符时,
INSTRB函数和INSTR函数是完全相同的.
9.16. LENGTH(string)
用途:该函数用于返回输入字符串的字符数.返回的长度并非字段所定义的长度,而只是字段中占满字符的部分.
以列实例中,字段first_name定义为varchar2(15).
--语法:
SELECT first_name,LENGTH(first_name)
FROM employee
FIRST_NAME LENGTH(FIRST_NAME)
--------------- ------------------
JOHN 4
KEVIN 5
9.17. LENGTHB(string)
用途:该函数用于返回输入字符串的字节数.对于只包含单字节字符的字符集来说LENGTHB函数和LENGTH函数完全一样.
9.18. LOWER(string)
用途:该函数将字符串string全部转换为小写字母,对于数字和其它非字母字符,不执行任何转换.
9.19. UPPER(string)
用途: 该函数将字符串string全部转换为大写字母,对于数字和其它非字母字符,不执行任何转换.
9.20. LPAD(string,length[,’set’])
用途:在字符串string的左边加上一个指定的字符集set,从而使串的长度达到指定的长度length.参数set可以是单个字符,也可以是字符串.如果string的长度小于length时,取string字符串的前length个字符.
--例如:
SELECT first_name,LPAD(first_name,20,' ')
FROM employee
FIRST_NAME LPAD(FIRST_NAME,20,'')
--------------- -----------------------------------------
JOHN JOHN
KEVIN KEVIN
9.21. RPAD(string,length[,’set’])
用途:在字符串string的右边加上一个指定的字符集set,从而使串的长度达到指定的长度length.参数set可以是单个字符,也可以是字符串.如果string的长度小于length时,取string字符串的前length个字符.
--例如:
SELECT first_name,rpad(first_name,20,'-')
FROM employee
FIRST_NAME RPAD(FIRST_NAME,20,'-')
--------------- -----------------------------------------
JOHN JOHN----------------
KEVIN KEVIN---------------
9.22. LTRIM(string[,’set’])
用途:该函数从字符串的左边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止.
--例如:
SELECT first_name,ltrim(first_name,'BA')
FROM employee
WHERE first_name='BARBARA'
FIRST_NAME LTRIM(FIRST_NAM
--------------- ---------------
BARBARA RBARA
9.23. RTRIM(string[,’set’])
用途:该函数从字符串的右边开始,去掉字符串set中的字符,直到看到第一个不在字符串set中的字符为止.具有NULL值的字段不能与具有空白字符的字段相比较.
这是因为空白字符与NULL字符是完全不同的两种字符.该函数的另外一个用途是当进行字段连接时去掉不需要的字符.
9.24. SUBSTR(string,start[,length])
用途:该函数从输入字符串中取出一个子串,从start字符处开始取指定长度的字符串,如果不指定长度,返回从start字符处开始至字符串的末尾.
9.25. REPLACE(string,search_set[,replace_set])
用途:该函数将字符串中所有出现的search_set都替换成replace_set字符串.可以使用该函将字符串中所有出现的符号都替换成某个有效的名字.如果不指定replace_set,则将从字符串string中删除所有的搜索字符串search_set.
--例如:
SELECT REPLACE('abcdefbdcdabc,dsssdcdrd','abc','ABC') FROM dual
REPLACE('ABCDEFBDCDABC',
-----------------------
ABCdefbdcdABC,dsssdcdrd
9.26. TRANSLATE(string,search_set,replace_set)
用途:该函数用于将所有出现在搜索字符集search_set中的字符转换成替换字符集replace_set中的相应字符.注意:如果字符串string中的某个字符没有出现在搜索字符集中.则它将原封不动地返回.如果替换字符集replace_set比搜索字符集search_set小,那么搜索字符集search_set中后面的字符串将从字符串string中删除.
--例如:
SELECT TRANSLATE('GYK-87M','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',9999999999xxxxxxxxxxxxxx)
FROM dual
TRANSL
------
xx-99x
9.27. ABS(number)
用途:该函数返回数值number的绝对值.绝对值就是一个数去掉符号的那部分.
9.28. SQRT(number)
用途:该函数返回数值number的帄方根,输入值必须大于等于0,否则返回错误.
9.29. CEIL(number)
用途:该函数返回大于等于输入值的下一个整数.
9.30. FLOOR(number)
用途:该函数返回小于等于number的最大整数.
9.31. MOD(n,m)
用途:该函数返回n除m的模,结果是n除m的剩余部分.m,n可以是小数,负数.
9.32. POWER(x,y)
用途:该函数执行LOG函数的反操作,返回x的y次方.
9.33. ROUND(number,decimal_digits)
用途:该函数将数值number四舍五入到指定的小数位.如果decimal_digits为0,则返回整数.decimal_digits可以为负数.
9.34. TRUNC(number[,decimal_pluces])
用途:该函数在指定的小数字上把一个数值截掉.如果不指定精度,函数预设精度为0. decimal_pluces可以为负数.
9.35. SIGN(number)
用途:该函数返回number的符号,如果number为正数则返回1,为负数则返回-1,为0则返回0.
9.36. SIN(number)
用途:该函数返回弧度number的正弦值.
9.37. SINH(number)
用途:该函数返回number的返正弦值.
9.38. COS(number)
用途:该函数返回弧度number的三角余弦值.要用角度计算余弦,可以将输入值乘以0.01745转换成弧度后再计算.
9.39. COSH(number)
用途:该函数返回输入值的反余弦值.
9.40. TAN(number)
用途:该函数返回弧度number的正切值.
9.41. TANH(number)
用途:该函数返回数值number的反正切值.
9.42. LN(number)
用途:该函数返回number自然对数.
9.43. EXP(number)
用途:该函数返回e(2.71828183)的number次方.该函数执行自然对数的反过程.
9.44. LOG(base,number)
用途:该函数返回base为底,输入值number的对数. 单行函数:
单行函数中可以对任何数据类型的数据进行操作.
9.45. DUMP(expression[,format[,start[,length]]])
用途:该函数按指定的格式显示输入数据的内部表示.下表列出了有效的格式.
格式代码 描述
8 八进制
10 十进制
16 十六进制
17 单字符
--例如:
SELECT DUMP('FARRELL',16)
FROM dual
DUMP('FARRELL',16)
----------------------------------
Typ=96 Len=7: 46,41,52,52,45,4c,4c
9.46. GREATEST(list of values)
用途:该函数返回列表中项的最大值.对数值或日期来说,返回值是最大值或最晚日期,如果列表中包含字符串,返回值是按字母顺序列表中的最后一项.
--例如:
SELECT GREATEST(123,234,432,112)
FROM dual
GREATEST(123,234,432,112)
-------------------------
9.47. LEAST(list of values)
用途:该函数返回列表中项的最小值.对数值或日期来说,返回值是最小值或最早日期,如果列表中包含字符串,返回值是按字母顺序列表中的第一项.
--例如:
SELECT LEAST(sysdate,sysdate-10)
FROM dual
LEAST(SYS
---------
10-JAN-00
9.48 NVL(expression,replacement_value)
用途:如果表达式不为空值,函数返回该表达式的值,如果是空值,就返回用来替换的值.
--例如:
SELECT last_name,
NVL(TO_CHAR(COMMISSION),'NOT APPLICABLE')
FROM employee
WHERE department_id=30
LAST_NAME NVL(TO_CHAR(COMMISSION),'NOTAPPLICABLE')
--------------- ----------------------------------------
ALLEN 300
WARD 500
MARTIN 1400
BLAKE NOT APPLICABLE
多行函数
组函数可以对表达式的所有值操作,也可以只对其中不同值进行操作,组函数的语法如下所示:
9.49. function[DISTINCT|ALL expression]
如果既不指定DISTINCT,也不指定ALL,函数将对查询返回的所有数据行进行操作.不能在同一个SELECT语句的选择列中同时使用组函数和单行函数.
9.50. AVG([DISTINCT|ALL] expression)
用途:对查询返回的数据行求帄均值.
--例如:
SELECT AVG(sal) "Average"
FROM emp
Average
----------
2073.21429
9.51. COUNT([DISTINCT|ALL] expression)
用途:计算表达式的个数.要计算EMP表中雇员的个数.
--例如:
SELECT COUNT(deptno)
FROM emp
COUNT(DEPTNO)
-------------
14
SELECT COUNT(distinct deptno)
FROM emp
COUNT(DISTINCTDEPTNO)
---------------------
9.52. MAX([DISTINCT|ALL] expression)
用途:对查询返回的行集求最大值.如果有多个最大值,将所有均返回.要检索公司中最高工资的雇员.
语法:
SELECT ename,sal
FROM emp
WHERE sal=(select max(sal) FROM emp)
ENAME SAL
---------- ---------
KING 5000
9.53. MIN([DISTINCT|ALL] expression)
用途:对查询返回的行集求最小值.如果有多个最小值,将所有均返回.
--例如:
SELECT MIN(last_name)
FROM employee
MIN(LAST_NAME)
---------------
ADAMS
9.54. SUM([DISTINCT|ALL] expression)
用途:计算查询返回的所有非空数值的总和.如果返回的数据都是空值,则该函数也返回空值.
--例如:
SELECT SUM(salary)"Total"
FROM employee
WHERE department_id=10
Total
---------
8750
9.55. VARIANCE([DISTINCT|ALL] expression)
用途:该函数计算返回所有行的统计方差.
--例如:
SELECT VARIANCE(salary)
FROM employee
VARIANCE(SALARY)
----------------
973659.27
字符函数:
数据库字符集与X等价数值 :Chr(x) 相反函数:ASCII
select Chr('65') from dual;
select ASCII('A') from dual;
连接字符串:concat(string 1,string2) 常用||替代
select concat('123','456') from dual;
select '123'||'456'||'789' from dual
去空格: trim(string)\LTRIM\RTRIM
select length(trim(' 12 123 ')) from dual;
select length(LTRIM(' 12 123 ')) from dual;
select LTRIM(' 12 123 ') from dual;
select RTRIM(' 12 123 ') from dual;
大小写转换 UPPER 和 LOWER
select UPPER('aaa') from dual;
select LOWER('AAA') from dual;
首字母大写:INITCAP(enam)\NLS_INICAP 只有首字母大写
select INITCAP('NLS_INICAP') from dual;
字符串截取:substr()
--
select 'ABCDEFG',substr('ABCDEFG',2,3) from dual
--
SELECT 'ABCDEFG',SUBSTR('ABCDEFG',-3,3) FROM DUAL;
字符串长度:length()
select length('1234567') from dual;
内容替换:replace()
select replace('ASDFF','ASD','F')from dual;
内容比较替换:TRANSLATE(string ,string1,string2)
select TRANSLATE('ASDFGHJKL','ASDFGH','q') from dual;
-------------
分析函数 over max(personincome) over(partition by earnmonth,area) 最高值
Min(personincome) over(partition by earnmonth,area) 最低值avg(personincome)
over(partition by earnmonth,area) 平均值sum(personincome)
over(partition by earnmonth,area) 总额
aLL表示对所有,distinct表示对不同的值求最大值,相同的只取一次
常用的聚合函数 AVG,MAX,MIN,COUNT,SUM
select from dual;
select a.empsalary,mod(empsalary,5) from emp a;
select * from emp ;
select ('13500.00'+'20060.00')/2 from dual;
--16780
SUM(DISTINCT|ALL column) 求和
AVG(DISTINCT|ALL column) 平均
MAX(DISTINCT|ALL column) 最大
MIN(DISTINCT|ALL column) 最小
COUNT(DISTINCT|ALL column) 统计 count(*)和count(1)
MEDIAN 求中位数
VARIANCE(DISTINCT|ALL column) 方差
STDDEV(distinct|all column) 标准差
-------------
四舍五入:ROUND()
2、截断小数位:TRUNC()
3、取余(取模):MOD
SELECT ROUND(789.536) FROM dual;
【1】保留2位小数,(如果是-2则对整数进行四舍五入,变为800了)
SELECT ROUND(783.569,2) FROM dual;
【2】使用MOD()函数进行取余操作
SELECT MOD(10,2) FROM dual;
转换函数:
1、TO_CHAR(): 将日期或数值转换成字符串
2、TO_NUMBER():将字符串转换成数字
3、TO_DATE(): 将字符串转换成日期
select TO_DATE('20170208','YYYYMMDD') from DUAL;
SELECT SYSDATE FROM dual;
Oracle提供了以下的日期函数支持:
MONTHS_BETWEEN():求出给定日期范围的月数
ADD_MONTHS():在指定日期上加上指定的月数,求出之后的日期
NEXT_DAY():下一个的今天的日期
LAST_DAY():求出给定日期的最后一天日期
select MONTHS_BETWEEN(SYSDATE,TO_DATE('20170208','YYYYMMDD')) from dual;
select ADD_MONTHS(SYSDATE,1) from dual;
select NEXT_DAY(SYSDATE,2) from dual;
select LAST_DAY(SYSDATE) from dual;
select sysdate from dual;
--返回字符串首字母变成大写
select initcap(t.prod_code) from subs.inf_group t;
--在一个字符串中搜索指定字符。
--instr(被搜索字符串,指定字符串,开始搜索的位置,搜索第几个指定字符)
select instr('oraclerasdf','ra',1,2) from dual;
--返回字符串的长度
select length('aaaa') from dual;
--返回字符串并且将所有的字符小写
select lower('ASDFGHJ') FROM DUAL;
--返回字符串并且将所有的字符大写
select upper('asdfghj') FROM DUAL;
--在字符右边添加字符rpad(被添加添加的字符,添加字符后的总位数,添加的字符)
--在字符左边添加字符lpad(被添加添加的字符,添加字符后的总位数,添加的字符)
select lpad(rpad('aaa',10,'*'),17,'*') from dual;
--删除右边的字符串rtrim(字符串,删除的部分)
select rtrim('gao qian jing','ing') from dual;
--删除左边的字符串rtrim(字符串,删除的部分)
select ltrim('gao qian jing','gao') from dual;
--截取字符串substr('字符串',开始的位置,截取字符串的长度)开始的位置坐标从1开始
select substr('abcdefghijklmnopqistuvwxyz',3,4) from dual;
--替换字符串replace(字符串,被替换的字符串,要替换的字符串)
select replace('he love you','he','i') from dual;
--返回指定值的绝对值
select abs(-100) from dual;
--返回一个大于或等于的整数
select ceil(3.0001) from dual;
--对给定的数据取整
select floor(2.67) from dual;
--mod(n1,n2)返回一个n1除以n2的余数
select mod(13,4) from dual;
--power(n1,n2)返回n1的n2次方根
select power(3,3) from dual;
--按照指定的精度进行舍入
select round(1.5),round(1.4),trunc(1.5),trunc(1.4) from dual;
--比较数字,大于0返回1,小于0返回-1,等于0返回0
select sign(123),sign(-123),sign(0) from dual;
--返回数字的根
select sqrt(9),sqrt(4) from dual;
--按照指定的精度截取一个数
select trunc(123.1666,-1),trunc(123.1666,2) from dual;
--增加或减去月份
select to_char(add_months(to_date('1999-12-07','yyyy-mm-dd'),-3),'yyyy-mm-dd') from dual;
--返回日期的最后一天
select last_day(to_date('1999-12-07','yyyy-mm-dd')) from dual;
--返回两个日期相差的月数
select months_between(to_date('1999-1-08','yyyy-mm-dd'),
to_date('1999-3-07','yyyy-mm-dd')) from dual;
--desc对查询结果进行从大到小的排序
select * from subs.inf_group c order by c.group_id asc;
--nvl(n1,n2) n1为null返回n2 n1不为null返回n1
--nvl2(n1,n2,n3) n1为null返回n2,n2为null返回n3,n2和n3类型不同,n3会转换成n2类型
--nullif(n1,n2) 相等返回null,不相等返回n1
在Oracle中的DBMS_RANDOM程序包中封装了一些生成随机数和随机字符串的函数,其中常用的有以下两个:
DBMS_RANDOM.VALUE函数
该函数用来产生一个随机数,有两种用法:
1. 产生一个介于0和1之间(不包含0和1)的38位精度的随机数,这种用法不包含参数,语法为:
DBMS_RANDOM.VALUE RETURN NUMBER;
2. 产生一个介于指定范围之内的38位精度的随机数,语法为:
DBMS_RANDOM.VALUE(low IN NUMBER,high IN NUMBER) RETURN NUMBER;
这种用法包含两参数,参数low用来指定要生成的随机数的下限,参数high指定上限,生成的随机。
请注意生成的随机数有可能等于下限,但绝对小于上限,即“low<=随机数<high”。
例如: 要产生一个1到100之间的数可以这样写:
DBMS_RANDOM.VALUE(1,100)
DBMS_RANDOM.STRING函数
该函数产生一个随机字符串,语法为:
DBMS_RANDOM.STRING (opt IN CHAR,len IN NUMBER) RETURN VARCHAR2;
len :指定生成的字符串的长度。
opt:指定生成的字符串的样式,
允许的取值及其表示的含义如下表所示:
‘u’或’U’ : 返回一个由大写字母组成的字符串
‘l’或’L’ : 返回一个由小写字母组成的字符串
‘a’或’A’ : 返回一个由大写字母和小写字母组成的字符串
‘x’或’X’ : 返回一个由大写字母和数字组成的字符串
‘p’或’P’ : 返回一个由任意的可打印字符组成的字符串
例如: 要产生一个长度为6且只包括大写字母的字符串,可以这样写:
DBMS—RANDOM.STRING('U',6)
复制代码
1、从表中随机取记录
select * from (select * from staff order by dbms_random.random)
where rownum < 4
表示从STAFF表中随机取3条记录
2、产生随机数
SELECT DBMS_RANDOM.RANDOM FROM DUAL;
产生一个任意大小的随机数
SELECT ABS(MOD(DBMS_RANDOM.RANDOM,100)) FROM DUAL;
产生一个100以内的随机数
SELECT TRUNC(100+900*dbms_random.value) FROM dual;
产生一个100~1000之间的随机数
SELECT dbms_random.value FROM dual;
产生一个0~1之间的随机数
SELECT dbms_random.value(10,20) FROM dual;
产生一个10~20之间的随机数
SELECT dbms_random.normal FROM dual;
NORMAL函数返回服从正态分布的一组数。此正态分布标准偏差为1,期望值为0。这个函数返回的数值中有68%是介于-1与+1之间,95%介于-2与+2之间,99%介于-3与+3之间。
3、产生随机字符串
select dbms_random.string('P',20) from dual;
第一个参数 P 表示 printable,即字符串由任意可打印字符构成
第二个参数表示返回字符串长度
4、ceil( n )函数是返回大于或等于n的最小整数。
DBMS_RANDOM.VALUE()是随机产生( 0,1 )之间的数。
要产生两位的随机数,可以DBMS_RANDOM.VALUE()*100,这样产生( 0,100 )
的随机数,当产生( 0,10)之间的数时,只要加上10就可以保证产生的数都是两位了。
ORACLE的PL/SQL提供了生成随机数和随机字符串的多种方式,罗列如下:
1、小数( 0 ~ 1)
select dbms_random.value from dual
2、指定范围内的小数 ( 0 ~ 100 )
select dbms_random.value(0,100) from dual
3、指定范围内的整数 ( 0 ~ 100 )
select trunc(dbms_random.value(0,100)) from dual
4、长度为20的随机数字串
select substr(cast(dbms_random.value as varchar2(38)),3,20) from dual
5、正态分布的随机数
select dbms_random.normal from dual
6、随机字符串
select dbms_random.string(opt, length) from dual
opt可取值如下:
'u','U' : 大写字母
'l','L' : 小写字母
'a','A' : 大、小写字母
'x','X' : 数字、大写字母
'p','P' : 可打印字符
7、随机日期
select to_date(2454084+TRUNC(DBMS_RANDOM.VALUE(0,365)),'J') from dual
通过下面的语句获得指定日期的基数
select to_char(sysdate,'J') from dual
8、生成GUID
select sys_guid() from dual
--生成带分隔符(-)的GUID的自定义函数
create or replace function my_guid
return varchar2
is
guid varchar(36);
temp varchar(32);
begin
temp:=sys_guid();
guid:= substr(temp,1,8) || '-'
||substr(temp,9,4) || '-'
||substr(temp,13,4)|| '-'
||substr(temp,17,4)|| '-'
||substr(temp,21,12);
return guid;
end;
/
oracle中substr函数的用法
1、substr(string string, int a, int b)
参数1:string 要处理的字符串
参数2:a 截取字符串的开始位置(起始位置是0)
参数3:b 截取的字符串的长度(而不是字符串的结束位置)
例如:
substr("ABCDEFG", 0); //返回:ABCDEFG,截取所有字符
substr("ABCDEFG", 2); //返回:CDEFG,截取从C开始之后所有字符
substr("ABCDEFG", 0, 3); //返回:ABC,截取从A开始3个字符
substr("ABCDEFG", 0, 100); //返回:ABCDEFG,100虽然超出预处理的字符串最长度,但不会影响返回结果,系统按预处理字符串最大数量返回。
substr("ABCDEFG", -3, 3); //返回:EFG,注意参数-3,为负值时表示从尾部开始算起,字符串排列位置不变。
2、substr(string string, int a)
参数1:string 要处理的字符串
参数2:a 可以理解为从索引a(注意:起始索引是0)处开始截取字符串,也可以理解为从第 (a+1)个字符开始截取字符串。
例如:
substr("ABCDEFG", 0); //返回:ABCDEFG, 截取所有字符
substr("ABCDEFG", 2); //返回:CDEFG,截取从C开始之后所有字符
INSTR
(源字符串, 目标字符串, 起始位置, 匹配序号)
在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,就是说从字符的开始
到字符的结尾就结束。
语法如下:
instr( string1, string2 [, start_position [, nth_appearance ] ] )
参数分析:
string1
源字符串,要在此字符串中查找。
string2
要在string1中查找的字符串.
start_position
代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。
nth_appearance
代表要查找第几次出现的string2的位置. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
注意:
如果String2在String1中没有找到,instr函数返回0.
示例:
select instr('121221222122221','1',1,1) from dual;
返回:1
select instr('121221222122221','1',1,2) from dual;
返回:3
select instr('121221222122221','1',1,3) from dual;
返回:6
select instr('121221222122221','1',1,4) from dual;
返回:10
select instr('121221222122221','1',1,5) from dual;
返回:15
select instr('121221222122221','1',1,6) from dual;
返回:0
select instr('121221222122221','12',1,1) from dual;
返回:1
select instr('121221222122221','12',1,2) from dual;
返回:3
select instr('121221222122221','12',1,3) from dual;
返回:6
select instr('121221222122221','12',1,4) from dual;
返回:10
select instr('121221222122221','12',1,5) from dual;
返回:0
select instr('121221222122221','12',1,6) from dual;
返回:0
SELECT instr('syranmo','s') FROM dual; -- 返回 1
SELECT instr('syranmo','ra') FROM dual; -- 返回 3
1 SELECT instr('syran mo','a',1,2) FROM dual; -- 返回 0
(根据条件,由于a只出现一次,第四个参数2,就是说第2次出现a的位置,显然第2次是没有再出现了,所以结果返回0。注意空格也算一个字符!)
SELECT instr('syranmo','an',-1,1) FROM dual; -- 返回 4
(就算是由右到左数,索引的位置还是要看‘an’的左边第一个字母的位置,所以这里返回4)
SELECT instr('abc','d') FROM dual; -- 返回 0
注:也可利用此函数来检查String1中是否包含String2,如果返回0表示不包含,否则表示包含。
对于上面说到的,我们可以这样运用instr函数。请看下面示例:
如果我有一份资料,上面都是一些员工的工号(字段:CODE),可是我现在要查询出他们的所有员工情况,例如名字,部门,职业等等,这里举例是两个员工,工号分别是’A10001′,’A10002′,其中假设staff是员工表,那正常的做法就如下:
1 2 SELECT code , name , dept, occupation FROM staff WHERE code IN ('A10001','A10002');
或者:
SELECT code , name , dept, occupation FROM staff WHERE code = 'A10001' OR code = 'A10002';
有时候员工比较多,我们对于那个’觉得比较麻烦,于是就想,可以一次性导出来么?这时候你就可以用instr函数,如下:
SELECT code , name , dept, occupation FROM staff WHERE instr('A10001,A10002',code)>0;
查询出来结果一样,这样前后只用到两次单引号,相对方便点。
还有一个用法,如下:
SELECT code, name, dept, occupation FROM staff WHERE instr(code, '001') > 0;
等同于
SELECT code, name, dept, occupation FROM staff WHERE code LIKE '%001%' ;
--生成随即字符dbms_random.string(选项,长度);
--选项:u表示大写字母,L表示小写字母,x表示数字和字母混合,p表示任意字符
--随机生成数字:语法1:dbms_random.value; 生成0-1之间随机数
--dbms_random.value*num; 生成0到num之间的随机数
--dbms_random.value(min,max);生成min到max之间的随机数
--随机数取整:round(dbms_random.value(min,max)); 生成min到max之间的随机整数
--随机数取整:trunc(dbms_random.value(min,max)); 生成min到max之间的随机整数
--随机获取13100000000~18999999999之间的数字(也就是131到189之间的手机号码)
select trunc(dbms_random.value(13100000000,18999999999)) from dual;
自定义函数:
create or replace function fun_kiki_emp_avg_sal(v_department emp.department%type)return number is
/*
*(3)创建一个函数,以部门号为参数,返回该部门的平均工资。
*/
v_avg_sal emp.sal%type;
begin
select avg(sal) into v_avg_sal from emp where department=v_department;
return v_avg_sal;
end;
--测试1
declare
v_no number:=0;
begin
v_no:=fun_kiki_emp_avg_sal(10);
dbms_output.put_line(v_no);
end;
---------------------------
18579.9218
--测试2
select fun_kiki_emp_avg_sal(10) from dual;
-----------------------------------
18579.9218