120.Oracle数据库SQL开发之 PLSQL编程——包
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50086975
把过程和函数一起组织到包中。包可以将彼此相关的功能划分到一个自包含的单元。通过这种方式将PL/SQL代码模块化。
包通常由两个部分组成:规范和包体。
规范列出可用的过程、函数、类型和对象。所有的数据库用户都可以访问这些条目,因此这些条目称为公有项目。
包体中任务在规范中未列出的项目对于这个包体都是私有对象。私有项目只能用在包体内。
通过将公有项目和私有项目结合起来,可以构建出非常复杂的包结构,这种复杂性外部是看不到的。
1. 创建包规范
CREATE PACKAGE语句用于创建包规范。
如下:
CREATE PACKAGE product_package AS
TYPEt_ref_cursor IS REF CURSOR;
FUNCTIONget_products_ref_cursor RETURN t_ref_cursor;
PROCEDUREupdate_product_price (
p_product_id IN products.product_id%TYPE,
p_factor IN NUMBER
);
END product_package;
/
2. 创建包体
CREATE PACKAGE BODY语句用于创建包体。
CREATE PACKAGE BODY product_package AS
FUNCTIONget_products_ref_cursor
RETURNt_ref_cursor IS
v_products_ref_cursor t_ref_cursor;
BEGIN
-- get theREF CURSOR
OPEN v_products_ref_cursorFOR
SELECTproduct_id, name, price
FROMproducts;
-- returnthe REF CURSOR
RETURNv_products_ref_cursor;
ENDget_products_ref_cursor;
PROCEDUREupdate_product_price (
p_product_id IN products.product_id%TYPE,
p_factor IN NUMBER
) AS
v_product_count INTEGER;
BEGIN
-- countthe number of products with the
-- suppliedproduct_id (will be 1 if the product exists)
SELECTCOUNT(*)
INTOv_product_count
FROMproducts
WHERE product_id= p_product_id;
-- if theproduct exists (v_product_count = 1) then
-- updatethat product's price
IFv_product_count = 1 THEN
UPDATEproducts
SET price= price * p_factor
WHEREproduct_id = p_product_id;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERSTHEN
ROLLBACK;
ENDupdate_product_price;
END product_package;
/
3. 调用包中的函数和过程
调用包中的函数和过程时,应该在调用中使用包名。
如下:
store@PDB1> selectproduct_package.get_products_ref_cursor from dual;
GET_PRODUCTS_REF_CUR
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
PRODUCT_ID NAME PRICE
---------- ----------------------------------------
13Lunar Landing 15.99
14Submarine 15.99
15Airplane 15.99
1 Modern Science 60
2 New Chemistry 35
3 Supernova 25.99
4 Tank War 13.95
5 Z Files 49.99
6 2412: The Return 14.95
7 Space Force 9 13.49
8 From Another Planet 12.99
9 Classical Music 10.99
10Pop 3 15.99
11Creative Yell 14.99
12My Front Line 13.49
15 rows selected.
调用如下:
store@PDB1> CALLproduct_package.update_product_price(3,1.25);
Call completed.
store@PDB1> select price from products whereproduct_id = 3;
PRICE
----------
32.49
4. 获取有关包中函数和过程的信息
从user_procedures视图中可以获得某个包中的函数和过程的信息。
如下:
store@PDB1> select object_name,procedure_name fromuser_procedures where object_name='PRODUCT_PACKAGE';
OBJECT_NAME
----------------------------------------------------------------------------------------------------
PROCEDURE_NAME
----------------------------------------------------------------------------------------------------
PRODUCT_PACKAGE
GET_PRODUCTS_REF_CURSOR
PRODUCT_PACKAGE
UPDATE_PRODUCT_PRICE
PRODUCT_PACKAGE
5. 删除包
使用DROP PACKAGE语句用于删除包。