温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Oracle存储过程Procedure简单介绍(第一部分)

发布时间:2020-08-11 14:15:35 来源:ITPUB博客 阅读:275 作者:edge_dba 栏目:关系型数据库
我们都知道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; 
到这里我们介绍了存储过程的一些基本概念,在下一篇博客里,我们要介绍存储过程的一些高级功能。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI