游標是指向結果集中某一行的指標,讓程式能逐行處理查詢結果。分為:
SELECT ... INTO ...、DML、觸發器自動建立,僅處理單行。CURSOR cur_name (param1 type, ...) IS
SELECT ... FROM ... WHERE ...;
OPEN cur_name (arg1, ...); — 執行查詢,結果集載入游標。FETCH cur_name INTO var1, var2, ...; 或 FETCH cur_name INTO rec_var;(rec_var cur_name%ROWTYPE)。每次 FETCH 移至下一行。CLOSE cur_name; — 釋放資源。| 屬性 | 型別 | 含義 |
|---|---|---|
SQL%ISOPEN | BOOLEAN | 游標是否開啟(執行中 TRUE,結束 FALSE) |
SQL%FOUND | BOOLEAN | 最近 DML/單行查詢是否影響/返回資料 |
SQL%NOTFOUND | BOOLEAN | SQL%FOUND 相反 |
SQL%ROWCOUNT | NUMBER | 目前為止影響/返回的行數 |
FOR rec IN cur_name(param) LOOP
DBMS_OUTPUT.PUT_LINE(rec.col1 || ' ' || rec.col2);
END LOOP;
-- 自動 OPEN、FETCH、CLOSE,不可在迴圈中再使用 OPEN/FETCH/CLOSE
執行期動態組裝查詢:
TYPE ref_cur IS REF CURSOR;
c ref_cur;
OPEN c FOR 'SELECT ... WHERE id = ' || v_id;
FETCH c INTO ...;
CLOSE c;
DECLARE
v_ename emp.ename%TYPE;
v_job emp.job%TYPE;
CURSOR c_emp IS SELECT ename, job FROM emp WHERE empno = 7788;
BEGIN
OPEN c_emp;
FETCH c_emp INTO v_ename, v_job;
DBMS_OUTPUT.PUT_LINE(v_ename || ' ' || v_job);
CLOSE c_emp;
END;