oracle動態游標例項

2021-08-29 19:55:04 字數 3418 閱讀 2555

1,帶引數的游標  

與儲存過程和函式相似,可以將引數傳遞給游標並在查詢中使用。這對於處理在某種條件下開啟游標的情況非常有用。它的語法如下:  

cursor   cursor_name[(parameter[,parameter],...)]   is   select_statement;    

定義引數的語法如下:  

parameter_name   [in]   data_type[   value]    

與儲存過程不同的是,游標只能接受傳遞的值,而不能返回值。引數只定義資料型別,沒有大小。    

另外可以給引數設定乙個預設值,當沒有引數值傳遞給游標時,就使用預設值。游標中定義的引數只是乙個佔位符,在別處引用該引數不一定可靠。  

在開啟游標時給引數賦值,語法如下:  

open   cursor_name[value[,value]....];    

引數值可以是文字或變數。  

例:  

decalre  

cursor   c_dept   is   select   *   from   dept   order   by   deptno;  

cursor   c_emp   (p_dept   varachar2)   is  

select   ename,salary  

from   emp  

where   deptno=p_dept  

order   by   ename  

r_dept   dept%rowtype;  

v_ename   emp.ename%type;  

v_salary   emp.salary%type;  

v_tot_salary   emp.salary%type;  

begin  

open   c_dept;  

loop  

fetch   c_dept   into   r_dept;  

exit   when   c_dept%notfound;  

dbms_output.put_line('department:'||   r_dept.deptno||'-'||r_dept.dname);  

v_tot_salary:=0;  

open   c_emp(r_dept.deptno);  

loop  

fetch   c_emp   into   v_ename,v_salary;  

exit   when   c_emp%notfound;  

dbms_output.put_line('name:'||   v_ename||'   salary:'||v_salary);  

v_tot_salary:=v_tot_salary+v_salary;  

end   loop;  

close   c_emp;  

dbms_output.put_line('toltal   salary   for   dept:'||   v_tot_salary);  

end   loop;  

close   c_dept;  

end;    

2. 字串變數

動態游標就是動態定義游標。  

declare  

type   t_sor   is   ref   cursor;  

v_sor   t_sor;     --必需的,通過物件變數實現.  

...  

begin    

..  

end;  

/給乙個完整的例子:  

create   or   replace   procedure   sp_clear(v_table   in   string)   is  

type   cur_type   is   ref   cursor;  

c_tab   cur_type;  

v_str   string(2000);  

v_tab   t_clear.wlbmc%type;  

v_sql   string(3000);  

begin  

--get   table   from   v_table  

--reorder   these   tables  

v_str:=upper(v_table);  

v_str:=replace(v_str,',',''',''');  

v_str:=''''||v_str||'''';  

v_sql:='select   wlbmc   from   t_clear   where   trim(wlbmc)   in   ('||v_str||')   order   by   bz   desc';  

open   c_tab   for   v_sql;  

loop  

fetch   c_tab   into   v_tab;  

exit   when   c_tab%notfound;  

v_sql:='delete   from   '||v_tab||'';  

execute   immediate   v_sql;      

end   loop;        

commit;      

--deal   with   exception    

exception    

when   others   then  

rollback;  

raise;  

end   sp_clear;  

/   

3.字串變數例子2

給你乙個完整的例子:  

declare  

type   empcurtyp   is   ref   cursor;  

emp_cv       empcurtyp;  

emp_rec     emp%rowtype;  

sql_stmt   varchar2(200);  

my_job       varchar2(15)   :=   'clerk';  

begin  

sql_stmt   :=   'select   *   from   emp   where   job   =   :j';  

open   emp_cv   for   sql_stmt   using   my_job;  

loop  

fetch   emp_cv   into   emp_rec;  

exit   when   emp_cv%notfound;  

--   process   record  

end   loop;  

close   emp_cv;  

end;   

帶輸入引數的動態游標的例項

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...

oracle 動態游標

今天寫了個動態游標 使用傳入引數 關於游標分類以及用法 思路就是先拼好sql 然後開動態游標 oralce10g也支援正規表示式 呵呵 剛剛好可以實現動態傳入引數 procedure tj pda testdata v indicator in varchar is type rc is ref c...

Oracle動態游標入門

說明 下面的儲存過程在oracle817下全部通過測試,編譯和執行均是正確的 一 最簡單的乙個動態游標 create or replace procedure test cur isstrsql1 varchar 1000 type tcur is ref cursor cur tcur ac wh...