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