ホームページ  >  記事  >  データベース  >  オラクルカーソルとは何ですか

オラクルカーソルとは何ですか

青灯夜游
青灯夜游オリジナル
2022-02-23 11:35:0413221ブラウズ

Oracle では、カーソルは、キーワード CURSOR を使用して、Oracle によってクエリされるデータ セットのセットを定義するメカニズムです。クエリされたデータ セットはメモリに格納でき、カーソルはデータの 1 つを指します。データ セットをループするという目的を達成するために、ループ カーソルを介して記録します。

オラクルカーソルとは何ですか

このチュートリアルの動作環境: Windows 7 システム、Oracle 11g バージョン、Dell G3 コンピューター。

Oracle では、カーソルは SELECT ステートメントに名前を割り当て、その SQL ステートメント内の情報を処理できるメカニズムです。

Oracle カーソルは、キーワード CURSOR を通じて Oracle によって照会されるデータ セットのセットを定義します。配列と同様に、照会されたデータ セットはメモリに格納され、カーソルはレコードの 1 つを指し、カーソルがループ データ セットをループする目的を達成します。

カーソルの機能は何ですか?

①結果セット内の特定の行の位置を指定します。

②現在の結果セットの位置に基づいて、1 行または連続する複数の行を取得します。

③ 結果セットの現在位置にある行のデータを変更します。

④ 他のユーザーによるデータ変更に対してさまざまな機密レベルを定義します。

⑤データベースにはプログラムからアクセスできます。

Oracle カーソルの種類?

1. 静的カーソル: 結果セットが確認されている (静的に定義されている) カーソル。暗黙的カーソルと明示的カーソルに分けられる

  • 暗黙的カーソル: すべての DML ステートメントは暗黙的カーソルであり、SQL ステートメントの情報は暗黙的カーソル属性を通じて取得できます。

  • カーソルの表示: ユーザーは、宣言されたカーソル、つまり指定された結果セットを表示します。クエリが複数行の結果を返す場合は、明示的なカーソルが必要です。

2. REF カーソル: 結果セットを動的に関連付ける一時オブジェクト。

Oracle カーソルのステータスとカーソル属性の使用方法は何ですか?

①カーソルの状態を属性で表現します。

  • %Found: Fetch ステートメント (レコードの取得) の実行ステータスが True または False です。

  • %NotFound: 最後のレコードが True として抽出されるか False として抽出されるか。

  • %ISOpen: カーソルが開いているかどうか。True または False。

  • %RowCount: カーソルによって現在抽出されている行の数。

②カーソルのプロパティを利用します。

例:

/* conn scott/tiger */
  Begin
   Update emp Set  SAL = SAL + 0.1  Where JOB = 'CLERK';
   If  SQL%Found  Then
    DBMS_OUTPUT.PUT_LINE('已经更新!');
   Else
    DBMS_OUTPUT.PUT_LINE('更新失败!');
   End  If;
  End;

ディスプレイ カーソルを使用するにはどうすればよいですか?ループカーソルを反復するにはどうすればよいですか?

1. 表示カーソルを使用します

  • カーソルを宣言します: 記憶領域を分割します。この時点では Select ステートメントは実行されないことに注意してください。 。

CURSOR 游标名( 参数 列表)   [返回值类型]   IS   Select 语句;
  • カーソルを開く: Select ステートメントを実行し、結果セットを取得してカーソルに格納します。このとき、カーソルは先頭を指します。最初のレコードではなく、結果セットです。

 Open 游标名( 参数 列表);
  • レコードの取得: カーソルを移動してレコードを取得します

Fetch  游标名InTo  临时记录或属性类型变量;
  • カーソル: カーソルはバッファー プールに配置され、リソースは完全には解放されません。再開可能です。

Close  游标名;

2. ループ カーソルの移動

  • ループ カーソルの場合

ループ カーソルは次のとおりです。暗黙的にオープン カーソルは自動的にスクロールしてレコードを取得し、レコードを保存するための一時レコード タイプ変数を自動的に作成します。処理後、カーソルは自動的に閉じられます。

     For  变量名  In  游标名 
     Loop
      数据处理语句;
     End Loop;
  • ループ カーソル

     。。。
    Loop
     Fatch  游标名InTo  临时记录或属性类型变量;
     Exit  When   游标名%NotFound;
    End   Loop;
     。。。

例 1:

/* conn scott/tiger */
   Declare
     Cursor myCur is select empno,ename,sal from emp;
     vna varchar2(10);
     vno number(4);
     vsal number(7,2);
  Begin
     open myCur;
     fetch myCur into vno,vna,vsal;
     dbms_output.put_line(vno||'    '||vna||'    '||vsal);
     close myCur;
  End;
  /

