sql >> データベース >  >> RDS >> Oracle

オラクルのカーソルとは

    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変数
    カーソル属性


    1. PostgreSQLでOracleデータベースにアクセスする方法

    2. 統計がロックされているテーブルを見つける方法

    3. 単純なパラメータ化と簡単な計画—パート2

    4. エンティティデータフレームワークからのトリガーの代わりにテーブルに挿入するときにエラーが発生しました