入門 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
© Copyright 2024 ExpyDoc