IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Oracle学习笔记——存储过程

    果冻想发表于 2015-09-06 11:36:02
    love 0

    存储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类型参数的特点。说到参数的数据类型,很多时候,我们是直接的指定数据类型为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中调用存储过程
    • 在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日 于呼和浩特。



沪ICP备19023445号-2号
友情链接