社員管理アプリが使うデータベースを準備します。SQL Developer を使って、アプリ専用のユーザーを作り、部署テーブルと社員テーブルを作成し、サンプルデータを登録します。
この章で学ぶこと
- SQL Developer でデータベースに接続する方法
- アプリ専用のユーザー(スキーマ)を作成する方法
- シーケンスを使った主キーの自動採番
- サンプルデータの登録と、COMMIT の大切さ
3.1 この章の全体像
第2章でインストールした Oracle Database には、最初から system という管理者用のユーザーが用意されています。しかし、管理者ユーザーでアプリのテーブルを作るのは好ましくありません。何でもできてしまうため、操作を間違えたときの影響が大きいからです。
そこでこの章では、管理者ユーザーで アプリ専用のユーザー を作り、そのユーザーでテーブルを作成します。
図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 ユーザーでデータベースに接続します。
- SQL Developer を起動します(第2章で展開したフォルダーの
sqldeveloper.exeをダブルクリック)。 - 画面左の「接続」パネルにある緑色の 「+」 ボタン(新規データベース接続)をクリックします。マウスを重ねると「接続の作成...」と表示されます。
-
「データベース接続の作成/選択」ダイアログが表示されるので、次のとおり入力します。
項目 入力する値 Name(接続名) XE_SYSTEMユーザー名 systemパスワード system(第2章のインストール時に設定したパスワード)パスワードの保存 チェックを入れる 接続タイプ 基本 ホスト名 localhostポート 1521SID / サービス名 「サービス名」 を選び、 XEPDB1と入力 -
「テスト」 ボタンをクリックします。ダイアログ左下に 「ステータス:成功」 と表示されれば、入力内容は正しいです。 サービス名は
XEPDB1と大文字で入力します。「SID」の欄にxeが灰色で残っていても、「サービス名」が選ばれていれば問題ありません。

図3-3 XE_SYSTEM の接続設定(「サービス名」を選び、「テスト」で「ステータス:成功」を確認して「保存」)
- 「保存」 ボタンをクリックします。入力した接続の設定が保存され、「接続」パネルに XE_SYSTEM が追加されます。入力した設定を確実に残すため、「接続」の前に必ず「保存」を押してください。
- 「接続」 ボタンをクリックします。右側に 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桁で表示するように変えます。
- 左の一覧で データベース → NLS を選びます。
- 「日付書式」を
YYYY-MM-DD HH24:MI:SSに書き換えます。あわせて「タイムスタンプ書式」をYYYY-MM-DD HH24:MI:SS、「タイムスタンプTZ書式」をYYYY-MM-DD HH24:MI:SSXFF TZRにしておくと、ほかの日時の型も同じ形で表示されます。

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

図3-5 ワークシートの設定(赤枠の3か所を設定して「OK」)
- 「OK」をクリックします。
- 日付書式の設定は、接続したときに読み込まれます。すでに接続している場合は、「接続」パネルで接続を右クリックして「切断」し、もう一度接続します。
| 項目 | 対象になるデータ型 | この教材では |
|---|---|---|
| 日付書式 |
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 を入力します。
-- アプリ専用のユーザー 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 を上から順に 実行する。結果は文字で表示される |

図3-6 SQL を入力したワークシート(赤枠が「スクリプトの実行」ボタン。その左の緑の三角が「文の実行」ボタン)
ここでは2つの SQL をまとめて実行したいので、F5(スクリプトの実行)を押します。ワークシートのタブと右上に XE_SYSTEM と表示されていることも確認しておきましょう(どの接続で SQL を実行するかを表しています)。
画面下の 「スクリプト出力」 タブに、図3-7 のように「User EMPAPPは作成されました。」と「Grantが正常に実行されました。」が表示されれば成功です。

図3-7 ユーザー作成の SQL を実行したあと(下の「スクリプト出力」に結果が表示される)
【知識メモ】メッセージの表記について
SQL Developer のバージョンによって、メッセージの表記が少し異なることがあります(英語で「User EMPAPP created.」と表示される場合もあります)。エラー(ORA- で始まるメッセージ)が出ていなければ問題ありません。
【ご注意】「ORA-65096: 共通ユーザーまたはロール名が無効です」と表示されたら
アプリ用のデータベース(XEPDB1)ではなく、全体を管理するコンテナ・データベース(XE)に接続しています。コンテナ・データベースでは、C## で始まる名前のユーザーしか作れないため、このエラーになります。

図3-8 間違った設定の例(「SID」に xe が指定されている)
「接続」パネルで XE_SYSTEM を右クリック → プロパティ を開き、「サービス名」 が選ばれていて値が XEPDB1 になっているか確認してください(「SID」の xe になっていたら直します)。「テスト」で成功したら「保存」して接続し直し、もう一度 SQL を実行します。
どちらに接続しているかは、ワークシートで次の SQL を実行すると確かめられます。XEPDB1 と表示されれば正しい接続です。
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 で行います。
-
「接続」パネルの緑色の 「+」 ボタンをクリックします。
-
次のとおり入力します。
項目 入力する値 Name(接続名) XE_EMPAPPユーザー名 empappパスワード empappパスワードの保存 チェックを入れる 接続タイプ 基本 ホスト名 localhostポート 1521SID / サービス名 「サービス名」を選び、 XEPDB1

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

図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(スクリプトの実行)を押します。
-- 部署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)が作成されたというメッセージが表示されれば成功です。
図3-11 シーケンスとテーブルを作成する SQL を実行したあと
作成したテーブルの確認
- 「接続」パネルで XE_EMPAPP の左の「+」(または「▶」)をクリックして展開します。
-
「表」 を展開すると、
DEPARTMENTとEMPLOYEEが表示されます。表示されない場合は、「表」を右クリックして リフレッシュ を選んでください。

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

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

図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(スクリプトの実行)を押します。
-- 部署(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回、最後に「コミットが完了しました。」と表示されれば成功です。
図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; と入力しなくても、ツールバーのボタンで変更を確定(コミット)できます。確定する前なら、変更を取り消す(ロールバック)こともできます。練習として、社員の年齢を変えてみましょう。
-
XE_EMPAPP のワークシートに次の SQL を入力し、その行にカーソルを置いて Ctrl + Enter で実行します。 「スクリプト出力」に「1行更新しました。」と表示されます。ただし、この時点ではまだ 確定していません。
ワークシート(XE_EMPAPP)UPDATE EMPLOYEE SET AGE = 100 WHERE EMP_ID = 1;
図3-16 UPDATE を実行したあと(赤枠の左が「コミット」、右が「ロールバック」のボタン)
2. 変更を確定するときは、次のどちらかを行います。
- ワークシートで
COMMIT;を実行する - ツールバーの「コミット」ボタン(赤枠の左。マウスを重ねると「コミット (F11)」と表示される)をクリックする、または F11 を押す
- 確定する前に変更を取り消すときは、次のどちらかを行います。
- ワークシートで
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 を押します。
SELECT * FROM DEPARTMENT ORDER BY DEPT_ID;
画面下の 「問合せ結果」 タブに、次のように表示されます。
図3-17 Ctrl + Enter で実行すると、「問合せ結果」タブに表で表示される
| DEPT_ID | DEPT_NAME |
|---|---|
| 1 | 総務部 |
| 2 | 営業部 |
| 3 | 開発部 |
社員テーブルの確認(部署名と結合)
社員テーブルには部署IDしか入っていないので、部署テーブルと 結合 して部署名も表示してみましょう。複数行にわたる SQL は、SQL のどこかにカーソルを置いて Ctrl + Enter を押せば、その SQL 全体が実行されます。
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 | 開発部 | 東京都 |
図3-18 結合した SELECT の結果(部署名が表示されている)
【知識メモ】日付の表示形式について
上の結果は、3.2「SQL Developer の設定を変える」で日付書式を変えた場合の表示です。設定を変えていない場合は、BIRTH_DATE が 95-04-12 のように年が2桁で表示されます。どちらの場合も、データベースには正しく 2000年6月22日 として保存されています。
この SELECT 文と同じことを、第8章ではアプリの中で行い、社員一覧画面に部署名を表示します。
3.8 やり直したいとき
テーブルの定義を間違えた、データを登録し直したい、というときは、テーブルを削除して作り直すのが確実です。
-- 社員テーブルを先に削除する(部署テーブルを参照しているため)
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 は、ファイルに保存しておくと、やり直すときにすぐ使えて便利です。
- エクスプローラーで、SQL を保存するフォルダーを作ります。例:
ドキュメント\spring-sql - メモ帳などのテキストエディタを開きます。
- 3.5 のシーケンスとテーブル作成の SQL と、3.6 のデータ登録の SQL を、それぞれコードの右上の「コピー」ボタンでコピーして、メモ帳に続けて貼り付けます。
- メモ帳などお使いのテキストエディタで、メニューの ファイル → 名前を付けて保存 を選びます。
- 保存先に作成したフォルダーを選び、ファイル名を
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)を先に削除してから、部署テーブルを削除します。







