Oracle入门(十四.11)之使用显式游标属性
一、游標和記錄
此示例中的游標基于SELECT語句,該語句僅檢索每個表行的兩列。 如果它檢索了六列或七,八,二十個呢?
DECLAREv_emp_id employees.employee_id%TYPE;v_last_name employees.last_name%TYPE;CURSOR emp_cursor ISSELECT employee_id, last_nameFROM employeesWHERE department_id = 30; BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_id, v_last_name;...該游標檢索整個EMPLOYEES行。 凌亂而啰嗦,不是嗎?
DECLAREv_emp_id employees.employee_id%TYPE;v_first_name employees.first_name%TYPE;v_last_name employees.last_name%TYPE;...v_department_id employees.department_id%TYPE;CURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id = 30; BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_id, v_first_name, v_last_name ...v_department_id;...比較下面的代碼片段。 你看到了什么差異?
DECLAREv_emp_id ...;v_first_name ...;...v_department_id ...:CURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id =30; BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_id, v_first_name,... v_department_id;... DECLARECURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id = 30;v_emp_recordemp_cursor%ROWTYPE; BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_record;...右側的代碼使用%ROWTYPE根據游標聲明記錄結構。 記錄是PL / SQL中的復合數據類型。
?
二、PL / SQL記錄的結構
記錄是一種復合數據類型,由多個字段組成,每個字段都有自己的名稱和數據類型。 您通過在字段名前加上記錄名來引用每個字段。 %ROWTYPE用與它所基于的游標相同的字段聲明一個記錄。
(1)cursor_name%ROWTYPE的結構
DECLARECURSOR emp_cursor ISSELECT employee_id, last_name, salary FROM employeesWHERE department_id = 30;v_emp_record emp_cursor%ROWTYPE;?
(2)游標和%ROWTYPE
%ROWTYPE便于處理活動集的行,因為您可以簡單地獲取記錄。
?
?
DECLARECURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id = 30; v_emp_record emp_cursor%ROWTYPE; BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_emp_record;EXIT WHEN emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id|| ' - ' ||v_emp_record.last_name);END LOOP;CLOSE emp_cursor; END;(3)游標和%ROWTYPE:另一個例子
DECLARECURSOR emp_dept_cursor ISSELECT first_name, last_name, department_nameFROM employees e, departments dWHERE e.department_id = d.department_id; v_emp_dept_record emp_dept_cursor%ROWTYPE; BEGINOPEN emp_dept_cursor;LOOPFETCH emp_dept_cursor INTO v_emp_dept_record;EXIT WHEN emp_dept_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_emp_dept_record.first_name||' – '||v_emp_dept_record.last_name||' – '||v_emp_dept_record.department_name);END LOOP;CLOSE emp_dept_cursor; END;?
三、顯式游標屬性
與隱式游標一樣,有幾個屬性可用于獲取有關顯式游標的狀態信息。 當附加到游標變量名稱后,這些屬性返回有關游標操作語句執行的有用信息。
(1)%ISOPEN屬性
只有當光標打開時才可以獲取行。 在執行提取以測試游標是否處于打開狀態之前,請使用%ISOPEN游標屬性。 %ISOPEN返回游標狀態:如果打開則為TRUE,否則返回FALSE。
例:
IF NOT emp_cursor%ISOPEN THEN OPEN emp_cursor; END IF; LOOPFETCH emp_cursor...(2)%ROWCOUNT和%NOTFOUND屬性
通常在循環中使用%ROWCOUNT和%NOTFOUND屬性來確定何時退出循環。
對以下內容使用%ROWCOUNT游標屬性:
?處理確切的行數
?計算循環中到目前為止獲取的行數和/或確定何時退出循環
對以下內容使用%NOTFOUND游標屬性:
?確定查詢是否找到符合條件的行
?確定何時退出循環
(3)%ROWCOUNT和%NOTFOUND的示例
此示例顯示了如何在循環中使用%ROWCOUNT和%NOTFOUND屬性作為退出條件。
DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employees;v_emp_record emp_cursor%ROWTYPE; BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_emp_record;EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id |' '|| v_emp_record.last_name);END LOOP;CLOSE emp_cursor; END;(4)SQL語句中的顯式游標屬性
您不能直接在SQL語句中使用顯式游標屬性。 以下代碼返回一個錯誤:
DECLARECURSOR emp_cursor ISSELECT employee_id, salary FROM employeesORDER BY SALARY DESC;v_emp_record emp_cursor%ROWTYPE;v_count NUMBER; BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_emp_record;EXIT WHEN emp_cursor%NOTFOUND;INSERT INTO top_paid_emps(employee_id, rank, salary)VALUES(v_emp_record.employee_id, emp_cursor%ROWCOUNT,v_emp_record.salary); ...?
?
?
總結
以上是生活随笔為你收集整理的Oracle入门(十四.11)之使用显式游标属性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle入门(十四.10)之显式游标
- 下一篇: Oracle入门(十四.12)之游标FO