0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Spring入門】第3章 データベースの準備

0
Last updated at Posted at 2026-09-28

社員管理アプリが使うデータベースを準備します。SQL Developer を使って、アプリ専用のユーザーを作り、部署テーブルと社員テーブルを作成し、サンプルデータを登録します。

この章で学ぶこと

  • SQL Developer でデータベースに接続する方法
  • アプリ専用のユーザー(スキーマ)を作成する方法
  • シーケンスを使った主キーの自動採番
  • サンプルデータの登録と、COMMIT の大切さ

3.1 この章の全体像

第2章でインストールした Oracle Database には、最初から system という管理者用のユーザーが用意されています。しかし、管理者ユーザーでアプリのテーブルを作るのは好ましくありません。何でもできてしまうため、操作を間違えたときの影響が大きいからです。

そこでこの章では、管理者ユーザーで アプリ専用のユーザー を作り、そのユーザーでテーブルを作成します。

ch03-1.png

図3-1 この章の作業の流れ

【知識メモ】ユーザーとスキーマ

Oracle Database では、ユーザーを作ると、そのユーザー専用の「テーブルを置く場所」も同時に作られます。この場所を スキーマ といいます。PDB(XEPDB1)という大きな入れ物の中に、ユーザーごとのスキーマという入れ物があり、テーブルはその中に作られます。empapp ユーザーで作ったテーブルは empapp スキーマに置かれ、ほかのユーザーのテーブルとは区別されます。

Oracle では「ユーザー」と「スキーマ」がほぼ同じ意味で使われる、と覚えておけば十分です。
他のデータベースソフトでは、ユーザーとスキーマが別のものとして扱われるなど、用語が異なりますので意識しておいてください。

この章で使う接続情報をまとめておきます。

項目 管理者用 アプリ用
接続名 XE_SYSTEM XE_EMPAPP
ユーザー名 system empapp
パスワード system(第2章で設定したもの) empapp
ホスト名 localhost
ポート 1521
サービス名 XEPDB1

3.2 system ユーザーで接続する

まず、管理者の system ユーザーでデータベースに接続します。

  1. SQL Developer を起動します(第2章で展開したフォルダーの sqldeveloper.exe をダブルクリック)。
  2. 画面左の「接続」パネルにある緑色の 「+」 ボタン(新規データベース接続)をクリックします。マウスを重ねると「接続の作成...」と表示されます。

sqldev-new-connection.png
図3-2 「接続」パネルの「+」ボタン

  1. 「データベース接続の作成/選択」ダイアログが表示されるので、次のとおり入力します。

    項目 入力する値
    Name(接続名) XE_SYSTEM
    ユーザー名 system
    パスワード system(第2章のインストール時に設定したパスワード)
    パスワードの保存 チェックを入れる
    接続タイプ 基本
    ホスト名 localhost
    ポート 1521
    SID / サービス名 「サービス名」 を選び、XEPDB1 と入力
  2. 「テスト」 ボタンをクリックします。ダイアログ左下に 「ステータス:成功」 と表示されれば、入力内容は正しいです。 サービス名は XEPDB1 と大文字で入力します。「SID」の欄に xe が灰色で残っていても、「サービス名」が選ばれていれば問題ありません。

new-connection-system.png
図3-3 XE_SYSTEM の接続設定(「サービス名」を選び、「テスト」で「ステータス:成功」を確認して「保存」)

  1. 「保存」 ボタンをクリックします。入力した接続の設定が保存され、「接続」パネルに XE_SYSTEM が追加されます。入力した設定を確実に残すため、「接続」の前に必ず「保存」を押してください。
  2. 「接続」 ボタンをクリックします。右側に SQL を入力する ワークシート が開きます。

【ご注意】「SID」ではなく「サービス名」を選ぶ

初期状態では「SID」が選ばれていて、値に xe と入っていることがあります。SID の xe で接続すると、アプリ用ではない別の領域(コンテナ・データベース)につながってしまい、この後の手順がうまくいきません。必ず 「サービス名」 を選び、XEPDB1 と入力してください。

【知識メモ】XEPDB1 とは

Oracle Database 21c XE は、アプリ用のデータベース領域を複数入れられる仕組みになっています。インストール時に自動で作られるアプリ用のデータベース領域が XEPDB1 です。この教材のテーブルはすべて XEPDB1 の中に作ります。

【ご注意】「テスト」でエラーになったら

  • ORA-01017(ユーザー名またはパスワードが無効)… パスワードの入力ミスです。大文字・小文字も区別されます
  • ORA-12514(サービスが見つからない)… サービス名の入力ミスか、「SID」が選ばれたままになっています
  • IO エラー/接続が拒否されました … Oracle Database が起動していない可能性があります。第2章の「Oracle が動いていることを確認する」を見直してください

SQL Developer の設定を変える

SQL Developer の日付の表示と、ワークシートの設定を変えます。設定は、メニューの ツール → プリファレンス で開く「プリファレンス」画面で行います。

SQL Developer は、初期設定では日付を 95-04-12 のように年を2桁で表示します。1995年なのか2095年なのか紛らわしいので、4桁で表示するように変えます。

  1. 左の一覧で データベース → NLS を選びます。
  2. 「日付書式」を YYYY-MM-DD HH24:MI:SS に書き換えます。あわせて「タイムスタンプ書式」を YYYY-MM-DD HH24:MI:SS、「タイムスタンプTZ書式」を YYYY-MM-DD HH24:MI:SSXFF TZR にしておくと、ほかの日時の型も同じ形で表示されます。

pref-nls.png
図3-4 NLS の日付書式・タイムスタンプ書式・タイムスタンプTZ書式

  1. 左の一覧で データベース → ワークシート を選びます。
  2. 次の3か所を設定します。
    • 「切断時にすべてのワークシートを閉じる」に チェックを入れます
    • 「閉じる際にファイルの保存をプロンプト」の チェックを外します
    • 「市松模様またはしま模様のグリッド」に チェックを入れます

pref-stripe.png
図3-5 ワークシートの設定(赤枠の3か所を設定して「OK」)

  1. 「OK」をクリックします。
  2. 日付書式の設定は、接続したときに読み込まれます。すでに接続している場合は、「接続」パネルで接続を右クリックして「切断」し、もう一度接続します。
項目 対象になるデータ型 この教材では
日付書式 DATE(日付と時刻) 生年月日(BIRTH_DATE)の表示に使われる。これを変えれば十分
タイムスタンプ書式 TIMESTAMP(秒以下まで持つ日時) 使わない(そろえておくと便利)
タイムスタンプTZ書式 TIMESTAMP WITH TIME ZONE(タイムゾーン付きの日時) 使わない(そろえておくと便利)

YYYY は4桁の年、MM は月、DD は日、HH24 は24時間表記の時、MI は分、SS は秒を表します。Oracle の DATE 型は時刻も持てるので、時刻まで表示しています。

「切断時にすべてのワークシートを閉じる」と「閉じる際にファイルの保存をプロンプト」は、ワークシートを開いたまま SQL Developer を終了したときの混乱を防ぐための設定です。ワークシートを閉じずに、保存して終了すると、次に起動したときに、どこにも接続されていないワークシートが開いた状態になり、どの接続で SQL を実行すればよいのか迷ってしまいます。切断したときにワークシートが閉じるようにし、閉じるときに保存を確認する画面も出ないようにしておくと、このような状態になりません。

「市松模様またはしま模様のグリッド」を入れると、SELECT の結果(問合せ結果)の表が、1行おきに背景色が変わって表示され、横に長い行でも読み間違えにくくなります。

ワークシートに行番号を表示する設定は、付録C「SQL Developer を使いやすくする設定」にまとめています。

3.3 アプリ専用のユーザーを作成する

system で接続したワークシートに、次の SQL を入力します。

ワークシート(XE_SYSTEM)
-- アプリ専用のユーザー empapp を作成する
CREATE USER empapp IDENTIFIED BY empapp;

-- empapp にすべての権限を与える(学習用)
GRANT ALL PRIVILEGES TO empapp;

SQL を実行する

SQL Developer のワークシートには、SQL を実行する方法が2つあります。

実行方法 操作 動き
文の実行 ツールバーの緑の三角ボタン、または Ctrl + Enter カーソルがある位置の 1つの SQL だけ を実行する。SELECT の結果は表の形で表示される
スクリプトの実行 ツールバーの「紙と緑の三角」のボタン、または F5 ワークシートに書いた すべての SQL を上から順に 実行する。結果は文字で表示される

worksheet-create-user.png
図3-6 SQL を入力したワークシート(赤枠が「スクリプトの実行」ボタン。その左の緑の三角が「文の実行」ボタン)

ここでは2つの SQL をまとめて実行したいので、F5(スクリプトの実行)を押します。ワークシートのタブと右上に XE_SYSTEM と表示されていることも確認しておきましょう(どの接続で SQL を実行するかを表しています)。

画面下の 「スクリプト出力」 タブに、図3-7 のように「User EMPAPPは作成されました。」と「Grantが正常に実行されました。」が表示されれば成功です。

create-user-result.png
図3-7 ユーザー作成の SQL を実行したあと(下の「スクリプト出力」に結果が表示される)

【知識メモ】メッセージの表記について

SQL Developer のバージョンによって、メッセージの表記が少し異なることがあります(英語で「User EMPAPP created.」と表示される場合もあります)。エラー(ORA- で始まるメッセージ)が出ていなければ問題ありません。

【ご注意】「ORA-65096: 共通ユーザーまたはロール名が無効です」と表示されたら

アプリ用のデータベース(XEPDB1)ではなく、全体を管理するコンテナ・データベース(XE)に接続しています。コンテナ・データベースでは、C## で始まる名前のユーザーしか作れないため、このエラーになります。

wrong-sid.png
図3-8 間違った設定の例(「SID」に xe が指定されている)

「接続」パネルで XE_SYSTEM を右クリック → プロパティ を開き、「サービス名」 が選ばれていて値が XEPDB1 になっているか確認してください(「SID」の xe になっていたら直します)。「テスト」で成功したら「保存」して接続し直し、もう一度 SQL を実行します。

どちらに接続しているかは、ワークシートで次の SQL を実行すると確かめられます。XEPDB1 と表示されれば正しい接続です。

ワークシート(XE_SYSTEM)
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

SQL の意味

記述 意味
CREATE USER empapp empapp という名前のユーザーを作る
IDENTIFIED BY empapp パスワードを empapp にする
GRANT ALL PRIVILEGES TO empapp empapp に、データベースのすべての権限をまとめて与える

【ご注意】権限の与え方について

この教材は入門編のため、権限でつまずかないように、empapp に すべての権限をまとめて 与えています。

すべての権限を持つユーザーは、他のユーザーのデータを読んだり消したりすることもできてしまいます。実際のシステム開発の現場では、セキュリティのリスクを考慮して、必要な権限だけを与える のが原則です。現場で権限を付与するときは、どの権限が必要かを必ず確認してから行ってください。

【ご注意】パスワードについて

この教材では覚えやすさを優先して、ユーザー名とパスワードを同じ empapp にしています。実際のシステムでは、推測されにくいパスワードを設定してください。

3.4 empapp ユーザーで接続する

作成した empapp ユーザーで接続し直します。ここからの作業は、すべて empapp で行います。

  1. 「接続」パネルの緑色の 「+」 ボタンをクリックします。

  2. 次のとおり入力します。

    項目 入力する値
    Name(接続名) XE_EMPAPP
    ユーザー名 empapp
    パスワード empapp
    パスワードの保存 チェックを入れる
    接続タイプ 基本
    ホスト名 localhost
    ポート 1521
    SID / サービス名 「サービス名」を選び、XEPDB1

new-connection-empapp.png
図3-9 XE_EMPAPP の接続設定(赤枠の項目を入力・選択し、「テスト」で「ステータス:成功」を確認して「保存」)
3. 「テスト」 で「ステータス:成功」になることを確認し、「保存」 をクリックしてから、「接続」 をクリックします。
4. XE_EMPAPP のワークシートが新しいタブで開きます。ワークシートのタブに XE_EMPAPP と表示されていることを確認してください。

worksheet-empapp.png
図3-10 XE_EMPAPP のワークシート(タブと右上に XE_EMPAPP と表示される)

【再確認】どのユーザーのワークシートかを必ず確認する

ワークシートは接続ごとに開きます。XE_SYSTEM のワークシートでテーブルを作ってしまうと、テーブルが system のスキーマにできてしまい、アプリから見つけられません。SQL を実行する前に、タブの名前が XE_EMPAPP になっていることを確認する習慣をつけましょう。

XE_SYSTEM のワークシートは、もう使わないので閉じておきましょう。

3.5 テーブルを作成する

第1章で紹介した、部署テーブル(DEPARTMENT)と社員テーブル(EMPLOYEE)を作成します。あわせて、部署IDと社員IDの番号を振るための シーケンス(SEQ_DEPT・SEQ_EMP)も作ります。社員テーブルは部署テーブルを参照するので、部署テーブルを先に 作ります。

XE_EMPAPP のワークシートに次の SQL を入力し、F5(スクリプトの実行)を押します。

ワークシート(XE_EMPAPP)
-- 部署IDの番号を振るシーケンス
CREATE SEQUENCE SEQ_DEPT NOCACHE;

-- 社員IDの番号を振るシーケンス
CREATE SEQUENCE SEQ_EMP NOCACHE;

-- 部署テーブル
CREATE TABLE DEPARTMENT (
  DEPT_ID    NUMBER(4)  CONSTRAINT PK_DEPARTMENT PRIMARY KEY,
  DEPT_NAME  VARCHAR2(20 CHAR)  NOT NULL
);

-- 社員テーブル
CREATE TABLE EMPLOYEE (
  EMP_ID      NUMBER(6)  CONSTRAINT PK_EMPLOYEE PRIMARY KEY,
  NAME        VARCHAR2(20 CHAR)  NOT NULL,
  GENDER      NUMBER(1)  NOT NULL,
  AGE         NUMBER(3)  NOT NULL,
  BIRTH_DATE  DATE       NOT NULL,
  DEPT_ID     NUMBER(4)  NOT NULL
    CONSTRAINT FK_EMPLOYEE_DEPARTMENT REFERENCES DEPARTMENT (DEPT_ID),
  ADDRESS     VARCHAR2(10 CHAR)  NOT NULL
);

「スクリプト出力」に、図3-11 のように、シーケンス2つ(SEQ_DEPT・SEQ_EMP)とテーブル2つ(DEPARTMENT・EMPLOYEE)が作成されたというメッセージが表示されれば成功です。

create-table-result.png

図3-11 シーケンスとテーブルを作成する SQL を実行したあと

作成したテーブルの確認

  1. 「接続」パネルで XE_EMPAPP の左の「+」(または「▶」)をクリックして展開します。
  2. 「表」 を展開すると、DEPARTMENT と EMPLOYEE が表示されます。表示されない場合は、「表」を右クリックして リフレッシュ を選んでください。

tables-tree.png
図3-12 「表」の下に DEPARTMENT と EMPLOYEE が表示される

  1. EMPLOYEE をダブルクリックすると、右側に列の一覧が表示されます。列名やデータ型が SQL のとおりになっているか確認しましょう。

employee-columns.png
図3-13 EMPLOYEE の列の一覧
4. 同じように 「順序」 を展開すると、作成したシーケンス SEQ_DEPT と SEQ_EMP が表示されます。SQL Developer では、シーケンスは「順序」という名前で表示されます。

sequences-tree.png
図3-14 「順序」の下に SEQ_DEPT と SEQ_EMP が表示される

テーブルの列

部署テーブル(DEPARTMENT)

項目 列名 データ型 説明
部署ID DEPT_ID NUMBER(4) 主キー。シーケンスで 1 から順に番号を振る
部署名 DEPT_NAME VARCHAR2(20 CHAR) 例:総務部

社員テーブル(EMPLOYEE)

項目 列名 データ型 説明
社員ID EMP_ID NUMBER(6) 主キー。シーケンスで 1 から順に番号を振る
氏名 NAME VARCHAR2(20 CHAR) 例:雷禅 海皇
性別 GENDER NUMBER(1) 1:男、2:女
年齢 AGE NUMBER(3) 例:30
生年月日 BIRTH_DATE DATE 例:2000/06/22
部署ID DEPT_ID NUMBER(4) 部署テーブルの部署ID(外部キー)
住所 ADDRESS VARCHAR2(10 CHAR) 都道府県。例:東京都

SQL の解説

自動採番(シーケンス)

シーケンス は、1、2、3…と重ならない番号を順に払い出してくれるデータベースの部品です。CREATE SEQUENCE SEQ_EMP NOCACHE; は、「社員IDに使う番号を払い出すシーケンス SEQ_EMP を作る」という指定です。

  • 番号は 1 から 1 ずつ増える:開始の番号と増やす幅は、何も書かなければ 1 になります
  • NOCACHE を必ず付ける:付けないと、Oracle は番号を前もって20個まとめて用意しておき、データベースを再起動したときなどに、用意したまま使わなかった番号を捨てます。そのため、社員IDが 1, 2, 21 のように大きく飛ぶことがあります。NOCACHE を付けると、番号をまとめて用意しないので、このような飛び方をしなくなります
  • 次の番号は シーケンス名.NEXTVAL で取り出す:3.6 の INSERT では、SEQ_EMP.NEXTVAL と書いて社員IDに次の番号を入れます

社員を新規登録すると社員IDが自動で決まる、という動きは、このシーケンスで実現します。第11章でアプリから登録するときも、社員IDはアプリ側では決めず、JPA がシーケンスから次の番号を取り出します(第6章)。

データ型

データ型 意味
NUMBER(n) 最大 n 桁の整数。NUMBER(3) なら -999〜999
VARCHAR2(n CHAR) 最大 n 文字 の文字列。CHAR を付けると、日本語でも英数字でも1文字を1と数える
DATE 日付(Oracle の DATE は時刻も持てるが、この教材では日付だけを使う)

【知識メモ】CHAR を付ける理由

VARCHAR2(20) のように CHAR を付けないと、長さは バイト数 で数えられます。日本語は1文字が3バイトになることが多いので、VARCHAR2(20) には漢字が6文字ほどしか入りません。VARCHAR2(20 CHAR) と書けば、日本語でも20文字まで入ります。

制約

記述 意味
NOT NULL 値を必ず入れなければならない(空は許さない)
PRIMARY KEY(主キー) その行を特定するための列。同じ値は入れられず、空も許さない
REFERENCES(外部キー) 社員テーブルの DEPT_ID には、部署テーブルに存在する DEPT_ID しか入れられない

制約は、列の定義の後ろに書く「列制約」と、列の定義とは別にまとめて書く「表制約」のどちらでも書けます。今回は記述のわかりやすさを重視し、すべて列制約で書きました。

3.6 サンプルデータを登録する

部署を3件、社員を3件登録します。社員は部署を参照するので、ここでも 部署を先に 登録します。

ワークシートの内容をすべて消してから、次の SQL を入力し、F5(スクリプトの実行)を押します。

ワークシート(XE_EMPAPP)
-- 部署(DEPT_ID は SEQ_DEPT から 1, 2, 3 と振られる)
INSERT INTO DEPARTMENT (DEPT_ID, DEPT_NAME) VALUES (SEQ_DEPT.NEXTVAL, '総務部');
INSERT INTO DEPARTMENT (DEPT_ID, DEPT_NAME) VALUES (SEQ_DEPT.NEXTVAL, '営業部');
INSERT INTO DEPARTMENT (DEPT_ID, DEPT_NAME) VALUES (SEQ_DEPT.NEXTVAL, '開発部');

-- 社員(EMP_ID は SEQ_EMP から 1, 2, 3 と振られる)
INSERT INTO EMPLOYEE (EMP_ID, NAME, GENDER, AGE, BIRTH_DATE, DEPT_ID, ADDRESS)
  VALUES (SEQ_EMP.NEXTVAL, '雷禅 海皇', 1, 26, DATE '2000-06-22', 2, '大阪府');
INSERT INTO EMPLOYEE (EMP_ID, NAME, GENDER, AGE, BIRTH_DATE, DEPT_ID, ADDRESS)
  VALUES (SEQ_EMP.NEXTVAL, '院照 心愛', 2, 27, DATE '1999-07-11', 1, '京都府');
INSERT INTO EMPLOYEE (EMP_ID, NAME, GENDER, AGE, BIRTH_DATE, DEPT_ID, ADDRESS)
  VALUES (SEQ_EMP.NEXTVAL, '林檎 星飛', 1, 24, DATE '2001-12-24', 3, '東京都');

-- 登録を確定する
COMMIT;

「スクリプト出力」に「1行挿入しました。」が6回、最後に「コミットが完了しました。」と表示されれば成功です。

insert-result.png

図3-15 データ登録の SQL を実行したあと(最後に「コミットが完了しました。」)

INSERT 文のポイント

  • 列名を明示する:INSERT INTO EMPLOYEE (EMP_ID, NAME, GENDER, ...) のように、値を入れる列の名前を書きます
  • 主キーには シーケンス名.NEXTVAL を書く:EMP_ID には SEQ_EMP.NEXTVAL、部署テーブルの DEPT_ID には SEQ_DEPT.NEXTVAL を書き、番号をシーケンスに任せます
  • 日付は DATE '年-月-日' で書く:DATE '2000-06-22' は、「2000年6月22日」という日付を表す書き方です。環境の設定に左右されず、確実に日付として扱われます
  • 社員の DEPT_ID には部署の ID を書く:雷禅さんは営業部なので、営業部の部署ID 2 を指定しています

【再確認】COMMIT を忘れない

INSERT・UPDATE・DELETE でデータを変更しても、COMMIT するまでは変更が 確定していません。確定前の変更は、変更した本人の接続からしか見えず、ほかの接続(たとえば、この後で作る Spring Boot のアプリ)からは見えません。

「SQL Developer ではデータが見えるのに、アプリでは表示されない」というトラブルの多くは、COMMIT のし忘れが原因です。SQL Developer で手作業でデータを変更したら、必ず COMMIT しましょう。

【知識メモ】アプリからの登録では

第9章以降でアプリから登録・変更・削除を行うときは、Spring が自動で COMMIT してくれます。COMMIT を自分で書く必要があるのは、SQL Developer などで直接データを操作するときです。

ボタンでコミット・ロールバックする

SQL Developer では、COMMIT; と入力しなくても、ツールバーのボタンで変更を確定(コミット)できます。確定する前なら、変更を取り消す(ロールバック)こともできます。練習として、社員の年齢を変えてみましょう。

  1. XE_EMPAPP のワークシートに次の SQL を入力し、その行にカーソルを置いて Ctrl + Enter で実行します。 「スクリプト出力」に「1行更新しました。」と表示されます。ただし、この時点ではまだ 確定していません。

    ワークシート(XE_EMPAPP)
    UPDATE EMPLOYEE SET AGE = 100 WHERE EMP_ID = 1;
    

commit-button.png

図3-16 UPDATE を実行したあと(赤枠の左が「コミット」、右が「ロールバック」のボタン)
2. 変更を確定するときは、次のどちらかを行います。

  • ワークシートで COMMIT; を実行する
  • ツールバーの「コミット」ボタン(赤枠の左。マウスを重ねると「コミット (F11)」と表示される)をクリックする、または F11 を押す
  1. 確定する前に変更を取り消すときは、次のどちらかを行います。
    • ワークシートで ROLLBACK; を実行する
    • 「コミット」ボタンの右隣の「ロールバック」ボタン(赤枠の右)をクリックする、または F12 を押す

【ご注意】この練習は、最後にロールバックしておく

この後の章は、雷禅さんの年齢が 26 のデータで進みます。練習で UPDATE したら、コミットせずにロールバック して元に戻しておきましょう。SELECT * FROM EMPLOYEE; で、雷禅さんの AGE が 26 に戻っていることを確認できます。うっかりコミットしてしまった場合は、UPDATE EMPLOYEE SET AGE = 26 WHERE EMP_ID = 1; を実行してからコミットすれば元に戻せます。

コミットすると、ロールバックでは元に戻せません。「確定してよいか」をよく確かめてからコミットする習慣をつけましょう。

3.7 登録したデータを確認する

SELECT 文で、データが正しく登録されたか確認します。確認のための SELECT は、結果を表の形で見やすく表示できる 「文の実行」(Ctrl + Enter)で実行します。

部署テーブルの確認

次の SQL の行にカーソルを置いて、Ctrl + Enter を押します。

ワークシート(XE_EMPAPP)
SELECT * FROM DEPARTMENT ORDER BY DEPT_ID;

画面下の 「問合せ結果」 タブに、次のように表示されます。

select-department.png

図3-17 Ctrl + Enter で実行すると、「問合せ結果」タブに表で表示される

DEPT_ID DEPT_NAME
1 総務部
2 営業部
3 開発部

社員テーブルの確認(部署名と結合)

社員テーブルには部署IDしか入っていないので、部署テーブルと 結合 して部署名も表示してみましょう。複数行にわたる SQL は、SQL のどこかにカーソルを置いて Ctrl + Enter を押せば、その SQL 全体が実行されます。

ワークシート(XE_EMPAPP)
SELECT e.EMP_ID, e.NAME, e.GENDER, e.AGE, e.BIRTH_DATE,
       d.DEPT_NAME, e.ADDRESS
  FROM EMPLOYEE e
  INNER JOIN DEPARTMENT d ON e.DEPT_ID = d.DEPT_ID
 ORDER BY e.EMP_ID;
EMP_ID NAME GENDER AGE BIRTH_DATE DEPT_NAME ADDRESS
1 雷禅 海皇 1 26 2000-06-22 00:00:00 営業部 大阪府
2 院照 心愛 2 27 1999-07-11 00:00:00 総務部 京都府
3 林檎 星飛 1 24 2001-12-24 00:00:00 開発部 東京都

select-join.png

図3-18 結合した SELECT の結果(部署名が表示されている)

【知識メモ】日付の表示形式について

上の結果は、3.2「SQL Developer の設定を変える」で日付書式を変えた場合の表示です。設定を変えていない場合は、BIRTH_DATE が 95-04-12 のように年が2桁で表示されます。どちらの場合も、データベースには正しく 2000年6月22日 として保存されています。

この SELECT 文と同じことを、第8章ではアプリの中で行い、社員一覧画面に部署名を表示します。

【便利な使い方】参考:クエリー・ビルダー

ワークシートの「クエリー・ビルダー」タブを開くと、テーブルを図で並べて、表示したい列にチェックを付けるだけで SELECT 文を組み立てることもできます。ワークシートに書いた SELECT 文を開くと、下のように結合の関係が線で表示されます。SQL を書くのに慣れるまでは、結合の関係を目で確かめるのに便利です。

query-builder.png
図3-19 クエリー・ビルダー(EMPLOYEE と DEPARTMENT が DEPT_ID で結ばれている)

3.8 やり直したいとき

テーブルの定義を間違えた、データを登録し直したい、というときは、テーブルを削除して作り直すのが確実です。

ワークシート(XE_EMPAPP)
-- 社員テーブルを先に削除する(部署テーブルを参照しているため)
DROP TABLE EMPLOYEE;
DROP TABLE DEPARTMENT;

-- シーケンスも削除する
DROP SEQUENCE SEQ_EMP;
DROP SEQUENCE SEQ_DEPT;

削除したら、3.5 のシーケンスとテーブルの作成と、3.6 のデータ登録をもう一度行います。シーケンスを作り直すので、番号も 1 から振り直されます。

【ご注意】削除する順番に注意

社員テーブルは外部キーで部署テーブルを参照しています。部署テーブルを先に削除しようとすると、「ORA-02449:外部キーによって参照される一意/主キーが表にあります」というエラーになります。参照している側(社員)から先に 削除してください。

【ご注意】番号が飛んでしまったときも作り直す

INSERT の途中でエラーが起きると、シーケンスの番号が消費されて、社員IDが 1, 2, 4 のように飛ぶことがあります。一度払い出された番号は再利用されません。この教材の説明と同じ ID にしておきたい場合は、シーケンスとテーブルを作り直してください。

3.9 SQL をファイルに保存する

この章で書いた SQL は、ファイルに保存しておくと、やり直すときにすぐ使えて便利です。

  1. エクスプローラーで、SQL を保存するフォルダーを作ります。例:ドキュメント\spring-sql
  2. メモ帳などのテキストエディタを開きます。
  3. 3.5 のシーケンスとテーブル作成の SQL と、3.6 のデータ登録の SQL を、それぞれコードの右上の「コピー」ボタンでコピーして、メモ帳に続けて貼り付けます。
  4. メモ帳などお使いのテキストエディタで、メニューの ファイル → 名前を付けて保存 を選びます。
  5. 保存先に作成したフォルダーを選び、ファイル名を setup.sql として保存します。保存したら、エクスプローラーでファイル名が setup.sql になっていることを確認します(拡張子の表示は 第2章 2.1)。

やり直すときは、保存したファイルをメモ帳で開き、すべてコピーして XE_EMPAPP のワークシートに貼り付けてから、F5(スクリプトの実行)を押します。ワークシートのタブに XE_EMPAPP と表示されていることを確認してから実行してください。

3.10 まとめと確認問題

まとめ

  • SQL Developer では、接続を作ってからワークシートで SQL を実行する。接続先のサービス名は XEPDB1
  • 管理者ユーザー(system)で、アプリ専用のユーザー empapp を作成し、権限を与えた
  • Oracle では、ユーザーを作るとそのユーザーの スキーマ ができる
  • CREATE SEQUENCE … NOCACHE で、1 から順に番号を払い出すシーケンスを作れる。INSERT では ID に シーケンス名.NEXTVAL を書く
  • データを変更したら COMMIT しないと確定せず、アプリからは見えない
  • テーブルを作り直すときは、外部キーで参照している側(社員)から削除する

確認問題

問1 SQL Developer で接続を作るとき、「SID」ではなく「サービス名」を選んで何と入力しましたか。

解答を見る

XEPDB1 です。Oracle Database 21c XE に最初から用意されている、アプリ用のデータベースの名前です。

問2 「スクリプトの実行」(F5)と「文の実行」(Ctrl + Enter)の違いを説明してください。

解答を見る

スクリプトの実行は、ワークシートのすべての SQL を上から順に実行し、結果を文字で表示します。文の実行は、カーソルがある位置の1つの SQL だけを実行し、SELECT の結果を表の形で表示します。

問3 社員テーブルにデータを INSERT するとき、EMP_ID に SEQ_EMP.NEXTVAL と書くのはなぜですか。

解答を見る

シーケンス SEQ_EMP から次の番号を取り出して、社員IDにするためです。番号はシーケンスが 1 から順に払い出すので、自分で番号を考える必要がなく、ほかの社員と重なることもありません。

問4 SQL Developer で社員を登録したのに、アプリの画面には表示されませんでした。まず何を疑うべきですか。

解答を見る

COMMIT のし忘れ です。COMMIT するまで変更は確定せず、ほかの接続(アプリ)からは見えません。

問5 テーブルを作り直すため、DROP TABLE DEPARTMENT; を先に実行したらエラーになりました。なぜですか。

解答を見る

社員テーブルが外部キーで部署テーブルを参照しているためです。参照している側の社員テーブル(EMPLOYEE)を先に削除してから、部署テーブルを削除します。


前へ

第2章 開発環境の構築

次へ

第4章 最初の Spring Boot アプリ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?