您的位置:首页 > 数据库 > Oracle

oracle cursor使用的几个实例(笔记)

2014-05-06 17:55 211 查看
CREATE OR REPLACE PROCEDURE p_c_csp_update_staffnoteva
is

cur    SYS_REFCURSOR;
v_receivers t_msg_noteinfo.receivers%type;
v_receiver t_msg_notereceive.receiver%type default '';
v_NoteId t_msg_notereceive.noteid%type;
v_sendtime   DATE;

BEGIN

update   t_c_sqm_staffnoteva t set  t.iseva='1',t.removereason='免检到期' where t.endday <sysdate and t.iseva='0' ;

commit;
update t_c_sqm_staffnoteva t  set  t.iseva='1',t.endday=sysdate,t.removereason='服务质量差错'
where t.iseva='0' and t.staffid in(select t1.staffid from v_c_sqm_newworksituation t1 where
t1.countday>sysdate-2  and(t1.error>0 or t1.bigerror>0 or t1.morebigerror>0
or t1.declarationofservice>0 or t1.badreviewproblem1>0 ));
commit;

OPEN cur FOR
SELECT T.STAFFID
FROM t_c_sqm_staffnoteva T
WHERE T.iseva='1' and t.removereason='服务质量差错' and t.endday>sysdate-1/24;

p_generate_sequence('',6,'0',v_NoteId);
v_sendtime:=sysdate;

LOOP
FETCH cur
INTO v_receiver;
exit when cur%NOTFOUND;

insert into t_msg_notereceive (HOSTEDCCID, NOTEID, RECEIVER, READFLAG,
STATUS, TITLE, SENDTIME, SENDER, GRADE, AFFIXFLAG, ANONYMOUSFLAG, READTIME,
AFFIXPATH, PARTIONID, TYPEID, TYPENAME, ISSCROLL, ISPOPUP, NEWAFFIXPATH,
ISPOP, POPVALIDDATE, ISSHOWCOUNT, ISFLOAT, ISSATISFY)
values ('', v_NoteId, v_receiver, 'N', '7', 'ceshi123',
v_sendtime, '9800139', '1',
'N', 'N', null, '', '68', '203', '团队建设', 'N', 'N', '', 'N', null, 'N', 'N', '');

if v_receivers is null
then
v_receivers:=v_receiver;
else
v_receivers:=v_receivers||','||v_receiver;
end if;

end loop;

if v_receivers!=''
then

insert into t_msg_noteinfo (HOSTEDCCID, NOTEID, TITLE, CONTENT,
SENDTIME, STATUS, GRADE, RETURNFLAG, ISEMAIL, EMAILADDRESS, ANONYMOUSFLAG, SENDMODULE,
AFFIXPATH, SENDER, RECEIVERS, OTHERID, UPID, ORIGINID, DELETETIME, TYPEID,
TYPENAME, ISSCROLL, ISPOPUP, NEWAFFIXPATH, ISPOP, POPVALIDDATE, ISSHOWCOUNT, ISFLOAT)
values ('', v_NoteId, 'ceshi123',
'您在' ||to_char(v_sendtime,'mm')|| '月' || to_char(v_sendtime,'dd')|| '日,出现话务录音质评差错(或服务申告),即将退出免检名单,若有疑义,可在5个工作日内提出申诉,逾期未申诉视为无疑义',
v_sendtime, '2', '1', '',
'N', '', 'N', 'memo', '', '9800139', v_receivers, '', '', '',
null, '203', '团队建设', 'N', 'N', '', 'N', null, 'N', 'N');

commit;

end if;

EXCEPTION
WHEN OTHERS THEN

ROLLBACK;

END p_c_csp_update_staffnoteva;
declare 
  TYPE curname is ref CURSOR  --return test_yf%rowtype
    ;
  i number:=0 ;
  openflag varchar2(20);
  
  cur curname;
  cursor cur1(tid in number)  is select id,name from test_yf where id=tid or id=i;
  rowty test_yf%rowtype;
  rowtyp cur1%rowtype;
  
begin

-- cur begin

--loop 1
open cur for select * from test_yf where id <0;
  loop 
  fetch cur into rowty ;
  exit when cur%notfound;
  
  dbms_output.put_line(cur%rowcount||':loop1  '||rowty.id);
   
end loop;

