存储函数,存储过程
相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。
2.都是一次编译,多次执行。
不同点:1.存储过程定义关键字用procedure,函数定义用function。
2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。
3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute 2.使用begin和end),函数除了存储过程的两种方式外,
还可以当做表达式使用,例如放在select中(select f1() form dual;)。
总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。
一:存储函数
1.存储函数编写
(1)函数的声明
(2)函数形参声明 in /out
(3)返回值类型 return type;
(3)变量声明 基本变量/record/cursor
(4)返回值 retun result;
关于 OUT 型的参数: 因为函数只能有一个返回值, PL/SQL 程序可以通过 OUT 型的参数实现有多个返回值 要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的参数). 要求: 部门号定义为参数, 工资总额定义为返回值. create or replace function sum_sal(dept_id number, total_count out number) return number is --变量声明(游标) cursor sal_cursor is select salary from employees where department_id = dept_id; v_sum_sal number(8) := 0; begin total_count := 0; for c in sal_cursor loop v_sum_sal := v_sum_sal + c.salary; total_count := total_count + 1; end loop; --dbms_output.put_line('sum salary: ' || v_sum_sal); return v_sum_sal; end;
2.调用测试 select function(参数) from dual; //记得接收返回值
delare v_total number(3) := 0; begin dbms_output.put_line(sum_sal(80, v_total)); dbms_output.put_line(v_total); end;
二:存储过程
1.存储过程创建 和存储函数基本相同,只是没有return返回值
定义一个存储过程: 获取给定部门的工资总和(通过 out 参数), 要求:部门号和工资总额定义为参数 create or replace procedure sum_sal_procedure(dept_id number, v_sum_sal out number) is cursor sal_cursor is select salary from employees where department_id = dept_id; begin v_sum_sal := 0; for c in sal_cursor loop --dbms_output.put_line(c.salary); v_sum_sal := v_sum_sal + c.salary; end loop; dbms_output.put_line('sum salary: ' || v_sum_sal); end;
2.调用测试
declare v_sum_sal number(10) := 0; begin sum_sal_procedure(80,v_sum_sal); end;