Oracle SQL入門

入門
David Lockman……著
MbCD……訳
宮原 徹……監訳
商標
Oracle は、米国カリフォルニア州レッドウッド市のオラクル・コーポレーションの登録商標です。
Oracle9i は、米国カリフォルニア州レッドウッド市のオラクル・コーポレーションの登録商標です。
その他、本書で登場するシステム名、製品名は一般に各開発メーカーの登録商標です。なお本書では、TM、¤ マー
クは明記しておりません。
装丁:谷原 正則
Authorized translation from the English language edition published by Sams.
Copyright ' 1995
All right reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission in writing from the Publisher.
Japanese language edition published by ASCII Corporation.
Copyright ' 2003
本書は、株式会社アスキーが、Sams との契約に基づき翻訳したものです。日本語版に関する権利・責任は、株式
会社アスキーが保有します。
はじめに
Oracle は、世界で最も使われているデータベース管理システムです。その人気には、いくつか
の理由があります。
●
Oracle は、さまざまな種類のコンピュータシステムで利用できます。
●
製品が新しくリリースされるたびに強力な機能が追加されています。
●
組織が維持管理しなければならないデータの量は指数的に増えていきますが、これを管理で
きる便利で信頼性の高いシステムが必要とされています。
本書の内容
本書では、Oracle という Oracle リレーショナルデータベース管理システム(RDBMS)について
解説します。Oracle は、Windows 版の Oracle から、大規模コンピュータシステム向けの Oracle
Server までほとんど同等の機能と操作が可能です。
本書の内容はほとんど、そのまますべてのプラットフォーム上の Oracle に通用します。個々も
プラットフォームでの違いは該当部分で解説をします。
対象読者
本書では、リレーショナルであるか否かにかかわらず、データベースの利用経験もある程度持っ
ている読者を想定しています。
以下のような読者は、本書から得るところが多いでしょう。
●
Oracle の使用経験はないが、Access などの PC データベースには慣れ親しんでいる開発者。
●
リレーショナルデータベース、および構造化問い合わせ言語(SQL)について学びたい学生。
●
リレーショナルデータベースに関する最新の技術動向を把握しておきたい情報システムの専
門家。
本書の表記規則
本書では、以下の規則に従って表記を行います。
●
プログラムのコード、文、関数、演算子、および特殊なコンピュータ用語は、以下のような
字体を使用して示します。
normal computer font
●
コンピュータに対する入力と、コンピュータからの出力を同じところで示す場合、入力すべ
き文字を以下の字体を使用して示します。
bold computer font
●
構文の説明や実例において、ユーザーが特定の値を指定しなければならない箇所では、以下
の字体を使用します。示されている文字列の代わりにファイル名、パラメータ、あるいは何
らかの適切な値を指定してください。オペレーティングシステムによっては、ファイルシス
テムの差違により、具体的なディレクトリ名やファイル名などを読み替える必要があります。
なお、本書の記述は Windows でのファイルシステムを前提とした表記にあわせてあります。
italic computer font
●
文中に現われる技術的な用語や重要な概念などは、以下の字体を使用して示します。
重要な用語
監訳者まえがき
仕事柄、さまざまな方から Oracle にまつわる質問や相談を受けますが、それらの質問の中で一
番答えるのに困ってしまうのが「今まで Oracle を使ったことことがないのだが、どうやって勉強
すればよいのか?」、あるいは「Oracle を勉強したいのだが、いい本はないだろうか?」といっ
た質問です。
このような質問が出てくる背景には、一頃騒がれていたいわゆる「ダウンサイジング」や「オー
プンシステム」といったものが、一握りの先進的な企業のみがシステムに取り入れるものではな
くなり、システム開発のごく当たり前の考え方となってきた証拠といえるのではないでしょうか。
これはとくに PC サーバーといったハードウェアの進歩と、LAN の普及率の向上からも見ること
ができます。つまり、Oracle のようなリレーショナルデータベース管理システムを利用したクラ
イアントサーバー型のシステムが、従来の OA 目的で使われていたワープロや表計算と同じレベ
ルになりはじめたといえます。
しかし、ワープロや表計算といった一般ユーザー向けのパソコンソフトの使い方を覚えるには、
書店のコンピュータ関連書籍のコーナーに行くと、どれを買えばいいのか迷ってしまうくらいの
入門書が、それこそ山積みになって並んでいます。翻って、Oracle をはじめとするクライアント
サーバーシステムやリレーショナルデータベースシステムに関する書籍は、書店の棚にはなかな
か見当たりません。あるとしても学術的な解説書であったり、Oracle Power Objects のようなク
ライアントアプリケーション開発ツールの解説本で、SQL やリレーショナルデータベース関連の
入門書は皆無といってもいいくらいです。
Oracle ならば、日本オラクルより日本語の製品マニュアルが提供されていますが、一般の書籍
に比べて高価ですし、ボリュームが多いので読むのが大変、内容的にもかなり高度なため、初心
者が読みこなすのは非常に難しいものです(もちろん、実際に Oracle を利用する場合には情報が
豊富であり、こんなに心強い味方はありません。多少高価でも 1 セット揃えておくだけの価値は
十二分にあります。開発中や稼動後に泣かないためにも、マニュアル購入分、それと技術サポー
トやメンテナンス契約を結ぶための費用まできちんとシステム予算に入れておくことを、強く強
くお薦めしておきます)
。
書籍以外の学習方法としては、研修コースを受講するといった方法がありますが、これは費用
や時間が許す場合のみ取れる方法で、試験的に導入したいといった場合には困難です。
そんなときに、本書の翻訳のお話がありました。原書を最初にぱらぱらとめくったときには、な
んと地味な本なのだろうと思いました。しかし、内容を順に見ていくと SQL から PL/SQL、Oracle
の仕組みと、Oracle を使ってシステムを構築するための基礎知識がきちんと網羅されています。
私自身、久方振りに基礎を復習できてしまったぐらいです。また内容的にも深く解説がなされて
います。とくにデータベースシステム設計の基本ともいえるデータ型については、オラクル純正
のマニュアルよりも具体的、かつ詳細であると思われるぐらいです。
ある程度、章ごとに内容がまとまっているので、とりあえず一通り読み通してもいいですし、
興味のある章から読んでもよいでしょう。
ただ、ぜひ次のことを念頭においてお読みください。現在のクライアントサーバーシステム開
発の流行を踏まえますと、ウィンドウ環境上で動作するグラフィカルな開発ツールを利用して、マ
ウスを使ってドラッグ&ドロップ、といったオブジェクト指向に基づいた開発が主流となってい
ます。今にも「コーディング」という言葉がなくなってしまいそうなくらい自動化が進んでいま
す。けっして GUI 開発ツールを否定するのでありません。逆にそのようなツールがどんどん優秀
になってきて、開発生産性が向上していくことは大変すばらしいことでしょう。しかし、Oracle
の基本は「SQL、PL/SQL、そして SQL∗Plus」であると思います。そのことは本書を読んで、さ
らに実際にシステム開発を行なってみれば、きっと実感できるでしょう。
本書が、そのような Oracle の基礎を学ぶ一助になれば幸いです。
本書で解説します SQL、PL/SQL については、すべての Oracle でご利用いただけます。
最後に、校正する必要がないくらいすばらしい翻訳をしてくださった MbCD の木本氏と、全体
の調整をしていただいたスーパーアスキー編集部の小島氏、お疲れ様でした。
1996 年 秋
日本オラクル株式会社
宮原 徹
改訂に寄せて
本書の初版が日本国内で出版されたのが 1996 年。そして世の中はもうすでに 2003 年になって
います。私自身も、当時勤めていた日本オラクルを退社し、転職を経てすでに独立して仕事をす
るようになっています。月日が立つのは本当に早いものです。
当時、旧版で扱っていた Oracle は Windows 3.1 用の Oracle7 でした。それが今や Oracle8、
Oracle8i を経て、Oracle9i Database Release2 まで進んでいるのですから、これまた驚きです。
バージョンが進むなかで、高機能化、多機能化し、さまざまな周辺ソフトウェアも生まれてきま
した。
しかし、そんな時の流れのなかでも、SQL だけは古くなることもなく、しっかりとその中心的
な位置を占めたままでいるようです。今回の改訂にあたって、あらためて旧版に目を通しました
が、その内容はまったく色褪せることなく、現在でも立派に通用する内容でした。当時、息の長
い書籍にするために、思い切って原著の無駄を省き、エッセンスのみを抽出する作業を行ったこ
とが間違いではなかったこととともに、基礎を修得することの重要性を実感しました。
今回の改訂では、この方針を踏襲して旧版からの変更は最小限に留めています。また、不要と
思われる章に関しては思い切って削ぎ落とし、必要に応じてその他の章に再編成し直しています。
これにより、さらに密度の濃い内容になったと考えています。もちろん、最新の Oracle9i に対応
させるための加筆修正も随所で行っていますので、安心してください(とくに Oracle9i における
拡張機能については、付録 A「Oracle9i での変更点」において解説します)
。
以前は、それでもまだ一部の技術者が必要としていた RDBMS や SQL の知識も、現在では誰も
が必要とするものになってきました。そんな時流に合わせて、硬軟取り混ぜた SQL 解説書籍が出
版されています。また、旧版の前書きで「高価だ」と書いた Oracle のマニュアルも、OTN(Oracle
Technology Network http://otn.oracle.co.jp/)に登録すれば、無料で PDF 版をダウンロードする
ことができるようになったため、以前ほど情報に困らない状況になっております。
それでも、実践に即し、必要十分な SQL の知識を提供してくれる本書は、SQL 初学者の自習
書として、あるいはすでにデータベースを扱っている技術者の SQL リファレンスとして、十二分
に役立つことができるでしょう。
すでにシステム開発の主流は、
「クライアントサーバー型」から、Java のサーブレットを使った
「3 層 Web アプリケーション型」に移りつつありますが、それでも未だに Oracle の基本は「SQL、
そして SQL∗Plus」であり続けるようです(PL/SQL は Java に取って代わられそうです)
。
本書が、旧版に引き続いて、そのような Oracle の基礎を学ぶ一助になれば幸いです。
最後に、忙しい合間を縫ってふたたび本書の編集作業を担当していただいたアスキーの小島氏
に感謝いたします。
2003 年 1 月吉日
株式会社びぎねっと
宮原 徹
目 次
はじめに ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5
本書の内容 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5
対象読者 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5
本書の表記規則 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 6
監訳者まえがき ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 7
改訂に寄せて ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・9
第 1 章 Oracle とは何か?
29
1.1 リレーショナルデータベースの展望 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 29
1.2 SQL(Structured Query Language:構造化問い合わせ言語)を用いた
Oracle との対話 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・30
1.3 本書の目的 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 30
第 2 章 Oracle の基礎知識
33
2.1 データベースの起動と停止 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・33
2.2 Oracle のデータ格納構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 34
2.3 データベースオブジェクト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35
2.4 ユーザー管理 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 35
35
2.4.1 データベースユーザー
2.4.2 データベースロール
36
36
2.4.3 データベース権限
2.5 エクスポートとインポート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・37
2.6 バックアップと回復 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38
2.7 SQL ツール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38
2.7.1 SQL∗Plus
2.7.2 SQL∗Loader
38
39
11
目 次
第 3 章 はじめての Oracle データベース
41
3.1 Oracle の用語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 41
3.1.1 データベース接続
41
3.1.2 データベースユーザー
42
3.1.3 新しいユーザーの作成
42
3.2 論理データモデルとデータベースの設計 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・43
44
3.2.1 リレーショナルデータベースの理論
3.3 修理店のデータベース ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 45
3.4 Customer 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・46
3.5 Manufacturer 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 46
3.6 Product 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 47
3.7 Depot 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・47
3.8 Employee 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 48
3.9 取 引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・48
3.10 Repair_Header 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・49
3.11 Repair_Item 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・50
3.12 Depot_Estimate 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・50
3.13 Repair_Log 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・51
3.14 Condition_Code 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・51
3.15 Action_Code 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 52
3.16 Item_Status_Code 表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 52
3.17 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 53
第 4 章 SQL の基本
55
4.1 表は列と行でできている ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 56
4.2 データの検索と変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 56
4.2.1 SQL の文法
57
4.3 SELECT 文の構文 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・57
4.3.1 単純な SELECT 文
4.3.2 選択リスト
58
59
4.3.3 SELECT によって返される結果
12
60
目 次
4.3.4 選択リストにおける式の利用
4.3.5 算術演算子
60
60
4.3.6 文字列演算子
62
4.3.7 組み込み関数
63
4.4 WHERE 句における条件の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 63
64
4.4.1 AND と OR を用いた条件の結合
4.5 ORDER BY 句を用いたデータのソート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 65
4.6 行の数だけを知りたい場合は、行数を数える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 66
4.7 副問い合わせの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 67
4.7.1 SELECT 文を用いた新しい表の作成
67
4.8 別名を用いた列の参照 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 68
4.9 NULL 値の概念 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69
4.10 列の値が NULL である行の検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・69
4.11 LIKE 演算子を用いた行の検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・70
4.12 BETWEEN 演算子を用いた行の検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 73
4.13 IN 演算子 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74
4.14 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 75
第 5 章 SQL∗Plus を用いて Oracle にアクセスする
77
5.1 SQL 文と SQL∗Plus コマンドの区別 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・77
5.1.1 DESCRIBE を使用して表の定義を見る
78
5.2 コマンドバッファ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・79
5.3 SQL 文のファイルへの保存 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・82
5.3.1 SQL∗Plus の SAVE コマンド
5.3.2 GET を使用した SQL 文の取得
82
82
5.4 出力のファイルへの保存 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 83
5.5 スクリプトの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・84
5.5.1 SQL∗Plus スクリプトの入れ子
84
13
目 次
5.6 出力の書式化 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 86
86
5.6.1 COLUMN コマンドを使用した列の書式化
5.6.2 列の書式の指定
86
5.6.3 列見出しの変更
89
5.7 合計と小計 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 90
5.7.1 BREAK コマンドを用いて反復表示される値の表示を抑制する
5.7.2 COMPUTE コマンドのその他の例
5.7.3 SQL∗Plus の出力へのタイトルの追加
91
92
93
5.8 SQL∗Plus のシステム変数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・94
95
5.8.1 AUTOCOMMIT
5.8.2 ECHO
95
96
5.8.3 FEEDBACK
5.8.4 HEADING
96
5.8.5 LINESIZE
96
5.8.6 LONG
96
96
5.8.7 NUMWIDTH
5.8.8 PAGESIZE
96
5.8.9 PAUSE(停止)
5.8.10 TIME
5.8.11 TIMING
96
97
97
5.8.12 SQL∗Plus システム変数のデフォルト値の設定
98
5.9 置換変数を使用した柔軟性のある問い合わせの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・98
5.9.1 置換変数を使用して SQL∗Plus スクリプトに値を渡す
5.9.2 ユーザー変数を設定するその他の方法
99
100
5.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・102
14
目 次
第 6 章 表の作成と変更
103
6.1 最大限の柔軟性を提供するデータベースの設計方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 103
6.1.1 正規化の規則その 1:列に含まれる情報はすべて単一でなければならない
6.1.2 正規化の規則その 2:列はすべて主キーのみに依存する
104
105
6.1.3 正規化の規則その 3:列はすべて主キーのみに依存し、主キー以外には依存しない
105
106
6.1.4 データベース設計に対する正規化の適用
6.2 CREATE TABLE 文の基本 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 107
6.2.1 表の命名
107
6.2.2 列の命名
107
6.2.3 表の作成例
6.2.4 主キーの特定
6.2.5 外部キーの特定
108
109
110
6.2.6 CHECK 句を用いた、列の値に対する制約の指定
6.2.7 列のデフォルト値の設定
113
114
6.3 ALTER TABLE を使用した表定義の変更 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 115
6.3.1 列の定義の必須(NOT NULL)から任意(NULL)への変更
116
6.3.2 列の定義の任意(NULL)から必須(NOT NULL)への変更
116
6.4 列の幅を広げる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 117
6.4.1 列の幅を狭める
118
6.5 表を変更する場合の一般的な制限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・120
6.5.1 主キーの変更
6.5.2 外部キーの変更
120
121
6.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 122
第 7 章 SQL を使用したデータの変更
123
7.1 SQL データ操作言語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 123
7.1.1 トランザクションは作業の論理単位
7.1.2 COMMIT による作業の保存
124
7.1.3 ROLLBACK による変更の取り消し
7.1.4 セーブポイント
124
124
126
15
目 次
7.2 INSERT による行の追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 127
127
7.2.1 INSERT の構文
7.3 INSERT における値の指定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・128
7.3.1 列と値のデータ型は一致しなければならない
129
129
7.3.2 値として疑似列を使用する
130
7.3.3 INSERT で列を指定する理由
7.4 INSERT における副問い合わせの使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・131
131
7.4.1 副問い合わせを含む INSERT の構文
7.5 UPDATE によるデータの更新 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・132
132
7.5.1 UPDATE の基本構文
132
7.5.2 複数の列の値の変更
7.6 レコードではなく、集合を考える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・133
7.7 DELETE 文によるデータの削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 134
7.7.1 DELETE の構文
134
134
7.7.2 TRUNCATE によるすべての行の削除
7.8 SELECT FOR UPDATE 文による行のロック ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 135
7.8.1 並列性
135
135
7.8.2 読み取り専用のトランザクション
7.9 列の値を NULL に設定する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・136
7.9.1 INSERT 文中で NULL を指定する
136
7.9.2 UPDATE 文中で列を NULL に設定する
7.9.3 デフォルトの値と NULL
137
137
7.9.4 UPDATE 文中における NULL の指定
137
7.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・138
第 8 章 Oracle のデータ型
139
8.1 数値データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・139
8.1.1 数字の精度
140
8.1.2 DECIMAL データ型の使用法
8.1.3 FLOAT データ型の使用法
8.1.4 文字列と数値の変換
16
143
143
143
目 次
8.2 文字データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・145
8.2.1 CHAR データ型の使用法
147
147
8.2.2 VARCHAR2 データ型の使用法
8.3 日付/時間のデータ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・148
8.4 大きな文字列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 148
8.5 LOB データ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・150
8.5.1 BLOB データ型
150
8.5.2 CLOB/NCLOB データ型
8.5.3 BFILE データ型
151
151
8.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 151
第 9 章 文字列の扱い方
153
9.1 文字列の長さを知る ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・153
9.2 文字列からの部分文字列の抽出 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・154
9.3 文字列のパターンを見つける ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 155
9.4 文字列の一部の置換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・156
9.5 文字列の切り捨て ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 158
9.5.1 末尾の空白の検証
160
9.6 文字列のパディング ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・160
9.6.1 LPAD
160
9.6.2 RPAD
162
9.7 文字列の大文字小文字の変換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 162
9.8 DECODE 関数を使用して文字列を返す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・164
9.9 文字の ASCII 値への変換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 166
9.9.1 文字列内のパターンの検索
167
9.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・168
17
目 次
第 10 章 日付の扱い方
169
10.1 Oracle の日付データ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 169
10.1.1 日付データ型は日付以上のものを提供する
169
10.2 日付の範囲を指定した行の検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・171
10.3 現在の日付と時間:SYSDATE ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・171
10.4 Oracle の日付書式モデル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 171
10.4.1 日付型の列の指定
173
10.5 Oracle のデフォルトの日付書式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・173
10.6 日付の文字列への変換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 174
10.6.1 さまざまな書式を用いた日付の表示
175
10.7 文字列の日付への変換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 177
10.7.1 INSERT、UPDATE、DELETE 文における日付の使用
178
10.8 日付と時間 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 178
10.8.1 秒以下の単位の扱い方
180
10.9 午前か午後か:AM、PM、24 時間表記 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・180
10.10 2 つの日付の差の計算 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・180
10.11 時間によるソート、タイムゾーンの扱い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 182
10.11.1 タイムゾーンの変更方法
10.11.2 夏時間
182
184
10.12 ユリウス日付書式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 184
10.13 2 つの日付の差を秒単位で計算する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 185
10.14 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 186
第 11 章 数値の扱い方
187
11.1 数値列を指定する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・187
11.2 Oracle が数値を格納する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・189
11.3 数値の文字列への変換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 190
11.3.1 数値から文字列への自動変換
190
11.3.2 TO_CHAR による数値の文字列への変換
191
11.4 文字列の数値への変換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 193
11.5 統計用組み込み関数の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・194
18
目 次
11.6 数値の丸めと切り捨て ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 194
11.6.1 ROUND
194
11.6.2 TRUNC
195
11.6.3 FLOOR
195
11.6.4 CEIL
196
11.7 最大値または最小値を求める ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・196
11.8 NULL 値の判別 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・199
11.9 さまざまな数値関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・200
11.9.1 MOD 関数
11.9.2 ABS 関数
11.9.3 SIGN 関数
201
201
202
11.9.4 数値を対応する ASCII 文字に変換する方法
202
11.10 三角関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 202
11.11 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 203
第 12 章 表と列の制約の定義
205
12.1 主キーの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・205
12.1.1 表作成の際の主キーの定義
206
12.1.2 表の作成後の主キーの定義
207
12.2 外部キーと参照整合性 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 208
208
12.2.1 表作成の際の外部キーの宣言
210
12.2.2 表作成後の外部キーの宣言
12.2.3 主キー列と外部キー列
211
212
12.2.4 キー制約の無効化と有効化
215
12.2.5 主キーの削除
12.2.6 外部キーの削除
216
12.3 一意制約の宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・217
12.3.1 主キーと一意制約の違い
217
12.4 表の索引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・218
12.4.1 索引の作成
218
12.4.2 一意索引を作るべきでない理由
219
12.5 必須列の値:NOT NULL 制約 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 219
19
目 次
12.6 列の CHECK 制約による値の制限 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 220
12.6.1 列に対する複数の CHECK 制約
222
12.6.2 CHECK 制約における他の列の参照
223
12.6.3 CHECK 制約における疑似列の使用
224
12.7 子をどうするか:参照整合性と UPDATE および DELETE 文 ・・・・・・・・・・・・ 224
225
12.7.1 主キーに対する変更の制限
226
12.7.2 連鎖的な削除
12.8 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・226
第 13 章 より高度な問い合わせ
227
13.1 組み込みグループ関数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 227
227
13.1.1 COUNT 関数
229
13.1.2 最大値と最小値を求める
13.1.3 AVG と SUM の使用法
229
13.1.4 グループ関数と他の列との組み合わせ
230
13.2 非重複行の検索 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230
13.3 行のグループ化 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・231
13.4 階層情報の処理 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・234
13.4.1 EXISTS 演算子の使用法
236
13.5 結合操作 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・237
13.5.1 2 つの表の単純な結合
239
13.5.2 あいまいな列
240
13.5.3 直積に注意
13.5.4 複数の表の結合
13.5.5 「自己」結合
13.5.6 外部結合
238
241
242
243
13.6 SELECT 文における集合演算子の使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・245
13.6.1 INTERSECT 演算子
13.6.2 UNION 演算子
246
13.6.3 UNION と UNION ALL
13.6.4 MINUS 演算子
245
249
250
13.7 別の表から行を選択して表を作成する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・252
20
目 次
13.8 SQL を用いた SQL スクリプトの生成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 254
13.9 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・256
第 14 章 ビュー、順序、シノニム
259
14.1 ビューは仮想表 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・259
260
14.1.1 ビューの構文
260
14.1.2 ビューを使用したデータに対するアクセス制限
14.1.3 セキュリティをより強化したビュー
14.1.4 ビューを使用して複雑さを隠す
264
14.1.5 ビューを通したデータの変更
266
14.1.6 ビューの使用法に関する制限
266
14.1.7 ビューに基づくビュー
261
267
14.2 数値の生成:順序の働き ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 269
14.2.1 順序の作成
269
14.2.2 順序を使用して、修理店の新しい顧客 ID を割り当てる
14.2.3 開始番号と増減間隔を指定した順序の定義
14.2.4 順序の現在値を見る
269
270
271
14.3 シノニムの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・272
14.3.1 シノニム定義の構文
14.3.2 シノニムの削除
272
273
14.3.3 パブリックシノニムを使用して表の所有権を隠す
274
14.4 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・275
第 15 章 トランザクションの定義
277
15.1 データベーストランザクション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・277
15.2 インスタンスの回復 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・278
15.3 同時実行制御の例 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・278
15.4 Oracle のロック ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 280
15.5 SELECT FOR UPDATE 文 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・280
15.6 トランザクションと UNDO 表領域 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 281
15.7 トランザクションとロールバックセグメント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 282
21
目 次
15.8 新しいロールバックセグメントの追加 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・282
283
15.8.1 新しいロールバックセグメントの作成
15.8.2 新しいロールバックセグメントの状態の設定
284
15.9 SQL∗Plus では AUTOCOMMIT を ON に設定すべきでない ・・・・・・・・・・・・・・285
15.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 286
第 16 章 PL/SQL の基本
287
16.1 PL/SQL はブロック構造言語 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・288
16.1.1 宣言部
290
16.1.2 実行部
290
16.1.3 例外部
290
16.2 PL/SQL における変数の宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・290
16.2.1 %TYPE を使用した変数の宣言
291
16.2.2 %ROWTYPE を使用した変数の宣言
291
16.3 よく使用するフロー制御構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・292
16.3.1 IF 文
292
16.3.2 単純な LOOP 文
16.3.3 EXIT 文
293
16.3.4 WHILE-LOOP 文
16.3.5 FOR-LOOP 文
16.3.6 GOTO 文
16.3.7 NULL 文
16.3.8 代入文
293
293
294
294
295
295
295
16.3.9 PL/SQL サブプログラムにおけるコメント
16.4 PL/SQL プログラムにおける SQL 文の使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 296
16.4.1 PL/SQL と SELECT 文
16.4.2 PL/SQL サブプログラム
296
297
16.5 サブブロックの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 297
16.6 プロシージャの宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・298
16.7 ファンクションの宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 300
16.7.1 プロシージャとファンクションの引数
301
16.8 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・302
22
目 次
第 17 章 ストアードプロシージャ、ファンクション、
およびパッケージの作成と使用
305
17.1 ストアードプロシージャとファンクションの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・306
17.1.1 ストアードプロシージャ作成の際のエラーメッセージの取得
308
17.2 ストアードプロシージャの取り出し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 310
17.2.1 プロシージャ、ファンクション、パッケージ、およびパッケージ本体のリストの
取得
311
17.2.2 プロシージャとファンクションの事前宣言
313
17.3 SQL 文におけるストアードファンクションの使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 314
17.4 表への結果の格納 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・315
17.5 DBMS_OUTPUT による処理結果の表示 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・316
17.6 ストアードプロシージャの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・317
17.7 パッケージ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 318
318
17.7.1 パッケージの宣言
319
17.7.2 パッケージ本体の宣言
17.7.3 パッケージの初期化
321
17.7.4 データベーストリガーで使用するパッケージの設計
322
17.8 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・322
第 18 章 PL/SQL のデータ型と変数
325
18.1 BOOLEAN データ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・325
18.2 BINARY_INTEGER データ型 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 326
18.3 %TYPE の使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・327
18.4 %ROWTYPE の使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 329
18.5 さらに複雑なデータ型:PL/SQL 表とレコード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 331
18.5.1 PL/SQL 表の宣言
332
18.5.2 ユーザー定義レコードの宣言
334
18.6 変数のデフォルト値の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335
18.7 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335
23
目 次
第 19 章 PL/SQL におけるエラー処理と例外
337
19.1 例外部 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・337
19.2 定義済み例外 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 339
339
19.2.1 DUP_VAL_ON_INDEX 例外
19.2.2 INVALID_NUMBER 例外
340
19.2.3 NO_DATA_FOUND 例外
340
19.2.4 TOO_MANY_ROWS 例外
341
19.2.5 VALUE_ERROR 例外
341
19.3 例外の宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 342
19.4 成功と失敗の判定:SQLCODE と SQLERRM を調べる ・・・・・・・・・・・・・・・・・・ 343
19.5 RAISE_APPLICATION_ERROR を使用してエラーを返す ・・・・・・・・・・・・・・・343
19.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・344
第 20 章 カーソルを使用したデータの検索
345
20.1 カーソルの宣言 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・347
20.2 カーソルのオープン ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・349
20.3 カーソルからの行のフェッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・350
20.4 カーソルのクローズ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・352
20.5 カーソルの FOR ループの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・353
20.6 %FOUND か%NOTFOUND か? ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 354
20.7 %ROWCOUNT を使用して行数を調べる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・354
20.8 カーソルはオープンされているか:%ISOPEN ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 356
20.9 複数のカーソルの使用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 357
20.10 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 358
24
目 次
第 21 章 データベーストリガーを使用した
ビジネス規則の適用
359
21.1 トリガーの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・360
360
21.1.1 文レベルトリガーと行レベルトリガー
361
21.1.2 トリガー本体における列値の参照
21.1.3 トリガーイベント
361
362
21.1.4 BEFORE と AFTER トリガー
21.1.5 表で使用できるトリガー
362
21.2 トリガーによる列値の検証 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・362
21.3 トリガーによるセキュリティ規則の適用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・364
21.4 トリガーによる列値の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・365
21.5 連鎖トリガー ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 367
21.6 トリガーで使用できない COMMIT と ROLLBACK ・・・・・・・・・・・・・・・・・・・・・・・・・ 370
21.7 トリガーからのストアードプロシージャの呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・371
21.8 トリガーにおける例外の通知 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・371
21.9 トリガーの削除、有効化、無効化 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 373
21.10 DBA_TRIGGERS を使用してトリガーを調べる ・・・・・・・・・・・・・・・・・・・・・・・・・・・373
21.11 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 375
第 22 章 データの保存とロード
377
22.1 Export プログラムの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・378
22.1.1 指定した表のエクスポート
379
22.1.2 ユーザーが所有するオブジェクトのエクスポート
381
22.1.3 全データベースのエクスポート
22.1.4 エクスポート用のパラメータ
380
381
22.2 Import プログラムの使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・383
22.2.1 表のインポート
384
22.2.2 所有者を指定したオブジェクトのインポート
22.2.3 全データベースのインポート
22.2.4 インポート用のパラメータ
385
386
386
25
目 次
22.3 SQL∗Loader ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 387
388
22.3.1 SQL∗Loader の制御ファイル
389
22.3.2 SQL∗Loader のデータファイル
22.3.3 SQL∗Loader の不良データファイル
389
22.3.4 SQL∗Loader の破棄データファイル
389
389
22.3.5 SQL∗Loader のログファイル
22.4 SQL∗Loader の使用法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 389
22.5 SQL∗Loader を用いた固定長レコードのロード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・390
22.5.1 制御ファイルの内容
22.5.2 SQL∗Loader の実行
22.5.3 ログファイルの内容
22.5.4 SQL∗Loader の実行
22.5.5 ログファイルの内容
391
391
391
393
393
22.5.6 不良データファイルの内容:何がまずかったのか
395
22.5.7 SQL∗Loader の再実行
22.5.8 ログファイルの内容
394
395
22.6 表に対する区切り文字で区切られた可変長レコードのロード ・・・・・・・・・・・・・・396
22.6.1 制御ファイルの内容
22.6.2 SQL∗Loader の実行
22.6.3 ログファイルの内容
397
397
397
22.6.4 SQL∗Loader を用いた中間表へのデータのロード
22.6.5 制約の扱い方
398
400
22.7 データベースのバックアップと回復 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 401
22.7.1 一貫性のあるバックアップ
401
22.7.2 ORACLE のユーティリティを使う場合と Export を使う場合
402
22.8 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・402
第 23 章 ユーザーとロールの管理
403
23.1 SQL∗Plus を用いた新規ユーザーの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・403
23.1.1 ユーザーの使用ディスク領域の制限
26
404
目 次
23.2 SQL∗Plus を用いた新規データベースロールの定義 ・・・・・・・・・・・・・・・・・・・・・・・・・405
23.2.1 あらかじめ定義されているデータベースロール
23.2.2 データベースロールに対する権限の付与
405
406
23.3 ロールの権限の取り消し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 408
23.4 ユーザーのロールの取り消し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・409
23.5 特別なユーザー:SYS と SYSTEM ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 409
23.6 まとめ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・410
付録 A Oracle9i での変更点
411
A.1 SQL:1999 への対応 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 411
A.1.1 クロス結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・411
A.1.2 内部結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 412
A.1.3 外部結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 412
A.1.4 自己結合 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 414
A.2 パーティション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・414
A.2.1 レンジ・パーティション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 415
A.2.2 ハッシュ・パーティション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・415
A.2.3 リスト・パーティション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 415
A.2.4 レンジ-ハッシュ・コンポジット・パーティション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・416
A.2.5 レンジ-リスト・コンポジット・パーティション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・416
索引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 417
27
Oracle Chapter 1
第1 章
Oracleとは何か?
1.1 リレーショナルデータベースの展望
1970 年、Communications of the ACM は、"A Relational Model of Data for Large Shared Data
Banks"という論文を発行しました。IBM のサンノゼ研究所(San Jose Research Laboratory)の
E. F. コッド博士によるこの論文は、リレーショナルデータベースの概念の理論的、数学的基礎を
説明したものです。計算機科学の分野で、コッド氏の論文ほどデータベースベンダー、関連企業、
およびユーザーに大きな影響を与えてきたものはありません。
論文で、コッド氏は、リレーショナルデータベースの構成要素は、関係、属性、ドメイン、お
よび関係演算子であると述べています。また、彼は当時最も必要とされていた 3 つの特性を持つ
データ格納システムについて書いています。その 3 つの特性とは、以下の通りです。
●
論理データの独立:この特性は、ある属性(列)を変更しても(たとえば、サイズの増減な
ど)
、同じ関係(表)の他の属性に対して目に見える影響がないというものです。論理データ
の独立は、ソフトウェアの保守にかかるコストを大幅に削減できることから、データ処理を
行なう組織にとっては魅力的なものでした。
●
関係およびデータの整合性:他のデータベースシステムとは異なり、リレーショナルデータ
ベースは、アプリケーションソフトウェアを整合性を維持するという重荷から解放します。
コッド氏は、リレーショナルデータベースが維持管理する 2 つの特性、関係およびデータの
整合性について説明しています。これらについては、本書の全体を通して詳しく解説します。
●
非定型問い合わせ:この機能により、ユーザーはデータベースから検索するデータを示すだ
けでよく、検索方法を指示する必要がなくなります。
コッド氏が示した、リレーショナルデータベース機能のいくつかを実装した実際の製品が登場す
29
第 1 章 Oracle とは何か?
るまでには、多少の時間を要しました。今日では、ORACLE、Sybase、IBM、Microsoft、Computer
Associates、Centura などを含む、数多くのリレーショナルデータベース管理システム(RDBMS)
ベンダーが存在します。これらのベンダーの中で業界のリーダーとなっているのが ORACLE で
す。ORACLE の RDBMS エンジン Oracle は、他のいかなるデータベース製品よりも多くのプ
ラットフォームに移植されてきました。Oracle がさまざまなプラットフォームでサポートされて
いることから、多くのアプリケーションソフトウェアのベンダーがデータベースプラットフォー
ムとして Oracle を選んできました。ORACLE では、同じ RDBMS エンジンをデスクトップ環境
から汎用機まで、さまざまなプラットフォームに移植し、リリースしています。
NOTE
今日のリレーショナルデータベースには、コッド氏の論文で言及されていなかった非常に便利な機能
がいくつか実装されています。しかし逆に、コッド氏が定義したリレーショナルデータベースの 12
カ条の条件をすべて実装した商用のデータベースがまだ存在しないのも興味深い事実です。
1.2 SQL(Structured Query Language:構造化問い合わせ言語)
を用いたOracleとの対話
構造化問い合わせ言語(SQL:シーケルと発音する)の Oracle 版を使用して、Oracle と対話
することができます。SQL は非手続型言語です。つまり、データに対するアクセスと操作の手順
を正確に指定しなければならない C 言語や COBOL とは異なり、SQL では単に何をすべきか指
示します。Oracle は、要求に応えるための手順を内部的に決定します。SQL は業界標準である
と同時に、ANSI の規格としても存在します。Oracle の SQL の実装は、ANSI X3.135-1989/ISO
9075-1989 の規格の Level 2 に準拠しており、Integrity Enhancement Feature を完全に実装して
います。他のデータベースベンダーと同様に、ORACLE も ANSI SQL には定められていない多
くの拡張機能を提供しています。
さらに、Oracle の SQL の実装は、Database Language SQL と題された Federal Information
Processing Standard Publication (FIPS PUB) 127 という、アメリカ合衆国政府の規格にも準拠し
ています。
1.3 本書の目的
本書は、以下のような読者を想定して書かれています。
●
Access などのデータベースは使い慣れているが、Oracle やその他の SQL ベースのデータベー
ス製品を使ったことがない。
30
1.3 本書の目的
●
Oracle Server を使ったことはあるが、新しいデータベース管理ツールを使ったことがない。
●
クライアント/サーバー型のアプリケーションを開発するためのプロトタイピングツールと
して Oracle を使おうと思っている。
また本書では、以下のことがらを解説します。
●
SQL:リレーショナルデータベースと対話するための、事実上の業界標準および ANSI 規格
として認められている言語。
●
PL/SQL:SQL を拡張した、ORACLE による手続型言語。データベーストリガー、ストアー
ドプロシージャ、およびファンクションを作成するために使用できる。
●
実際の開発現場におけるノウハウ:データベースの設計、データのロード、および UNIX 上
で動作するアップサイズされた Oracle データベースにおける環境。
31
Oracle Chapter 2
第2 章
Oracleの基礎知識
ORACLE の提供する Oracle データベースは、きわめて広範囲のプラットフォームでサポート
されています。しかし、Oracle を利用するうえで最も基本となるのは、SQL∗Plus といっても過
言ではありません。
本章では、Oracle を利用するうえでの基礎知識や必要となるツールを紹介します。
2.1 データベースの起動と停止
ここでは、Oracle の基本的な構造について理解しておくことが大切です。Oracle データベース
には次の 3 つの状態があると考えられます。
●
実行中で使用可能
●
起動中または停止中
●
停止状態。使用不可能
Oracle データベースを利用するためには、なんらかの方法でデータベースを起動しなければな
りません。
TIP
コンピュータの電源を切る前には、データベースを停止するようにしておくとよいでしょう。これに
より Oracle はすべてのデータベースファイルを安全にクローズできます。もし Oracle を停止せず
に、コンピュータの電源を切ると、次回に起動するときにインスタンス回復と呼ばれる作業を実行し
ます。
33
第 2 章 Oracle の基礎知識
2.2 Oracleのデータ格納構造
Oracle におけるデータの格納構造は、階層構造と見ることができます(図 2-1 参照)。
Oracleの格納階層構造
使用済みエクステント
空きエクステント
表領域
使用済みエクステント
セグメントは、
特定のオブジェクトに
割り当てられている
すべてのエクステント
から成ります。
空きエクステント
使用済みエクステント
個々のブロック
図 2-1
Oracle の格納階層構造
階層構造の最下層には、
「ブロック」があります。これは、Oracle のデータベースオブジェク
トを格納する基本の要素です。2 つ以上の連続するブロックは、
「エクステント」と呼ばれる単位
にまとめられます。
エクステントの上位に「セグメント」があります。表や索引といったデータベースオブジェク
トは、複数のエクステントがまとめられたセグメントに格納されます。
「表領域」は表や索引などのデータベースオブジェクトを格納する領域です。表領域は複数の
セグメントから構成されます。表領域は 1 つ以上のデータベースファイルから構成されます。
以前のバージョンの Oracle では、データベースの領域管理はデータベース管理者の最大の仕事
でもありましたが、最新のバージョンでは自動領域管理で Oracle に領域管理をまかせることが推
奨されています。
システムには目的別に、最低でも以下の 5 つの表領域があるとよいでしょう。
SYSTEM 表領域
Oracle がシステム管理用オブジェクトが格納される
ユーザーデータ用表領域
ユーザーのデータが格納される
索引用表領域
索引が格納される
UNDO 表領域
トランザクション中の変更が格納される
一時セグメント用表領域
一時的な作業領域として利用される
34