当前位置:   article > 正文

Oracle 函数_oracle 调用函数

oracle 调用函数

1.函数:

函数与存储过程相似,也是数据库中存储的已命名PL/SQL程序块。函数的主要特征是它有且仅有一个返回值。通过return来指定函数的返回类型。在函数的任何地方可以通过return expression语句从函数返回,返回类型必须和声明的返回类型一致

语法:

  1. create or replace function function_name
  2. [(parameter_list)]
  3. return datatype
  4. {is/as}
  5. [declare_section]
  6. begin
  7.   executable_statements; --也必须含有return语句
  8. [exception_handlers;]
  9. end;
  10. function_name:函数名称。
  11. parameter_list:函数列表,可选。
  12. return datatype:指定函数的返回类型,不能指定大小。
  13. declare_section:声明部分,用来声明变量,可选。
  14. executable_statements:要执行的PL-SQL语句。
  15. exception_handlers:异常处理,可选。
  16. or repalce:是否覆盖,可选。

实例:

  1. --读入两个值, 返回比较大的值
  2. create or replace function function1(para1 in number, para2 in number)
  3. return number
  4. as
  5. begin
  6. if para1 > para2 then
  7. return para1;
  8. else
  9. return para2;
  10. end if;
  11. end function1;
  1. --法一:
  2. create or replace function sayhello return varcahr2 --varcahr2不能有长度
  3. is
  4. say varchar2(20); --这个地方是可以定义长度的。
  5. begin
  6. say := 'hello world';
  7. return say;
  8. end;
  9. --法二:
  10. create or replace function sayhello2 return varcahr2 --varcahr2不能有长度
  11. is
  12. begin
  13. return 'hello world';
  14. end;
  15. --调用:
  16. select sayhello2 from dual;

2.函数和存储过程的优势:

1、共同使用的代码可以只需要被编写一次,而被需要该代码的任何应用程序调用(.net,c++,java,也可以使DLL库);简化了应用程序的开发维护,提高了效率和性能。

2、这种模块化的方法使得一个复杂的问题、大的程序逐步简化成几个简单的、小的程序部分,进行分别编写,因此程序的结构更加清晰,简单,也容易实现。

3、节省内存空间。它们以一种压缩的形式被存储在外存中,当被调用时才被放入内存进行处理。而且多个用户在调用同一个存储过程或函数时,只需要加载一次即可。

4、提高数据的安全性和完整性。通过把一些对数据的操作方到存储过程或函数中,就可以通过是否授予用户有执行该语句的权限,来限制某些用户对数据库进行这些操作。

3、函数和存储过程的区别:

1、存储过程用户在数据库中完成特定操作或者任务(如插入,删除等),函数用于返回特定的数据,函数中不能包含对数据库执行操作的语句,如DML语句(增删改查)。

2、存储过程可以没有返回值,而函数必须要有返回值。

3、sql语句(DML或SELECT)中不可用调用存储过程,而函数可以。

4、适用场合:

1、如果需要返回多个值和不返回值,就使用存储过程;如果只需要返回一个值,就使用函数。

2、存储过程一般用于执行一个指定的动作,函数一般用于计算和返回一个值。

3、可以在SQL内部调用函数来完成复杂的计算问题,但不能调用存储过程。

5.自定义函数:

数据库中函数包含四个部分:声明、返回值、函数体和异常处理。

  1. --没有参数的函数
  2. create or replace function get_user return varchar2 is
  3. v_user varchar2(50);
  4. begin
  5. select username into v_user from user_users;
  6. return v_user;
  7. end get_user;
  1. --带有IN参数的函数
  2. create or replace function get_empname(v_id in number) return varchar2 as
  3. v_name varchar2(50);
  4. begin
  5. select name into v_name from employee where id = v_id;
  6. return v_name;
  7. exception
  8. when no_data_found then
  9. raise_application_error(-20001, '你输入的ID无效!');
  10. end get_empname;

6.函数调用:

  1. --1.在SQL语句中直接调用 get_avgsal()、get_user是函数
  2. select deptno,get_avgsal(10) from emp where deptno=10;
  3. select get_avgsal(10) 平均值 from dual;
  4. select get_user from dual;
  5. --2.使用输出语句调用函数
  6. set serveroutput on
  7. BEGIN
  8. dbms_output.put_line(avgsal(10));
  9. END ;

7.删除函数: 

drop function get_empname;

8.实例: 

1.定义一个函数,用于计算emp表中某个部门的平均工资

  1. create or replace function get_avgsal(dno in emp.deptno%type)
  2. return number
  3. is
  4. f_avgsal emp.sal%type;
  5. begin
  6. select avg(sal) into f_avgsal from emp where deptno=dno;
  7. return f_avgsal;
  8. end;
  9. /
  10. begin
  11. dbms_output.put_line(get_avgsal(10));
  12. end;
  13. /
  14. select get_avgsal(10) from dual;

2. 写一个函数,传入员工编号,返回所在部门名称

  1. create or replace function d_name(eno emp.empno%type)
  2. return varchar2
  3. is
  4.     f_name dept.dname%type;
  5. begin
  6.     select dname into f_name from dept where deptno = (select deptno from emp where empno=eno);
  7.     return f_name;
  8. end;
  9. select d_name(7369) from dual;

3.定义函数,输入部门编号,查询出该部门的员工总数。

  1. create or replace function emp_sum(dno emp.deptno%type)
  2. return number
  3. is
  4. total number;
  5. begin
  6. select count(*) into total from emp group by deptno having deptno=dno;
  7. return total;
  8. end;
  9. /
  10. begin
  11. dbms_output.put_line('该部门总人数为:' || emp_sum(&a));
  12. end;

4.定义函数,使用记录类型作为返回类型,根据指定的部门号返回其对应的部门信息

  1. --方案一:
  2. create or replace function s_dept(dno dept.deptno%type)
  3. return dept%rowtype
  4. is
  5. d_message dept%rowtype;
  6. begin
  7. select * into d_message from dept where deptno=dno;
  8. return d_message;
  9. end;
  10. declare
  11.     v_no dept.deptno%type := &a;
  12. begin
  13. dbms_output.put_line(s_dept(v_no).deptno || '     ' || s_dept(v_no).dname || '     ' || s_dept(v_no).loc);
  14. end;
  15. --方案二:
  16. create or replace function s_dept(dno in dept.deptno%type) return dept%rowtype
  17. is
  18.     d_message dept%rowtype;
  19. begin
  20.     select * into d_message from dept where deptno=dno; 
  21.     return d_message;
  22. end;
  23. declare
  24.     d_no dept.deptno%type:=&a;
  25.     d_mess dept%rowtype:=s_dept(d_no);
  26. begin
  27.     dbms_output.put_line(d_mess.deptno||'   '||d_mess.dname||'    '||d_mess.loc);
  28. end;

 参考:

1.Oracle 自定义函数_风神修罗使的博客-CSDN博客

2.oracle 函数的使用_爱睡觉的小馨的博客-CSDN博客_oracle函数调用 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/584687
推荐阅读
相关标签
  

闽ICP备14008679号