例 2: ループを使用してカーソルを移動します。

 /* conn scott/tiger */
  Declare
     Cursor myCur is select ename,job,sal,empno from emp;
     varE myCur%rowType;
  Begin
     if myCur%isopen = false then
        open myCur;
       dbms_output.put_line('Opening...');
     end if;
     loop
        fetch myCur into varE;
        exit when myCur%notfound;
        dbms_output.put_line(myCur%rowCount||'    '||vare.empno||'    '||vare.ename||'    '||vare.sal);
     end loop;
     if myCur%isopen then
        Close myCur;
        dbms_output.put_line('Closing...');
     end if;
  End;
  /

例 3: For ループを使用してカーソルを移動します。

  /* conn scott/tiger */
  Declare
     Cursor myCur is select * from emp;
  Begin
     for varA in myCur
      loop
         dbms_output.put_line(myCur%rowCount||'    '||varA.empno||'    '||varA.ename||'  '||varA.sal);
      end loop;
  End;
  /

表示されたカーソル内のレコードを更新および削除するにはどうすればよいですか?

①UPDATE または DELETE ステートメントの WHERE CURRENT OF 部分文字列は、UPDATE または DELETE 操作を実行するテーブルから取得された最新のデータを具体的に処理します。

このメソッドを使用するには、カーソルを宣言するときに FOR UPDATE 部分文字列を使用する必要があります。ダイアログで FOR UPDATE 部分文字列を使用してカーソルを開くと、

戻りセット内のすべてのデータ行が行レベル (ROW-LEVEL) 排他ロックにある場合、他のオブジェクトはこれらのデータ行のクエリのみを行うことができ、

は UPDATE、DELETE、または SELECT...FOR UPDATE 操作を実行できません。

複数テーブルのクエリでは、OF 句を使用して特定のテーブルをロックします。OF 句が無視されると、すべてのテーブルで選択されたデータ行がロックされます。

これらのデータ行が他のセッションによってロックされている場合、通常の状況では、ORACLE はデータ行のロックが解除されるまで待機します。

② 更新または削除を使用します:

⑴ 表示カーソルを更新または削除することを宣言します:

   Cursor 游标名IS  SELECT 语句   For Update [ Of  更新列列名];
   Cursor 游标名IS  SELECT 语句   For Delete [ Of  更新列列名];

⑵ 表示カーソルを使用して現在のレコードを更新または削除します:

   Update  表名   SET   更新语句  Where   Current  Of   游标名;
   Delete  From  表名   Where   Current  Of   游标名;

例 1: 表示カーソル レコードを更新します

   /*conn scott/tiger*/
   Declare
     Cursor myCur is select job from emp for update;
       vjob empa.job%type;
       rsal empa.sal%type;
    Begin
       open myCur;
       loop
          fetch myCur into vjob;
          exit when myCur%notFound;
          case  (vjob)
             when 'ANALYST' then  rsal := 0.1;
            when  'CLERK' then  rsal := 0.2;
             when  'MANAGER' then  rsal := 0.3;
             else
               rsal := 0.5;
          end case;
        update emp set sal = sal + rsal where current of myCur;
       end loop;
    End;
    /

例 2: 表示カーソル レコードを削除します

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor  Select   JOB  From  empa  For  Update;
      vSal   emp.Sal%TYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  vSal;
       Exit  When  MyCursor%NotFound;
       If   vSal < 800 Then
        Delete  From empa  Where  Cursor  Of   MyCursor;
       End  If;  
      End    Loop;
    End;/

パラメータ付き表示カーソルとは何ですか?

1. プロシージャや関数と同様に、パラメータをカーソルに渡してクエリで使用できます。

パラメータはデータ型のみを定義し、サイズは定義しません (Oracle のすべての仮パラメータはデータ型のみを定義し、サイズは定義しません)。

  与过程不同的是,游标只能接受传递的值,而不能返回值。

   可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。

  游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。

2、使用带参数的显示游标

  • 声明带参数的显示游标:

   CURSOR 游标名  [(parameter[,parameter],...)]    IS   Select语句;

参数形式:

1,参数名   数据类型  

2,参数名   数据类型  DEFAULT  默认值

   例子:

    /*conn scott/tiger
    Crate table  empa  Select * from scott.emp;
    */
    Declare
      Cursor MyCursor(pSal  Number  Default   800)  Select   JOB  From  empa Where  SAL >  pSal ;
      varA  MyCursor%ROWTYPE;
    Begin
      Loop
       Fetch  MyCursor  InTo  varA;
       Exit  When  MyCursor%NotFound;
       DBMS_OUTPUT.PUT_LINE(MyCursor%RowCount||&#39;    &#39;||varA.empno||&#39;    &#39;||varA.ename||&#39;  &#39;||varA.sal); 
      End    Loop;
    End;/

推荐教程:《Oracle教程

以上がオラクルカーソルとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。