PL/SQL学习笔记之包

 

一:包

   包是由一组相关的函数,过程,变量,游标等PL/SQL程序设计元素的组合而成的一个PL/SQL程序单元,相当于Java中的类。

   包的主要作用是封装:把相同或相似的东西归类,方便维护和管理,提高开发效率,提高性能。

 

二:包的开发

    包的开发包括两部分:包的声明定义  和  包的主体开发。

    包的声明定义:声明  类型,变量,常量,异常,游标,函数,过程(声明,但不实现!) ,在包的声明部分定义的变量是公有变量(public),可以在包外通过  包名.变量名  引用。

    包的主体开发:在包的主体对 函数、过程 等进行具体的代码实现;在包主体的声明部分,可以定义私有变量,只在包内使用

 

三:创建包(包的声明定义)

CREATE [OR REPLACE] PACKAGE package_name  
[AUTHID{CURRENT_USER|DEFINER}]  
--AUTHID CURRENT_USER 和 AUTHID DEFINER 选项说明应用程序在调用函数时所使用的权限模式  
IS|AS  
  [公有数据类型定义]  
  [公有游标声明]  
  [公有变量、常量声明]  
  [公有函数声明]  
  [公有过程声明]  
END [package_name];

例子:

CREATE OR REPLACE PACKAGE c_package AS
   -- 过程声明
   PROCEDURE addCustomer(c_id   customers.id%type,
   c_name  customers.name%type,
   c_age  customers.age%type,
   c_addr customers.address%type, 
   c_sal  customers.salary%type);
  
   -- 过程声明
   PROCEDURE delCustomer(c_id  customers.id%TYPE);

   --过程声明
   PROCEDURE listCustomer;
 
END c_package;

 

四:包开发(包的主体开发)

    CREATE [OR REPLACE] PACKAGE BODY package_name  
    IS|AS  
      [私有数据类型定义]  
      [私有变量、常量声明]  
      [私有异常错误声明]  
      [私有函数声明和定义]  
      [私有函过程声明和定义]  
      [公有游标定义]//对游标进行具体赋值  
      [公有函数定义]//对函数进行具体代码实现
      [公有过程定义]//对过程进行具体代码实现
    BEGIN  
      --执行部分(一般为空)
    END package_name;  

例如:

CREATE OR REPLACE PACKAGE BODY c_package AS
   PROCEDURE addCustomer(c_id  customers.id%type,
      c_name customers.name%type,
      c_age  customers.age%type,
      c_addr  customers.address%type, 
      c_sal   customers.salary%type)
   IS
   BEGIN
      INSERT INTO customers (id,name,age,address,salary)
         VALUES(c_id, c_name, c_age, c_addr, c_sal);
   END addCustomer;
  
   PROCEDURE delCustomer(c_id   customers.id%type) IS
   BEGIN
       DELETE FROM customers
         WHERE id = c_id;
   END delCustomer;

   PROCEDURE listCustomer IS
   CURSOR c_customers is
      SELECT  name FROM customers;
   TYPE c_list is TABLE OF customers.name%type;
   name_list c_list := c_list();
   counter integer :=0;
   BEGIN
      FOR n IN c_customers LOOP
      counter := counter +1;
      name_list.extend;
      name_list(counter)  := n.name;
      dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
      END LOOP;
   END listCustomer;
END c_package;

 

五:包调用

packageName.var; //调用公有变量
packageName.func(param...);//调用函数
packageName.procedure(param..);//调用过程

 

六:删除包

DROP PACKAGE [BODY] [user.]package_name;

 

七:查看包源码

 select text from user_source where name = 'packageName'; 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值