存储过程
存储过程是Oracle开发者在数据转换或查询报表时经常使用的方式一。存储过程是一种命名PL/SQL程序块,它将一些相关的SQL语句、流程控制语句组合在一起,用于执行某些特定的操作或者任务,可以将经常需要执行的特定的操作写成过程。通过过程名,就可以多次调用过程,从而实现程序的模块化设计。这种方式极大地节省了用户的时间,也提高了程序的效率。
概述
在Oracle中,可以在数据库中定义子程序,在子程序中将一些固定的操作集中起来,由Oracle数据库服务器完成,以完成某个特定的功能。这种子程序称为存储过程(Procc-Dure)。存储过程可以通俗地理解为是存储在数据库服务器中的封装了一段或多段SQL语句的PL/SQL代码块。在数据库中有一些是系统默认的存储过程,那么可以直接通过存储过程的名称进行调用。另外,存储过程还可以在编程语言中调用,如Java、C#等等。
存储过程优点:
- 存储过程在服务器端运行,执行速度快。
- 存储过程执行一次后驻留在Oracle数据库服务器的高速Cache中,以后再次执行存储过程时,只需从高速Cache中调用已经编译好的代码即可,从而提高了系统性能。
- 存储过程确保了数据库的安全。使用存储过程,可以在禁止用户直接访问应用程序中的某些数据表的情况下,授权执行访问这些数据表的存储过程。
- 自动完成需要预先执行的任务。存储过程可以设置为系统启动时自动执行,而不必在系统启动后再进行手动操作,从而方便了用户的使用,可以自动完成一些需要预先执行的任务。
创建存储过程
CREATE [OR REPLACE] PROCEDURE procedure_name
[Parameter [IN | OUT | IN OUT] data_type1,
Parameter [IN | OUT | IN OUT] data_type2,
......]
IS|AS
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END procedure_name;
- OR REPLACE: 表示如果指定的过程已经存在,则覆盖同名的存储过程。
- Procedure_name: 表示存储过程的名称。
- Parameter: 表示存储过程中的参数。
- IN: 表示向存储过程传递参数。
- OUT: 表示从存储过程返回参数。
- Date_type: 表示传入参数的数据类型,也可以带有默认值。
- AS或IS 后声明的变量主要用于过程体内,且不能加DECLARE语句。
执行存储过程
语法:
方式一:直接调用
SQL> exec Procedure_name;
方式二:在另一个PL/SQL中调用
begin
Procedure_name(parameter1,parameter2,...);
end;
示例:创建一个简单的存储过程Insert_student,该过程可用于向Student表添加数据。
表信息如下:
创建存储过程:
create or replace procedure Insert_student is
begin
insert into Student
values(5,'二狗','男',28,'体育学院');
exception
when dup_val_on_index then
dbms_output.put_line('重复的学生ID');
when others then
dbms_output.put_line('发生其它错误!');
end Insert_student;
执行存储过程:
SQL> set serveroutput on; --保证DBMS_OUTPUT.PUT_LINE成功输出
SQL> exec Insert_student;
重复的学生ID
PL/SQL procedure successfully completed
查看存储过程
存储过程一旦被创建就会存储到数据库服务器上,Oracle通过使用视图USER_SOURCE查看已经存在的存储过程脚本。
查看存储过程Insert_student的脚本
user_procedures视图的部分类说明
列 | 类型 | 说明 |
---|---|---|
OBJECT_NAME | VARCHAR2(30) | 对象名,可以是过程、函数或包名 |
PROCEDURE_NAME | VARCHAR2(20) | 过程名 |
AGGREGATE | VARCHAR2(3) | 过程是否是聚合函数。该值为YES或NO |
IMPLTYPEOWNER | VARCHAR2(30) | 实现类型(如果有的话)的所有者名称 |
IMPLTYPENAME | VARCHAR2(30) | 实现类型(如果有的话)名 |
PARALLEL | VARCHAR2(3) | 过程是否支持并行查询。该值为YES或NO |