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