「Oracle」PL/SQLでカーソルのOPEN~FETCH処理を行う方法

環境
Oracle 11.2.0.1.0

1.テーブルを作成します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> create table userinfo_tbl(uno varchar(25),uname varchar(35),age number(2));
表が作成されました。
SQL> create table userinfo_tbl(uno varchar(25),uname varchar(35),age number(2)); 表が作成されました。
SQL> create table userinfo_tbl(uno varchar(25),uname varchar(35),age number(2));

表が作成されました。

2.データを挿入します

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL> insert into userinfo_tbl values('1001','user01',23);
1行が作成されました。
SQL> insert into userinfo_tbl values('2002','user02',33);
1行が作成されました。
SQL> insert into userinfo_tbl values('3003','user03',44);
1行が作成されました。
SQL> insert into userinfo_tbl values('1001','user01',23); 1行が作成されました。 SQL> insert into userinfo_tbl values('2002','user02',33); 1行が作成されました。 SQL> insert into userinfo_tbl values('3003','user03',44); 1行が作成されました。
SQL> insert into userinfo_tbl values('1001','user01',23);

1行が作成されました。

SQL> insert into userinfo_tbl values('2002','user02',33);

1行が作成されました。

SQL> insert into userinfo_tbl values('3003','user03',44);

1行が作成されました。

3.カーソルの定義
CURSOR カーソル名 IS
SELECT * FROM テーブル名;

カーソルのROWTYPEを設定します
rec カーソル名%ROWTYPE;

カーソルをOPENします
OPEN カーソル名;
LOOP
FETCH カーソル名 INTO rec;

SQL構文

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
DECLARE
--カーソルの定義
CURSOR cftcur IS
SELECT * FROM userinfo_tbl;
--カーソルのROWTYPEを設定
rec cftcur%ROWTYPE;
BEGIN
--カーソルをOPENする
OPEN cftcur;
--カーソルをループする
LOOP
--カーソルから1行取り出しrecに格納する
FETCH cftcur INTO rec;
--データが存在しない場合はループを抜ける
EXIT WHEN
cftcur%NOTFOUND;
--取得したデータを表示する
DBMS_OUTPUT.PUT_LINE('UNO ⇒' || rec.UNO);
DBMS_OUTPUT.PUT_LINE('UNAME ⇒' || rec.UNAME);
DBMS_OUTPUT.PUT_LINE('AGE ⇒' || rec.AGE);
END LOOP;
--カーソルをCLOSEする
CLOSE cftcur;
END;
/
DECLARE --カーソルの定義 CURSOR cftcur IS SELECT * FROM userinfo_tbl; --カーソルのROWTYPEを設定 rec cftcur%ROWTYPE; BEGIN --カーソルをOPENする OPEN cftcur; --カーソルをループする LOOP --カーソルから1行取り出しrecに格納する FETCH cftcur INTO rec; --データが存在しない場合はループを抜ける EXIT WHEN cftcur%NOTFOUND; --取得したデータを表示する DBMS_OUTPUT.PUT_LINE('UNO ⇒' || rec.UNO); DBMS_OUTPUT.PUT_LINE('UNAME ⇒' || rec.UNAME); DBMS_OUTPUT.PUT_LINE('AGE ⇒' || rec.AGE); END LOOP; --カーソルをCLOSEする CLOSE cftcur; END; /
DECLARE
    --カーソルの定義
    CURSOR cftcur IS
    SELECT * FROM userinfo_tbl;

    --カーソルのROWTYPEを設定
    rec cftcur%ROWTYPE;

  BEGIN
    --カーソルをOPENする
    OPEN cftcur;
     --カーソルをループする
    LOOP
      --カーソルから1行取り出しrecに格納する
     FETCH cftcur INTO rec;

      --データが存在しない場合はループを抜ける
      EXIT WHEN
        cftcur%NOTFOUND;

      --取得したデータを表示する
      DBMS_OUTPUT.PUT_LINE('UNO ⇒' || rec.UNO);
      DBMS_OUTPUT.PUT_LINE('UNAME ⇒' || rec.UNAME);
      DBMS_OUTPUT.PUT_LINE('AGE ⇒' || rec.AGE);

    END LOOP;

    --カーソルをCLOSEする
    CLOSE cftcur;

  END;
  /

