oracle function函数

偏执的太偏执、 2024-02-17 22:14 150阅读 0赞

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

1.function函数的语法如下:

[sql] view plain copy

  1. createorreplacefunction function_name (
  2. argu1 [mode1] datatype1, --定义参数变量
  3. argu2 [mode2] datatype2 --定义参数变量
  4. ) return datatype --定义返回的数据类型
  5. is
  6. begin
  7. end;

执行:

[sql] view plain copy

  1. var v1 varchar2(100)
  2. exec :v1:=function_name

2.不带任何参数的定义

[sql] view plain copy

  1. createorreplacefunction 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. createorreplacefunction 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. createorreplacefunction 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. createorreplacefunction 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. RETURNNULL;
  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

3

发表评论

表情:
评论列表 (有 0 条评论,150人围观)

还没有评论,来说两句吧...

相关阅读