10.5 存储过程
前面介绍了PL/SQL块的基本编写方法。在SQL*Plus中编写并执行PL/SQL块,PL/SQL块的代码存放在SQL*Plus的缓冲区中。如果在SQL*Plus中执行其他SQL语句或者PL/SQL块,SQL*Plus的缓冲区就会存放新的内容,原来的内容会被从缓冲区中清除出去。这种没有名称只是临时存放在缓冲区中的PL/SQL块称为匿名块。
如果希望PL/SQL块能随时被调用执行,并能与数据库中的其他用户共享,那就需要创建有名字的PL/SQL块,并经过编译与优化,存放在数据库中,这就是��储程序。
数据库中的用户只要拥有适当的权限,就可以调用存储程序,将存储程序编译后的伪代码装载到系统全局区的共享池中执行,完成相应的程序功能。
存储程序有存储过程、存储函数、触发器、包等不同形式,本节将介绍存储过程。
10.5.1 建立存储过程
存储过程用于执行特定的操作。建立存储过程的语法如下:
CREATE(OR REPLACE)PROCEDURE
((参数1({IN|OUT|INOUT}),
参数2({IN|OUT|INOUT}))
( AUTHID DEFINER | CURRENT_USER)
{IS|AS)
BEGIN
EXCEPTION
END;
下面解释建立存储过程的参数具体含义。
使用OR REPLAcE选项的功能是当已经存在同名称的存储过程时,首先将其删除,再创建新的存储过程。
存储过程可以带有一个或者多个参数。IN表示该参数接受存储过程外部传递进来的值,是默认的参数传递模式。OuT表示该参数在存储过程中被赋值,并向存储过程外部传递出去。IN OUT表示该参数同时具备IN和OUT两种参数传递模式的特性,既可以接受存储过程外部传递进来的值,又能在存储过程中被赋值,并向存储过程外部传递出去。
AUTHID选项用来设定存储过程被调用时的权限,可以在可选值DEFINER和CURRENT USER中选择其中之一。在默认为DEFlNER,即存储过程被调用时,将以创建者身份执行。如果选择cuRRENT LJSER,那么存储过程被调用时,将以当前登录用户的身份执行,因此选择CURRENT_USER时,存储过程的创建者往往要对当前登录用户进行额外的授权操作,包括执行该存储过程的权限,以及该存储过程中访问的数据库对象的相应权限,如视图的SELECT、表的UPDATE等。
IS和AS作为存储过程声明部分的开始,AS一般用于独立的存储过程,IS一般用于放入程序包中的存储过程。两者的作用是等价的。
存储过程的执行部分和异常处理与前面学习过的PL/SQL块是完全相同的。
(例27)检索某部门的工资总和,这个过程有一个参数,代表部门编号,并打印该信息。
CREATE OR REPLACE PROCEDURE p_deptincome(dept_no IN number)AUTHID DEFINER
AS
total_sal_number:=0;一定义变量total_sal存放工资总和,并赋初值0
BEGIN
SELECT sum(salary)INTo total_sal FROM EMPLOYEES
where DEPARTMENT_ID=dept_no;
dbms_output.put_line(‘部门编号’||to_ehar(dept_no)||‘的工资总和为:’
||to_char(total_sal));
END;
以上代码的执行结果如下:
SQL>/
过程已创建。
……