ORACLE编写的程序一般分为两类,一种是可以完成一定功能的程序叫存储过程;另一种就是在使用时给出一个或多个值,处理完后返回一个或多个结果的程序叫函数。这两种程序都存放在Oracle数据库字典中。下面分别介绍这两种程序的编写方法。
ORACLE提供可以把PL/SQL程序存储在数据库中,并可以在任何地方来运行它。这样就叫存储过程或函数。在本节中,主要介绍:
1.创建存储过程和函数
2.正确使用系统级的异常处理和用户定义的异常处理
3.建立和管理存储过程和函数
创建过程语法:
存储过程:
与其它的数据库系统一样,Oracle的存储过程是用PL/SQL语言编写的能完成一定处理功能的存储在数据库字典中的程序。
创建过程:
建立内嵌过程
在 oracle server上建立内嵌过程,可以被多个应用程序调用,可以向内嵌过程传递参数,也可以向内嵌过程传回参数.
create [or replace] procedure procedure_name
[ (argment [ { in| in out }] type,
argment [ { in | out | in out } ] type
{ is | as }
<类型.变量的说明>
( 注: 不用 declare 语句 )
<执行部分>
Begin
exception
<可选的异常处理说明>
end;
注意:
l. 这里的IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;
2. 在存储过程内的变量类型只能指定变量类型;不能指定长度;
3. 在AS或IS后声明要用到的变量名称和变量类型及长度;
4. 在AS或IS后声明变量不要加declare语句。
CREATE OR REPLACE PROCEDURE ModeTest(
p_InParameter IN NUMBER,
p_OutParameter OUT NUMBER,
p_InOutParameter IN OUT NUMBER )
IS
v_LocalVariable NUMBER;
BEGIN
/* 分配 p_InParameter给 v_LocalVariable. */
v_LocalVariable := p_InParameter; -- Legal
/* 分配 7 给 p_InParameter. 这是非法的,因为声明是IN */
p_InParameter := 7; -- Illegal
/* 分配 7 给 p_OutParameter. 这是合法的,因为声明是OUT */
p_OutParameter := 7; -- Legal
/* 分配 p_InOutParameter给 v_LocalVariable.这是合法的,因为声明是IN OUT */
v_LocalVariable := p_InOutParameter; -- Legal
/*分配 7 给 p_InOutParameter.这是合法的,因为声明是IN OUT */
p_InOutParameter := 7; -- Legal
END ModeTest;
/
使用过程
存储过程建立完成后,只要通过授权,用户就可以在SQLPLUS、Oracle开发工具或第三方开发工具来调用运行。Oracle使用EXECUTE语句来实现对存储过程的调用。
EXEC[UTE] procedure_name( parameter1, parameter2…);--我实在是看不出来跟SQL有啥区别
-----------------------------------------------------------------------------------------------------------------------
先声明包,以及包里面存在的函数 过程等等
-----------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PACKAGE 包名
AS
PROCEDURE Bird(
参数1 参数类型.......
id number,---根据编号查询
result OUT SYS_REFCURSOR
); --注意分号
END 包名
/ --不要问我为什么要加个"/",我也不知道ORACLE这么会有这么BT的规定
-------------------------------------------------------------------------------------------------------------------------
下面才是重头戏......哇嘎嘎
-------------------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PACKAGE BODY 包名
AS
Procedure Bird(
id number,
result OUT SYS_REFCURSOR
)
IS
BEGIN
open result for
select StuId,name,sex,grade from StuInfo where StuId = id
END Bird;
/
个人感觉存储过程比函数要好得多,尤其是在执行大量数据的时候,对数据表的操作就是增删改查,建议直接使用存储过程,节约代码,便于修改。