日历

2008 7.9 Wed
  12345
6789101112
13141516171819
20212223242526
2728293031  
«» 2008 - 7 «»

文章搜索

日志文章

2007年09月18日 03:20:44

pl/sql编程之程序包

程序包是一种数据对象,它是对相关pl/sql类型,子程序,游标,异常,变量和常量的封装.它包含两部内容:程序包规范和程序包主体.在程序包规范中,可以声明类型,变量,常量,异常,游标和子程序.程序包主体用于实现包规范中定义的内容.OK,一起来看看代码.
--包规范(类似接口)
create or replace package pack1 is
procedure updatesal(dno number);--过程

function selectename(eno number) return varchar2;--函数
end pack2;
--包主体(类似接口的实现)
create or replace package body pack1 is
procedure updatesal(dno number)
is
begin
--每个员工加资金1000,如果工资+资金少于2000的则再继续加奖金500
update emp set comm=case
when nvl(comm,0)+sal<2000 then nvl(comm,0)+1500
else nvl(comm,0)+1000
end
  where deptno=dno;
end;
--根据编号查找员工
function selectename(eno number) return varchar2 is
e_ename varchar2(20);
begin
select ename into e_ename from emp where empno=eno;
return e_ename;
end;
end pack2;

--调用
declare
dno number;
eno number;
e_name varchar2(20);
begin
dno:=&请输入部门编号;
eno:=&请输入员工编号;
pack1.updatesal(dno);
e_name:=pack1.selectename(eno);
dbms_output.put_line(e_name);
end;


OK,在来看看程序包中的游标.看代码咯.

--创建包规范
create or replace package pack2 is
cursor c_cur(eno number) return emp%rowtype;--游标
procedure e_pro(eno number);--过程
end pack3;

--创建包主体
create or replace package body pack2 is
cursor c_cur(eno number) return emp%rowtype is
select *from emp where deptno=eno;
procedure e_pro(eno number) is
rec emp%rowtype;
begin
open c_cur(eno);
    loop
    fetch c_cur into rec;
    exit when c_cur%notfound;
    dbms_output.put_line(rec.ename);
    end loop;
close c_cur;
end e_pro;
end pack2;
--调用
declare
e_no number;
begin
e_no:=&abc;
pack2.e_pro(e_no);
end;

说明:
游标的定义也是分为两部分:游标规范和游标主体.在包规范中声明游标规范时必须通过return子句指定游标的返回类型.return子句可以由以下两个数据类型结构中的任一组成.
1.使用%rowtype属性根据数据库表定义的记录.
2.根据程序员定义的记录类型的记录.


Tags: pl sql  

类别: oracle |  评论(0) |  浏览(1598) |  收藏
发表评论