一、引數游標
引數游標是帶有引數的游標,在定義引數游標之後,當使用不同引數值多次開啟游標時,可以產生不同的結果集,語法如下:
cursor cursor_name(parameter_name datatype) is select_statement;
定義引數游標時,游標引數只能指定資料型別,而不能指定長度。
示例如下:
oracle**
declare
cursor temp_cursor(no number) is select name from cip_temps where id=no;
v_name cip_temps.name%type;
begin
open temp_cursor(1);
loop
fetch temp_cursor into v_name;
exit when temp_cursor%notfound;
dbms_output.put_line(v_name);
end loop;
close temp_cursor;
end;
二、使用游標更新或刪除資料
通過使用顯示游標,不僅可以一行一行的處理select語句結果,而且也可以更新或刪除當前游標的資料,注意,如果要通過游標更新或刪除資料,在定義游標時一定要帶有for update子句,語法如下:
cursor cursor_name(parameter_name datatype) is select_statement for updae [of column_reference][nowait];如上所示:for update子句用於在游標結果集資料上加行共享鎖,以防止其他使用者在相應行上執行dml操作,當select語句要引用到多張表是,使用of子句可以確定哪些表要加鎖,如果沒有of子句,則會在select語句所引用的全部表上加鎖,nowait用於指定不等待鎖,為了更新或刪除當前游標行資料,必須在update 或delete語句中引用where current of 子句,語法如下:
update table_name set column=.. where current of cursor_name;
delete from table_name where current of cursor_name;
1、使用游標更新資料
declare
cursor temp_cursor is select name,address,id from cip_temps for update;
v_name cip_temps.name%type;
v_address cip_temps.address%type;
v_id cip_temps.id%type;
begin
open temp_cursor;
loop
fetch temp_cursor into v_name,v_address,v_id;
exit when temp_cursor%notfound;
if(v_id>4) then
update cip_temps set name='name'||to_char(v_id),address=
'address'||to_char(v_id) where current of temp_cursor;
end if;
end loop;
close temp_cursor;
end;
2、使用游標刪除資料
oracle**
declare
cursor temp_cursor is select name,address,id from cip_temps for update;
v_name cip_temps.name%type;
v_address cip_temps.address%type;
v_id cip_temps.id%type;
begin
open temp_cursor;
loop
fetch temp_cursor into v_name,v_address,v_id;
exit when temp_cursor%notfound;
if(v_id>2) then
delete from cip_temps where current of temp_cursor;
end if;
end loop;
close temp_cursor;
end;
3、使用of子句在特定表加行共享鎖。
如果使用子查詢涉及到多張表,那麼預設情況下會在所有表上加行共享鎖,為了只在特定表上加行共享鎖,需要在for update子句後帶有of子句,of後面跟欄位名,如果跟表名或游標名稱,則會報錯:標示符無效。示例如下:
oracle**
declare
cursor gdata is select name,address,cip_temps.id from cip_temps,cip_t
where cip_temps.id=cip_t.id for update of address;
rs gdata%rowtype;
begin
open gdata;
loop
fetch gdata into rs;
exit when gdata%notfound;
if rs.id=1 then
delete from cip_temps where current of gdata;
else
update cip_temps set name='king' where current of gdata;
end if;
end loop;
close gdata;
end;
4、使用nowait子句
使用for update語句對被作用於行加鎖,如果其他會話已經在被作用於行上加鎖,那麼預設情況下當前會話要一直等待對方釋放鎖,通過在for update子句中指定 nowait語句,可以避免等待鎖,當指定了nowait子句之後,如果其他會話已經在被作用行加鎖,那麼當前會話會顯示錯誤提示資訊,並退出pl/sql,示例如下:
oracle**
declare
cursor gdata is select name,address,cip_temps.id from cip_temps,cip_t
where cip_temps.id=cip_t.id for update nowait;
rs gdata%rowtype;
begin
open gdata;
loop
fetch gdata into rs;
exit when gdata%notfound;
if rs.id=1 then
delete from cip_temps where current of gdata;
else
update cip_temps set name='king' where current of gdata;
end if;
end loop;
close gdata;
end;
三、游標for迴圈
使用游標for迴圈是迴圈游標最簡單的方法,oracle會隱含開啟游標、迴圈提取資料、關閉游標,語法如下:
for record_name in cursor_name loop
..........
end loop;
如上所示:cursor_name是已經定義的游標名稱,record_name是oracle隱含定義的記錄變數。
1、使用游標for迴圈
當使用游標開發程式時,建議使用for迴圈,從而簡化**程式,示例如下:
oracle**
declare
cursor temp_cursor is select name,age,address,id from cip_temps;
begin
for emp_record in temp_cursor loop
dbms_output.put_line(temp_cursor%rowcount||'第一行資料:'||emp_record.name||':'|| emp_record.age||':'|| emp_record.address||':'|| emp_record.id);
end loop;
end;
2、在游標for迴圈時直接使用子查詢
sql**
declare
begin
for emp_record in (select * from cip_temps) loop
dbms_output.put_line('第一行資料:'||emp_record.name||':'|| emp_record.age||':'|| emp_record.address||':'|| emp_record.id);
end loop;
end;
Oracle 學習開發子程式 游標 引數游標
b 一 引數游標 b 引數游標是帶有引數的游標,在定義引數游標之後,當使用不同引數值多次開啟游標時,可以產生不同的結果集,語法如下 cursor cursor name parameter name datatype is select statement 定義引數游標時,游標引數只能指定資料型別,...
使用游標 引數游標
參游標是指帶有引數的游標。在定義了引數游標之後,當使用不同引數值多次開啟游標時,可以生成不同的結果集。定義引數游標的語法如下 cursor cursor name parameter name datetype is select statement 注意,當定義引數游標時,游標引數只能指定資料型別...
oracle帶引數的游標
oracle中的游標可以帶引數麼?具體 怎麼實現呢?可以啊,引數在游標定義時使用,開啟時傳入引數,例如 create or replace procedure a as cursor b c id int is select from d where id c id begin open b 111...