先来看一看什么叫存储过程吧,
在Oracle中,可以在数据库中定义子程序,这种程序块被称作存储过程(procedure)他存放在数据字典中,可以在不同的用户和应用程序之间共享,并可实现程序的优化和重用,
有什么优点:
第一,过程在服务器端运行,速度快。
第二,过程执行一次后代码就驻留在高速缓冲存储器,在以后操作中,只需从高速缓冲存储器中调用以编译代码执行,提高了系统性能。
第三,确保数据库的安全,可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问这些表的过程,非表的授权用户除非通过过程,否则不能访问这些表。
第四,自动完成需要预先执行的任务,过程可以在系统启动时自动执行,而不必再系统启动后在进行手动操作,大大方便了用户的使用,可以自动完成一些需要预先执行的任务。
先来看看几个简单的例子吧,
例子一:
计算指定系总学分大与40的人数;
create or replace procedure count_grade
(zym in char,person_num out number)
as
begin
select count(zxf)
into person_num
from XS
where ZYM = zym;
end count_grade;
呵呵,够简单的吧
下面的用到了if else;
例子二:
统计表XS中男女同学的人数,存储过程使用到了一个输入参数和一个输出参数;
create or replace procedurre count_num
(
sex in char,
num out number
)
as
begin
if sex = '男' then
select count(XB) into num
from xs
where XB = '男';
else
select countXS) into num
from xs
where XB = '女';
end if;
end count_num;
接下来就调用一下吧,在调用过程count_num时,需要先调用out类型的参数。
declare
man_num number;
begin
count_num('男',man_num)
end;
再来一个,删除指定员工号的信息,
CREATE OR REPLACE PROCEDURE DelEmp
(v_empno IN emp.empno%TYPE) --->emp.empno%TYPE是为了参数和emp表的empno字段一致
AS
No_result EXCEPTION;
BEGIN
DELETE FROM emp WHERE empno=v_empno;
IF SQL%NOTFOUND THEN
RAISE no_result;
END IF;
DBMS_OUTPUT.PUT_LINE('编码为'||v_empno||'的员工已被除名!');