oracle function

来源:互联网 发布:电魂网络客服电话 编辑:程序博客网 时间:2024/05/21 22:48

原文地址:http://blog.csdn.net/jumtre/article/details/38092067


函数调用限制
1、SQL语句中只能调用存储函数(服务器端),而不能调用客户端的函数
2、SQL只能调用带有输入参数,不能带有输出,输入输出函数
3、SQL不能使用PL/SQL的特有数据类型(boolean,table,record等)
4、SQL语句中调用的函数不能包含INSERT,UPDATE和DELETE语句

1.function函数的语法如下:

[sql] view plain copy
  1.     create or replace function function_name (  
  2.      argu1 [mode1] datatype1, --定义参数变量  
  3.      argu2 [mode2] datatype2 --定义参数变量  
  4.  ) return datatype --定义返回的数据类型  
  5. is   
  6.   
  7. begin  
  8.   
  9. end;  

执行:

[sql] view plain copy
  1. var v1 varchar2(100)   
  2. exec :v1:=function_name  

2.不带任何参数的定义

[sql] view plain copy
  1. create or replace function get_user   
  2. return varchar2   
  3. is   
  4. Result varchar2(50); --定义变量  
  5. begin   
  6. select username into Result from user_users;   
  7. return(Result); --返回值  
  8. end get_user;  


3.带有in参数的

[sql] view plain copy
  1. create or replace function get_sal(  
  2. empname in varchar2  
  3. return number   
  4. is   
  5. Result number;   
  6. begin   
  7. select sal into Result from emp where ename=empname;   
  8. return(Result);   
  9. end;  
执行:

[sql] view plain copy
  1. SQL> var sal number   
  2. SQL> exec :sal:=get_sal('scott');  

4.带out参数的

[sql] view plain copy
  1. create or replace function get_info(  
  2. e_name varchar2,  
  3. job out varchar2  
  4. return number   
  5. Is  
  6. Result number;   
  7. begin   
  8. select sal,job into Result,job from emp where ename=e_name;   
  9. return(Result);   
  10. end;  
执行:

[sql] view plain copy
  1. SQL> var job varchar2(20)   
  2. SQL> var dname varchar2(20)   
  3. SQL> exec :dname:=get_info('SCOTT',:job)  


5.带in out参数的

6.函数调用举例

[sql] view plain copy
  1. create or replace function f_sys_getseqid(  
  2.     v_seqname           IN VARCHAR2,  
  3.     v_provincecode      IN VARCHAR2    --省编码  
  4. return Varchar2  
  5. IS  
  6.     iv_date             VARCHAR2(8);  
  7.     iv_seqname          VARCHAR2(50);  
  8.     iv_sqlstr           VARCHAR2(200);  
  9.     iv_seq              VARCHAR2(8);  
  10.     iv_seqid            VARCHAR2(16);  
  11. BEGIN  
  12.     iv_seqname := LOWER(TRIM(v_seqname));  
  13.     iv_sqlstr := 'SELECT '||iv_seqname||'.nextval FROM DUAL';  
  14.     EXECUTE IMMEDIATE iv_sqlstr INTO iv_seq;--执行动态的sql语句,执行相似的一组语句  
  15.     IF v_seqname = 'SEQ_FUNCROLE_ID' THEN  
  16.       iv_seqid:= 'ESS' || LPAD(iv_seq,5,'0');  
  17.     ELSE  
  18.       SELECT substrb(v_provincecode,1,2)||TO_CHAR(SYSDATE,'yymmdd'INTO iv_date FROM DUAL;  
  19.       iv_seqid:= iv_date || LPAD(iv_seq,8,'0');  
  20.     END IF;  
  21.     RETURN iv_seqid;  
  22. EXCEPTION  
  23.     WHEN OTHERS THEN  
  24.     RETURN NULL;  
  25. END;  
调用方式如下:

[sql] view plain copy
  1. SELECT TO_NUMBER(F_SYS_GETSEQID('SEQ_TERMTRADE_ID', V_PROVINCE_CODE)) INTO V_BATCH_ID FROM DUAL;  

EXECUTE IMMEDIATE的说明:执行动态的sql语句。


转载自:http://www.blogjava.net/stevenjohn/archive/2012/08/12/385324.html

原创粉丝点击