操作例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SQL > set serveroutput on
SQL> DECLARE
2 --カーソルの定義
3 CURSOR cftcur IS
4 SELECT * FROM userinfo_tbl;
5
6 --カーソルのROWTYPEを設定
7 rec cftcur%ROWTYPE;
8
9 BEGIN
10 --カーソルをOPENする
11 OPEN cftcur;
12
13 --カーソルをループする
14 LOOP
15 --カーソルから1行取り出しrecに格納する
16 FETCH cftcur INTO rec;
17
18 --データが存在しない場合はループを抜ける
19 EXIT WHEN
20 cftcur%NOTFOUND;
21
22 --取得したデータを表示する
23 DBMS_OUTPUT.PUT_LINE('UNO ⇒' || rec.UNO);
24 DBMS_OUTPUT.PUT_LINE('UNAME ⇒' || rec.UNAME);
25 DBMS_OUTPUT.PUT_LINE('AGE ⇒' || rec.AGE);
26
27 END LOOP;
28
29 --カーソルをCLOSEする
30 CLOSE cftcur;
31
32 END;
33 /
UNO ⇒1001
UNAME ⇒user01
AGE ⇒23
UNO ⇒2002
UNAME ⇒user02
AGE ⇒33
UNO ⇒3003
UNAME ⇒user03
AGE ⇒44
PL/SQLプロシージャが正常に完了しました。
SQL > set serveroutput on SQL> DECLARE 2 --カーソルの定義 3 CURSOR cftcur IS 4 SELECT * FROM userinfo_tbl; 5 6 --カーソルのROWTYPEを設定 7 rec cftcur%ROWTYPE; 8 9 BEGIN 10 --カーソルをOPENする 11 OPEN cftcur; 12 13 --カーソルをループする 14 LOOP 15 --カーソルから1行取り出しrecに格納する 16 FETCH cftcur INTO rec; 17 18 --データが存在しない場合はループを抜ける 19 EXIT WHEN 20 cftcur%NOTFOUND; 21 22 --取得したデータを表示する 23 DBMS_OUTPUT.PUT_LINE('UNO ⇒' || rec.UNO); 24 DBMS_OUTPUT.PUT_LINE('UNAME ⇒' || rec.UNAME); 25 DBMS_OUTPUT.PUT_LINE('AGE ⇒' || rec.AGE); 26 27 END LOOP; 28 29 --カーソルをCLOSEする 30 CLOSE cftcur; 31 32 END; 33 / UNO ⇒1001 UNAME ⇒user01 AGE ⇒23 UNO ⇒2002 UNAME ⇒user02 AGE ⇒33 UNO ⇒3003 UNAME ⇒user03 AGE ⇒44 PL/SQLプロシージャが正常に完了しました。
SQL > set serveroutput on
SQL> DECLARE
  2    --カーソルの定義
  3    CURSOR cftcur IS
  4    SELECT * FROM userinfo_tbl;
  5
  6    --カーソルのROWTYPEを設定
  7    rec cftcur%ROWTYPE;
  8
  9  BEGIN
 10    --カーソルをOPENする
 11    OPEN cftcur;
 12
 13    --カーソルをループする
 14    LOOP
 15      --カーソルから1行取り出しrecに格納する
 16      FETCH cftcur INTO rec;
 17
 18      --データが存在しない場合はループを抜ける
 19      EXIT WHEN
 20        cftcur%NOTFOUND;
 21
 22      --取得したデータを表示する
 23      DBMS_OUTPUT.PUT_LINE('UNO ⇒' || rec.UNO);
 24      DBMS_OUTPUT.PUT_LINE('UNAME ⇒' || rec.UNAME);
 25      DBMS_OUTPUT.PUT_LINE('AGE ⇒' || rec.AGE);
 26
 27    END LOOP;
 28
 29    --カーソルをCLOSEする
 30    CLOSE cftcur;
 31
 32  END;
 33  /
UNO ⇒1001
UNAME ⇒user01
AGE ⇒23
UNO ⇒2002
UNAME ⇒user02
AGE ⇒33
UNO ⇒3003
UNAME ⇒user03
AGE ⇒44

PL/SQLプロシージャが正常に完了しました。

 

Oracle

Posted by arkgame