果冻想
认真玩技术的地方

Oracle学习笔记——存储过程

存储PL/SQL单元

前面对于总结Oracle的文章总结了那么多,重点还是关于Oracle开发的。从今天这篇文章开始,就开始总结存储PL/SQL单元。说到存储PL/SQL单元,很多人就很糊涂,存储PL/SQL单元是什么?说白了,存储PL/SQL单元就是子程序,就是Oracle中的存储过程、函数和包。存储PL/SQL单元有一个名字,我们可以根据这个名字来调用PL/SQL单元。

子程序包括存储过程和函数,如果一个子程序属于一个包,则这个子程序被称为包子程序;如果一个子程序不属于任何一个包,则这个子程序被称为独立子程序。

说到子程序,我们是可以给子程序传递参数的,在具体怎么说编写子程序之前,我准备先说说怎么传参,这个传参搞不好还很容易出错。

子程序的参数

在调用存储过程和函数时,可以向子程序中传递参数,子程序的参数有以下三个属性:

  • 参数的名字
  • 参数的模式
  • 参数的数据类型

参数的名字必须为合法的PL/SQL标识符,具体的可以参见这篇《Oracle学习笔记——PL/SQL基础知识总结》文章。对于参数的模式有以下三种:

  • IN类型(入参)
  • OUT类型(出参)
  • IN、OUT类型(既是入参,也是出参)

对于IN类型的参数,只用于传入数据,参数的值不能被修改,如果修改了IN类型参数,则会有编译错误;OUT类型的参数主要是把值返回给调用者;而IN、OUT类型的参数则同时具备了IN类型和OUT类型参数的特点。说到参数的数据类型,很多时候,我们是直接的指定数据类型为VARCHAR2NUMBER等之类的;如果在我们无法知道表或者数据列的数据类型时,我们可以使用%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中调用存储过程
  • 在SQL*Plus中调用存储过程

在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日 于呼和浩特。

未经允许不得转载:果冻想 » Oracle学习笔记——存储过程
网站维护离不开您的支持,您可以赞助本站,谢谢支持
×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

赞助本站
关注微信公众号
关注微信公众号和果冻一起分享你的疑惑与心得。
分享到: 更多 (0)

玩技术,我们是认真的

联系我们关于果冻