一:包
包是由一组相关的函数,过程,变量,游标等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';