关于程序包的概念详细说明等,请查看https://www.cnblogs.com/huyong/archive/2011/05/26/2057973.html
博主写的很详细,这里就不再细说,包类似于Java中的类,包用来放存储过程以及函数,存储过程以及函数就类似与java中的方法,当使用包中的方法时就通过包名来调用
使用程序包比较符格面向对象的思想
-- 包的创建 create or replace package 包名 as 全局变量名 变量类型 procedure 过程名(参数); function 函数名(参数); end 包名; -- 包体的创建 create or replace package body 包名 as procedure 过程名(参数) as 声明变量部分; begin 存储过程代码块; end; function 函数名(参数) return 返回值类型 as begin 函数代码块; return 返回结果; end; end 包名;
下面举个例:
-- 创建包 create package pack1 as -- 创建常量 v_pi constant number(7) := 3.1415926; -- 定义获的面积函数 function getArea(v_r number) return number; -- 定义过程 procedure pro2; end pack1; -- 创建包体 create package body pack1 as v_area number(5, 2); -- 实现函数 function getArea(v_r number) return number as begin v_area := power(v_r,2) * v_pi; return v_area; end; -- 实现过程 procedure pro2 as begin dbms_output.put_line('面积为:' || v_area); end; end pack1; declare v_area number; begin -- 调用 v_area:=pack1.getArea(5); pack1.pro2; end;
模拟一个转账案例
create or replace package pack2 as function getMoney(v_name bank.name%type) return bank.money%type; procedure zhuan(name1 bank.name%type, name2 bank.name%type, money1 bank.money%type); end pack2; create or replace package body pack2 as function getMoney(v_name bank.name%type) return bank.money%type as v_money bank.money%type; begin select money into v_money from BANK where name = v_name; dbms_output.put_line(v_name||'余额:'||v_money); return v_money; end; procedure zhuan(name1 bank.name%type, name2 bank.name%type, money1 bank.money%type) as begin update bank set money=money + money1 where name = name1; update bank set money=money - money1 where name = name2; commit; exception when others then dbms_output.put_line('余额不足'); rollback; end; end pack2; declare v_money bank.money%type; begin pack2.zhuan('zhangsan','lisi',500); v_money:=pack2.getMoney('zhangsan'); end;