Oracleのカーソルとは
Oracleは、プライベートSQL領域と呼ばれる作業領域を使用して、SQLステートメントを実行し、情報を格納します。 Oracleカーソルは、これらの作業領域に名前を付け、保存されている情報にアクセスできるようにするPL/SQL構造です
Oracleのカーソルの種類
- Oracleの暗黙カーソル
- Oracleの明示カーソル
明示カーソル
明示カーソルには次の段階があります
1)宣言:カーソルの名前を宣言し、クエリの構造を定義します
2)Open:openステートメントはクエリを実行し、参照されているすべての変数をバインドします。クエリによって識別された行は、アクティブセットと呼ばれます。そして今、それはフェッチに利用可能です
アクティブセットとは: 複数行のクエリによって返される行のセット
そのサイズは、検索条件を満たす行の数です
3)フェッチ:この段階では、カーソルから行がフェッチされ、各フェッチ後に、残りの行についてカーソルをテストします。行がない場合は、カーソルを閉じます
。4)閉じる:closeステートメントはアクティブな行のセットを解放し、カーソルを再び開いて更新されたアクティブなセットをフェッチできます
ステージの詳細
カーソルの宣言
- カーソル名
- クエリの構造
Syntax: CURSOR IS : It includes most of the usual clauses, but INTO Clause is not allowed Example: DECLARE CURSOR cur1 is SELECT address,salary,emp_no,emp_name FROM emp WHERE region=’US’; ……………………………… BEGIN ……………………………… END;
カーソルを開く
ここで、解析とクエリの実行が行われます。カーソルを開くと、クエリによって返された行をフェッチできるようになります。
Syntax: Open <cursor name> This statement is used within the executable section of the block. It also establishes an active set of the rows Example: OPEN cur1; DECLARE v_salary number; CURSOR cur1 is SELECT salary FROM emp WHERE region=’US’; BEGIN OPEN cur1; LOOP FETCH cur1 into v_salary; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE (v_salary); END LOOP; CLOSE cur1; END; /
カーソルがアクティブセットの最初の行を指すようになります。
行の取得
カーソルが開かれると、現在の行が変数にロードされます。現在の行は、カーソルが現在指している行です。PL/SQL変数またはホストへのデータの取得
変数は、FETCHステートメントを介して実行されます
Syntax: FETCH INTO ;
- カーソルに関連付けられたクエリによって返される列の値ごとに、 が必要です。
INTOリストの対応する変数。
- また、それらのデータ型は互換性がなければなりません
カーソルを閉じる
カーソルを明示的に閉じ、必要に応じて再度開くことができます。
Syntax: CLOSE <cursor-name>; Example: CLOSE cur1 Example of Using CLOSE <Cursor Name> DECLARE v_address emp.address%TYPE; CURSOR cur1 is select address from emp; BEGIN OPEN cur1; LOOP FETCH cur1 into v_address; EXIT WHEN cur1%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_address); END LOOP; CLOSE cur1; END; /
明示的なカーソル属性
属性 | タイプ | 説明 |
%ISOPEN | ブール値 | カーソルが開いている場合はTRUEと評価されます |
%NOTFOUND | ブール値 | 最新のフェッチで行が返されない場合はTRUEと評価されます |
%FOUND | ブール値 | 最新のフェッチが行を返す場合はTRUEと評価されます |
%ROWCOUNT | 番号 | これまでに返された行の総数を評価します |
Oracleカーソルを使用した高度な概念
Oracleカーソルとレコード
1)PLSQLレコードについてはすでに読んでいます。
2)PL/SQLレコードにも値をフェッチすることでアクティブセットの行を処理できます
3)明示カーソルで選択された列のリストに基づいてplsqlレコードを定義することもできます
例
DECLARE CURSOR dept_cursor is Select deptno,dept_name FROM dept; dept_record dept_cursor%rowtype; BEGIN OPEN dept_cursor; LOOP FETCH dept_cursor INTO dept_record; Insert into dept_temp (deptno, deptname) values (dept_record.deptno, dept_record.dept_name); EXIT WHEN dept_cursor%notfound; END LOOP; Commit; CLOSE dept_cursor; END; /
オラクルのパラメータ付きカーソル/パラメータ化されたカーソル
Syntax: CURSOR cursor_name(parameter_name datatype, ) IS Select_statement;
1)カーソルを開いてクエリを実行するときに、パラメータ値をカーソルに渡します
2)毎回異なるアクティブセットで明示カーソルを数回開きます
Open cursor_name(parameter_value , ……);
例
DECLARE CURSOR cur1(v_deptno number) is Select deptname,dept_loc,dept_pincode from dept where deptno=v_deptno; Dept_record cur1%rowtype; l_deptno number:=111; BEGIN OPEN cur1(112); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; OPEN cur1(l_deptno); LOOP FETCH cur1 into dept_record; IF cur1%FOUND THEN Dbms_output.put_line(dept_record.deptname); ELSE Exit; END IF; END LOOP; CLOSE cur1; END; /
関連記事
Oraclesqlで日付を操作する方法
OraclePLSQLテーブル
OraclePLSQLレコードに関するすべて
最も一般的に尋ねられる25のoracleplsqlインタビューの質問
OraclePLSQLブロック構造とOraclePLSQL変数
カーソル属性