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/ ,如需转载,请注明出处,否则将追究法律责任。