存储过程
关键字procedure or replace 作用: p1已经存在时 直接修改 创建一个过程函数 p1 参数是 emp中的 员工id类型
p1的参数类型还可以加 in out 默认不写就是 in
create or replace procedure p1(eno emp.empno%type)
is
begin
update emp set sal = sal+1000 where empno = eno; 修改员工工资
end;
使用 过程
declare
begin
p1(7788); 7788员工的工资就加了1000
end;
存储函数
就是定一个函数 有返回值 关键字 function 在定义时需要将返回值 定义在 is 内 然后给它赋值就可以了 返回了
注意 return 的后面只能定义它的类型 不能定义返回的范围 number(10)
create or replace function f_yearsal(eno emp.empno%type) return number
is
s number(10);
begin
select sal*12+nvl(comm,0) into s from emp where empno= eno; 计算员工的年薪
return s;
end;
使用函数 因为 函数 f_yearsal有返回值 所以需要定义一个 变量来接受它
declare
s number(10);
begin
s :=f_yearsal(7788);
dbms_output.put_line(s);
end;
out 和 in 使用
使用 过程计算年薪 因为过程没有返回值 所以需要 再定义一个 输出类型的参数yearsal
create or replace procedure p_yearsal(eno emp.empno%type,yearsal out number) 参数也不能加范围
is
s number(10);
c emp.comm%type; 分别给工资和奖金赋值
begin
select sal*12,nvl(comm,0) into s,c from emp where empno= eno;
yearsal :=s+c;
end;
当执行完p_yearsal 后 yearsal 就有值了 定义一个变量接受
declare
yearsal number(10);
begin
p_yearsal(7788,yearsal);
dbms_output.put_line(yearsal);
end;
什么时候用out 当遇到 := 或者 into 赋值语句给变量赋值的时候 都必须是out的
列如 过程 p_yearsal(eno emp.empno%type,yearsal out number) eno没有给他 := 或into 就是in 而yearsal 有 :=赋值
过程和函数的区别
存储过程 没有返回值 存储函数有返回值 多了两个return
如果想用 存储过程 实现有返回值 就必须使用 out类型的 参数, 但是其本质 也不是有返回值,而是 执行完毕后 给 这个参数赋值
可以用 存储函数 来自定义 函数 列如单行函数 upper,就是利用 存储函数的有返回值