前面对于总结Oracle的文章总结了那么多,重点还是关于Oracle开发的。从今天这篇文章开始,就开始总结存储PL/SQL单元。说到存储PL/SQL单元,很多人就很糊涂,存储PL/SQL单元是什么?说白了,存储PL/SQL单元就是子程序,就是Oracle中的存储过程、函数和包。存储PL/SQL单元有一个名字,我们可以根据这个名字来调用PL/SQL单元。
子程序包括存储过程和函数,如果一个子程序属于一个包,则这个子程序被称为包子程序;如果一个子程序不属于任何一个包,则这个子程序被称为独立子程序。
说到子程序,我们是可以给子程序传递参数的,在具体怎么说编写子程序之前,我准备先说说怎么传参,这个传参搞不好还很容易出错。
在调用存储过程和函数时,可以向子程序中传递参数,子程序的参数有以下三个属性:
参数的名字必须为合法的PL/SQL标识符,具体的可以参见这篇《Oracle学习笔记——PL/SQL基础知识总结》文章。对于参数的模式有以下三种:
对于IN类型的参数,只用于传入数据,参数的值不能被修改,如果修改了IN类型参数,则会有编译错误;OUT类型的参数主要是把值返回给调用者;而IN、OUT类型的参数则同时具备了IN类型和OUT类型参数的特点。说到参数的数据类型,很多时候,我们是直接的指定数据类型为VARCHAR2
、NUMBER
等之类的;如果在我们无法知道表或者数据列的数据类型时,我们可以使用%TYPE
和%ROWTYPE
间接获得参数的数据类型。关于%TYPE
和%ROWTYPE
具体如何使用,读过前几篇关于Oracle文章的伙计应该不会感到陌生。接下来就开始总结这篇博文的主角——存储过程。
在之前的文章中,我也写了很多的存储过程的示例代码。可以看到存储过程没有返回值,它就是一些PL/SQL代码的组合,由于存储过程具有以下的一些优点,我们才在实际工作中才大量使用它:
总而言之,存储过程是你不得不掌握的知识点。
我先来创建一个最简单的存储过程。
create or replace procedure pro_1(id varchar2)
is
name varchar2(20); -- 声明一个变量
begin
-- 以下就是存储过程的主体部分
dbms_output.put_line('id:' || id || ' name:' || name);
end;
上述代码就是一个最简单的存储过程,create or replace
表示如果这个存储过程不存在就创建一个新的存储过程,而如果这个存储过程存在了,就覆盖这个存储过程;id varchar2
是传递的一个参数,默认是IN
类型。多动手,写几个存储过程就领悟了。写完了存储过程,我们就需要编译这个存储过程,将它保存在数据库中。
说到编译存储过程,我一般都是在PL/SQL Developer上,直接UI操作就编译好了。由于使用PL/SQL Developer编译存储过程属于“无脑操作”那种的,没有多少技术含量,这里就主要说说如何在命令行下编译存储过程。
在命令行下编译存储过程需要用到下面的这个命令语句:
alter procedure pro_1 compile;
其中pro_1
是存储过程的命令,最重要的是执行编译的用户必须被授予了alter any procedure
权限。编译完了之后,接下来看看如何让这个存储过程跑起来。
说到调用存储过程,这也得分两种情况讨论:
在PL/SQL调用存储过程就好比调用一个函数一样,例如这样:
begin
pro_1(00813045);
end;
对于在SQL*Plus中调用存储过程平时我用的比较少,也比较生疏,但是也比较简单,如下:
SQL> set serveroutput on;
SQL> execute pro_1(00813025);
使用关键字execute
就好了,很多时候,我们需要在Linux的Shell脚本中执行储存过程,这个时候我们就需要先使用SQL*Plus连接Oracle,然后再使用execute
执行存储过程。
当你不想要它的时候,快乐的执行drop procedure pro_1;
就好了,这没有什么,就像删除一个表那样轻松。
大晚上写了这么一篇文章,好困,写的比较笼统,但是对于初学者来说,这样的一篇文章足以让你了解Oracle的存储过程。接下来的学习就看你自己的了,赶紧敲起键盘,写上几个存储过程练练手吧。
晚安各位!!!
2015年8月25日 于呼和浩特。