oracle 学习(五)pl/sql语言存储过程&包

首先搞清楚俩概念 存储过程(procedure)&程序包(package)

  • 存储过程:数据库对象之一,可以理解为数据库的子程序在客户端和服务器端可以直接调用它。触发器是与表直接关联的特殊存储过程,是在对表记录进行操作时触发的。
    • 优点
      1. 存储过程在服务器端运行,执行速度快。
      2. 存储过程执行一次后,代码就驻留在高速缓存,以后的操作只需从高速缓存中调用已编译的代码执行,提高了系统性能。
      3. 确保数据库的安全。可以不授权用户直接访问应用程序中的一些表,而是授权用户执行访问这些表的存储过程。非授权的用户除非通过存储过程,否则不能访问这些表。
      4. 自动完成需要预先执行的任务。存储过程可以在系统启动时自动执行,而不必在系统启动后再进行手工操作,大大方便了用户使用,可以自动完成一些需要预先执行的任务。
    • 存储过程的创建
      1. 1 CREATE[OR REPLACE]PROCEDURE<过程名> /*定义过程名*/
        2      [(<参数名><参数类型><数据类型>[DEFAULT<默认值>][,...N])]
        3                                             /*定义参数类型及属性*/
        4 {IS|AS}
        5       [<变量声明>]
        6       BEGIN
        7           <过程体>
        8       END[<过程名>][;]

         说明:

        1. 过程名:存储过程名称要符合标识符规则,并且在所属方案中必须是唯一的。关键字OR REPLACE表示在创建过程中,如果已存在同名的存储过程,则重新创建。
        2. 参数名:
    • 存储过程的调用
      1 [{EXEC|EXECUTE}]<过程名>
      2      [([<参数名>=>]<实参>|@<实参变量>[,...n])][;]
      CREATE PROCEDURE proc
      AS
      BEGIN
            DBMS_OUTPUT.PUT_LINE('hello world');
      END;
      
      EXEC proc;
      ;OR
      BEGIN 
              proc;
      END;
      View Code
    • 创建包头
      1 CREATE [OR REPLACE] PACKAGE [<用户方案名>.]<包名>   /*包头名称*/
      2  IS|AS  <PL/SQL 程序序列>                                         /*定义过程、函数等*/

       

    • 创建包体
      1 CREATE [OR REPLACE] PACKAGE BODY[<用户方案名>.]<包名>
      2   IS|AS<PL/SQL 程序序列>

       

    • 删除包
      1 /*删除包体*/
      2 DROP PACKAGE BODY <包名>;
      3 /*删除包头及包体*/
      4 DROP PACKAGE <包名>;

       

    • 包的创建&调用eg:
       1 /*包头部分*/
       2 CREATE OR REPALCE PACKAGE  TEST_PACKAGE
       3   IS
       4   FUNCTION average (cnum IN char)
       5        RETURN NUMBER;
       6 END;
       7 
       8 /*包体部分*/
       9 CREATE OR REPALCE PACKAGE BODY TEST_PACKAGE
      10   IS
      11   FUNCTION average (cnum IN char)
      12        RETURN NUMBER
      13         AS
      14        avger NUMBER;
      15   BEGIN 
      16          SELECT AVG(成绩) INTO avger
      17             FROM CJB WHERE 课程号=cnum GROUP BY 课程号;
      18   RETURN(avger);
      19   END avgerage;
      20 END;
      21  
      22 /*调用包*/
      23 DECLARE 
      24        num number;
      25 BEGIN
      26        num:=TEST_PACKAGE.average('101');
      27        DBMS_OUTPUT.PUT_LINE(TO CHAR(num));
      28 END;
      View Code

       

    • 包的初始化:当第一次调用打包子程序时,该包将进行初始化。也就是说将该包从硬盘读入内存,并启动调用的子程序的编译代码。这时系统为该包中定义的所有变量分配内存单元。每个会话都有其打包变量的副本,以确保执行同一包子程序两个会话使用不同的内存单元。大多数情况下,初始化代码要在包第一次初始化时运行。为实现这种功能,可以在包体中的所有对象之后加入一个初始化部分。语法格式为:
      1 CREATE OR  REPLACE PACKAGE BODY<包名>
      2   IS|AS 
      3   ...
      4   BEGIN 
      5         <初始化代码>;
      6   END;

       

    • 重载:在包的内部,过程和函数可以被重载。名称相同参数不同。
      • 限制:
        1. 如果两个子程序的参数仅在名称和模式上不同,这两个子程序不能重载。
        2. 不能仅根据两个子程序不同的返回类型对其进行重载。
        3. 重载子程序的参数的类族(type family)必须不同。例如CHAR 和 VARCHAR2属于同一类族,故不能对他们进行唯一的参数重载。

 

转载于:https://www.cnblogs.com/yuelien/p/6627175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值