存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的。创建存储过程,需要有CREATE PROCEDURE的系统权限,该权限可由系统管理员授予:grant execute on user_tbl to user 。
create [or replace] procedure procedure_name [(parameter1 [model] datatype1, ...)]
is [as]
begin
Pl/sql Block;
end [procedure_name];
注: procedure_name是存储过程的名字,parameter用于指定参数,model用于指定参数模式,datatype用于指定参数类型,IS [AS]用于开始PL/SQL代码块。当定义存储过程的参数时,只能指定数据类型,不能指定数据长度。
编写存储过程可以使用任何文本编辑器或直接在SQL*Plus环境下进行,编写好的存储过程必须要在SQL*Plus环境下进行编译,生成编译代码,原代码和编译代码在编译过程中都会被存入数据库。编译成功的存储过程就可以在Oracle环境下进行调用了。
删除存储过程:drop procedure procedure_name
编译存储过程:alter procedure procedure_name compile
查看存储过程及状态:
select object_name,status
from user_objects
where object_type='PROCEDURE'
查看存储过程的代码,其中procedure_name是存储过程的名字:
select text
from user_source
where name= procedure_name
执行(或调用)存储过程的人是过程的创建者或是拥有EXECUTE ANY PROCEDURE系统权限的人或是被拥有者授予EXECUTE权限的人。
执行方法1:EXECUTE 模式名.存储过程名[(参数...)];
执行方法2:BEGIN
SET SERVEROUTPUT ON
模式名.存储过程名[(参数...)];
END;
参数的作用是向存储过程传递数据,或从存储过程获得返回结果。如果省略IN、OUT或IN OUT,则默认模式是IN。
参数名 IN 数据类型 DEFAULT 值
定义一个输入参数变量,用于传递参数给存储过程。在调用存储过程时,主程序的实际参数可以是常量、有值变量或表达式等。DEFAULT 关键字为可选项,用来设定参数的默认值。
参数名 OUT 数据类型
定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。在存储过程中,参数变量只能被赋值而不能将其用于赋值,在存储过程中必须给输出变量至少赋值一次。
参数名 IN/OUT 数据类型 DEFAULT 值
在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。在存储过程中必须给变量至少赋值一次。
参数的值由调用者传递,传递的参数的个数、类型和顺序应该和定义的一致。如果顺序不一致,可以采用以下调用方法。
EXECUTE CHANGE_SALARY(P_VAR=>1,P_VAR2=>2);
可以看出传递参数的顺序发生了变化,并且明确指出了参数名和要传递的值,=>运算符左侧是参数名,右侧是参数表达式,这种赋值方法的意义较清楚。
使用OUT类型的参数返回存储过程的结果。
CREATE OR REPLACE PROCEDURE PARM_COUNT(P_TOTAL OUT NUMBER)
AS
BEGIN
SELECT COUNT(*) INTO P_TOTAL FROM com_parm;
END;
在sqlplus中输入以下命令执行:
DECLARE
V_COUNT NUMBER;
BEGIN
PARM_COUNT(V_COUNT);
DBMS_OUTPUT.PUT_LINE('参数总数为:'||V_COUNT);
END;