「sql for」で検索した方へ【SQL基礎】
Sal
sql 次はselectでデータベースから取得した値をfor文で回します。ポイントは次の三つ。cursorを用いて「変数のように」selectした結果を代入すること。その値をfor句の IN に代入すること。ループの変数は「レコード」として値を取り出すことができること

「sql for」で検索した方へ【SQL基礎】

  1. 記事の概要
  2. 通常のsqlにfor文は存在しない。
  3. for文をサポートしている「PL/SQL」とは
  4. PL/SQLのforのきほんの書き方
  5. 「PL/SQL for 逆順」のきほんの書き方
  6. selectをforで回す
  7. サンプルテーブル
  8. 備考
## 記事の概要
SQLのfor文について解説する記事です。
## 通常のsqlにfor文は存在しない。
まず大前提として、「通常のSQLにfor文は存在しません」 そもそもSQLにはいくつか種類がありますが、それらがサポートする ものは以下のキーワードのみです。

表D-1 PL/SQLの予約語

頭文字: 予約語

A

ALL、ALTER、AND、ANY、AS、ASC、AT

B

BEGIN、BETWEEN、BY

C

CASE、CHECK、CLUSTERS、CLUSTER、COLAUTH、COLUMNS、COMPRESS、CONNECT、CRASH、CREATE、CURSOR

D

DECLARE、DEFAULT、DESC、DISTINCT、DROP

E

ELSE、END、EXCEPTION、EXCLUSIVE

F

FETCH、FOR、FROM、FUNCTION

G

GOTO、GRANT、GROUP

H

HAVING

I

IDENTIFIED、IF、IN、INDEX、INDEXES、INSERT、INTERSECT、INTO、IS

L

LIKE、LOCK

M

MINUS、MODE

N

NOCOMPRESS、NOT、NOWAIT、NULL

O

OF、ON、OPTION、OR、ORDER、OVERLAPS

P

PROCEDURE、PUBLIC

R

RESOURCE、REVOKE

S

SELECT、SHARE、SIZE、SQL、START、SUBTYPE

T

TABAUTH、TABLE、THEN、TO、TYPE

U

UNION、UNIQUE、UPDATE

V

VALUES、VIEW、VIEWS

W

WHEN、WHERE、WITH


このリストを見るとわかるように、通常のSQLの中にはloopを補助するものはありません。 そしてSQLのうちでfor文が存在するのはSQLの中でも PL SQLと呼ばれる種類のもののみです。 for文をサポートしているのは「PL/SQL」
## for文をサポートしている「PL/SQL」とは
PL/SQLとは「Procedure Language SQL」という意味の文法です。 Procedureは順序、手続きなどの意味を持ちますから、PLSQLは 手続き型に拡張したSQLという意味を持つのです。
## PL/SQLのforのきほんの書き方
まずはデータベースに接続しない例から 次のコードでは1から3の数字をループしてコンソールに出力しています。

FOR i IN 1..3 LOOP
    DBMS_OUTPUT.PUT_LINE('ループ変数 i = ' || i);
END LOOP;
- 実行結果

ループ変数 i = 1
ループ変数 i = 2
ループ変数 i = 3

## 「PL/SQL for 逆順」のきほんの書き方
1から3のループを逆順にしたいときはREVERSEキーワードを使います。

FOR i IN REVERSE 1..3 LOOP
    DBMS_OUTPUT.PUT_LINE('ループ変数 i = ' || i);
END LOOP;
- 実行結果

ループ変数 i = 3
ループ変数 i = 2
ループ変数 i = 1

## selectをforで回す
次はselectでデータベースから取得した値をfor文で回します。 ポイントは次の三つ - cursorを用いて「変数のように」selectした結果を代入すること - その値をfor句の IN に代入すること - ループの変数は「レコード」として値を取り出すことができること

DECLARE
    CURSOR employee_cur IS
        SELECT id, name FROM employees WHERE name like '悟';
BEGIN
    FOR employee_rec IN employee_cur LOOP
        DBMS_OUTPUT.PUT_LINE( 'idは' || employee_rec.id || 'です');
        DBMS_OUTPUT.PUT_LINE( 'nameは' || employee_rec.name 'です');
    END LOOP;
END;
- 実行結果


idは20です。
nameはtarouです。
...

PL/SQLプロシージャが正常に完了しました。
## サンプルテーブル
- employees
id name salary dept_id
1234 tarou 10,00 20
1235 kaiou 20.000 20
1236 nanashi 30,00 10000
## 備考
title:「sql for」で検索した方へ【SQL基礎】 description:次はselectでデータベースから取得した値をfor文で回します。ポイントは次の三つ。cursorを用いて「変数のように」selectした結果を代入すること。その値をfor句の IN に代入すること。ループの変数は「レコード」として値を取り出すことができること img:https://images.squarespace-cdn.com/content/v1/5c3cf2ac5417fc3efa512c5a/1547588142968-VWQR0WMNFIX7GW18937A/lrg.jpg category_script:page_name.startswith("25")