Oracle 游标使用大全2
生活随笔
收集整理的這篇文章主要介紹了
Oracle 游标使用大全2
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
游標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{CURRENT OF cursor_name|search_condition}?例:? 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 删除oracle表里的重复记录
- 下一篇: HD_1232畅通工程