PLSQL 程序包

程序包是对相关过程、函数、变量、游标和异常等对象的封装

  • 包部件可以以任意顺序出现
  • 并非所有部件都必须被使用
  • 对函数/事件的声明 必须是前向声明
  • 在编译包主体时先编译包规范说明
  • 包主体也不是必须的
  • 包内定义的函数/过程对外是可见的
  • 包内定义的函数/过程可以被重载
  • 二个子程序的参数仅在名字或模式上是不同的,那么不能重载
  • 不能根据反回类型的不同来重载二个函数

程序包的定义和使用规范

  • 包规范
  • 包主体
  • 包和作用域
  • 重载包中子程序
  • 包的初始化
  • 包和相关性

包的定义形式如下:

PACKAGE BODY 包名 IS
	变量名说明
	游标说明
	游标申明
	例外说明
	记录说明
	plsql说明
	过程体
	函数体
BEGIN 
	语句序列
END[包名];
CREATE OR REPLACE PACKAGE BODY pack_me AS
  PROCEDURE order_proc (orno VARCHAR2) IS
    stat CHAR(1);
  BEGIN
    SELECT ostatus INTO stat FROM order_master
    WHERE orderno = orno;
    ……
  END order_proc;
  FUNCTION order_fun(ornos VARCHAR2)
  RETURN VARCHAR2
  IS
    icode   VARCHAR2(5);
    ocode   VARCHAR2(5);
  BEGIN
  ......
  END order_fun;
END pack_me;
/* 示例 */
/* 包定义 */
create or replace package toyspack 
is 
	procedure updatetoyprice;
	function augtoyprice return number;
end;
---------------------------------------
/* 包体 */
create or replace package body toyspack
is
	/* 存储过程 */
	procedure updatetoyprice
	as
		augprice number;
		begin
		augprice:=augtoyprice;
		while(augprice<=400)
		loop
		update my_toys
		set price=case
			when pricex1.1<50 then pricex1.1
				else 
			price;
			end ;
		augprice:=augtoyprice;
		end loop;
	commit;
	end;
	/* 函数 */
	function augtoyprice
		return number
	as
		augprice number;
	begin
		select avg(price) into augprice from my_toys;
		return augprice;
	end;
end;
/* 包调用 */
execute toyspack.updatetoyprice;

程序包中的游标

游标的定义分为游标规范和游标主体两部分
在包规范中声明游标规范时必须使用 RETURN 子句指定游标的返回类型
RETURN子句指定的数据类型可以是:

  • 用 %ROWTYPE 属性引用表定义的记录类型
  • 程序员定义的记录类型
SQL> CREATE OR REPLACE PACKAGE BODY cur_pack AS
 CURSOR ord_cur(vcode VARCHAR2)
 RETURN order_master%ROWTYPE IS 
 SELECT * FROM order_master WHERE VENCODE=vcode;
 PROCEDURE ord_pro(vcode VARCHAR2) IS
   or_rec order_master%ROWTYPE;
 BEGIN
  OPEN ord_cur(vcode); 
  LOOP
    FETCH ord_cur INTO or_rec;
    EXIT WHEN ord_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LIne(’返回的值为' || or_rec.orderno);
  END LOOP;
 END ord_pro;
END cur_pack;
posted @ 2023-12-10 16:41  osbreak  阅读(11)  评论(0编辑  收藏  举报