Oracle 游標使用大全2

2021-05-26 20:25:20 字數 3266 閱讀 2337

游標for迴圈 

在大多數時候我們在設計程式的時候都遵循下面的步驟: 

1、開啟游標 

2、開始迴圈 

3、從游標中取值 

4、檢查那一行被返回 

5、處理 

6、關閉迴圈 

7、關閉游標 

可以簡單的把這一類**稱為游標用於迴圈。但還有一種迴圈與這種型別不相同,這就是for迴圈,用於for迴圈的游標按照正常的宣告方式宣告,它的優點在於不需要顯式的開啟、關閉、取資料,測試資料的存在、定義存放資料的變數等等。游標for迴圈的語法如下: 

for record_name in 

(corsor_name[(parameter[,parameter]...)] 

| (query_difinition) 

loop 

statements 

end loop; 

下面我們用for迴圈重寫上面的例子: 

decalre 

cursor c_dept is select deptno,dname from dept order by deptno; 

cursor c_emp (p_dept varachar2) is 

select ename,salary 

from emp 

where deptno=p_dept 

order by ename 

v_tot_salary emp.salary%type; 

begin 

for r_dept in c_dept loop 

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

v_tot_salary:=0; 

for r_emp in c_emp(r_dept.deptno) loop 

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

v_tot_salary:=v_tot_salary+v_salary; 

end loop; 

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

end loop; 

end; 

在游標for迴圈中使用查詢 

在游標for迴圈中可以定義查詢,由於沒有顯式宣告所以游標沒有名字,記錄名通過游標查詢來定義。 

decalre 

v_tot_salary emp.salary%type; 

begin 

for r_dept in (select deptno,dname from dept order by deptno) loop 

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

v_tot_salary:=0; 

for r_emp in (select ename,salary 

from emp 

where deptno=p_dept 

order by ename) loop 

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

v_tot_salary:=v_tot_salary+v_salary; 

end loop; 

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

end loop; 

end; 

游標中的子查詢 

語法如下: 

cursor c1 is select * from emp 

where deptno not in (select deptno 

from dept 

where dname!='accounting'); 

可以看出與sql中的子查詢沒有什麼區別。 

游標中的更新和刪除 

在pl/sql中依然可以使用update和delete語句更新或刪除資料行。顯式游標只有在需要獲得多行資料的情況下使用。pl/sql提供了僅僅使用游標就可以執行刪除或更新記錄的方法。 

update或delete語句中的where current of子串專門處理要執行update或delete操作的表中取出的最近的資料。要使用這個方法,在宣告游標時必須使用for update子串,當對話使用for update子串開啟乙個游標時,所有返回集中的資料行都將處於行級(row-level)獨佔式鎖定,其他物件只能查詢這些資料行,不能進行update、delete或select...for            update操作。 

語法: 

for update [of [schema.]table.column[,[schema.]table.column].. 

[nowait] 

在多表查詢中,使用of子句來鎖定特定的表,如果忽略了of子句,那麼所有表中選擇的資料行都將被鎖定。如果這些資料行已經被其他會話鎖定,那麼正常情況下oracle

將等待,直到資料行解鎖。 

在update和delete中使用where current of子串的語法如下: 

where 

例: 

delcare 

cursor c1 is select empno,salary 

from emp 

where comm is null 

for update of comm; 

v_comm number(10,2); 

begin 

for r1 in c1 loop 

if r1.salary<500 then 

v_comm:=r1.salary*0.25; 

elseif r1.salary<1000 then 

v_comm:=r1.salary*0.20; 

elseif r1.salary<3000 then 

v_comm:=r1.salary*0.15; 

else 

v_comm:=r1.salary*0.12; 

end if; 

update emp; 

set comm=v_comm 

where current of c1l; 

end loop; 

end

Oracle 游標使用大全2

游標for迴圈 在大多數時候我們在設計程式的時候都遵循下面的步驟 1 開啟游標 2 開始迴圈 3 從游標中取值 4 檢查那一行被返回 5 處理 6 關閉迴圈 7 關閉游標 可以簡單的把這一類 稱為游標用於迴圈。但還有一種迴圈與這種型別不相同,這就是for迴圈,用於for迴圈的游標按照正常的宣告方式宣...

Oracle 游標使用大全2

游標for迴圈 在大多數時候我們在設計程式的時候都遵循下面的步驟 1 開啟游標 2 開始迴圈 3 從游標中取值 4 檢查那一行被返回 5 處理 6 關閉迴圈 7 關閉游標 可以簡單的把這一類 稱為游標用於迴圈。但還有一種迴圈與這種型別不相同,這就是for迴圈,用於for迴圈的游標按照正常的宣告方式宣...

Oracle 游標使用大全2

游標for迴圈 在大多數時候我們在設計程式的時候都遵循下面的步驟 1 開啟游標 2 開始迴圈 3 從游標中取值 4 檢查那一行被返回 5 處理 6 關閉迴圈 7 關閉游標 可以簡單的把這一類 稱為游標用於迴圈。但還有一種迴圈與這種型別不相同,這就是for迴圈,用於for迴圈的游標按照正常的宣告方式宣...