概述
本篇博文中主要探讨以下内容:
存储过程和存储函数
1. 匿名块
2. 命名块(存储过程)
3. 存储函数
--在用到dbms_output.put_line()函数之前先要设置,否则无法输出
set serveroutput on;
--以下语句是输出一句话this is a test!
SQL> begin
dbms_output.put_line('this is a test!');
end;
/
--使用declare用来声明变量
SQL> declare
n number;
begin
n:=90;--sql中给变量赋值要加冒号:
dbms_output.put_line('n='||n);
end;
/
错误示范:
没有设置 set serveroutput on;
没有任何输出结果
设置 set serveroutput on;后
1、一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值。
2、过程和函数都可以通过out指定一个或多个输出行。我们可以利用out参数,在过程和函数中实现返回多个值。
3、存储过程和存储函数都可以有out参数。
4、存储过程和存储函数都可以有多个out参数。
5、存储过程可以通过out参数来实现返回值。
6、如果只有一个返回值,用存储函数;否则,就用存储过程。
1.创建无参存储过程p_my_first_proc
--创建无参存储过程p_my_first_proc (注意第一行最后要加as或者is)
create or replace procedure p_my_first_proc as
begin
dbms_output.put_line('this is my first produre!');
end;
2.执行p_my_first_proc
execute p_my_first_proc;
--创建带有参数存储过程p_fac
create or replace procedure p_fac(n number) as
begin
dbms_output.put_line('n= '||n);
end;
execute p_fac(199);
--创建一个可以返回多个值的存储过程p_fac
--通过out指定一个或多个输出行
create or replace procedure p_fac(n number,res out number) as
begin
res := n * 10;
end;
var r number;
exec p_fac(10,:r);
--调用方法一
var r number;
exec fac(10,:r);
--调用方法二
declare
n number:=9;
r number;
begin
p_fac(n,r);
dbms_output.put_line('r='||r);
end;
--if
create or replace procedure p_max(a number,b number,m out number) as
begin
if a > b then
m := a;
else
m := b;
end if;
end;
--多分支
--while
create or replace procedure p_sum(n number ,res out number) as
i number:=1;
begin
res := 0;
while i <=n loop
res := res + i;
i := i+1;
end loop;
end;
--for
create or replace procedure p_sum(n number,res out number) as
begin
res := 0;
for i in 1..n loop
res := res + i;
end loop;
end;
--利用存储过程和while语句实现1-n之间的累加求和
create or replace procedure p_sum(n number,s out number) as
i number := 1;
begin
s := 0;
while true loop
exit when i>n ;
s := s +i;
i := i + 1;
end loop;
end;
--声明变量
var sum number;
exec(100,:sum);
--通过id 取工资
create or replace procedure getSalByEmpno(eno number,salary out number) is
begin
select sal into salary from emp where empno = eno;
exception
when NO_DATA_FOUND then
RAISE_APPLICATION_ERROR(-20000,'该雇员不存在');
end;
--调用方式一
declare
salary number;
begin
getSalByEmpNo(7654,salary);
dbms_output.put_line('salary = ' || salary);
end;
--调用方式二
declare
sal number;
begin
getSalByEmpno(salary=>sal,eno=>7654);
dbms_output.put_line('salary = ' || sal);
end;
--查看原代码
select * from user_source where name = upper('getSalbyempno');
删除存储过程 DROP PROCEDURE 存储过程名字
--查看所有的存储过程和函数
select *From user_source;
--删除存储过程 p_test
drop procedure p_test;
注意:函数是有返回值的
1.创建函数
--创建函数
--根据员工编号查出工资
create or replace function getSalByEmpno(eno number) return number as
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno = eno ;
return v_sal;
exception
when NO_DATA_FOUND then
raise_application_error(-20000,'该雇员不存在');
end;
--调用一
var v_sal number;
exec :v_sal := getSalByEmpno(7900);
--调用二
select getSalByEmpno(7900) from dual;
--显示错误
show errors
--或者
select * from user_errors;
--查看对象之间的依赖关系
select * from user_dependencies;
drop function f_test;
存储函数有返回值,而存储过程没有返回值。
- 如果存储过程想实现有返回值的业务,我们就必须使用out类型的参数。
- 即便是存储过程使用了out类型的参数,起本质也不是真的有了返回值,
- 而是在存储过程内部给out类型参数赋值,在执行完毕后,我们直接拿到输出类型参数的值。