Oracle 游標使用大全2

2021-08-26 00:18:54 字數 3158 閱讀 9813

游標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迴圈的游標按照正常的宣告方式宣...