CHIL-ORACLE-函数

创建函数的的语法:
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       ‘   7849 返回指定位数的数值,前面为0,显示为空格 99999      -578      ‘  -5789 返回指定位数的数值,前面为0,显示为空格 99999     1234567   ‘######’
 9 返回指定位数的数值,前面为0,显示为空格 99999     45.895    ‘  469 插入小数点                           9999.99   784784.009 插入小数点                           9999.99   45.348245.359  在结果串的指定位置插入逗号            9,999,999  784       ‘   7849  在结果串的指定位置插入逗号            9,999,999  1234567   ‘1,234,5679  在结果串的指定位置插入逗号            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   年份用四个数字表示(1999YEAR   年份的字母全部拼写(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 LeftFROM 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=746,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;


大小写转换 UPPERLOWER
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

 

posted @ 2017-03-07 10:20  CHIL  阅读(416)  评论(0编辑  收藏  举报