ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 创建package

创建package

原创 Linux操作系统 作者:perfychi 时间:2012-08-02 09:06:51 0 删除 编辑

create or replace package pack_one as --包头的声明

type cur is ref cursor;  --定义一个动态游标,也只能是动态

type v_record is record( -- 定义一个记录类型(集合的一种)

v_name emp.ename%type,

v_sal emp.sal%type,

v_dname dept.dname%type

);

function my_fun(v_job varchar2) return cur;  --定义一个方法

procedure my_pro(v_job in varchar2,my_cur2 out cur);--定义一个存储过种

end pack_one;--包头结束

 

create or replace package body pack_one as--创建一个包体

function my_fun(v_job varchar2) return cur--对方法的实现,注意是在包体的声明部分里操作

  is

  my_cur cur;--声明游标,因为还是在包的部分,所以直接声明即可

  sql_cur varchar2(200);

  begin

  sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job||'''';--拼接SQL语句,重要注意引号的使用.因为job字段是字符串型。如果是numbr类型,就没这么费劲,海要加单引号了。

  dbms_output.put_line(sql_cur);--可以通过输出为调试拼接好的SQL语句

  open my_cur for sql_cur;--打开游标

  return(my_cur);--方法有返回值,要牢记

  end my_fun;--方法的实现结束

 

  procedure my_pro(v_job in varchar2,my_cur2 out cur)--对存储过程的实现

    as

    sql_cur varchar2(200);

    begin

      sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job='''||v_job|| '''';

      open my_cur2 for sql_cur;--打开游标,注意,打开的是传进来的参数,即我们把游标通过参数传出给调用环境 因为是out

    end my_pro;

  begin

    null;

end pack_one;--存储实现的结束

 

 


使用using 改写上述过程(包体不部分):

create or replace package body pack_one asfunction my_fun(v_job varchar2) return cur  is

  my_cur cur  sql_cur varchar2(200);

  begin

  sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job= :job';

 --使用绑定变量时,即使是字符串类型,也不需要格外加单引号, 绑定变量自身含有类型,通过下面的using v_job就给绑定变量赋予了合适的类型,此处千万不要画蛇添足,否则回报错。这点与字符串拼接是不同的。

 

  dbms_output.put_line(sql_cur);

  open my_cur for sql_cur     using v_job;

  return(my_cur);--方法有返回值,要牢记

  end my_fun;--方法的实现结束

 

  procedure my_pro(v_job in varchar2,my_cur2 out cur)--对存储过程的实现

    as

    sql_cur varchar2(200);

    begin

      sql_cur:='select t1.ename,t1.sal,t2.dname from emp t1,dept t2 where t1.deptno=t2.deptno and t1.job= :job'; --使用绑定变量时,即使是字符串类型,也不需要格外加单引号, 绑定变量自身含有类型,通过下面的using v_job就给绑定变量赋予了合适的类型,此处千万不要画蛇添足,否则回报错。这点与字符串拼接是不同的。

      open my_cur2 for sql_cur    using v_job;

    end my_pro;

  begin

    null;

end pack_one;--存储实现的结束

 

 


 

 

declare--下面是对包的调用 调用其中的方法

v_cur pack_one.cur;--注意这里游标类型声明的方式

my_record pack_one.v_record;--同上,注意声明方式

begin

  v_cur:=pack_one.my_fun('CLERK');--通过参数调过方法,传进的参数,会被接收 因为是in

 

    loop

      fetch v_cur into my_record;

      exit when v_cur%notfound;

      dbms_output.put_line(my_record.v_name||'--'||my_record.v_sal||'--'||my_record.v_dname);

      end loop;

  end;

 

 

 

 

declare --下面是对包的调用,调用其中的合存储过程

temp_record pack_one.v_record;--同上,注意声明方式

my_cur2 pack_one.cur;--注意这里游标类型声明的方式

begin

  pack_one.my_pro('CLERK',my_cur2);--通过传参,来调用,第一个参数是传进,第二个是用于接收传出的参数

  loop

    fetch my_cur2 into temp_record;

    exit when my_cur2%notfound;

    dbms_output.put_line(temp_record.v_name||'--'||temp_record.v_sal||'--'||temp_record.v_dname);

    end loop;

  end;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27042095/viewspace-739583/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-06-06

  • 博文量
    484
  • 访问量
    2976213