2015年11月6日金曜日

PLSQL SELECTの結果を取得する~取得結果が複数行の場合~

前回「PLSQL SELECTの結果を取得する ~取得結果が1行の場合~ 」に続き
今回はSELECTの結果が複数行の場合です。

SELECTの結果が複数行の場合はカーソルを使用します。

カーソルとは
SELECTの結果セットに対して、1行ずつデータを取り出し、順次処理していくためのものです。

カーソルを使用する手順

1. カーソルの宣言する。
   CURSOR カーソル名 IS SELECT文;

2. カーソルを開く。
   OPEN カーソル名;

3. ループ処理を開始

4. 1行ごとにデータを取り出す。
   FETCH カーソル名 INTO 変数

5. データがなければループを終了する
   EXIT WHEN カーソル名%NOTFOUND;

6. カーソルを閉じる。
   CLOSE カーソル名;

カーソルを使用してMemberテーブルの全データを取得し、1件づつ変数に代入し出力します。
※カーソルを使用したデータの取得についてはコチラ「PLSQL カーソルを使用してデータを取得する
DECLARE
    --カーソル定義
    CURSOR member_csr IS 
        SELECT * FROM Member;
    --変数宣言
    memberid VARCHAR2(4);
    membername VARCHAR2(10);
    rank VARCHAR2(2);
BEGIN
    --カーソルオープン
    OPEN member_csr;
    
    LOOP
      --カーソルから1件データを取り出し、変数に代入
      FETCH member_csr INTO memberid, membername, rank;
      --カーソルにデータがなければ、ループ終了
      EXIT WHEN member_csr%NOTFOUND;
      --出力
      SYS.DBMS_OUTPUT.PUT_LINE(memberid || ' ' || membername || ' ' || rank);    
    END LOOP;
    
    --カーソルクロース
    CLOSE member_csr;
END;

前回「PLSQL SELECTの結果を取得する ~取得結果が1行の場合~ 」と同様に
変数宣言のデータ型を「%type属性」にしたパターン。
DECLARE
    --カーソル定義
    CURSOR member_csr IS 
        SELECT * FROM Member;
    --変数宣言
    memberid Member.MemberId%Type;
    membername Member.MemberName%Type;
    rank Member.Rank%Type;
BEGIN
    --カーソルオープン
    OPEN member_csr;
    
    LOOP
      --カーソルから1件データを取り出し、変数に代入
      FETCH member_csr INTO memberid, membername, rank;
      --カーソルにデータがなければ、ループ終了
      EXIT WHEN member_csr%NOTFOUND;
      --出力
      SYS.DBMS_OUTPUT.PUT_LINE(memberid || ' ' || membername || ' ' || rank);    
    END LOOP;
    
    --カーソルクロース
    CLOSE member_csr;
END;
Memberテーブルの「%ROWTYPE属性」を使用したパターン
DECLARE
    --カーソル定義
    CURSOR member_csr IS 
        SELECT * FROM Member;
    --変数宣言
    member_rec Member%Rowtype;
BEGIN
    --カーソルオープン
    OPEN member_csr;
    
    LOOP
      --カーソルから1件データを取り出し、変数に代入
      FETCH member_csr INTO member_rec;
      --カーソルにデータがなければ、ループ終了
      EXIT WHEN member_csr%NOTFOUND;
      --出力
      SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName || ' ' || member_rec.Rank);    
    END LOOP;
    
    --カーソルクロース
    CLOSE member_csr;
END;
カーソルの「%ROWTYPE属性」を使用したパターン
カーソルを使用した場合は「レコード変数名 カーソル名%ROWTYPE;」とすることでカーソルの1データを代入できるレコート変数ができます。
DECLARE
    --カーソル定義
    CURSOR member_csr IS 
        SELECT * FROM Member;
    --レコード型のレコード変数を宣言
    member_rec member_csr%Rowtype;

BEGIN
    --カーソルオープン
    OPEN member_csr;
    
    LOOP
      --カーソルから1件データを取り出し、変数に代入
      FETCH member_csr INTO member_rec;
      --カーソルにデータがなければ、ループ終了
      EXIT WHEN member_csr%NOTFOUND;
      --出力
      SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName || ' ' || member_rec.Rank);    
    END LOOP;
    
    --カーソルクロース
    CLOSE member_csr;
END;
変数宣言のデータ型を自分で定義したレコート型にしたパターン。
DECLARE
    --カーソル定義
    CURSOR member_csr IS 
        SELECT * FROM Member;
     --レコード型の作成
    TYPE member_rec_type IS RECORD
        (
            MemberId  Member.MemberId%type,
            MemberName  Member.MemberName%type,
            Rank  Member.Rank%type
        );
    --レコード型のレコード変数を宣言
    member_rec member_rec_type;

BEGIN
    --カーソルオープン
    OPEN member_csr;
    
    LOOP
      --カーソルから1件データを取り出し、変数に代入
      FETCH member_csr INTO member_rec;
      --カーソルにデータがなければ、ループ終了
      EXIT WHEN member_csr%NOTFOUND;
      --出力
      SYS.DBMS_OUTPUT.PUT_LINE(member_rec.MemberId || ' ' || member_rec.MemberName || ' ' || member_rec.Rank);    
    END LOOP;
    
    --カーソルクロース
    CLOSE member_csr;
END;

0 件のコメント: