Oracle PL/SQL 關於遊標的介紹
遊標是指向私有 SQL 區(private SQL area)的指標,私有 SQL 區中儲存著關於 SELECT 或 DML 語句的處理資訊。
(1) 隱式遊標
隱式遊標是指被後臺 PL/SQL 建立和管理的會話遊標。當你執行一條 SELECT 或 DML 語句的時候,PL/SQL 會開啟一個隱式遊標。
使用者不可以控制隱式遊標,但是獲取隱式遊標的屬性。
隱式遊標的屬性如下:
SQL%ISOPEN 遊標是否開啟
SQL%FOUND 結果集中還有行數
SQL%NOTFOUND 結果集中沒有行數
SQL%ROWCOUNT 執行的行數
SQL%BULK_ROWCOUNT FORALL 語句的執行行數
SQL%BULK_EXCEPTIONS 當 FORALL 語句完成時所處理的 FORALL 異常
--例子
DROP TABLE dept_temp;
CREATE TABLE dept_temp AS
SELECT * FROM dept;
CREATE OR REPLACE PROCEDURE p (
deptno NUMBER
) AUTHID DEFINER AS
BEGIN
DELETE FROM dept_temp
WHERE deptno = deptno;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE (
'Delete succeeded for department number ' || deptno
);
ELSE
DBMS_OUTPUT.PUT_LINE ('No department number ' || deptno);
END IF;
END;
SQL> BEGIN
2 p(40);
3 p(50);
4 END;
5 /
Delete succeeded for department number 40
No department number 50
PL/SQL 過程已成功完成。
(2) 顯式遊標
顯式遊標是指被使用者建立和管理的會話遊標。你必須宣告和定義一個顯式遊標,讓它和一個查詢相關聯。
--例子,迴圈顯式遊標中的結果
DECLARE
CURSOR c1 IS
SELECT last_name, job_id FROM hr.employees
WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')
ORDER BY last_name;
v_lastname hr.employees.last_name%TYPE; -- variable for last_name
v_jobid hr.employees.job_id%TYPE; -- variable for job_id
CURSOR c2 IS
SELECT * FROM hr.employees
WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]')
ORDER BY job_id;
v_employees hr.employees%ROWTYPE; -- record variable for row of table
BEGIN
OPEN c1;
LOOP -- Fetches 2 columns into variables
FETCH c1 INTO v_lastname, v_jobid;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );
OPEN c2;
LOOP -- Fetches entire row into the v_employees record
FETCH c2 INTO v_employees;
EXIT WHEN c2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||
v_employees.job_id );
END LOOP;
CLOSE c2;
END;
-------------------------------------
Higgins AC_MGR
Greenberg FI_MGR
Hartstein MK_MAN
Russell SA_MAN
Partners SA_MAN
Errazuriz SA_MAN
Cambrault SA_MAN
Zlotkey SA_MAN
PL/SQL 過程已成功完成。
(1) 隱式遊標
隱式遊標是指被後臺 PL/SQL 建立和管理的會話遊標。當你執行一條 SELECT 或 DML 語句的時候,PL/SQL 會開啟一個隱式遊標。
使用者不可以控制隱式遊標,但是獲取隱式遊標的屬性。
隱式遊標的屬性如下:
SQL%ISOPEN 遊標是否開啟
SQL%FOUND 結果集中還有行數
SQL%NOTFOUND 結果集中沒有行數
SQL%ROWCOUNT 執行的行數
SQL%BULK_ROWCOUNT FORALL 語句的執行行數
SQL%BULK_EXCEPTIONS 當 FORALL 語句完成時所處理的 FORALL 異常
--例子
DROP TABLE dept_temp;
CREATE TABLE dept_temp AS
SELECT * FROM dept;
CREATE OR REPLACE PROCEDURE p (
deptno NUMBER
) AUTHID DEFINER AS
BEGIN
DELETE FROM dept_temp
WHERE deptno = deptno;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE (
'Delete succeeded for department number ' || deptno
);
ELSE
DBMS_OUTPUT.PUT_LINE ('No department number ' || deptno);
END IF;
END;
SQL> BEGIN
2 p(40);
3 p(50);
4 END;
5 /
Delete succeeded for department number 40
No department number 50
PL/SQL 過程已成功完成。
(2) 顯式遊標
顯式遊標是指被使用者建立和管理的會話遊標。你必須宣告和定義一個顯式遊標,讓它和一個查詢相關聯。
--例子,迴圈顯式遊標中的結果
DECLARE
CURSOR c1 IS
SELECT last_name, job_id FROM hr.employees
WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')
ORDER BY last_name;
v_lastname hr.employees.last_name%TYPE; -- variable for last_name
v_jobid hr.employees.job_id%TYPE; -- variable for job_id
CURSOR c2 IS
SELECT * FROM hr.employees
WHERE REGEXP_LIKE (job_id, '[ACADFIMKSA]_M[ANGR]')
ORDER BY job_id;
v_employees hr.employees%ROWTYPE; -- record variable for row of table
BEGIN
OPEN c1;
LOOP -- Fetches 2 columns into variables
FETCH c1 INTO v_lastname, v_jobid;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( RPAD(v_lastname, 25, ' ') || v_jobid );
END LOOP;
CLOSE c1;
DBMS_OUTPUT.PUT_LINE( '-------------------------------------' );
OPEN c2;
LOOP -- Fetches entire row into the v_employees record
FETCH c2 INTO v_employees;
EXIT WHEN c2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE( RPAD(v_employees.last_name, 25, ' ') ||
v_employees.job_id );
END LOOP;
CLOSE c2;
END;
-------------------------------------
Higgins AC_MGR
Greenberg FI_MGR
Hartstein MK_MAN
Russell SA_MAN
Partners SA_MAN
Errazuriz SA_MAN
Cambrault SA_MAN
Zlotkey SA_MAN
PL/SQL 過程已成功完成。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26506993/viewspace-1986738/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PL/SQL 遊標SQL
- Oracle PL/SQL塊簡介OracleSQL
- Oracle PL/SQLOracleSQL
- 關於Oracle Database Vault介紹OracleDatabase
- Oralce之PL/SQL程式設計(遊標)SQL程式設計
- Oracle 的PL/SQL語言使用OracleSQL
- 6.4. PL/SQL語法——6.4.6. 遊標SQL
- sql多表的關係介紹SQL
- openGauss關於PL/SQL匿名塊呼叫測試SQL
- Oracle PL/SQL程式碼中的註釋OracleSQL
- pl/sql中三種遊標迴圈效率對比SQL
- 使用profiler測試Oracle PL/SQL效能OracleSQL
- 【SQL】SQL表連線方法方式介紹(Oracle/Postgresql)SQLOracle
- Java 中關於protected的介紹Java
- PL/SQL第三章--游標SQL
- 【TUNE_ORACLE】列出LOOP套LOOP的PL/SQL程式碼SQL參考OracleOOPSQL
- 【OracleEBS】 在PL/SQL中呼叫Oracle ERP請求OracleSQL
- 「Oracle」客戶端 PL/SQL DEVELOPER 安裝使用Oracle客戶端SQLDeveloper
- PL/SQL Developer連線到Oracle 12cSQLDeveloperOracle
- Oracle10g SQL tune adviser簡單介紹OracleSQL
- pl/sql developer中關於TIMESTAMP顯示格式的疑問和學習SQLDeveloper
- Rman關於filesperset引數的介紹
- 關於風機滑環的介紹
- 關於 React Hooks 的簡單介紹ReactHook
- Oracle RAC DRM介紹和關閉DRMOracle
- 關於Luthier CI 路由介紹路由
- Oracle vs PostgreSQL Develop(23) - PL(pg)sql(引數宣告)OracleSQLdev
- 原創:oracle PL/SQL程式設計基礎 上OracleSQL程式設計
- 原創:oracle PL/SQL程式設計基礎 下OracleSQL程式設計
- PL/SQL Developer連線遠端Oracle資料庫SQLDeveloperOracle資料庫
- PL/SQL 宣告SQL
- ORACLE MTS的介紹(zt)Oracle
- 關於keras框架的介紹以及操作使用Keras框架
- 關於PHP的語法介紹,新手必看PHP
- 關於mysql基礎知識的介紹MySql
- 關於 Android Service 的介紹都在這了Android
- [譯] 關於 React Motion 的簡要介紹React
- 【Oracle】Oracle logminer功能介紹Oracle
- Python 關於JSON模組介紹PythonJSON