我们都知道SQL语言是没有判断和过程控制语句的,而PL/SQL又很好的补充了SQL语言这方面的不足。而存储过程也是一种PL/SQL块,但是存储过程又跟传统的PL/SQL块不一样,存储过程是以命名的方式存储于数据库中的。它有很多优点,比如:
1、存储过程是以命名的数据库对象形式存储于数据库当中。存储在数据库中的优点是很明显的,因为代码不保存在本地,用户可以在任何客户机上登录到数据库,并调用或修改代码。
2、存储过程可由数据库提供安全保证,要想使用存储过程,需要有存储过程的所有者的授权,只有被授权的用户或创建者本身才能调用执行存储过程。
3、存储过程的信息是写入数据字典的,所以存储过程可以看作是一个公用模块,用户编写的PL/SQL程序或其他存储过程都可以调用它(但存储过程和函数不能调用PL/SQL程序)。一个重复使用的功能,可以设计成为存储过程。
4、像其他高级语言的过程和函数一样,可以传递参数给存储过程,参数的传递也有多种方式。存储过程可以有返回值,也可以没有返回值,存储过程的返回值必须通过参数带回;函数有一定的数据类型,像其他的标准函数一样,我们可以通过对函数名的调用返回函数值。
5、存储过程需要进行编译,以排除语法错误,只有编译通过才能调用。
Oracle存储过程基本语法
CREATE OR REPLACE PROCEDURE 存储过程名(参数)
IS/AS
变量
BEGIN
可执行部分
EXCEPTION
错误处理部分
END;
按照惯例举个hello world的例子
create or replace procedure hello as
say_hi varchar2(20);
begin
say_hi := 'Hello World';
dbms_output.put_line(say_hi);
end;
/
语法说明:
1、create or replace procedure是创建存储过程的一个基本语法
2、在存储过程(PROCEDURE)和函数(FUNCTION)中使用IS和AS并没有太大区别,在视图(VIEW)中只能用AS不能用IS,在游标(CURSOR)中只能用IS不能用AS。后面一般跟变量声明。
3、begin和end之间是PL/SQL程序体,其中exception来指定失败处理流程。
调用一个存储过程
begin
-- Call the procedure
hello;
end;
存储的查看和删除:
查询存储过程hello的创建脚本
select * from user_source where name='HELLO';
查看存储过程hello的状态
select * from user_objects where object_name = 'HELLO';
重点看status列的状态,valid表示该存储过程是通过编译的,invalid
我们可以看到一个存储过程是有参数可以声明的,那么关于参数肯定就有输入和输出参数的区别了
三种形式的参数
1、IN 定义一个输入参数变量,用于传递参数给存储过程
2、OUT 定义一个输出参数变量,用于从存储过程获取数据
3、IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能
参数的定义形式和作用如下:
IN参数
语法:参数名 IN 数据类型 DEFAULT 值;
定义一个输入参数变量,用于传递参数给存储过程。在调用存储过程时,主程序的实际参数可以是常量、有值变量或表达式等。DEFAULT 关键字为可选项,用来设定参数的默认值。如果在调用存储过程时不指明参数,则参数变量取默认值。在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。
OUT参数
语法:参数名 OUT 数据类型;
定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。
在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。在存储过程中,参数变量只能被赋值而不能将其用于赋值,在存储过程中必须给输出变量至少赋值一次。
IN OUT参数
语法:参数名 IN OUT 数据类型 DEFAULT 值;
定义一个输入、输出参数变量,兼有以上两者的功能。在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。DEFAULT 关键字为可选项,用来设定参数的默认值。在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。在存储过程中必须给变量至少赋值一次。
1、参数in的举例
create or replace procedure say_hello (to_who in varchar2 default 'zhangsan') as
begin
dbms_output.put_line('Say Hi to '|| to_who);
end;
执行
begin
-- Call the procedure
say_hello( 'peter');
end;
2、参数out的举例
输出模式的参数,用于输出值,会忽略传入的值。在子程序内部可以对其进行修改。
输出:子程序执行完毕后,out模式参数最终的值会赋值给调用时对应的<实参变量>。
注意:out模式参数的调用,必须通过变量。
create or replace procedure pout(p1 out int) as
begin
p1 := 33;
end;
执行
declare
var1 int := 30;
begin
dbms_output.put_line(var1);
pout(var1);
dbms_output.put_line(var1);
end;
第一次输出30,第二次输出33。
3、参数in out的举例
输入输出模式:能接收传入的实参值;在子程序内部可以修改; 可以输出(必须用实参变量调用)
create or replace procedure pinout(p1 in out int) as
begin
dbms_output.put_line(p1);
p1 := 44;
end;
执行
declare
var1 int := 40;
begin
dbms_output.put_line(var1);
pinout(var1);
dbms_output.put_line(var1);
end;
到这里我们介绍了存储过程的一些基本概念,在下一篇博客里,我们要介绍存储过程的一些高级功能。