對於顯示游標的使用,有四個步驟:
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...