oracle 游标变量

引用性游标变量

定义类型,定义变量,为变量赋不同的值

定义游标类型,定义游标变量,打开游标时为游标变量指定对应select语句 即对应的结果集

type  A is ref cursor;

a A;

b A;

open a for select * from emp;

open  b for select * from dept;

close a;

close b;

游标+循环结构可以处理select语句多条返回结果

for 循环自己也可以处理select 语句多条返回结果

for v_emp in (select * from emp)

loop

statements;

end loop;

存储过程参数 

in 

out

inout mode 

in 表示只读,实参的值不可变,

out 就是一个变量,过来装返回数的。

inout 可读,可写。 可以往回装数。

一般情况存储过程不需要返回值,如果需要一个返回值,可以用函数,如果需要多个返回值,可以用out,inout模式参数。

execute a(2000,'CUSIP','CUSIP')
Error report:
ORA-06550: line 1, column 14:
PLS-00363: expression 'CUSIP' cannot be used as an assignment target

out mode参数,必须是变量,把常量'CUSIP' 改成一个变量就可以了

ORA-06550 error The symbol ":=" was substituted for "A" to continue

begin
a(v_in, v_out2,v_out1);
end;

begin
execute a(v_in, v_out2,v_out1); 错的,大哥,为啥加execute,去掉
end;

在调用带有out mode 参数的存储过程时,需要在pl/sql 程序中(匿名快之类的)定义变量,用来接收(存储)被调用的存储过程执行之后,形参返回给实参的值。(比如查询10号部门的人数,和平均薪水)

a(10,v_count,v_sal);

out mode的参数在存储过程代码里面一定会被重写,重新赋值,最后存储过程执行完毕,值被带回,送给实参。

因为你out mode是为了返回值,所以肯定会写代码赋值给你。

set serveroutput on;
create or replace procedure a (
p_field_ID IN hzn_field.field_id%type, p_pfname out hzn_field.pf_name%type, p_field_name out hzn_field.field_name%type )
is 
begin
select pf_name,field_name into p_pfname,p_field_name from hzn_field where field_id=p_field_id;
exception 
when no_data_found then dbms_output.put_line('there is no such field');
when others then dbms_output.put_line('there is something wrong');
end a;
set serveroutput on;
declare
v_in  hzn_field.field_id%type :=2000;
v_out1  hzn_field.field_name%type default 'action' ;
v_out2   hzn_field.pf_name%type default 'action';
begin
v_out1:='aa';
v_out2:='bb';
a(v_in, v_out2,v_out1);
dbms_output.put_line(v_in||' ' ||v_out1||' '||v_out2);
end;

anonymous block completed
2000 Quote_ID_changedbyadmin Quote ID_changedbyadmin

select name,text from user_source where type='PROCEDURE';

   包

包里面的变量和游标

是全局的,可以直接包名.变量名 包名.游标名  调用

begin

包名.过程名;

end;

包重载,指的是包里面的函数和过程可以重载

包初始化,指的是初始化变量。

包的持续性 指的是每个用户自己维护自己的包中所有变量的副本,各自修改各自的值,互不影响。 即便在期间别的用户修改过包中变量的值,但是自己维护的这个变量的值还是你自己最后修改的值而不是别人改过的值,这就是连续性。

游标连续性 

是指用户调用包里面的游标,第一次调用之后,第二才从下一行继续开始,而不是总是从游标的第一条开始。

execute pkg_persistcursor.displayemp;

execute pkg_persistcursor.displayemp;

displayemp 过程里面打开游标,并检索并打印2行游标记录。

上面两行语句,调用了两次包中的存储过程,也就是打开了2次游标,第一次打开只有,第二次打开接着第一次往下检索而不是从第一行检索,这就是包中游标的连续性。

包的串行化,指的是包中的变量啊,游标啊,调用一次之后,全部重置,关闭游标。那么下次再调用游标和变量都是重置的初始值,

pragma serially reusable;

select * from user_source where type='PACKAGE BODY' and name ='DSC_APP_PKG';

猜你喜欢

转载自blog.csdn.net/hushunhuadao/article/details/81384281