PLSQL SELECTの結果を取得する~取得結果が複数行の場合~
PLSQL カーソルを使用してデータを取得する
PLSQL パラメータ付きカーソル
PLSQL カーソル属性
カーソルには「明示カーソル」と「暗黙カーソル」の2種類があります。
明示カーソル
カーソルに名前をつけているものを明示カーソルと呼びます。
前回までのカーソルを使用したサンプルでは、以下のサンプルのようにDECLARE部でカーソルに対して名前を付けています。
DECLARE --カーソル定義 CURSOR member_csr IS SELECT * FROM Member; …以下略…
暗黙カーソル
明示カーソル以外で埋め込まれたSQLが実行されるとき、Oracleによって暗黙的にカーソルが作成され実行されます。
次のコードは暗黙カーソルを使用したSELECT文、UPDATE文です。
DECLARE membername Member.MemberName%Type; BEGIN --暗黙カーソルを使用したSELET文 SELECT MemberName Rank INTO membername FROM Member WHERE MemberId = '1'; --暗黙カーソルを使用したSELET文のLOOP FOR rec IN (SELECT * FROM Member) LOOP SYS.DBMS_OUTPUT.PUT_LINE(rec.MemberId || ' ' || rec.MemberName); END LOOP; --暗黙カーソルを使用したUPDATE文 UPDATE Member SET MemberName = 'ishida', Rank = 'C' WHERE MemberId = '1'; END;この暗黙カーソルにも明示カーソルと同じく属性があります。
暗黙カーソルのカーソル名は「SQL」になり、属性値を調べるには「SQL%属性名」とします。
但しカーソル名は「SQL」しかないため、直前に実行したSQLの属性しか調べることができません。
属性 | 意味 |
---|---|
FOUND | カーソルを実行した結果、該当するものがあったかどうか |
NOTFOUND | FOUNDの逆値 |
ISOPEN | カーソルが開いているかどうか 暗黙カーソルでは常にfalse |
ROWCOUNT | カーソルを処理した結果、処理された行数 SELECTの場合フェッチした件数 |
下記のコードでは暗黙カーソルの属性を調べています。
DECLARE membername Member.MemberName%Type; BEGIN -- ■ 暗黙カーソルを使用したSELET文のカーソルFORループ ■ -- --出力結果 --ISOPEN=false --FOUND=false --ROWCOUNT= FOR rec IN (SELECT * FROM Member WHERE MemberId = '1') LOOP --ISOPEN属性の確認 IF (SQL%ISOPEN) THEN SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true'); ELSE SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false'); END IF; --FOUND属性の確認 IF (SQL%FOUND) THEN SYS.DBMS_OUTPUT.PUT_LINE('FOUND=true'); ELSE SYS.DBMS_OUTPUT.PUT_LINE('FOUND=false'); END IF; --ROWCOUNT属性の確認 SYS.DBMS_OUTPUT.PUT_LINE('ROWCOUNT=' || SQL%ROWCOUNT); END LOOP; -- ■ 暗黙カーソルを使用したSELET文 ■ -- --出力結果 --ISOPEN=false --FOUND=true --ROWCOUNT=1 SELECT MemberName INTO membername FROM Member WHERE MemberId = '1'; --ISOPEN属性の確認 IF (SQL%ISOPEN) THEN SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true'); ELSE SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false'); END IF; --FOUND属性の確認 IF (SQL%FOUND) THEN SYS.DBMS_OUTPUT.PUT_LINE('FOUND=true'); ELSE SYS.DBMS_OUTPUT.PUT_LINE('FOUND=false'); END IF; --ROWCOUNT属性の確認 SYS.DBMS_OUTPUT.PUT_LINE('ROWCOUNT=' || SQL%ROWCOUNT); -- ■ 暗黙カーソルを使用したUPDATE文 ■ -- --出力結果 --ISOPEN=false --FOUND=true --ROWCOUNT=2 UPDATE Member SET MemberName = 'ishida', Rank = 'C' WHERE MemberId > '1'; --ISOPEN属性の確認 IF (SQL%ISOPEN) THEN SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=true'); ELSE SYS.DBMS_OUTPUT.PUT_LINE('ISOPEN=false'); END IF; --FOUND属性の確認 IF (SQL%FOUND) THEN SYS.DBMS_OUTPUT.PUT_LINE('FOUND=true'); ELSE SYS.DBMS_OUTPUT.PUT_LINE('FOUND=false'); END IF; --ROWCOUNT属性の確認 SYS.DBMS_OUTPUT.PUT_LINE('ROWCOUNT=' || SQL%ROWCOUNT); END;暗黙カーソルを使用したカーソルFORループでは属性が何も取れないのですね。
明示カーソルを使用したカーソルFORループでの各属性は、コチラ「PLSQL カーソル属性 」に書いてます。
0 件のコメント:
コメントを投稿