if cur%isopen then
openflag:='true';
else openflag:='false';
end if;
dbms_output.put_line('cur openstatus='||openflag||'  '||cur%rowcount);

 if(cur is not null  and cur%isopen) then
   close cur;
   end if;
   
   
 
 --loop 2  
 open cur for select * from test_yf where id <0;  
 for i in 1..3 loop 
 fetch cur into rowty ;
 dbms_output.put_line(cur%rowcount||':loop2  '||rowty.id  );
 end loop;
 dbms_output.put_line(cur%rowcount);--return value is relate to count of effective fetch operation
  close cur;
   
 --cur end
  
  
 --cur1 begin
 
-- loop 3
 
 
 for auto_record in cur1(5) loop
 
 dbms_output.put_line('loop3  '||auto_record.id||'  '||auto_record.name);
 end loop;
--this kind of loop will open,fetch and  close cursor automatically,
--and auto define 'auto_record' as type of cur1%rowtype ,
-- should not call 'close cursor'  after loop; 

-- normal fetch
    open cur1(5);
  
  fetch cur1 into rowtyp;
   dbms_output.put_line(rowtyp.id||'  '||rowtyp.name);
  
if cur1%isopen then
openflag:='true';
else openflag:='false';
end if;
dbms_output.put_line('cur1 openstatus='||openflag||'  '||cur1%rowcount);

 if( cur1%isopen)then 
 close cur1;
 end if;
  --cur1 end
 
 
 --exception
  exception
    when others then
    null;
    if(cur is not null and cur%isopen) 
    then close cur; end if;
    
    if( cur1%isopen)then 
     close cur1;
       end if;
       
    dbms_output.put_line(SQLCODE());
    dbms_output.put_line(sqlerrm());
  
end;
declare
cursor cur(tid  in number) --return test_yf%rowtype
is  select * from test_yf where id=tid ;

rowty test_yf%rowtype;

begin
open cur(111);
loop
fetch cur into rowty;
exit when cur%notfound;
dbms_output.put_line(rowty.id||'  '||rowty.name);
end loop;
close cur;

open cur(3);
loop
fetch cur into rowty;
exit when cur%notfound;
dbms_output.put_line(rowty.id||'  '||rowty.name);
end loop;
close cur;

open cur(-2);
loop
fetch cur into rowty;
exit when cur%notfound;
dbms_output.put_line(rowty.id||'  '||rowty.name);
end loop;
close cur;

exception
when others then
null;

dbms_output.put_line(SQLCODE());
dbms_output.put_line(sqlerrm());

end;


-----'DML'  and  'select .. into.. from ...' operation always create an implicit cursor by DB,
----use keyword  'sql' to manipulate current implicit cursor;

declare
-- Local variables here
i integer;
foundflag varchar2(20);
openflag varchar2(20);

begin
update test_yf set name='ccc' where id>0;
if sql%found then
foundflag:='true';
else foundflag:='false';
end if;

if sql%isopen then
openflag:='true';
else openflag:='false';
end if;

dbms_output.put_line(sql%rowcount||'  '||foundflag||'  '||openflag);--n  true  false

commit;

if sql%found then
foundflag:='true';
else foundflag:='false';
end if;

if sql%isopen then
openflag:='true';
else openflag:='false';
end if;

dbms_output.put_line(sql%rowcount||'  '||foundflag||'  '||openflag);--0 false false
end;


implicit游标的属性 返回值类型   意    义  

SQL%ROWCOUNT    整型  代表DML语句成功执行的数据行数  

SQL%FOUND   布尔型 值为TRUE代表插入、删除、更新或单行查询操作成功  

SQL%NOTFOUND    布尔型 与SQL%FOUND属性返回值相反  

SQL%ISOPEN  布尔型 DML执行过程中为真,结束后为假  

explicit游标的属性   返回值类型   意    义  

%ROWCOUNT   整型  获得FETCH语句返回的数据行数  

%FOUND  布尔型 最近的FETCH语句返回一行数据则为真,否则为假  

%NOTFOUND   布尔型 与%FOUND属性返回值相反  

%ISOPEN 布尔型 游标已经打开时值为真,否则为假  

oracle中预定义的异常 
Oracle的系统异常很多,但只有一部分常见错误在标准包中予以定义。定义的错误可以在EXCEPTION部分通过标准的错误名来进行判断,并进行异常处理。常见的系统预定义异常如下所示。 

Sql代码  


错 误 名 称 错误代码    错 误 含 义  

CURSOR_ALREADY_OPEN ORA_06511   试图打开已经打开的游标  

INVALID_CURSOR  ORA_01001   试图使用没有打开的游标  

DUP_VAL_ON_INDEX    ORA_00001   保存重复值到惟一索引约束的列中  

ZERO_DIVIDE ORA_01476   发生除数为零的除法错误  

INVALID_NUMBER  ORA_01722   试图对无效字符进行数值转换  

ROWTYPE_MISMATCH    ORA_06504   主变量和游标的类型不兼容  

VALUE_ERROR ORA_06502   转换、截断或算术运算发生错误  

TOO_MANY_ROWS   ORA_01422   SELECT…INTO…语句返回多于一行的数据  

NO_DATA_FOUND   ORA_01403   SELECT…INTO…语句没有数据返回  

TIMEOUT_ON_RESOURCE ORA_00051   等待资源时发生超时错误  

TRANSACTION_BACKED_OUT  ORA_00060   由于死锁,提交失败  

STORAGE_ERROR   ORA_06500   发生内存错误  

PROGRAM_ERROR   ORA_06501   发生PL/SQL内部错误  

NOT_LOGGED_ON   ORA_01012   试图操作未连接的数据库  

LOGIN_DENIED    ORA_01017   在连接时提供了无效用户名或口令  

-- dynamic query and dynamic cursor
declare
-- Local variables here
type mycurtype is ref cursor;
i integer;
mycur mycurtype;
str varchar2(200);
trecord test_yf%rowtype;
letter char default 'A';
flag boolean;
val varchar2(20);

--user defined exception
not_null_constraint_violation exception;
pragma exception_init(not_null_constraint_violation,-1400);
divisor_zero_error exception;
pragma exception_init(divisor_zero_error,-1476);
user_defined_exception exception;

begin
--dynamic query
i:=1;
str:='select * from test_yf where id='||i;
execute immediate str into trecord;
dbms_output.put_line(trecord.id||' '||trecord.name);

--dynamic cursor 1
i:=3;
open mycur for 'select * from test_yf where id='||i;
fetch mycur into trecord;
close mycur;
dbms_output.put_line(trecord.id||' '||trecord.name);

--dynamic cursor 2

while (letter>='z')loop
str:='select * from test_yf where name like ''%'||letter||'%''';
open mycur for str;

dbms_output.put_line(letter||' :');
loop
fetch mycur into trecord;
exit when (mycur%notfound);
dbms_output.put_line(mycur%rowcount||'= '||trecord.id||' '||trecord.name);
end loop;

close mycur;

if(letter='Z') then
letter:=chr(ascii(letter)+7);
else
letter:=chr(ascii(letter)+1);
end if;
end loop;

-----make exceptions

RAISE_APPLICATION_ERROR(-20001,'an exception was throwed by raise_application_error');

raise zero_divide;
raise not_null_constraint_violation;
raise NO_DATA_FOUND;

insert into test_yf(when) values(null);--not_null_constraint_violation

i:=i/0;--divisor_zero_error

select name into val from test_yf where id=11;
dbms_output.put_line(val);--NO_DATA_FOUND

----------------------

exception

when NO_DATA_FOUND then
dbms_output.put_line('data not found');
DBMS_OUTPUT.PUT('errcode:'|| SQLCODE( )||' ');
dbms_output.put_line(sqlerrm());

when not_null_constraint_violation then
dbms_output.put_line('not_null_constraint_violation');
DBMS_OUTPUT.PUT('errcode:'|| SQLCODE( )||' ');
dbms_output.put_line(sqlerrm());

when divisor_zero_error then
dbms_output.put_line('divisor_zero_error');
DBMS_OUTPUT.PUT('errcode:'|| SQLCODE( )||' ');
dbms_output.put_line(sqlerrm());

when user_defined_exception then
dbms_output.put_line('user_defined_exception');
DBMS_OUTPUT.PUT('errcode:'|| SQLCODE( )||' ');
dbms_output.put_line(sqlerrm());

when others then
dbms_output.put_line('others exception');
DBMS_OUTPUT.PUT('errcode:'|| SQLCODE( )||' ');
dbms_output.put_line(sqlerrm());

end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: