ORACLE遊標概念講解
阿新 • • 發佈:2019-02-01
7,怎樣更新和刪除顯示遊標中的記錄?
①UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執行UPDATE或DELETE操作的表中取出的最近的資料。
要使用這個方法,在宣告遊標時必須使用FOR UPDATE子串,當對話使用FOR UPDATE子串開啟一個遊標時,
所有返回集中的資料行都將處於行級(ROW-LEVEL)獨佔式鎖定,其他物件只能查詢這些資料行,
不能進行UPDATE、DELETE或SELECT...FOR UPDATE操作。
在多表查詢中,使用OF子句來鎖定特定的表,如果忽略了OF子句,那麼所有表中選擇的資料行都將被鎖定。
如果這些資料行已經被其他會話鎖定,那麼正常情況下ORACLE將等待,直到資料行解鎖。
②使用更新或刪除:
⑴宣告更新或刪除顯示遊標:
Cursor 遊標名 IS SELECT 語句 For Update [ Of 更新列列名];
Cursor 遊標名 IS SELECT 語句 For Delete [ Of 更新列列名];
⑵使用顯示遊標當前記錄來更新或刪除:
Update 表名 SET 更新語句 Where Current Of 遊標名;
Delete From 表名 Where Current Of 遊標名;
例子1:更新顯示遊標記錄
/*conn scott/tiger*/
Declare
Cursor myCur is select job from emp for update;
vjob empa.job%type;
rsal empa.sal%type;
Begin
open myCur;
loop
fetch myCur into vjob;
exit when myCur%notFound;
case (vjob)
when 'ANALYST' then rsal := 0.1;
when 'CLERK' then rsal := 0.2;
when 'MANAGER' then rsal := 0.3;
else
rsal := 0.5;
end case;
update emp set sal = sal + rsal where current of myCur;
end loop;
End;
/
例子2:刪除顯示遊標記錄
/*conn scott/tiger
Crate table empa Select * from scott.emp;
*/
Declare
Cursor MyCursor Select JOB From empa For Update;
vSal emp.Sal%TYPE;
Begin
Loop
Fetch MyCursor InTo vSal;
Exit When MyCursor%NotFound;
If vSal < 800 Then
Delete From empa Where Cursor Of MyCursor;
End If;
End Loop;
End;/
8,什麼是帶引數的顯示遊標?
①與過程和函式相似,可以將引數傳遞給遊標並在查詢中使用。
引數只定義資料型別,沒有大小(所有Oracle中的形參只定義資料型別,不指定大小)。
與過程不同的是,遊標只能接受傳遞的值,而不能返回值。
可以給引數設定一個預設值,當沒有引數值傳遞給遊標時,就使用預設值。
遊標中定義的引數只是一個佔位符,在別處引用該引數不一定可靠。
②使用帶引數的顯示遊標
⑴宣告帶引數的顯示遊標:
CURSOR 遊標名 [(parameter[,parameter],...)] IS Select語句;;
引數形式:1,引數名 資料型別
2,引數名 資料型別 DEFAULT 預設值
例子:
/*conn scott/tiger
Crate table empa Select * from scott.emp;
*/
Declare
Cursor MyCursor(pSal Number Default 800) Select JOB From empa Where SAL > pSal ;
varA MyCursor%ROWTYPE;
Begin
Loop
Fetch MyCursor InTo varA;
Exit When MyCursor%NotFound;
DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||' '||varA.empno||' '||varA.ename||' '||varA.sal);
End Loop;
End;/
①UPDATE或DELETE語句中的WHERE CURRENT OF子串專門處理要執行UPDATE或DELETE操作的表中取出的最近的資料。
要使用這個方法,在宣告遊標時必須使用FOR UPDATE子串,當對話使用FOR UPDATE子串開啟一個遊標時,
所有返回集中的資料行都將處於行級(ROW-LEVEL)獨佔式鎖定,其他物件只能查詢這些資料行,
不能進行UPDATE、DELETE或SELECT...FOR UPDATE操作。
在多表查詢中,使用OF子句來鎖定特定的表,如果忽略了OF子句,那麼所有表中選擇的資料行都將被鎖定。
如果這些資料行已經被其他會話鎖定,那麼正常情況下ORACLE將等待,直到資料行解鎖。
②使用更新或刪除:
⑴宣告更新或刪除顯示遊標:
Cursor 遊標名 IS SELECT 語句 For Update [ Of 更新列列名];
Cursor 遊標名 IS SELECT 語句 For Delete [ Of 更新列列名];
⑵使用顯示遊標當前記錄來更新或刪除:
Update 表名 SET 更新語句 Where Current Of 遊標名;
Delete From 表名 Where Current Of 遊標名;
例子1:更新顯示遊標記錄
/*conn scott/tiger*/
Declare
Cursor myCur is select job from emp for update;
vjob empa.job%type;
rsal empa.sal%type;
Begin
open myCur;
loop
fetch myCur into vjob;
exit when myCur%notFound;
case (vjob)
when 'ANALYST' then rsal := 0.1;
when 'CLERK' then rsal := 0.2;
when 'MANAGER' then rsal := 0.3;
else
rsal := 0.5;
end case;
update emp set sal = sal + rsal where current of myCur;
end loop;
End;
/
例子2:刪除顯示遊標記錄
/*conn scott/tiger
Crate table empa Select * from scott.emp;
*/
Declare
Cursor MyCursor Select JOB From empa For Update;
vSal emp.Sal%TYPE;
Begin
Loop
Fetch MyCursor InTo vSal;
Exit When MyCursor%NotFound;
If vSal < 800 Then
Delete From empa Where Cursor Of MyCursor;
End If;
End Loop;
End;/
8,什麼是帶引數的顯示遊標?
①與過程和函式相似,可以將引數傳遞給遊標並在查詢中使用。
引數只定義資料型別,沒有大小(所有Oracle中的形參只定義資料型別,不指定大小)。
與過程不同的是,遊標只能接受傳遞的值,而不能返回值。
可以給引數設定一個預設值,當沒有引數值傳遞給遊標時,就使用預設值。
遊標中定義的引數只是一個佔位符,在別處引用該引數不一定可靠。
②使用帶引數的顯示遊標
⑴宣告帶引數的顯示遊標:
CURSOR 遊標名 [(parameter[,parameter],...)] IS Select語句;;
引數形式:1,引數名 資料型別
2,引數名 資料型別 DEFAULT 預設值
例子:
/*conn scott/tiger
Crate table empa Select * from scott.emp;
*/
Declare
Cursor MyCursor(pSal Number Default 800) Select JOB From empa Where SAL > pSal ;
varA MyCursor%ROWTYPE;
Begin
Loop
Fetch MyCursor InTo varA;
Exit When MyCursor%NotFound;
DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||' '||varA.empno||' '||varA.ename||' '||varA.sal);
End Loop;
End;/