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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle PL/SQL之 Package介紹OracleSQLPackage
- 關於Oracle遊標的簡單定義Oracle
- 關於遊標的一些理解
- 關於MySQL遊標的巢狀使用MySql巢狀
- Oracle PL/SQL塊簡介OracleSQL
- SQL SERVER 遊標的使用SQLServer
- 關於Oracle Database Vault介紹OracleDatabase
- PL/SQL 遊標SQL
- 在SQL Server中,關於with as使用介紹SQLServer
- Oracle 動態遊標的使用Oracle
- PL/SQL 04 遊標 cursorSQL
- Oracle PL/SQLOracleSQL
- 【PL/SQL】遊標提取迴圈SQL
- 關於pl/sql的程式碼保護SQL
- 各種智慧指標的介紹指標
- sql多表的關係介紹SQL
- ORACLE PL/SQL程式設計詳解之一: PL/SQL 程式設計簡介(千里之行,始於足下)OracleSQL程式設計
- Oracle顯示遊標的使用及遊標for迴圈Oracle
- Oracle PL/SQL INDICESOracleSQL
- oracle PL/SQL示例OracleSQL
- oracle 儲存過程遊標的使用Oracle儲存過程
- 關於pl/sql中的繫結變數SQL變數
- pl/sql dev連線oracle相關問題SQLdevOracle
- Oracle遊標共享,父遊標和子游標的概念Oracle
- PL/SQL-遊標和遊標變數的使用SQL變數
- SQL 跟蹤方法相關介紹SQL
- Oracle SQL效能優化系列介紹OracleSQL優化
- Oracle與MySQL內嵌遊標的使用示例OracleMySql
- openGauss關於PL/SQL匿名塊呼叫測試SQL
- Oralce之PL/SQL程式設計(遊標)SQL程式設計
- oracle pl/sql programmingOracleSQL
- 遊標的學習
- 關於SQL Server資料庫備份和恢復特性介紹SQLServer資料庫
- Java 中關於protected的介紹Java
- ORACLE索引與高效能SQL介紹Oracle索引SQL
- oracle遊標的一些基礎問題Oracle
- 6.4. PL/SQL語法——6.4.6. 遊標SQL
- 【PL/SQL 學習】隱式遊標學習SQL