游標變數REF COUSOR 動態游標 使用例項

2021-07-09 07:15:18 字數 2540 閱讀 8881

對於顯示游標的使用,有四個步驟:

1 定義游標---cursor [cursorname] is;

2 開啟游標---open [cursorname];

3 運算元據---fetch [cursorname];

4 關閉游標---close [cursor name],這個step絕對不可以遺漏。

動態游標也都遵循這個步驟。

一般在游標資料是變化時*也就是獲取游標資料的表是變化的),使用動態游標。本例中,游標資料和傳入引數有關,是變化的蠻久可以用動態游標來處理。

下面是使用例項;

create or replace procedure recover2026(handingtime varchar2) is---傳入引數形如20151225 按天

type ref_cursor  is ref cursor;--宣告動態游標型別:ref_cursor  ;

cur ref_cursor;--1,定義游標 ,宣告ref_cursor  型別變數 cur;

v_ref_cur_sql varchar2(1000);--宣告乙個變數,用來儲存獲取游標內容的語句;

type rec is record(--宣告乙個記錄,用來得到游標的資料;

policy_no varchar2(64),

status number(1)

);recs rec;--記錄型別變數

v_sql varchar2(2000);

v_sql2 varchar2(2000);

v_sql3 varchar2(2000);

v_num int;

v_mod number(2);

begin

--1.從tb_policy2015***x,prod_no='2006' 和status 比較32套表中建立時間2015***x以前(不包含這一條的資料)的,

--prod_no='2006',status, policy_no 的資料

-- 如果在tb_policyserverxx中存在的話,則刪除tp_policy2015***x的資料這條資料,

--同時刪除tb_policyserverxx 中creattime='2015***x' and policy_no 這條資料

v_ref_cur_sql:='select policy_no,status from  tb_policy'||handingtime||' where prod_no=''2026'' ' ;--動態游標內容

--open cur ;

open cur for v_ref_cur_sql;--2,開啟游標  open cur for string(string的執行結果即為游標內容)

loop

fetch cur  into recs;--3,運算元據,取出游標資料,將游標資料一條一條的迴圈複製給變數 recs;

exit when cur%notfound;

v_mod:=mod(regexp_substr(recs.policy_no,'[0-9]+'),32);--模,對應32張表

v_sql:='select  count(*) from tb_policyservice'||v_mod||' t where t.policy_no='''||recs.policy_no||''' and t.status='''||recs.status||''' and t.prod_no=''2026'' and to_char(t.createtime,''yyyymmdd'')<'''||handingtime||'''';

execute immediate v_sql into v_num;

if v_num>0 then  --有資料則刪除tp_policy2015***x的資料這條資料

v_sql2:='delete  tb_policy'||handingtime||' t where t.policy_no='''||recs.policy_no||''' and t.status='''||recs.status||''' and t.prod_no=''2026'' ';

execute immediate v_sql2;

commit;

v_sql3:='delete tb_policyservice'||v_mod||' t  where t.policy_no='''||recs.policy_no||''' and to_char(t.createtime,''yyyymmdd'')='''||handingtime||''' and t.status='''||recs.status||'''';

execute immediate v_sql3;--同時刪除tb_policyserverxx 中creattime='2015***x' and policy_no 這條資料

commit;

end if;

end loop;

close cur;

end recover2026;

說明:動態游標ref cousor屬於引用型別,是一種資料型別,而cursor則不是。所以動態游標需要使用type什麼,在定義ref cursor型別的變數。

有好的建議或疑問,郵箱聯絡。

PL SQL 游標變數

start 游標變數非常有用,游標變數可以在不同的儲存過程中傳遞,也可以返回給客戶端。create table student id int not null,name varchar2 30 not null,class varchar2 10 insert into student values...

游標,動態,for迴圈

小測 輸出各部門員工的部門名稱和工號 姓名,工資。要求 各部門工資最高的放在前面 在 dallas 地方的部門名稱後加上 三種實現方式 1 通過顯式游標 2 通過for迴圈 3 通過動態sql方式 顯示游標 declare type emp dept is record name dept.dnam...

oracle動態游標

declare v col1 varchar2 254 v col2 varchar2 254 v sql varchar2 1024 type my cursor is ref cursor v cur my cursor begin v sql select 1,2 from dual wher...