遊標的類型有兩種:隱式和顯式。 PL/SQL會爲所有的SQL數據操作聲明一個隱式的遊標,包括只返回一條記錄的查詢操作。
其實我們在pl/sql中每作一次查詢操作就用到了oracle的隱式的遊標。
此外,我們可以顯示地使用遊標來處理一條查詢結果的遊標:
DECLARE
CURSOR c1 IS
SELECT empno, ename, job
FROM emp
WHERE deptno = 20;
由多行查詢返回的行集合稱爲結果集(result set)。它的大小就是滿足我們查詢條件的行的個數。如下圖所示,顯式遊標"指向"當前行的記錄,這可以讓我們的程序每次處理一條記錄。
其實,遊標相當於一個指針,它指向一個結果集;它在多個字段記錄的保存和處理上佔有
很大的優勢。
多行查詢處理有些像文件處理。例如,一個COBOL程序打開一個文件,處理記錄,然後關閉文件。同樣,一個PL/SQL程序打開一個遊標,處理查詢出來的行,然後關閉遊標。就像文件指針能標記打開文件中的當前位置一樣,遊標能標記出結構集的當前位置。
我們可以使用OPEN,FETCH和CLOSE語句來控制遊標,OPEN用於打開遊標並使遊標指向結果集的第一行,FETCH會檢索當前行的信息並把遊標指移向下一行,當最後一行也被處理完後,CLOSE就會關閉遊標。
遊標FOR循環
在大多需要使用顯式遊標的情況下,我們都可以用一個簡單的遊標FOR循環來代替OPEN,FETCH和CLOSE語句。首先,遊標FOR循環會隱式地聲明一個代表當前行的循環索引(loop index)變量。下一步,它會打開遊標,反覆從結果集中取得數據並放到循環索引的各個域(field)中。當所有行都被處理過以後,它就會關閉遊標。下面的例子中,遊標FOR循環隱式地聲明瞭一個emp_rec記錄:
DECLARE
CURSOR c1 IS
SELECT ename, sal, hiredate, deptno
FROM emp;
...
BEGIN
FOR emp_rec IN c1 LOOP
...
salary_total := salary_total + emp_rec.sal;
END LOOP;
END;
爲了使用每一個查詢到的行中的每一個字段,我們可以使用點標誌(dot notation),它的作用就像一個域選擇器。