<html><head>		<META http-equiv="Content-Type" content="text/html; charset=UTF-8"><link rel="stylesheet" href="josh.css"></head><body bgcolor="#FFFFFF">
<div id="説明">
			<table width="100%" cellspacing="0" cellpadding="0" border="0">
				<tr><td valign="top" class="name">SQL ステートメントのコマンドリファレンス</td><td valign="top" nowrap class="compatibility">&#160; </td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr><td>本章では、SQL コマンドをアルファベット順に詳細に説明および例示したオライリー・ジャパン発行の『<span class="emphasis">SQL クイックリファレンス</span>』の主な内容について説明します。各コマンドと関数は、本マニュアルで対象としている SQL Server、MySQL、Oracle、および PostgreSQL の製品固有の 4 つの SQL 言語に対して、基本表内で "対応 (S)"、"変則対応 (SWV)"、"制限付き対応 (SWL)"、または "未対応 (NS)" にそれぞれ分類されています。SQL99 標準、各ベンダーのアプリケーションの順に簡潔に漏れなく説明し、例およびサンプルコードを示します。</td>
				</tr>
			</table>
		</div><div id="ALTER PROCEDURE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">ALTER PROCEDURE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis"></span><span class="emphasis">ALTER PROCEDURE</span>   ステートメントは、既存のストアドプロシージャーを変更できます。変更の種類と程度はベンダーごとに大きく異なります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、このステートメントは、<span class="emphasis">CREATE PROCEDURE</span> ステートメントで以前に作成したプロシージャーを、権限を変更せずに、また、従属するストアドプロシージャーやトリガーに影響を及ぼさずに変更します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のこのコマンドは、単に PL/SQL ストアドプロシージャーを再コンパイルしますが、コードの変更はできません。代わりに、同じ機能を実現するには、Oracle コマンドの <span class="emphasis">CREATE OR REPLACE PROCEDURE</span> を使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER PROCEDURE procedure_name {CASCADE | RESTRICT}
[LANGUAGE | PARAMETER STYLE | &lt;SQL data access&gt; | &lt;null clause behavior&gt; | DYNAMIC RESULT SETS | NAME]
[parameter datatype [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE PROCEDURE</span> の説明にあるように、言語 (<span class="emphasis">LANGUAGE</span>)、パラメータスタイル (<span class="emphasis">PARAMETER STYLE</span>)、SQL データアクセスメソッド (<span class="emphasis">NO SQL</span>、<span class="emphasis">CONTAINS SQL</span> など)、NULL 句の動作 (<span class="emphasis">CALL ON NULL INPUT</span> など)、動的結果セット (<span class="emphasis">DYNAMIC RESULT SET</span>)、およびプロシージャーの名前 (<span class="emphasis">NAME</span>) はすべて変更できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ALTER PROCEDURE</span> コマンドは、入力パラメータの数や型の変更にも使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER PROC[EDURE] procedure_name [;number]
[ {@parameter datatype } [VARYING] [= default] [OUTPUT] ][,...n]
[WITH { RECOMPILE | ENCRYPTION  | RECOMPILE , ENCRYPTION } ]
[FOR REPLICATION]
AS
T-SQL Block</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、このコマンドは、以前に作成したストアドプロシージャー (procedure_name) の任意の既存パラメータを変更できます。つまり、このコマンドのみで、<span class="emphasis">DROP PROCEDURE</span> ステートメントに続けて新たな <span class="emphasis">CREATE PROCEDURE</span> ステートメントを発行する場合と同じことができます。ストアドプロシージャーに対する権限や許可を再構築する必要はありません。構文の詳細については、<span class="emphasis">CREATE PROCEDURE</span> コマンドの項を参照してください。このコマンドを SQL Server で実行できるのは、ストアドプロシージャーの所有者、または <span class="emphasis">db_owner</span> および <span class="emphasis">ddl_admin</span> に固有のデータベースロールのメンバーです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER PROCEDURE [user.]<span class="replaceable">procedure_name</span> COMPILE [DEBUG];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、コンパイルするプロシージャーまたはパッケージの名前 ([user.]procedure_name) を指定する必要があります。<span class="emphasis">COMPILE</span> キーワードは必須です。<span class="emphasis">COMPILE [DEBUG]</span> オプションを指定すると、PL/SQL 情報が再生成されます。このコマンドを実行できるのは、ストアドプロシージャーの所有者か、<span class="emphasis">ALTER ANY PROCEDURE</span> を実行する特別な権限の所有者のみです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server を使用したこの例では、一意の CHAR(22) 出力文字列を生成する <span class="emphasis">get_next_nbr</span> というプロシージャーを作成します。次に、一意の INT 出力値を取得するようにプロシージャーを変更する際に、<span class="emphasis">ALTER PROCEDURE</span> を使用してストアドプロシージャーを再定義します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- A Microsoft SQL Server stored procedure
CREATE PROCEDURE get_next_nbr
   @next_nbr CHAR(22) OUTPUT
AS
BEGIN
  DECLARE @random_nbr INT
  SELECT @random_nbr = RAND(  ) * 1000000

SELECT @next_nbr =
  RIGHT('000000' + CAST(ROUND(RAND(@random_nbr)*1000000,0))AS CHAR(6), 6) +
  RIGHT('0000' + CAST(DATEPART (yy, GETDATE(  ) ) AS CHAR(4)), 2) +
  RIGHT('000'  + CAST(DATEPART (dy, GETDATE(  ) ) AS CHAR(3)), 3) +
  RIGHT('00'   + CAST(DATEPART (hh, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('00'   + CAST(DATEPART (mi, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('00'   + CAST(DATEPART (ss, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('000'  + CAST(DATEPART (ms, GETDATE(  ) ) AS CHAR(3)), 3)
END
GO

ALTER PROCEDURE get_next_nbr
   @next_nbr INT OUTPUT
AS
BEGIN
  DECLARE @convert_to_nbr CHAR(22)
  DECLARE @random_nbr INT
  SELECT  @random_nbr = RAND(  ) * 1000000

SELECT @convert_to_nbr =
  RIGHT('000000' + CAST(ROUND(RAND(@random_nbr)*1000000,0))AS CHAR(6), 6) +
  RIGHT('0000' + CAST(DATEPART (yy, GETDATE(  ) ) AS CHAR(4)), 2) +
  RIGHT('000'  + CAST(DATEPART (dy, GETDATE(  ) ) AS CHAR(3)), 3) +
  RIGHT('00'   + CAST(DATEPART (hh, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('00'   + CAST(DATEPART (mi, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('00'   + CAST(DATEPART (ss, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('000'  + CAST(DATEPART (ms, GETDATE(  ) ) AS CHAR(3)), 3)

SELECT @next_nbr = CAST(@convert_to_nbr AS INT)

END
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="ALTER TABLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">ALTER TABLE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ALTER TABLE</span>   ステートメントは、テーブルを削除したりテーブルの既存の権限を変更することなく、既存のテーブルを変更できます。このステートメントを使用すると、既存のテーブルに対する増分変更を簡単に行えます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle と Microsoft SQL Server では、このコマンドをサポートしていますが、それぞれ異なる物理ファイルの割り当て方法を実現するため、いくつかのバリエーションがあります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>制限付き対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE table_name
[ADD [COLUMN] column_name datatype attributes]
| [ALTER [COLUMN] column_name SET DEFAULT default_value]
| [ALTER [COLUMN] column_name DROP DEFAULT]
| [ALTER [COLUMN] column_name ADD SCOPE table_name
| [ALTER [COLUMN] column_name DROP SCOPE {RESTRICT | CASCADE}]
| [DROP [COLUMN] column_name {RESTRICT | CASCADE}]
| [ADD table_constraint_name]
| [DROP CONSTRAINT table_constraint_name {RESTRICT | CASCADE}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 の <span class="emphasis">ALTER TABLE</span> ステートメントは、既存のテーブルに対して、多数の役立つ変更を行えます。この多機能なコマンドにより、列の追加 (<span class="emphasis">ADD COLUMN</span>) やテーブル制約の追加、初期設定値 (<span class="emphasis">DEFAULT</span>) の追加や削除、ユーザー定義の型を参照するように設定されている列に対する効力範囲 (<span class="emphasis">SCOPE</span>) の追加や削除、および列やテーブル制約の削除 (<span class="emphasis">DROP</span>) を行えます。<span class="emphasis">DROP RESTRICT</span> を指定すると、他のデータベースオブジェクトが、指定した列またはテーブル制約に依存する場合、ホスト DBMS によってコマンドが中止されます。<span class="emphasis">DROP CASCADE</span> を指定すると、指定した列またはテーブル制約に依存するあらゆるデータベースオブジェクトはホスト DBMS によって削除されます。これらのコマンド要素の詳細については、<span class="emphasis">CREATE TABLE</span> ステートメントの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE table_name
[ALTER COLUMN column_name new_data_type attributes {ADD | DROP}
   ROWGUIDCOL]
| [ADD [COLUMN] column_name datatype attributes][,...n]
| [WITH CHECK | WITH NOCHECK] ADD table_constraint][,...n]
| [DROP { [ CONSTRAINT ] constraint_name | COLUMN column_name }] [,...n]
| [{ CHECK | NOCHECK } CONSTRAINT { ALL | constraint_name [,...n] }]
| [{ ENABLE | DISABLE } TRIGGER { ALL | trigger_name [,...n] }]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server は、<span class="emphasis">ALTER TABLE</span> の実装において多くの機能を提供しています。<span class="emphasis">ALTER COLUMN</span> を指定すると、既存の列のデータタイプ、NULL の許容、識別関数などを変更できます。<span class="emphasis">ADD</span> を指定すると、新しい列、計算列、または制約をテーブルの最後に追加できます。現時点では、テーブルの最後以外の場所に列を挿入する手段はありません。<span class="emphasis">COLUMN</span> はわかりやすくするために提供されていますが、省略可能です。新しい列は、すべての制約、初期設定値および照合順序を含め、<span class="emphasis">CREATE TABLE</span> ステートメントと同じ方法で定義する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH CHECK</span> および <span class="emphasis">WITH NOCHECK</span> 句では、新しく追加した制約やキーでテーブル内のデータを検証するかどうかを指定します。<span class="emphasis">WITH NOCHECK</span> で追加する制約は、クエリオプティマイザによって考慮されません。このような制約はすべて <span class="emphasis">ALTER TABLE table_name CHECK CONSTRAINT ALL</span> を指定して有効化されるまで無視されます。制約は、<span class="emphasis">DROP CONSTRAINT</span> (<span class="emphasis">CONSTRAINT</span> キーワードは省略可) で削除でき、<span class="emphasis">CHECK CONSTRAINT</span> および <span class="emphasis">NOCHECK CONSTRAINT</span> で個々に有効化または無効化できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>同様に、テーブルの指定トリガーは、<span class="emphasis">ENABLE TRIGGER</span> および <span class="emphasis">DISABLE TRIGGER</span> 句で有効化または無効化できます。テーブルのすべてのトリガーを有効化または無効化するには、<span class="emphasis">ALTER TABLE employee DISABLE TRIGGER ALL</span> のように、テーブル名を指定してキーワード <span class="emphasis">ALL</span> を指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER [IGNORE] TABLE table_name
[ADD [COLUMN] column_name datatype attributes ]
   [FIRST | AFTER column_name]] [,...n]
| [ADD INDEX [index_name] (index_col_name,...)] [,...n]
| [ADD PRIMARY KEY (index_col_name,...)] [,...n]
| [ADD UNIQUE [index_name] (index_col_name,...)] [,...n]
| [ALTER [COLUMN] column_name {SET DEFAULT literal | DROP DEFAULT}] [,...n]
| [CHANGE [COLUMN] old_col_name create_definition] [,...n]
| [MODIFY [COLUMN] column_name datatype attributes] [,...n]
| [DROP [COLUMN] column_name] [,...n]
| [DROP PRIMARY KEY] [,...n]
| [DROP INDEX index_name] [,...n]
| [RENAME [AS] new_tbl_name] [,...n]
| [table_options]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>指定可能な列属性およびテーブル制約の詳細については、<span class="emphasis">CREATE TABLE</span> ステートメントの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">IGNORE</span> オプションを指定すると、一意キーを新たに定義する際に重複行を削除します。<span class="emphasis">IGNORE</span> を指定しないと、一意キー列に重複レコードが存在した場合、処理が中断されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FIRST</span> オプションは、新しい列 (column_name) をテーブルの最初の列として追加する際に使用します。<span class="emphasis">AFTER column_name</span> を指定すると、<span class="emphasis">column_name</span> で指定したテーブル内の列の後に新しい列を追加します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>さらに MySQL では、<span class="emphasis">ALTER TABLE</span> ステートメントに柔軟性を与えています。ユーザーは、単一の <span class="emphasis">ALTER TABLE</span> ステートメント内に、<span class="emphasis">ADD</span>、<span class="emphasis">ALTER</span>、<span class="emphasis">DROP</span>、および <span class="emphasis">CHANGE</span> 句を複数指定できます。ただし、<span class="emphasis">CHANGE column_name</span> および <span class="emphasis">DROP INDEX</span> 句は MySQL 独自の拡張で、SQL99 にはありません。MySQL では、Oracle の拡張 <span class="emphasis">MODIFY column_name</span> にも対応しています。<span class="emphasis">ALTER COLUMN</span> 句を指定すると、新しい初期設定値 (literal) を列 (column_name) に設定したり削除したりすることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブルの名前は、<span class="emphasis">RENAME AS</span> を使用して変更でき、列の名前は、<span class="emphasis">CHANGE</span> で変更できます。たとえば、次のコードではテーブルと列の両方の名前を変更します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE employee RENAME AS emp;
ALTER TABLE employee CHANGE employee_ssn emp_ssn INTEGER;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、列の一部 (列の最初の 10 文字など) に対してインデックスを作成できるため、そのインデックスの長さより短い列の作成には、<span class="emphasis">CHANGE</span> や <span class="emphasis">MODIFY</span> コマンドを使用できません。<span class="emphasis">DROP COLUMN</span> を使用すると、指定した列は、テーブルおよびその列で作成されたすべてのインデックスから削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP PRIMARY KEY</span> を指定したときに、テーブルに主キーが存在しなくても自動的に失敗にはなりません。代わりに、テーブルの最初の一意インデックスが削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、データを損失することなく、既存列のデータタイプを再定義できます。ただし、列に含まれている値は、新しく定義するデータタイプに適合する必要があります。たとえば、日付型の列は文字データタイプに再定義できますが、文字データタイプは整数型に再定義できません。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE mytable MODIFY mycolumn LONGTEXT</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、<span class="emphasis">FOREIGN KEY</span>、<span class="emphasis">CHECK</span>、および <span class="emphasis">REFERENCES</span> 句を指定できますが、これらは意味を持ちません。これらの句を含むコマンドを発行できますが、これらの句には効力がありません。これらの句は、主に移植時の互換性を保つために用意されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE [owner_name.]table_name
[ADD column_name datatype attributes]
| [MODIFY {column_name datatype
   | column_constraint
   | physical_storage_attributes [LOGGING | NOLOGGING]
   | nested_table_attributes}]
| [MODIFY CONSTRAINT {constraint_name {constraint_state}
   | drop_constraint_clause
   | drop_column_clause
   | [ALLOCATE | DEALLOCATE extent_clause]
   | [CACHE | NOCACHE]
   | [LOGGING | NOLOGGING]
   | [MONITORING | NOMONITORING] ]
| [DROP {[COLUMN] column_name | constraint_name}]
| [ALLOCATE EXTENT details]
| [DEALLOCATE UNUSED details]
| [RENAME TO new_table_name]
| [OVERFLOW physical_storage_attributes]
| [ADD OVERFLOW physical_storage_attributes]
| [{ADD | DROP | MODIFY | MOVE | TRUNCATE | SPLIT | EXCHANGE | MODIFY}
   PARTITION partition_details]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">ALTER TABLE</span> ステートメントには、過剰な使用負荷を処理するためのデータエクステント処理、オーバーフローエクステント処理、テーブルのパーティショニングなど、物理記憶域の制御およびテーブル操作のための強力な機能が多数用意されています。上記の <span class="emphasis">column_constraint</span>、<span class="emphasis">physical_storage_attributes</span>、<span class="emphasis">nested_table_attributes</span> などの行で使用可能な構文については、Oracle の <span class="emphasis">CREATE TABLE</span> の実装を確認してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは、<span class="emphasis">ADD</span> を使用して列や制約を新たに追加でき、また <span class="emphasis">MODIFY</span> および <span class="emphasis">DROP</span> を使用して既存の列や制約を変更および削除できます。新しい列が追加される際、テーブルに行がない場合を除き、その列は <span class="emphasis">NULL</span> として定義されます。<span class="emphasis">MODIFY</span> キーワードを指定すると、以前に作成したテーブルの属性を変更できます。<span class="emphasis">MODIFY CONSTRAINT</span> を指定すると、<span class="emphasis">LOGGING</span>、<span class="emphasis">CACHE</span>、<span class="emphasis">MONITOR</span> を有効にするかどうか、および、記憶域エクステントを <span class="emphasis">ALLOCATE</span> や <span class="emphasis">DEALLOCATE</span> で割り当てるかどうかなど、テーブルの制約を削除または変更できます。また、テーブルの制約を有効化または無効化するには、<span class="emphasis">ENABLE</span> および <span class="emphasis">DISABLE</span> キーワードを使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">ALTER TABLE</span> は、高度な設定が可能ですが複雑です。コマンドの従属句の詳細については、<span class="emphasis">CREATE TABLE</span> ステートメントの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次のコードでは、Oracle のテーブルに、列および一意制約を新たに追加します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE titles
ADD subtitle VARCHAR2(32) NULL
CONSTRAINT unq_subtitle UNIQUE;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>外部キー制約をテーブルに追加する際は、テーブル内のすべての既存データがその制約に適合するかどうかが DBMS によって確認されます。適合しない場合、<span class="emphasis">ALTER TABLE</span> は失敗します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="literal">SELECT</span> <span class="literal">*</span> を使用するすべてのアプリケーションでは、計画外であったとしても、新しい列が返されます。一方、ストアドプロシージャーのようなプリコンパイル済みのオブジェクトは、新しい列を返しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、Oracle では、<span class="emphasis">ADD</span> や <span class="emphasis">MODIFY</span> などの複数のアクションを、複数の列に対して実行できます。アクションはかっこで囲みます。たとえば、次のコマンドでは、単一のステートメントでテーブルに複数の列を追加します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE titles
ADD (subtitles VARCHAR2(32) NULL,
   year_of_copyright INT,
   date_of_origin DATE);</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TABLE table [*]
[ADD [COLUMN] column_name datatype attributes]
| [ALTER [COLUMN] column_name {SET DEFAULT value | DROP DEFAULT}]
| [RENAME [COLUMN] column_name TO new_column_name]
| [RENAME TO new_table_name]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の <span class="emphasis">ALTER TABLE</span> の実装では、列 (column_name) の追加に <span class="emphasis">ADD</span>  キーワードを使用します。既存の列には、<span class="emphasis">ALTER COLUMN . . . SET DEFAULT</span> を使用して新しい初期設定値 (value) を設定でき、一方、<span class="emphasis">ALTER COLUMN . . . DROP DEFAULT</span> を使用すると、列ベースで初期設定値を完全に削除できます。また、<span class="emphasis">ALTER</span> 句を使用して新しい初期設定値を列に追加できますが、その値が設定されるのは新しく挿入された行のみです。<span class="emphasis">RENAME</span> を指定すると、既存の列およびテーブルの名前を、新しい列名 (new_column_name) やテーブル名 (new_table_name) に変更できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="ALTER TRIGGER">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">ALTER TRIGGER </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ALTER TRIGGER</span>   ステートメントは、権限や従属関係を変更せずに既存のトリガー定義を変更します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>現時点では、このコマンドの SQL99 標準はありません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TRIGGER trigger_name
ON {table_name | view_name}
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF} {[DELETE] [,] [INSERT] [,] [UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
  T-SQL_block
| [FOR { [INSERT] [,] [UPDATE] }
[NOT FOR REPLICATION]
AS

  { IF UPDATE(column) [{AND | OR} UPDATE(column)] [...n]
    |
    IF (COLUMNS_UPDATED(  ) {bitwise_operator} updated_bitmask)
    { comparison_operator} column_bitmask [...n] }
    T-SQL_block ] } ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">FOR | AFTER | INSTEAD OF { [DELETE] [,] [UPDATE] [,][INSERT] } | { [INSERT] [,] [UPDATE] }</span> を指定して、コマンドの影響を受けるデータ変更ステートメントトリガーを記述できます。これらのオプションのうち最低 1 つを指定する必要がありますが、コンマで区切ることによって、どのように組み合わせることもできます。<span class="emphasis">FOR</span> および <span class="emphasis">AFTER</span> オプションは基本的に同じもので、指定するとデータ操作処理の完了後にトリガーのコードが実行されます。<span class="emphasis">INSTEAD OF</span> キー句を指定すると、データ操作処理の代わりにトリガーのコードが実行されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH APPEND</span> 句を指定すると、指定タイプの追加トリガーが基本テーブルに追加されます。このオプションは、<span class="emphasis">FOR</span> トリガーでのみ使用できます。<span class="emphasis">NOT FOR REPLICATION</span> キー句を指定すると、<span class="emphasis">sqlrepl</span> などのレプリケーションログインによるアクションの場合、トリガーは実行されません。<span class="emphasis">IF UPDATE (column)</span> 句を指定すると、指定列で <span class="emphasis">INSERT</span> または <span class="emphasis">UPDATE</span> アクションが検査される (<span class="emphasis">DELETE</span> アクションは検査されない) ので、カーソルを使用した行ベースの操作時に非常に便利です。<span class="emphasis">{AND | OR}</span> 演算子を使用すると、同じ句に含まれる別の列を検査できます。<span class="emphasis">IF (COLUMNS_UPDATED( ))</span> を使用すると、指定した列が <span class="emphasis">INSERT</span> または <span class="emphasis">UPDATE</span> トリガーによって影響を受けたかどうかを調べられます。結果は、ビットごとの演算子として返されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER TRIGGER [user.]<span class="replaceable">trigger_name </span>[ENABLE | DISABLE | COMPILE [DEBUG] ];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のこのコマンドでは、トリガーの基底コードを完全に変更できません (ただし、Oracle の <span class="emphasis">CREATE OR REPLACE TRIGGER</span> の実装で同じ機能が実行できます)。Oracle の <span class="emphasis">ALTER TRIGGER</span> は、トリガーを有効化、無効化、または再コンパイルできます。<span class="emphasis">COMPILE [DEBUG]</span> オプションを指定すると、PL/SQL 情報が再生成されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、  トリガーはテーブルに対して<span class="emphasis">のみ</span>使用できます (ただし、<span class="emphasis">INSTEAD OF</span> トリガーはビューに対しても使用可)。Microsoft SQL Server では、トリガーをテーブルおよび更新可能なビューに対して使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="ALTER VIEW">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">ALTER VIEW</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>現時点では、SQL99 標準に <span class="emphasis">ALTER VIEW</span>   はありませんが、このコマンドをサポートする各主要ベンダーのアプリケーション間で動作が異なることに注意する必要があります。Oracle では、このコマンドはビューの再コンパイルに使用されます。Microsoft SQL Server では、このコマンドを使用して、従属するすべてのストアドプロシージャー、トリガーまたは権限を変更せずにビューを変更できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>現時点では、このコマンドの SQL99 標準はありません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER VIEW <span class="replaceable">view_name </span>[(<span class="replaceable">column</span> [,...n])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA]
AS
<span class="replaceable">select_statement</span>
[WITH CHECK OPTION]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE VIEW</span> ステートメントと同様に、<span class="emphasis">ALTER VIEW</span> を使用すると、ビュー (view_name) で列の名前付けに使用される列エイリアス (column [,n])、およびビューの中心コンポーネントの <span class="emphasis">SELECT</span> ステートメント全体 (select_statement) を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ALTER VIEW</span> ステートメントのその他の句については、<span class="emphasis">CREATE VIEW</span> ステートメントの項で説明しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、コマンドの実行後に列名が同じである場合のみ、列の権限が維持されます。<span class="emphasis">ENCRYPTION</span> キーワードを使用すると、SQL Server の syscomments システムテーブル内のビューコードを暗号化できます。<span class="emphasis">CHECK OPTION</span> キーワードを指定すると、ビューに対して実行したすべてのデータ変更が、ビューを定義している <span class="emphasis">select_statement</span> の基準に強制的に準拠されます。これらのオプションのいずれかが以前にビューに定義されていた場合、これらのオプションは <span class="emphasis">ALTER VIEW</span> ステートメントを使用して有効化する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ALTER VIEW [user.]<span class="replaceable">view_name </span>COMPILE</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">ALTER VIEW</span> ステートメントは、ビューを再コンパイルします。このコマンドは、基本テーブルを変更した後にビューを有効化するのに便利です。ビューは、基本テーブルが変更されても再コンパイルされない場合は無効となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例 </span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この SQL Server の例では、カリフォルニア (CA) 出身の作家を格納する <span class="emphasis">california_authors</span> というビューを作成します。次に、<span class="emphasis">ALTER VIEW</span> を使用して、そのビューを拡張および置換します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE VIEW california_authors
AS
SELECT au_lname, au_fname, city, state
FROM authors
WHERE state = 'CA'
WITH CHECK OPTION
GO

ALTER VIEW california_authors
AS
SELECT au_fname, au_lname, address, city, state, zip
FROM pubs..authors
WHERE state = "CA"
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CALL">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CALL </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CALL</span>  ステートメントはストアドプロシージャーを呼び出します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>未対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CALL procedure_name [(parameter [,...n] )]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CALL</span> ステートメントを使用すると、ストアドプロシージャーの呼び出しを簡単に行えます。呼び出すには、ストアドプロシージャーの名前 (procedure_name) を指定し、ストアドプロシージャーで使用される任意のパラメータ (parameter [,n]) をかっこで囲んで指定するだけです。ストアドプロシージャーに <span class="emphasis">OUT</span> パラメータしかない場合やパラメータがない場合は、空のかっこを指定することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">CALL</span> ステートメントはサポートされていません。ただし、ほぼ同じ機能を、<span class="emphasis">EXECUTE</span> ステートメントを使用することによって実行できます。SQL Server のこの拡張機能の詳細については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CALL [schema.][{type_name | package_name}.]procedure_name@dblink
[(parameter [,...n] )]
[INTO :variable_name [INDICATOR :indicator_name] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">CALL</span> ステートメントを使用して、スタンドアローンのストアドプロシージャー、関数、メソッドを呼び出せるだけでなく、あるタイプまたはパッケージに含まれるストアドプロシージャーや関数も呼び出せます。別のデータベース内のプロシージャーや関数を呼び出すには、dblink ステートメントを <span class="emphasis">CALL</span> ステートメントの一部として使用し、オブジェクトの場所を指定してそのデータベースを宣言します。dblink は以前に作成したデータベースリンクを参照しなければなりません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>呼び出すルーチンが関数の場合、Oracle では、<span class="emphasis">INTO</span> 句を指定する必要があります。反対に言えば、関数を呼び出す場合にのみ INTO 句を使用することができます。INTO 句には、関数によって返される値を格納する変数を指定する必要があります。最後に、関数がプリコンパイル済みの Pro*C/C++ ルーチンの場合、ホスト変数の状態を保持するために INDICATOR 句で指示子も指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、シンプルなストアドプロシージャーを作成し、そのプロシージャーを個別に呼び出します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE PROCEDURE update_employee_salary
(emp_id NUMBER, updated_salary NUMBER)
IS
BEGIN
  UPDATE employee SET salary = updated_salary WHERE employee_id =emp_id ;
END;

CALL update_employee_salary(1517, 95000);</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CASE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CASE </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CASE</span>    関数を使用すると、<span class="emphasis">SELECT</span> または <span class="emphasis">UPDATE</span> ステートメント内で条件分岐処理の <span class="emphasis">IF-THEN-ELSE</span> 機能を実行できます。この関数は条件リストを評価し、いくつかの候補値の中から 1 つの値を返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>対応</td>
								</tr>
								<tr><td>Oracle</td><td>未対応 (同様の機能については、ベンダーのマニュアルにある <span class="emphasis">DECODE</span> 関数の説明を参照してください)</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CASE</span> には、単純 CASE および検索 CASE の 2 つがあります。単純 <span class="emphasis">CASE</span> 式は、1 つの値 (<span class="emphasis">input_value</span>) を他の値のリストと比較し、最初に一致した値に関連する結果を返します。検索 <span class="emphasis">CASE</span> 式はいくつかの論理条件を分析し、最初に真となった条件に関連する結果を返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- Simple comparison operation
CASE input_value
WHEN when_condition THEN resulting_value
[...n]
[ELSE else_result_value]
END

-- Boolean searched operation
CASE
WHEN Boolean_condition THEN resulting_value
[...n]
[ELSE else_result_expression]
END</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>単純 <span class="emphasis">CASE</span> 関数では、<span class="emphasis">input_value</span> の値が各 <span class="emphasis">WHEN</span> 句に対して評価されます。<span class="emphasis">resulting_value</span> は、<span class="emphasis">input_value</span> = <span class="emphasis">when_condition</span> が最初に TRUE となった場合に返されます。<span class="emphasis">when_condition</span> が TRUE として評価されない場合、<span class="emphasis">else_result_value</span> が返されます。<span class="emphasis">else_result_value</span> を指定しない場合、NULL が返されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>より複雑なブール値検索処理では、各 <span class="emphasis">WHEN</span> 句に独自のブール値比較処理を設定する以外は、式の構造は単純比較処理と基本的に同じです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>どちらでも、複数の <span class="emphasis">WHEN</span> 句を使用できますが、<span class="emphasis">ELSE</span> 句の指定は 1 つのみです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CASE</span> 関数を使用して contract 列の表示をより明確にする単純比較処理の例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT  au_fname,
        au_lname,
        CASE contract
            WHEN 1 THEN 'Yes'
            ELSE 'No'
        END 'contract'
FROM    authors
WHERE   state = 'CA'</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次に <span class="emphasis">SELECT</span> ステートメント内に指定した複雑な検索 <span class="emphasis">CASE</span> 関数の例を示します。ここでは、年間の売上数の範囲ごとのタイトル数をレポートします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT CASE
           WHEN ytd_sales IS NULL  THEN 'Unknown'
           WHEN ytd_sales &lt;=   200 THEN 'Not more than 200'
           WHEN ytd_sales &lt;=  1000 THEN 'Between  201 and  1000'
           WHEN ytd_sales &lt;=  5000 THEN 'Between 1001 and  5000'
           WHEN ytd_sales &lt;= 10000 THEN 'Between 5001 and 10000'
           ELSE 'Over 10000'
       END 'YTD Sales',
       COUNT(*) 'Number of Titles'
FROM   titles
GROUP BY CASE
           WHEN ytd_sales IS NULL  THEN 'Unknown'
           WHEN ytd_sales &lt;=   200 THEN 'Not more than 200'
           WHEN ytd_sales &lt;=  1000 THEN 'Between  201 and  1000'
           WHEN ytd_sales &lt;=  5000 THEN 'Between 1001 and  5000'
           WHEN ytd_sales &lt;= 10000 THEN 'Between 5001 and 10000'
           ELSE 'Over 10000'
         END
ORDER BY MIN( ytd_sales )</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次にこの結果を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>YTD Sales              Number of Titles
---------------------- ----------------
Unknown                2
Not more than 200      1
Between  201 and  1000 2
Between 1001 and  5000 9
Between 5001 and 10000 1
Over 10000             3</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>すべてのタイトルに割引を適用する <span class="emphasis">UPDATE</span> ステートメントの例を次に示します。以下に続く、より複雑なコマンドでは、パーソナルコンピュータ関連のすべてのタイトルに対して 25%、その他のタイトルに対して 10%、および会計年度内の売上が 10,000 ユニット以上のタイトルに対して 5% の割引を適用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の <span class="emphasis">UPDATE</span> クエリーでは、価格調整に検索 <span class="emphasis">CASE</span> 式が使用されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE  titles
SET     price = price *
        CASE
            WHEN ytd_sales &gt; 10000     THEN 0.95  -- 5% discount
            WHEN type = 'popular_comp' THEN 0.75  -- 25% discount
            ELSE 0.9                              -- 10% discount
        END
WHERE   pub_date IS NOT NULL</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この UPDATE ステートメントでは、1 つのステートメントで 3 つの異なる更新処理が完了します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CAST">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CAST </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CAST</span>  コマンドは、1 つのデータタイプの式を別のデータタイプに明示的に変換します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>未対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CAST(expression AS data_type[(length)])</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CAST</span> 関数は、列の値や変数などの任意の式を別の定義済みのデータタイプに変換します。データタイプの長さは、長さを持つ <span class="emphasis">CHAR</span> や <span class="emphasis">VARCHAR</span> などのデータタイプに対してオプションで指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DECIMAL</span> 値から <span class="emphasis">INTEGER</span> 型への変換など、特定の変換では、値が丸められる場合があります。また、変換後の値を表すのに十分な領域が新しく指定したデータタイプにない場合は、エラーが発生する場合があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この例では、会計年度内の売上を <span class="emphasis">CHAR</span> 型として取得し、そのデータを文字列および本のタイトルの一部と連結します。例では、<span class="emphasis">ytd_sales</span> を <span class="emphasis">CHAR(5)</span> に変換し、<span class="emphasis">title</span> の長さを短くし、結果を読みやすくします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT CAST(ytd_sales AS CHAR(5)) + "Copies sold of " + CAST(title AS
VARCHAR(30))
FROM titles
WHERE ytd_sales IS NOT NULL
  AND ytd_sales &gt; 10000
ORDER BY ytd_sales DESC</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次にこの結果を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>---------------------------------------------------
22246 Copies sold of The Gourmet Microwave
18722 Copies sold of You Can Combat Computer Stress
15096 Copies sold of Fifty Years in Buckingham Pala</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CLOSE CURSOR">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CLOSE CURSOR</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CLOSE CURSOR</span>   コマンドは、<span class="emphasis">DECLARE CURSOR</span> ステートメントで作成したサーバーサイドカーソルを閉じます。MySQL では、サーバーサイドカーソルをサポートしていませんが、広範な C プログラミング拡張はサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CLOSE { cursor_name }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">cursor_name</span> には、<span class="emphasis">DECLARE CURSOR</span> コマンドで作成したカーソルの名前を指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Microsoft SQL Server の例では、カーソルを開き、すべての行を取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE employee_cursor CURSOR FOR
  SELECT lname, fname
  FROM pubs.dbo.authors
  WHERE lname LIKE 'K%'

OPEN employee_cursor

FETCH NEXT FROM employee_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
  FETCH NEXT FROM Employee_Cursor
END

CLOSE employee_cursor

DEALLOCATE employee_cursor</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server の <span class="emphasis">DEALLOCATE</span> ステートメントは、カーソルが使用していたリソースとデータ構造を解放しますが、Oracle、PostgreSQL、および MySQL ではこのステートメントを使用しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="COMMIT TRANSACTION">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">COMMIT TRANSACTION</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">COMMIT</span>  <span class="emphasis">TRANSATION</span> ステートメントは、<span class="emphasis">BEGIN</span> で明示的に開いたトランザクション、または <span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、<span class="emphasis">DELETE</span> ステートメントで暗黙的に開いたトランザクションを明示的に終了します。このコマンドを使用すると、データ操作処理を手動で完了できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>COMMIT [WORK]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">COMMIT</span> には、1 つまたはグループのデータ操作処理の終了以外にも、トランザクションの別の側面に対して興味深い効果があります。効果の 1 つ目は、開いている関連カーソルがすべて閉じられることです。2 つ目の効果として、<span class="emphasis">ON COMMIT DELETE ROWS</span> で指定した任意の一時テーブルのデータが消去されます。3 つ目として、トランザクションによって行われたすべてのロックが解放されます。最後に、すべての遅延制約がチェックされます。遅延制約に違反がある場合、トランザクションはロールバックされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 では、次のステートメントのいずれかを実行すると、トランザクションが<span class="emphasis">暗黙的に開かれ</span>ます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><span class="emphasis">ALTER </span></li><li><span class="emphasis">CLOSE </span></li><li><span class="emphasis">COMMIT AND CHAIN</span> (SQL99 の新機能)</li><li><span class="emphasis">CREATE </span></li><li><span class="emphasis">DELETE </span></li><li><span class="emphasis">DROP </span></li><li><span class="emphasis">FETCH </span></li><li><span class="emphasis">FREE LOCATOR </span></li><li><span class="emphasis">GRANT </span></li><li><span class="emphasis">HOLD LOCATOR</span></li><li><span class="emphasis">INSERT </span></li><li><span class="emphasis">OPEN </span></li><li><span class="emphasis">RETURN</span></li><li><span class="emphasis">REVOKE</span></li><li><span class="emphasis">ROLLBACK AND CHAIN </span>(SQL99 の新機能)</li><li><span class="emphasis">SELECT </span></li><li><span class="emphasis">START TRANSACTION </span>(SQL99 の新機能)</li><li><span class="emphasis">UPDATE </span></li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 では、省略可能な新しい <span class="emphasis">AND CHAIN</span> キーワードが用意されています。このコマンドに対応しているベンダーはまだありません。この新しい構文を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>COMMIT [WORK] [AND [NO] CHAIN]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AND CHAIN</span> オプションを指定すると、後に続くトランザクションが先行するトランザクションの一部であるかのように処理されます。実際は、2 つのトランザクションは別々の処理単位ですが、トランザクション隔離レベルなどの共通のトランザクション環境が共有されます。<span class="emphasis">AND NO CHAIN</span> オプションを指定すると、単に 1 つのトランザクションが終了されます。<span class="emphasis">COMMIT</span> コマンドは、<span class="emphasis">COMMIT WORK AND NO CHAIN</span> コマンドの機能と同じです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>COMMIT [TRAN[SACTION] [transaction_name | @tran_name_variable] ]
|
COMMIT [WORK]
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、特定の指定トランザクションを永続的なものにすることができます。<span class="emphasis">COMMIT</span> コマンドは、<span class="emphasis">BEGIN TRAN</span> コマンドとペアで使用する必要があります。<span class="emphasis">COMMIT TRANSACTION</span> の構文では、終了するトランザクション (transaction_name) を明示的に指定したり、トランザクション名を変数 (@tran_name_variable) に格納したりできます。不思議なことですが、SQL Server では、指定したトランザクションの名前にかかわらず、最後に開いたトランザクションのみがコミットされます。<span class="emphasis">COMMIT WORK</span> を使用する場合、トランザクション名またはトランザクション名を格納している変数は指定できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ただし、この構文は、名前付きのトリガーがネストする場合は紛らわしくなります。というのは、この構文は最も外側のトランザクションを閉じるからです。SQL Server のトランザクションは、<span class="emphasis">@@TRANCOUNT</span> グローバル変数の数値で識別されます。<span class="emphasis">@@TRANCOUNT</span> が 0 の場合のみ、すべてのトランザクションがコミットされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>COMMIT [WORK];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では指定トランザクションを特に認めていません (セーブポイントは使用可)。したがって、最後に <span class="emphasis">COMMIT</span> ステートメントが明示的または暗黙的に実行された時点から、単純にすべてのデータ操作処理が確定されます。Oracle では、<span class="emphasis">WORK</span> キーワードを使用できますが、常に省略可能です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>COMMIT [WORK | TRANSACTION];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">WORK</span> および <span class="emphasis">TRANSACTION</span> キーワードは共に省略可能です。コマンドの効力は、どちらのキーワードを指定しても、または指定しなくても同じです。完了時には、コミットされたトランザクションはすべてディスクに書き込まれ、他のユーザーに表示されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT INTO sales VALUES('7896','JR3435','Oct 28
1997',25,'Net
60','BU7832');

COMMIT WORK;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="連結演算子">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">連結演算子</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT</span> の結果セット内で複数列のデータを連結して 1 つの列にする必要がある場合、DBMS でサポートされている連結記号を使用して連結できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT lname || ', ' || fname FROM customers WHERE cust_id = 41;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコード例で示されているように、ANSI 規格の連結記号は、 2 重パイプ記号 (<span class="literal">||</span>) で、Oracle および PostgreSQL でサポートされています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、連結記号として プラス記号 (+) を使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、<span class="emphasis">CONCAT(string1, numeric1, string2, numeric2 [,...n])</span> 関数を連結に使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CONNECT">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CONNECT</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CONNECT</span>   ステートメントは、DBMS や DBMS 内の指定データベースへの接続を確立します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>制限付き対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CONNECT [TO] DEFAULT
| {[server_specification] [AS connection_name] [USER user_name ] }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>明示的に接続を切らずに、<span class="emphasis">CONNECT</span> ステートメントが呼び出された場合、古いセッションが停止し、新しいセッションがアクティブになります。通常、<span class="emphasis">CONNECT</span> と <span class="emphasis">DISCONNECT</span> ステートメントを発行する間の期間が、<span class="emphasis">セッション</span>と呼ばれています。一般的に、ユーザーは明示的に起動したセッション期間に、DBMS 上のすべての処理を完了します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のツールである SQL*Plus では、<span class="emphasis">CONNECT</span> コマンドの使用方法がいくぶん異なります。これは、ユーザーを特定のスキーマに接続するためです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CONNECT TO DEFAULT</span> ステートメントは、ベンダーごとに実装が異なるので、多少異なる結果を返します。ただし標準では、ユーザー認証および現行データベースがデフォルトのサーバーでデフォルトセッションを開始するコマンドです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CONNECT TO DEFAULT</span> とは対照的に、<span class="emphasis">CONNECT TO server_name</span> では、サーバーを指定できます。ここでは、明示的に指定したサーバーに接続します。さらに、<span class="emphasis">AS</span> で接続名を、<span class="emphasis">USER</span> でユーザー名を宣言できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CONN[ECT] [[username/password] [AS [SYSOPER | SYSDBA] ] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CONNECT</span> 句に特定のユーザー名 (username) を指定して、データベースに接続できます。または、<span class="emphasis">AS SYSOPER</span> や <span class="emphasis">AS SYSDBA</span> などの特別な権限を使った接続を確立できます。別の接続が既に開かれている場合、<span class="emphasis">CONNECT</span> は開いているすべてのトランザクションをコミットし、現行のセッションを閉じて新しいセッションを開きます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">CONNECT</span> コマンドを明示的にサポートしていません。ただし、SPI (Server Programming Interface) において <span class="emphasis">SPI_CONNECT</span> ステートメントをサポートし、PG/tcl プログラミングパッケージにおいて <span class="emphasis">PG_CONNECT</span> ステートメントをサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>特定のユーザー ID を使用して接続するには、ユーザーまたは自動化プログラムは次のコマンドを発行します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CONNECT TO USER pubs_admin</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>指定接続が必要な DBMS の場合、次の代替構文を使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CONNECT TO USER pubs_admin AS pubs_administrative_session;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、Embedded SQL (ESQL) でのみ <span class="emphasis">CONNECT TO</span> をサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>EXEC SQL CONNECT TO new_york.pubs USER pubs_admin</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE DATABASE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE DATABASE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>実際は、SQL99 に <span class="emphasis">CREATE DATABASE</span>   ステートメントは含まれていません。<span class="emphasis">CREATE DATABASE</span> に最も近い SQL99 のステートメントは、<span class="emphasis">CREATE SCHEMA</span> および <span class="emphasis">CREATE CATALOG</span> です。<span class="emphasis">CREATE SCHEMA</span> の詳細については後で説明します。ただし、SQL データベースを操作するにはこのコマンドは不可欠です。ほぼすべてのベンダーが、このコマンドまたはこのコマンドの変則バージョンをサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE database_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この構文では、<span class="emphasis">database_name</span> が新たに作成するデータベースの識別子です。このコマンドは、指定した名前の空のデータベースを新たに作成します。ほとんどのベンダーでは、新しいデータベースを作るユーザーは、root、master、または system database の権限を持つことが要求されます。新しいデータベースを作成したら、そのデータベースにテーブル、ビュー、トリガーなどのデータベースオブジェクトを入れることができ、テーブルにはデータを格納できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server および Oracle では、データベースは、事前に作成されたファイル構造内でインスタンス化されます。これらのファイルは、データベースシステムとオペレーティングシステムの仲介役として働きます。その結果、SQL Server 版と Oracle 版の <span class="emphasis">CREATE DATABASE</span> は、同様により高度化されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次に、Microsoft SQL Server の構文を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE DATABASE database_name
[ ON [PRIMARY]
[ &lt;file&gt; [,...n] ]
[, &lt;file_group&gt; [,...n] ]
]
[ LOG ON { &lt;file&gt; [,...n]} ]
[ FOR LOAD | FOR ATTACH ]
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この実装では、データベースの名前 (database_name) を指定できるだけでなく、データベースを格納する場所も指定できます。Oracle および SQL Server は共に、データベースのリポジトリとして機能する<span class="emphasis">ファイル</span> (ディスク構造上に作成された事前定義領域) を使用します。データベースは、ファイル (file) やファイルグループ (file_group) に格納されます。また、SQL Server では、<span class="emphasis">LOG ON</span> 句を使用して、データベースとは別の場所にトランザクションログを格納できます。これらの機能によって、ディスク I/O を最適に制御するための高度なファイル計画が可能となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOR LOAD</span> 句を指定すると、データベースの作成後に、バックアップがデータベースに直ちに読み込まれ、最初の作成時間が短縮されます。<span class="emphasis">FOR ATTACH</span> 句を指定すると、DVD-ROM、CD-ROM、またはポータブルハードディスクなどの既存のオペレーティングシステムのファイル構造をデータベースにアタッチできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL と PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の <span class="emphasis">CREATE DATABASE</span> は、基本的にデータベースオブジェクトを格納する新しいディレクトリを作成します。つまり、これらのベンダーでは、データベースの作成はファイルシステムディレクトリの作成とほぼ同じです。データベースはベンダーアプリケーションのメインディレクトリ下にディレクトリとして作成され、データベース内に新たに作成するすべてのオブジェクトはそのフォルダ内に格納されます。これは PostgreSQL でも同じですが、PostgreSQL では、<span class="emphasis">WITH LOCATION</span> オプションを使用して、データベースの場所を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE DATABASE name [ WITH LOCATION = 'dbpath' ];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>たとえば、データベース <span class="emphasis">sales_revenue</span> を <span class="emphasis">/home/teddy/private_db</span> ディレクトリに作成するには、次のように指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE DATABASE sales_revenue WITH LOCATION = '/home/teddy/private_db';</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE DATABASE [database_name]
[CONTROLFILE REUSE]
[LOGFILE [GROUP1 integer] file1 integer [K | M] [,...n] [REUSE]]
   [MAXLOGFILES integer]
   [[MAXLOGMEMBERS] integer]
   [[MAXLOGHISTORY] integer]
[DATAFILE file1 [AUTOEXTEND [,...n] [ON | OFF]]
      [NEXT integer [K | M]]
      [MAXSIZE [UNLIMITED | integer [K | M]]
   [MAXDATAFILES integer]
   [,...n]]
[MAXINSTANCES integer]
[MAXDATAFILES integer]
[ARCHIVELOG | NOARCHIVELOG]
{CHARACTER SET charset}
{NATIONAL CHARACTER SET charset};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">CREATE DATABASE</span> は非常に強力なコマンドであるため、経験のあるデータベース管理者のみが使用してください。あまり経験のないユーザーが使用すると、このコマンドによって、既存のデータベースを破損してしまう可能性があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server と同様に Oracle でも、単なるデータベース名やデータベースファイルのパスの指定だけでなく、データベースファイル構造を扱う高度なレベルの操作性が提供されています。また、Oracle の環境に特有な <span class="emphasis">INIT.ORA</span> ファイルによって、データベースを作成および起動する際のデータベース名とその他の様々なオプションを指定します。<span class="emphasis">INIT.ORA</span> ファイルは常に使用し、このファイルに制御ファイルを指定する必要があります。そうしなければ、データベースは起動しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">file1 [,...n]</span> オプションを使用する場合、次のフォーマットでファイル名およびファイルサイズ (バイト、キロバイト、またはメガバイト単位) を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>'file_path_and_name' SIZE bytes [K | M] REUSE</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">[K | M]</span> オプションを使用すると、ファイルのバイトサイズはそれぞれ、1024 または 1048576 で乗算されます。<span class="emphasis">REUSE</span> オプションを使用すると、ファイルが存在しない場合はファイルを作成し、存在する場合は再利用します。<span class="emphasis">CONTROLFILE REUSE</span> オプションを指定すると、制御ファイルが上書きされます。同様に、<span class="emphasis">LOGFILE . . . REUSE</span> を指定すると、ログファイルが上書きされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ログファイルをグループでリストする場合、通常は、かっこで囲みます。メンバーが 1 つのみのグループを作成する場合、かっこは必要ありませんが、そのような場合はあまりありません。ログファイルのリストをかっこで囲んだ例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE DATABASE publications
LOGFILE ('/s01/oradata/loga01','/s01/oradata/loga02') SIZE 5M
DATAFILE</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>さらに、<span class="emphasis">LOGFILE</span> および <span class="emphasis">DATAFILE</span> オプションとサブオプションを指定すると、データベースの REDO ログファイルおよびデータベースファイルのサイズと拡張パターンを厳密に制御できます。<span class="emphasis">MAXLOGFILES</span> および <span class="emphasis">MAXDATAFILES</span> は、作成可能な REDO ログファイルとデータベースファイルの最大数をそれぞれ定義します。<span class="emphasis">AUTOEXTEND</span> が有効な場合、<span class="emphasis">UNLIMITED</span> に設定されていない限り、<span class="emphasis">NEXT</span> で指定したサイズずつ、<span class="emphasis">MAXSIZE</span> で指定したサイズまでデータファイルが拡張します。<span class="emphasis">MAXLOGMEMBERS</span> は、コピー可能な REDO ロググループの最大数を制御します。Oracle Parallel Server で使用する <span class="emphasis">MAXLOGHISTORY</span> を指定すると、適切な領域が制御ファイル内に記録されるように、アーカイブ REDO ログファイルの最大数が制御されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">MAXINSTANCES</span> パラメータは、作成したデータベースを同時にマウントできるインスタンスの最大数を設定します。<span class="emphasis">ARCHIVELOG</span> と <span class="emphasis">NOARCHIVELOG</span> は、相互に排他的なオプションで、REDO ログの運用方法を定義します。<span class="emphasis">ARCHIVELOG</span> を指定すると、データは追加のアーカイブファイルに保存され、メディアのリカバリに使用できます。どちらのオプションを指定してもリカバリ可能ですが、<span class="emphasis">NOARCHIVELOG</span> (デフォルト) では通常、メディア障害をリカバリできません。<span class="emphasis">CHARACTER SET</span> は、オペレーティングシステムに依存し、格納されるデータの言語および文字セットを制御します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE FUNCTION">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE FUNCTION</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE FUNCTION</span> ステートメントは<span class="emphasis">ユーザー定義関数</span> (UDF) を作成します。UDF は入力引数をとり、<span class="emphasis">CAST( )</span> と同様に、1 つの値を返します。UDF は、他のシステム関数と同様にクエリー内部で呼び出すことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL 関数およびベンダー間の個々の実装の詳細については、第 4 章を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>データベースプログラマーは <span class="emphasis">CREATE FUNCTION</span> ステートメントを使用して、ユーザー定義関数を作成できます。作成した関数は、<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、および <span class="emphasis">DELETE</span> ステートメントの <span class="emphasis">WHERE</span> 句などのクエリーやデータ操作処理で呼び出すことができます。このステートメントの基本構文は次に示すとおりですが、ベンダーによる実装方法は大きく異なるので、本項ではこの後に、それぞれの実装方法を説明します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION function_name
[(parameter datatype attributes [,...n])]
RETURNS datatype

  [LANGUAGE {ADA | C | FORTRAN | MUMPS | PASCAL | PLI | SQL}]
  [PARAMETER STYLE {SQL | GENERAL}]
  [SPECIFIC specific_name]
  [DETERMINISTIC | NOT DETERMINISTIC]
  [NO SQL | CONTAINS SQL | READS SQL DATA | MODIFIES SQL DATA]
  [RETURNS NULL ON NULL INPUT | CALL ON NULL INPUT]
  [STATIC DISPATCH]

code block</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 標準の <span class="emphasis">CREATE FUNCTION</span> ステートメントには、主なコンポーネントの他にも、あまり使用されないより高度なコンポーネントが用意されています。ほとんどの UDF では、ユーザーは、関数名、任意の入力パラメータ、および UDF が返す値のデータタイプを定義します。これらによって、コマンドの基本的な用法が決まります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 標準では、さらに多くの指定が可能です。<span class="emphasis">LANGUAGE</span> 句を指定すると、関数を記述する言語 (PostgreSQL など) を宣言できます。<span class="emphasis">PARAMETER STYLE</span> 句を使用すると、典型的な SQL スタイル以外のパラメータスタイルを <span class="emphasis">GENERAL</span> キーワードで宣言できます。デフォルトは SQL です。<span class="emphasis">SPECIFIC</span> 宣言は、ユーザー定義型の関数名をさらに制限指定するために使用します。<span class="emphasis">DETERMINISTIC</span> または <span class="emphasis">NOT DETERMINISTIC</span> 句を指定すると、関数に同じ入力パラメータを与えた場合、常に同じ結果を返す (決定性である) かどうかを、ホスト DBMS に指示します。決定性の関数のみが制約内で使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL データアクセス句の <span class="emphasis">NO SQL</span> を指定すると、関数に SQL コードは含まれせんが、<span class="emphasis">CONTAINS SQL</span> では含まれます。<span class="emphasis">READS SQL DATA</span> を指定すると、関数で <span class="emphasis">SELECT</span> または <span class="emphasis">FETCH</span> ステートメントを使用でき、<span class="emphasis">MODIFIES SQL DATA</span> を指定すると、任意のデータ変更ステートメントを使用できます。デフォルトは <span class="emphasis">CONTAINS SQL</span> です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>NULL を処理できないホスト言語に対しては、<span class="emphasis">RETURNS NULL ON NULL INPUT</span> を宣言し、関数が NULL を処理した際に NULL を返すようにします。反対に、<span class="emphasis">CALL ON NULL INPUT</span> (デフォルト) では、NULL パラメータを通常どおりに処理し、結果が不定となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">STATIC DISPATCH</span> 句は、ユーザー定義型または <span class="emphasis">ARRAYS</span> 型を使用するパラメータを含む非 SQL 関数に対して使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION [owner_name.]function_name
( [ {@parameter1 datatype [=default]} [,...n] ] )
RETURNS {datatype | TABLE]
[WITH {ENCRYPTION | SCHEMABINDING}]
AS &lt;Transact-SQL body&gt;
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p> SQL Server の関数は、<span class="emphasis">TABLE</span> データタイプを介して複数の値を返すことができます。<span class="emphasis">TABLE</span> データタイプは、付随する列リストがなく、単一の <span class="emphasis">SELECT</span> ステートメントで定義されている場合、<span class="emphasis">インライン</span>と見なされます。<span class="emphasis">RETURN</span> 句が <span class="emphasis">TABLE</span> データタイプを介して複数の値を返すときに、<span class="emphasis">TABLE</span> が列および列のデータタイプを定義している場合、この関数は<span class="emphasis">複数ステートメント</span>のテーブル値関数です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、作成するユーザー定義関数にユーザー定義パラメータを宣言する必要があります。SQL Server の <span class="emphasis">timestamp</span> 以外のすべてのデータタイプがパラメータとしてサポートされています。関数は、<span class="emphasis">timestamp</span>、<span class="emphasis">text</span>、<span class="emphasis">ntext</span>、<span class="emphasis">image</span> 以外の任意のデータタイプの値を返すことができます。インラインテーブル値が必要な場合、列リストを伴わない <span class="emphasis">TABLE</span> オプションを使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server のユーザー定義関数は、SQL Server の他の多くのデータベースオブジェクトと同様、<span class="emphasis">ENCRYPTION</span> または <span class="emphasis">SCHEMABINDING</span> オプションを指定して作成できます。<span class="emphasis">ENCRYPTION</span> オプションを指定すると、関数のテキストを格納するシステム列テーブルが暗号化されるので、関数コードが無許可で参照されないようにできます。<span class="emphasis">SCHEMABINDING</span> オプションを指定すると、テーブルやビューなどの特定のデータベースオブジェクトに関数がバインドされます。バインドされたデータベースオブジェクトは、その関数が存在しているか、その関数に <span class="emphasis">SCHEMABINDING</span> オプションが指定されている限り、変更も削除もできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Transact-SQL のコード本体には、インライン関数用に単一の <span class="emphasis">SELECT</span> ステートメントを <span class="emphasis">RETURN (SELECT . . . )</span> のフォーマットで指定するか、複数ステートメント操作用に一連の Transact-SQL ステートメントを指定します。<span class="emphasis">BEGIN . . . END</span> ブロック内に保持される Transact-SQL ステートメント本体は、データを恒久的には変更できず、その他の継続する副作用も発生させることはできません。このブロックの最後のステートメントには、単一のデータタイプの値または <span class="emphasis">TABLE</span> 値を返す無条件の <span class="emphasis">RETURN</span> ステートメントを指定する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Transact-SQL ブロックには、<span class="emphasis">@@CONNECTIONS</span> や <span class="emphasis">GETDATE</span> などの、異なる値を返すグローバル変数は使用できません。ただし、<span class="emphasis">@@SERVERNAME</span> などの、同じ結果値を返す変数は使用できます。コードはデータを恒久的に変更したり、その他の継続する副作用を発生させることができないため、その他にも多くの制限があります。たとえば、<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、および <span class="emphasis">DELETE</span> ステートメントで変更できるのは、その関数にローカルな <span class="emphasis">TABLE</span> 変数のみです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>1 つの値を返すスカラー関数の例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION metric_volume -- Input dimensions in centimeters.
   (@length decimal(4,1),
   @width decimal(4,1),
   @height decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
AS BEGIN
      RETURN ( @length * @width * @height )
   END
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このユーザー定義関数は、その他の関数同様、クエリーや他の処理で利用できます。たとえば、すべての建設プロジェクト (housing_construction) から、容積が 300,000 立法メートル以上のプロジェクト名 (project_name) とその容積 (metric_volume) を検索するには次のように記述します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT project_name,
   metric_volume(construction_height,
      construction_length,
      construction_width)
FROM housing_construction
WHERE metric_volume(construction_height,
      construction_length,
      construction_width) &gt;= 300000
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブルの値を返すユーザー定義関数は、結果セット値として使用したり、通常のテーブルと同じように、<span class="emphasis">SELECT</span> ステートメントの <span class="emphasis">FROM</span> 句内で使用したりします。<span class="emphasis">FROM</span> 句内では、通常のテーブル同様、テーブルエイリアス関数を割り当てることができます。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT co.order_id, co.order_price
FROM   construction_orders AS co,
       fn_construction_projects('Cancelled') AS fcp
WHERE  co.construction_id = fcp.construction_id
ORDER BY co.order_id
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [AGGREGATE] FUNCTION function_name
RETURNS {STRING | REAL | INTEGER}
SONAME shared_program_library_name ;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の <span class="emphasis">CREATE FUNCTION</span> で <span class="emphasis">AGGREGATE</span> オプションを使用すると、<span class="emphasis">SUM( )</span> および <span class="emphasis">COUNT( )</span> などのようにユーザー定義関数を集計できます。戻り値の型は、文字データは <span class="emphasis">STRING</span> 型、浮動小数点数は <span class="emphasis">REAL</span> 型、整数は <span class="emphasis">INTEGER</span> 型を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の <span class="emphasis">CREATE FUNCTION</span> の実装は、オペレーティングシステム上の手続きコードは、動的ロードに対応した C/C++ でなければならないため、他のベンダーと大きく異なります。C/C++ プログラムの指定には、<span class="emphasis">shared_program_library_name</span> オプションを使用します。関数は、MySQL サーバーに直接コンパイルして永続的に使用することも、動的な呼び出しプログラムとすることもできます。ユーザー定義関数は C/C++ プログラムとして書かれるため、本マニュアルではこの実装について説明しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [OR REPLACE] FUNCTION [owner_name.]function_name
[(parameter1 [IN | OUT | IN OUT] [NOCOPY] datatype][,...n)]]
RETURN datatype [DETERMINISTIC | AUTHID {CURRENT_USER | DEFINER} ]
  {IS | AS} {PL/SQL block | external program};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の ユーザー定義関数とストアドプロシージャーは、構成および構造において非常に似ています。主な違いは、ストアドプロシージャーが呼び出しプロセスに対して値を返すことができないのに対して、関数は、呼び出しプロセスに 1 つの値を返すことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のユーザー定義関数で指定する引数とパラメータには、<span class="emphasis">IN</span>、<span class="emphasis">OUT</span>、および <span class="emphasis">IN OUT</span> があります。<span class="emphasis">IN</span> 修飾子は関数を呼び出すときに指定して、関数に値を渡します。<span class="emphasis">OUT</span> 引数は呼び出しプロセスに値を返します。つまり、<span class="emphasis">IN</span> 修飾子は、関数を呼び出すユーザーまたはプロセスによって提供され、<span class="emphasis">OUT</span> 引数は関数によって返されます。<span class="emphasis">IN OUT</span> 引数は <span class="emphasis">IN</span> および <span class="emphasis">OUT</span> の両方の機能を実行します。<span class="emphasis">OUT</span> または <span class="emphasis">IN OUT</span> 引数が VARRAY や RECORD データタイプのように非常に大きな場合、NOCOPY キーワードを使用するとパフォーマンスが向上します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURN</span> キーワードで関数の戻り値のデータタイプを指定します。<span class="emphasis">DETERMINISTIC</span> キーワードを使用すると、関数は明示的に決定性として宣言され、処理が高速化されます。戻り値は、マテリアライズドビュー、同じ関数に対する別の関数の同時呼び出し、または関数ベースのインデックスから格納されます。また、現行ユーザーや関数の所有者がそれぞれ <span class="emphasis">AUTHID CURRENT_USER</span> または <span class="emphasis">AUTHID DEFINER</span> 句を使用する場合の権限で、関数を強制的に実行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>たとえば、次の関数では、プロジェクト名を指定して建設プロジェクトの利益を求めることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION project_revenue (project IN varchar2)
RETURN NUMBER
AS
   proj_rev NUMBER(10,2);
BEGIN
   SELECT SUM(DECODE(action,'COMPLETED',amount,0)) -
          SUM(DECODE(action,'STARTED',amount,0))   +
          SUM(DECODE(action,'PAYMENT',amount,0))
   INTO proj_rev
   FROM construction_actions
   WHERE project_name = project;
   RETURN (proj_rev);
END;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この例のユーザー定義関数 (project_revenue) では、プロジェクト名を引数として受け取ります。次に、決済金額から初期費用を減算し、その他の支払い金額を加算することによって、プロジェクトの利益が計算されます。<span class="literal">RETURN (proj_rev);</span> の行で、呼び出しプロセスに合計値を返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION name ( [ parameter1 [,...n] ] )
RETURNS datatype
AS {definition | object_file, link_symbol}
LANGUAGE {'C' | 'SQL' | 'PLPGSQL' | 'PLTCL' | 'PLTCLU' | 'PLPERL'
   | 'internal'}
[WITH ISCACHABLE];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE FUNCTION</span> の実装に関しては、PostgreSQL が最も柔軟に対応しています。その他の実装と同様、<span class="emphasis">パラメータ</span>が呼び出され、指定したデータタイプの値が返されます。また、PostgreSQL では、 関数を<span class="emphasis">オーバーロード</span>でき、関数が別の入力パラメータを受け取っている限りは、同じ関数名でも別の機能を割り当てることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH ISCACHABLE</span> データタイプ属性を指定すると、関数に同じパラメータ値が与えられた場合、常に同じ値を返すようにして、PostgreSQL のパフォーマンスを最適化します。この設定を行うと、オプティマイザは、関数呼び出しを事前評価できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">definition</span> には、内部関数名、オブジェクトファイルの名前とパス、SQL クエリー、手続き言語で記述されたテキストなど、 関数を定義する文字列を指定できます。文字列は関数を記述する言語に依存します。定義には、C 言語関数に対するオブジェクトファイル名 (<span class="emphasis">object_file</span>) およびリンクシンボル (<span class="emphasis">link_symbol</span>) を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の SQL 関数の簡単な例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION max_project_nbr
RETURNS int4
AS "SELECT MAX(project_ID) FROM housing_construction AS RESULT"
LANGUAGE 'sql';</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">CREATE FUNCTION</span> を <span class="emphasis">CREATE PROCEDURE</span> の代わりに使用したり、<span class="emphasis">CREATE TRIGGER</span> のアクションを定義するために使用したりします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LANGUAGE</span> キーワードを指定して、PostgreSQL の関数で外部プログラムを呼び出すことができます。それらは他の言語でコンパイルされるプログラムのため、本マニュアルでは説明しません。ただし、SQL のユーザー定義関数を記述するときは、<span class="emphasis">LANGUAGE `sql'</span> 句を使用する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE INDEX">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE INDEX</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  インデックスは、テーブルに対して作成する特別なオブジェクトで、<span class="emphasis">SELECT</span>、<span class="emphasis">UPDATE</span>、および <span class="emphasis">DELETE</span> ステートメントなどの多くのデータ操作処理を高速化します。インデックスの作成では、インデックス化する列の値の場所および分布 (統計情報) が構築されます。通常、テーブルに作成するインデックスによって、<span class="emphasis">WHERE</span> 句で指定できる範囲が異なります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE INDEX</span> コマンドはベンダー間で大きく異なります。この理由の 1 つとして、指定テーブル内のデータがディスク上で物理的にソートされる方法や配置される方法を指定するのに <span class="emphasis">CREATE INDEX</span> コマンドを使用している DBMS ベンダーがあることが挙げられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE INDEX index_name ON table_name (column_name [, ...n])</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>すべての主なベンダーでは、<span class="emphasis">複合インデックス</span> (<span class="emphasis">連結インデックス</span>) に対応しています。これらのインデックスは、姓と名など、2 つ以上の列を 1 単位として検索する方法が最適な場合に使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX <span class="replaceable">index_name</span>
ON {<span class="replaceable">table | view}</span> <span class="replaceable">(column [ASC | DESC]</span> [,...n])
[WITH [PAD_INDEX]
   [[,] FILLFACTOR = fillfactor]
   [[,] IGNORE_DUP_KEY]
   [[,] DROP_EXISTING]
   [[,] STATISTICS_NORECOMPUTE] ]
[ON filegroup]
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では重要なオプションが提供されています。たとえば、昇順または降順インデックスをテーブルに作成したり、ビューおよび計算列 (<span class="emphasis">UPPER(book_name)</span> または <span class="emphasis">((qty * amt) / royalty)</span> など) にもインデックスを作成したりできます。SQL Server では、<span class="emphasis">UNIQUE</span>、<span class="emphasis">CLUSTERED</span>、または <span class="emphasis">NONCLUSTERED</span> (デフォルト) のオプション引数も指定できます。<span class="emphasis">UNIQUE</span> を指定すると、列に同じ値のない一意インデックスが作成されます。値の挿入や更新など、インデックス内に重複行ができてしまう操作はすべてエラーとなります。<span class="emphasis">CLUSTERED</span> を指定すると、ディスク上のデータの物理的ソート順序が決まります。<span class="emphasis">NONCLUSTERED</span> を指定すると、テーブルの論理順序が作成され、データ操作処理を高速化します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server ではこの他にも次の構文を提供しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li><span class="emphasis">PAD_INDEX</span> を指定すると、<span class="emphasis">FILLFACTOR</span> で設定された値に従って、各インデックスデータページに領域が確保されます。</li><li><span class="emphasis">FILLFACTOR</span> にはパーセント値 (1 ～ 100) を指定して、インデックス作成時に 8 KB のデータページを埋める割合を SQL Server に指示します。これを指定すると、8 KB のデータページが埋まった際のページ分割を減少でき、I/O 集約型のディスク処理が減少します。FILLFACTOR を明示的に定義してクラスターインデックスを作成すると、インデックスのサイズを増加でき、特定の環境下の処理を高速化できます。</li><li><span class="emphasis">IGNORE_DUP_KEY</span> は、挿入や更新の操作によって、一意インデックスに重複レコードが作成される場合の動作を制御します。この値を列に設定すると、重複行のみが処理から除外されます。この値を設定しない場合、処理されたレコードは、重複していないレコードも含めてすべてロールバックされます。</li><li><span class="emphasis">DROP_EXISTING</span> は、既存のインデックスをすべて削除し、指定インデックスを再構築する便利な機能です。</li><li><span class="emphasis">STATISTICS_NORECOMPUTE</span> を指定すると、インデックス統計値は再計算されません。これによって、<span class="emphasis">CREATE INDEX</span> 処理は高速化しますが、インデックスはあまり役に立たなくなります。</li><li>ON <span class="emphasis">filegroup</span> を指定すると、指定した既存ファイルグループに対するインデックスが作成されます。これによって、特定のハードディスクや RAID デバイスにインデックスを配置できるようになります。</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>インデックスを作成するには、通常、現在テーブルが使用している領域の 1.2 ～ 1.5 倍の 領域が必要となります。インデックス作成後は、その領域のほとんどが解放されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [UNIQUE] INDEX index_name ON table_name (column_name(length) [,...n])</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の <span class="emphasis">CREATE INDEX</span> ステートメントは、基本的な ANSI 規格に対応しています。これには、複数列に対する インデックスの作成機能も含まれます。また、<span class="emphasis">UNIQUE</span> を指定して、インデックスが一意の値しか受け付けないよう定義できます。<span class="emphasis">UNIQUE</span> で作成された一意インデックスのあるテーブルに、一意ではない値を挿入しようとしても拒否されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の特徴的な機能として、<span class="emphasis">CHAR</span> または <span class="emphasis">VARCHAR</span> 型の列の最初の数文字 <span class="emphasis">(length)</span> に対してもインデックスを作成できます。これは、たとえば、列の最初の 10 文字だけで十分検索できる場合や、ディスク領域の確保が重要な場合に便利です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [UNIQUE | BITMAP] INDEX [owner_name.]index_name
ON [schema.]{table ({column | expression} [ASC | DESC] [,...n])
   | CLUSTER cluster_name}
[physical_attributes_clause | {LOGGING | NOLOGGING} |
  | [ONLINE] | [COMPUTE [STATISTICS] ]
  | {TABLESPACE tablespace_name | DEFAULT}
  | {COMPRESS int | NOCOMPRESS}
  | {NOSORT |REVERSE} ],...
 [GLOBAL PARTITION BY RANGE (column_list)
   (PARTITION [partition_name] VALUES LESS THAN (value_list)
   [physical_attributes_clause | {LOGGING | NOLOGGING} ] ,...n )
| LOCAL [ (PARTITION [partition_name]
   [physical_attributes_clause | {LOGGING | NOLOGGING} ] ,...n ) ] ]
[PARALLEL [int] | NOPARALLEL]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、列値に対してだけでなく、<span class="emphasis">UPPER(book_name)</span> または <span class="emphasis">((qty * amt) / royalty)</span> などの計算式に対してもインデックスを作成できます。インデックスには、一意 (<span class="emphasis">UNIQUE</span>) を指定できますが、一意ではないインデックスも作成できます。Oracle では、<span class="emphasis">BITMAP</span>  を指定して、わずかな違いしかない値を持つ列に有用なビットマップインデックスを作成できます。さらに、昇順 (<span class="emphasis">ASC</span>) および降順 (<span class="emphasis">DESC</span>) の両方のインデックスを作成できます。ただし、Oracle では、<span class="emphasis">降順</span>インデックスは関数ベースのインデックスとして処理されます。昇順 (<span class="emphasis">ASC</span>) インデックスと降順 (<span class="emphasis">DESC</span>) インデックスの機能にはいくつかの違いがあります。<span class="emphasis">CLUSTER</span> オプションを使用すると、インデックスにクラスターキーを指定することもできます。クラスターは Oracle 固有のコマンド <span class="emphasis">CREATE CLUSTER</span>  で作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle と SQL Server では、クラスターインデックスの定義に大きな違いがあります。SQL Server の<span class="emphasis">クラスターインデックス</span> は、テーブルに格納されているデータの物理的なソート順序を指定します。Oracle の<span class="emphasis">クラスター</span>インデックスは、2 つ以上のテーブル間で結合処理を大幅に高速化するための特殊なインデックスです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">physical_attributes_clause</span> は、次のように確立できる設定を参照します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>[ PCTFREE int
| PCTUSED int
| INITRANS int
| MAXTRANS int
| STORAGE storage...]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PCTFREE</span> は、SQL Server の <span class="emphasis">FILLFACTOR</span> と似ています。つまり、新たな挿入および更新用に、インデックス内に確保する空の領域の割合を指定します。<span class="emphasis">PCTFREE</span> は、一意 (<span class="emphasis">UNIQUE</span>) ではないインデックスに対してのみ使用できます。<span class="emphasis">PCTUSED</span> には、挿入のために必ず必要なブロック内の使用可能領域の割合を指定します。<span class="emphasis">PCTUSED</span> はテーブルに指定可能ですが、インデックスには使用されません。<span class="emphasis">STORAGE</span>、<span class="emphasis">INITRANS</span>、および <span class="emphasis">MAXTRANS</span> の詳細については、<span class="emphasis">CREATE TABLE</span> ステートメントの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">TABLESPACE</span> 句は、インデックスを特定のテーブル領域に割り当てます。<span class="emphasis">TABLESPACE</span> 句を指定しないと、インデックスはデフォルトのテーブル領域に置かれます。または、<span class="emphasis">DEFAULT</span> キーワードを指定しても同じ結果となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LOGGING</span> を指定すると、REDO ログファイルにインデックスの作成ログが記録され、<span class="emphasis">NOLOGGING</span> を指定するとログが記録されません。このキーワードは、Oracle Direct Loader を使用することによる大量の読み込みに関するデフォルト動作も設定します。インデックスのパーティションを作成する際は、これらのキーワードごとに特殊な動作となるため、詳細についてはベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ONLINE</span> を指定すると、インデックスが作成されている間にテーブルでデータ操作を行えます。<span class="emphasis">COMPUTE STATISTICS</span> コマンドはインデックスが作成されている間に統計情報を収集します。統計情報は、比較的低コストで収集されます。<span class="emphasis">COMPRESS</span> を指定すると、パーティション化されていないインデックスに対してキー圧縮を有効にします。これによって、繰り返しキー値が削減され領域が解放されます。<span class="emphasis">COMPRESS</span> に付随する整数値には、圧縮する接頭辞列の数を指定します。デフォルトは <span class="emphasis">NOCOMPRESS</span> で、圧縮を無効にします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、   パーティションインデックスおよびパーティションテーブルの作成に <span class="emphasis">PARTITION</span> 句を使用します。このため、Oracle のインデックスでは、パーティションテーブルがサポートされています。<span class="emphasis">LOCAL</span> 句を指定すると、テーブルの各パーティションに対して別々のインデックスを作成できます。<span class="emphasis">GLOBAL</span> 句を指定すると、すべてのパーティションに対して共通のインデックスを作成します。ただし、特定のインデックス値の範囲は、パーティションによって格納されている範囲ごとに異なる場合があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">NOSORT</span> オプションを指定すると、既に昇順にソートされている列に対して素早くインデックスを作成できます。列の値が完全に昇順でない場合、処理は中断されるので、<span class="emphasis">NOSORT</span> オプションを指定せずに再試行できます。<span class="emphasis">REVERSE</span> は対照的に、インデックスブロックを格納領域に逆順に配置します (行 ID は除く)。<span class="emphasis">REVERSE</span> は、<span class="emphasis">NOSORT</span> と相互に排他的で、ビットマップインデックスやインデックス編成テーブルに対しては使用できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PARALLEL</span> 句を指定すると、別個の CPU によってインデックスを並列に作成でき、処理が高速化します。オプションで指定する整数値によって、この処理で使用する並列スレッドの数が定義されます。デフォルトは <span class="emphasis">NOPARALLEL</span> で、インデックスは直列に作成されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [UNIQUE] INDEX index_name ON table
[USING [BTREE | RTREE | HASH] ]
(function_name (column [operator_class] [, ...] ))</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、標準的な昇順 インデックス、および<span class="emphasis">一意</span> インデックスを作成できます。この実装には、<span class="emphasis">WITH access_method</span> 句によるパフォーマンスの向上も含まれます。この句では、パフォーマンスを最適化するための次の 3 つの動的アクセスメソッドのいずれかを実行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i><span class="emphasis">BTREE</span></i><br>&#160;
						  その他のメソッドを指定しない場合、これがデフォルトのメソッドです。このメソッドは、Lehman-Yao による高並行性 btree を利用します。</li><li><i><span class="emphasis">RTREE</span></i><br>&#160;
						  このメソッドは、Guttman の 2 次分割アルゴリズムを使った標準 rtree を利用します。</li><li><i><span class="emphasis">HASH</span></i><br>&#160;
						  このメソッドは、Litwin の線形ハッシュの実装です。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、列のデータタイプに基づいた関連する演算子クラス (<span class="emphasis">operator_class</span>) を列に指定することもできます。演算子クラスには、特定のインデックスの演算子を指定します。ユーザーは列に有効な任意の演算子クラスを定義できますが、デフォルトでは、フィールドのデータタイプに最適な演算子クラスとなっています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、PostgreSQL では、関数、ユーザー定義関数、または式を使用してインデックスを定義できます。たとえば、<span class="emphasis">UPPER(book_name)</span> に対してインデックスを定義して、インデックスの基本データに定期的に適用される変換処理を高速化できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL のこの例では、<span class="emphasis">authors</span> テーブルの <span class="emphasis">au_id</span> 列に対して、シンプルな昇順インデックスを作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE INDEX au_id_ind
ON authors (au_id);</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、<span class="emphasis">CREATE FUNCTION</span> の項で使用した <span class="emphasis">housing_construction</span> テーブルを作成し、そのテーブルに対してクラスターインデックスを配置します。このインデックスでは、<span class="emphasis">CLUSTERED</span> 句が指定されているため、ディスク上に物理的な順序でデータをソートします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE housing_construction
   (project_number      INT NOT NULL,
   project_date         DATETIME NULL,
   project_name         VARCHAR(50)
       COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
   construction_color   NCHAR(20)
       COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
   construction_height  DECIMAL(4, 1) NULL ,
   construction_length  DECIMAL(4, 1) NULL ,
   construction_width   DECIMAL(4, 1) NULL ,
   construction_volume  INT NULL
GO

CREATE UNIQUE CLUSTERED INDEX project_id_ind
ON housing_construction(project_id)
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>複数列にまたがるインデックス、つまり<span class="emphasis">連結キー</span>を作成する必要のあることがよくあります。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE UNIQUE INDEX project2_ind
ON housing_construction(project_name, project_date)
WITH PAD_INDEX, FILLFACTOR = 80
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PAD_INDEX</span> 句を追加して、<span class="emphasis">FILLFACTOR</span> を 80 に設定すると、インデックスおよびデータページが 100% 埋まることなく、80% の状態を維持します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Oracle の例では、データの格納方法を見るため、特定のテーブル領域に対して同じインデックスを作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE UNIQUE INDEX project2_ind
ON housing_construction(project_name, project_date)
STORAGE (INITIAL 10M NEXT 5M PCTINCREASE 0)
TABLESPACE construction;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">housing_construction</span> テーブルを Oracle のサーバー上のパーティションテーブルとして作成する場合は、パーティションインデックスも作成する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE UNIQUE CLUSTERED INDEX project_id_ind
ON housing_construction(project_id)
GLOBAL PARTITION BY RANGE (project_id)
   (PARTITION part1 VALUES LESS THAN ('K')
      TABLESPACE construction_part1_ndx_ts,
   PARTITION part2 VALUES LESS THAN (MAXVALUE)
      TABLESPACE construction_part2_ndx_ts);</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE PROCEDURE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE PROCEDURE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  ストアドプロシージャーは、データベースサーバー環境に、条件処理およびプログラム機能を提供します。ストアドプロシージャーは、渡されたパラメータを受け取り、複雑なタスクを実行するプログラミングコードのカプセルです。ストアドプロシージャーはプリコンパイルされているという点でも非常に便利です。ストアドプロシージャーがタスクを迅速かつ効率的に実行できるのは、データベースオプティマイザがコードの実行計画をビルド済みだからです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応 (CREATE FUNCTION コマンドの項を参照)</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>他の多くの <span class="emphasis">CREATE</span> ステートメント同様、このコマンドはベンダー間で大きく異なっています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE PROCEDURE procedure_name
[parameter data_type attributes ][,...n]
AS
code block</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この SQL99 構文の詳細については、<span class="emphasis">CREATE FUNCTION</span> の項を参照してください。<span class="emphasis">CREATE FUNCTION</span> の高度な機能が、<span class="emphasis">CREATE PROCEDURE</span> にも適用されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>各ベンダーは、独自のプロシージャー型拡張を SQL 言語に実装しているため、本マニュアルでは、ストアドプロシージャーのコーディングについては説明しません。ただし、ストアドプロシージャーのプログラミングの基礎については説明します。O'Reilly 社発行の『<span class="emphasis">Transact-SQL Programming</span>』(Kevin Kline、Lee Gould &amp; Andrew Zanevsky、1999)、オライリー・ジャパン発行の『<span class="emphasis">Oracle PL/SQL プログラミング 基礎編/応用編 第2版</span>』<span class="emphasis"></span>などに、それぞれのプログラミング言語に関する詳細な解説があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE PROC[EDURE] <span class="replaceable">procedure_name </span>[;<span class="replaceable">number</span>]
[{@<span class="replaceable">parameter_name datatype</span>}<span class="replaceable"> </span>[VARYING] [= <span class="replaceable">default</span>] [OUTPUT]][,...<span class="replaceable">n</span>]
[WITH {RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}]
[FOR REPLICATION]
AS
Transact-SQL_block
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、プロシージャー名 (procedure_name) に加え、バージョン番号を <span class="emphasis">procedure_name;1</span> のフォーマットで指定できます。ここでは整数値 1 がバージョン番号を示します。これによって、単一のストアドプロシージャーの複数のバージョンにアクセスできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブル同様 (CREATE TABLE 参照)、ローカル一時プロシージャーおよびグローバル一時プロシージャーを宣言するには、 シャープ記号 (#)、および 2 重のシャープ記号 (##) をそれぞれのプロシージャー名の前に付加します。一時プロシージャーは、一時プロシージャーを作成したユーザーまたはプロセスのセッション期間のみ存在します。セッションが終了すると、一時プロシージャーは自動的に削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server のストアドプロシージャーには、最初にアットマーク (@)、次に SQL Server の任意のデータタイプを指定して、最高 1024 個の入力パラメータを宣言できます。パラメータに cursor データタイプを指定するには、<span class="emphasis">VARYING</span> および <span class="emphasis">OUTPUT</span> の両方を指定する必要があります。<span class="emphasis">VARYING</span> キーワードは cursor データタイプのパラメータにのみ使用し、結果セットがプロシージャーによって動的に構築されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>入力パラメータの値は、ユーザーまたは呼び出しプロセスによって提供される必要があります。ただし、初期設定値を指定すれば、ユーザーまたはプロセスが値を提供しなくてもプロシージャーを実行できます。初期設定値には、定数または NULL を設定する必要がありますが、<span class="emphasis">LIKE</span> の項で説明しているように、ワイルドカード文字を含めることもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>同様に、<span class="emphasis">OUTPUT</span> キーワードを使用してパラメータを戻りパラメータに宣言できます。戻りパラメータに格納された値は、SQL Server の <span class="emphasis">EXEC[UTE]</span> コマンドの戻りパラメータを格納する変数を介して任意の呼び出しプロシージャーに返されます。OUTPUT パラメータには、<span class="emphasis">TEXT</span> および <span class="emphasis">IMAGE</span> 型以外の任意のデータタイプを指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>省略可能なオプションの <span class="emphasis">WITH RECOMPILE</span>、<span class="emphasis">WITH ENCRYPTION</span>、および <span class="emphasis">WITH RECOMPILE, ENCRYPTION</span> について次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i>WITH RECOMPILE </i><br>&#160;
						  このオプションを指定すると、ストアドプロシージャーの実行計画がキャッシュされません。その代わり、ストアドプロシージャが実行されるたびに実行計画が再コンパイルされます。これは、プロシージャーで非定型または一時的な値が使用される場合に便利です。</li><li><i>WITH ENCRYPTION </i><br>&#160;
						  このオプションを指定すると、SQL Server の <span class="emphasis">syscomments</span> テーブルでストアドプロシージャーのコードを暗号化します。</li><li><i>WITH RECOMPILE, ENCRYPTION</i><br>&#160;
						  2 つのオプションを同時に行います。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOR REPLICATION</span> 句は <span class="emphasis">WITH RECOMPILE</span> 句と相互に排他的で、ストアドプロシージャーをサブスクライブサーバーで実行できないように指定します。これは、SQL Server の組み込みレプリケーションエンジンでのみ実行されるフィルタリングストアドプロシージャの作成に主に使用されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS Transact-SQL_block</span> 句には、Transact-SQL コマンドを最大で 128 MB のサイズまで指定します。Microsoft SQL Server では、有効な Transact-SQL ステートメントのほとんどを使用できますが、<span class="emphasis">SET SHOWPLAN_TEXT</span> および <span class="emphasis">SET SHOWPLAN_ALL</span> は使用できません。ストアドプロシージャー内での使用に制限のあるその他のコマンドは、<span class="emphasis">ALTER TABLE</span>、<span class="emphasis">CREATE INDEX</span>、<span class="emphasis">CREATE TABLE</span>、すべての <span class="emphasis">DBCC</span> ステートメント、<span class="emphasis">DROP TABLE</span>、<span class="emphasis">DROP INDEX</span>、<span class="emphasis">TRUNCATE TABLE</span>、および <span class="emphasis">UPDATE STATISTICS</span> です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、 名前の遅延解決を認めています。これは、作成されていないオブジェクトをストアドプロシージャーが参照した場合でも、エラーを発生せずにコンパイルされる機能です。これによって、オブジェクトがまだ存在しなくても、実行計画が作成され、実行時にのみエラーとなります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、ストアドプロシージャーを簡単にネストできます。ストアドプロシージャーが別のストアドプロシージャーを呼び出すごとに、システム変数の <span class="emphasis">@@NESTLEVEL</span> が 1 ずつ増加し、呼び出されたプロシージャーが完了するごとに、1 ずつ減少します。<span class="emphasis">SELECT @@NESTLEVEL</span> を指定すると、現行セッションのネスト層数が返されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [OR REPLACE] PROCEDURE [owner_name.]procedure_name
[(parameter1 [IN | OUT | IN OUT] [NOCOPY] datatype][,...n)]]
[AUTHID {CURRENT_USER | DEFINER} ]
{IS | AS} {PL/SQL block | LANGUAGE {java_spec | C_spec}};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の ユーザー定義関数とストアドプロシージャーは、構成および構造において非常に似ています。主な違いは、ストアドプロシージャーが呼び出しプロセスに対して値を返すことができないのに対して、関数は、呼び出しプロセスに 1 つの値を返すことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のストアドプロシージャーで指定する引数とパラメータには、<span class="emphasis">IN</span>、<span class="emphasis">OUT</span>、または <span class="emphasis">IN OUT</span> があります。<span class="emphasis">IN</span> 修飾子は関数を呼び出すときに指定して、関数に値を渡します。<span class="emphasis">OUT</span> 引数は呼び出しプロセスに値を返します。つまり、<span class="emphasis">IN</span> 修飾子は、関数を呼び出すユーザーまたはプロセスによって提供され、<span class="emphasis">OUT</span> 引数は関数によって返されます。<span class="emphasis">IN OUT</span> 引数は <span class="emphasis">IN</span> および <span class="emphasis">OUT</span> の両方の機能を実行します。<span class="emphasis">OUT</span> または <span class="emphasis">IN OUT</span> 引数が VARRAY や RECORD データタイプのように非常に大きな場合、<span class="emphasis">NOCOPY</span> キーワードを使用するとパフォーマンスが向上します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、現行ユーザーや関数の所有者がそれぞれ <span class="emphasis">AUTHID CURRENT_USER</span> または <span class="emphasis">AUTHID DEFINER</span> 句を使用する場合の権限で、関数を強制的に実行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">LANGUAGE</span> キーワードを介してプロシージャーが外部プログラムを呼び出すことができます。外部プログラムは C や Java 言語で記述されるため、本マニュアルでは、外部プログラムを呼び出すための具体的な構文については説明しません。この機能の詳細については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server のストアドプロシージャーは、結果セットを返すことが<span class="emphasis">できます</span>が、Oracle のストアドプロシージャーは、呼び出しプロセスに結果セットを返すことが<span class="emphasis">できません</span>。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Microsoft SQL Server のストアドプロシージャーでは、システムの日付と時刻の要素に基づく一意の 22 桁の値を生成し、その値を呼び出しプロセスに返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- A Microsoft SQL Server stored procedure
CREATE PROCEDURE get_next_nbr
   @next_nbr CHAR(22) OUTPUT
AS
BEGIN
  DECLARE @random_nbr INT
  SELECT @random_nbr = RAND(  ) * 1000000

SELECT @next_nbr =
  RIGHT('000000' + CAST(ROUND(RAND(@random_nbr)*1000000,0))AS CHAR(6), 6) +
  RIGHT('0000' + CAST(DATEPART (yy, GETDATE(  ) ) AS CHAR(4)), 2) +
  RIGHT('000'  + CAST(DATEPART (dy, GETDATE(  ) ) AS CHAR(3)), 3) +
  RIGHT('00'   + CAST(DATEPART (hh, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('00'   + CAST(DATEPART (mi, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('00'   + CAST(DATEPART (ss, GETDATE(  ) ) AS CHAR(2)), 2) +
  RIGHT('000'  + CAST(DATEPART (ms, GETDATE(  ) ) AS CHAR(3)), 3)
END
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE ROLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE ROLE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE ROLE</span>    を使用すると、データベースのユーザーに割り当てる権限セットを名前付きで作成できます。ユーザーはロールが付与されると、そのロールの権限および許可もすべて取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>未対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server は、<span class="emphasis">CREATE ROLE</span> コマンドをサポートしていませんが、システムのストアドプロシージャー <span class="emphasis">sp_add_role</span> を介して同等の機能を提供しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE ROLE role_name [WITH ADMIN {CURRENT_USER | CURRENT_ROLE}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このステートメントは新しいロール (role_name) を作成し、そのロールをホスト DBMS ユーザーと区別します。<span class="emphasis">WITH ADMIN</span> 句を指定すると、現在アクティブなユーザー (CURRENT_USER)、または現在アクティブなロール (CURRENT_ROLE) に直ちに割り当てられます。デフォルトでは、ステートメントに <span class="emphasis">WITH ADMIN CURRENT_USER</span> と指定されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE ROLE role_name [NOT IDENTIFIED | IDENTIFIED
   {BY password | EXTERNALLY | GLOBALLY}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では最初にロール (role_name) を作成し、ユーザーと同様に、後から <span class="emphasis">GRANT</span> コマンドを使用して権限および許可をそのロールに付与します。パスワードによって保護されているロールにアクセスする場合は、<span class="emphasis">SET ROLE</span> コマンドを使用します。ロールにパスワード (password) が設定されている場合、そのロールにアクセスするには <span class="emphasis">SET ROLE</span> コマンドを使用してパスワードを提供する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、事前構成済みのロールをいくつか提供しています。<span class="emphasis">CONNECT</span>、<span class="emphasis">DBA</span>、および <span class="emphasis">RESOURCE</span> は Oracle のすべてのバージョンで有効です。<span class="emphasis">EXP_FULL_DATABASE</span> および <span class="emphasis">IMP_FULL_DATABASE</span> は、インポート処理とエクスポート処理に使用する新しいロールです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、<span class="emphasis">CREATE</span> を使用して、Oracle の新しいロールを作成し、<span class="emphasis">GRANT</span> を使用してそのロールに権限を付与します。次に、<span class="emphasis">ALTER ROLE</span> でそのロールにパスワードを割り当て、<span class="emphasis">GRANT</span> でロールを 2 人のユーザーに付与します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE ROLE boss;

GRANT ALL ON employee TO boss;
GRANT CREATE SESSION, CREATE DATABASE LINK TO boss;

ALTER ROLE boss IDENTIFIED BY le_grande_fromage;

GRANT boss TO nancy, dale;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE SCHEMA">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE SCHEMA</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis"></span>  このステートメントは、<span class="emphasis">スキーマ</span>、つまり関連オブジェクトの名前付きグループを作成します。スキーマはテーブル、ビュー、および関連する権限の集まりです。スキーマは、既存の有効なユーザー ID (<span class="emphasis">所有者</span>) に関連付けられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE SCHEMA [schema_name] [AUTHORIZATION owner_name]
[DEFAULT CHARACTER SET char_set_name]
[PATH schema_name [,...n] ]

   [ &lt;create_table_statement1&gt; [...n] ]
   [ &lt;create_view_statement1&gt;  [...n] ]
   [ &lt;grant statement1&gt; [...n] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE SCHEMA</span> ステートメントには、<span class="emphasis">CREATE</span>、<span class="emphasis">GRANT</span> など、他の多くのステートメントを格納できます。オプションとして、<span class="emphasis">DEFAULT CHARACTER SET</span> を指定すると、スキーマのデフォルトの文字セットを指定できます。ファイルシステムにあるスキーマ内の任意のオブジェクトに対して <span class="emphasis">PATH</span> も宣言できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server および Oracle の構文 </span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE SCHEMA AUTHORIZATION owner_name
   [ &lt;create_table_statement1&gt; [...n] ]
   [ &lt;create_view_statement1&gt;  [...n] ]
   [ &lt;grant statement1&gt; [...n] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE SCHEMA</span> ステートメント内のあるステートメントが失敗した場合、ステートメント全体が失敗します。<span class="emphasis">CREATE SCHEMA</span> の利点の 1 つは、従属関係などに応じてステートメント内のオブジェクトを編成する必要がない点です。たとえば、<span class="emphasis">GRANT</span> ステートメントは通常、存在していないテーブルに対して発行できません。しかし、すべての <span class="emphasis">GRANT</span> ステートメントは、最初に <span class="emphasis">CREATE SCHEMA</span> ステートメント内に置くことができ、その後に、権限を与える対象を作成する <span class="emphasis">CREATE</span> ステートメントを配置できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE SCHEMA</span> コマンドを明示的にサポートしている実装はほとんどありません。ただし、ユーザーがデータベースオブジェクトを作成すると、スキーマは暗黙的に作成されます。一方、Oracle では、ユーザーが作成されるたびにスキーマが作成されます。<span class="emphasis">CREATE SCHEMA</span> コマンドは単に、テーブル、ビュー、およびその他のデータベースオブジェクトをそれらの権限と共に 1 回の手順ですべて作成する方法です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">CREATE</span> <span class="emphasis">SCHEMA</span> ではスキーマは作成されません。<span class="emphasis">CREATE USER</span> によってのみスキーマが作成されます。<span class="emphasis">CREATE SCHEMA</span> を使用すると、1 つの SQL ステートメントで複数の手順を実行できます。次の Oracle の例では、<span class="emphasis">CREATE SCHEMA</span> ステートメント内でオブジェクトを作成する前に権限を設定しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE SCHEMA AUTHORIZATION emily
   GRANT SELECT, INSERT ON view_1 TO sarah
   GRANT ALL ON table_1 TO sarah

   CREATE VIEW view_1 AS
      SELECT column_1, column_2
      FROM table_1
      ORDER BY column_2

   CREATE TABLE table_1(column_1 INT, column_2 CHAR(20));</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE TABLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE TABLE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE TABLE</span>   ステートメントは文字通り、テーブルを作成します。ただし、多くのベンダーでは、<span class="emphasis">CREATE TABLE</span> ステートメントを使用して、キー、カスケードの参照整合性、制約、および初期設定値の指定など、多様なその他の機能を実現できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは、テーブル名、テーブルの構成列、および列とテーブルのプロパティを定義します。通常、テーブルの設計および作成には、多くの検討を重ねます。このような作業は、<span class="emphasis">データベース設計</span> と呼ばれます。テーブルとそのテーブル内のデータとの関係、および、テーブルとデータベース内の別のテーブルとの関係を分析する作業を<span class="emphasis">正規化</span>といいます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>プログラマーおよび開発者は、このデータベース設計と正規化の原則を熟知したうえで、<span class="emphasis">CREATE TABLE</span> コマンドを発行することをお勧めします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>一般的に、テーブル名の先頭には常に英字が使用されます。使用可能な名前の長さはベンダーによって異なります。Oracle では 30 文字のみですが、必要な場合は 30 文字より長い名前を設定できます。数値はテーブル名に使用できますが、記号は アンダースコア (_) しか使用できません。ベンダーによっては、その他の多くの記号をテーブル名に使用できますが、混乱の元になる可能性があるため、それらの記号は使用しないことをお勧めします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>すべてのベンダーは列特性の定義で、<span class="emphasis">NULL</span>  および <span class="emphasis">NOT NULL</span> オプションをサポートしています。<span class="emphasis">NULL</span> オプションは、SQL99 の要件ではありません。列を <span class="emphasis">NULL</span> として定義した場合、列のデータタイプにかかわらず、その列は NULL 値を含むことができます。通常、NULL を含むことのできる列は、レコードごとに 1 ビット余分に領域を消費します。<span class="emphasis">NOT NULL</span> を指定した場合、その列は NULL 値を含むことはできません。<span class="emphasis">NOT NULL</span> 列に対して、NULL 値を挿入する <span class="emphasis">INSERT</span> 処理や、値を NULL に変更する <span class="emphasis">UPDATE</span> 処理はすべて失敗し、ロールバックされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、すべてのベンダーでは、列レベルおよびテーブルレベルの両方で主キー (<span class="emphasis">PRIMARY KEY</span>) 宣言をサポートしています。<span class="emphasis">主キー</span>は、テーブルの各行を一意に識別する方法を表す特殊な標識です。主キーはテーブル内の列から構成され (複数列の指定も可能)、各行に一意の識別子を提供します。テーブルに設定できる主キーは 1 つのみです。主キー内のすべての値は一意である必要があり、NULL を含むことはできません。主キーが設定されていれば、テーブルで外部キーを宣言し、別のテーブルの主キーとの直接的な関係を確立できます。このようにして、親/子、またはマスター/詳細の関係をテーブル間で作成できます。カスケードアクションによって、このアクションをさらに強化できます。たとえば、ある顧客の売上レコードが <span class="emphasis">sales</span> テーブルにある場合、<span class="emphasis">customer</span> テーブルにあるその顧客レコードの削除を防止するなどのアクションです。外部キーの構文はベンダー間で異なります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ほとんどのベンダーでは、<span class="emphasis">DEFAULT</span> キーワードを使用して指定列に初期設定値を設定できます。テーブルにレコードが挿入される際に、この列に値が提供されない場合は、初期設定値が挿入されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次に <span class="emphasis">CREATE TABLE</span> の基本構文を示します。テーブルを作成し、データを入力するにはこれで十分です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE table_name
   (
   column_name datatype[(length)] [NULL | NOT NULL],...n
   )</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次に簡単な例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE housing_construction
   (project_number      INT NOT NULL,
   project_date         DATETIME NOT NULL,
   project_name         VARCHAR(50) NOT NULL,
   construction_color   NCHAR(20) NULL,
   construction_height  DECIMAL(4,1) NULL,
   construction_length  DECIMAL(4,1) NULL,
   construction_width   DECIMAL(4,1) NULL,
   construction_volume  INT NULL)
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server のこのステートメントでは、8 つの列を含む <span class="emphasis">housing_construction</span> というテーブルを定義します。各列には、その列に含まれる情報の適切なデータタイプと共に、<span class="emphasis">NULL</span> または <span class="emphasis">NOT NULL</span> が定義されています。列定義のリストは常にかっこで囲まれ、次に定義が続く場合は コンマで各列定義が区切られます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE table_name
[ON COMMIT {PRESERVE ROWS | DELETE ROWS}
(column_name datatype attributes [,...n]
 | [LIKE  table_name]
 | [table_constraint][,...n] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 の <span class="emphasis">CREATE TABLE</span> ステートメントでは、テーブルの作成時にインスタンス化され、現行のユーザーセッションの終了時に自動的に削除される一時 (<span class="emphasis">TEMPORARY</span> ) テーブルを作成できます。一時テーブルとして、すべてのアクティブユーザーセッションで使用できるグローバル (<span class="emphasis">GLOBAL</span>) テーブル、または一時テーブルを作成したユーザーセッションでのみ使用できるローカル (<span class="emphasis">LOCAL</span>) テーブルを作成できます。一時テーブルには、<span class="emphasis">ON COMMIT</span> 句も指定できます。<span class="emphasis">ON COMMIT PRESERVE ROWS</span> を指定すると、<span class="emphasis">COMMIT</span> が実行された場合に、一時テーブルでのすべてのデータ変更が保存されます。<span class="emphasis">ON COMMIT DELETE ROWS</span> を指定すると、<span class="emphasis">COMMIT</span> 後に一時テーブルの行が空になります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LIKE table_name</span> オプションを指定すると、既存のテーブルと同じ列定義およびテーブル制約の新しいテーブルが作成されます。<span class="emphasis">LIKE</span> を使用する場合、列やテーブルの制約を定義する必要はありません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE TABLE</span> の実装はベンダー間で大きく異なり、このコマンドは重要なため、各ベンダーの実装の詳細については別々に説明します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE [<span class="replaceable">database_name</span>.[<span class="replaceable">owner</span>]. | <span class="replaceable">owner</span>.] <span class="replaceable">table_name</span>
({column_name datatype [ [DEFAULT default_value]
   | {IDENTITY [(seed,increment) [NOT FOR REPLICATION]]]
   [ROWGIDCOL] ]
   [NULL | NOT NULL]
   | [{PRIMARY KEY | UNIQUE}
        [CLUSTERED | NONCLUSTERED]
        [WITH FILLFACTOR = int] [ON {filegroup | DEFAULT}] ]
   | [[FOREIGN KEY]
        REFERENCES reference_table[<span class="emphasis">(</span>reference_column[,...n])]
        [ON DELETE {CASCADE | NO ACTION}]
        [ON UPDATE {CASCADE | NO ACTION}]
        [NOT FOR REPLICATION]
   | [CHECK [NOT FOR REPLICATION] (expression)
   | [COLLATE collation_name]
|column_name AS computed_column_expression
[,...n]
|[table_constraint][,...n] )
[ON {filegroup | DEFAULT} ]
[TEXTIMAGE_ON {filegroup | DEFAULT} ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、テーブル、列、およびテーブルレベルの制約を定義する際に、多くのオプションが提供されています。<span class="emphasis">CONSTRAINT constraint_name</span> に続けて制約の内容を指定すると、任意の列レベルの制約も名前付きで指定できます。<span class="emphasis">PRIMARY KEY</span> と <span class="emphasis">NULL</span> など、相互に排他的でない限りは 1 つの列に複数の制約を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、ローカル<span class="emphasis"></span>一時テーブルの作成も可能で、これは、<span class="emphasis">tempdb</span> データベース内に、テーブル名の先頭に 1 つの シャープ記号 (#) を付けて格納されます。ローカル一時テーブルは、作成したユーザーまたはプロセスで使用でき、ユーザーがログアウトするか、またはプロセスが終了すると削除されます。 グローバル一時テーブルは、現在ログインしているすべてのユーザーおよびプロセスで使用でき、テーブル名の先頭に 2 つのシャープ記号 (##) 付けて作成できます。グローバル一時テーブルは、プロセスが終了するか、または作成者がログアウトすると削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server は組み込みレプリケーションをサポートしているため、列プロパティの多くは <span class="emphasis">NOT FOR REPLICATION</span> に設定できます。これは、<span class="emphasis">IDENTITY</span> や <span class="emphasis">FOREIGN KEY</span> の値がサブスクライブサーバーにレプリケートされないようにします。この設定は、データはすべて同じではなく、構造が同じテーブルが別々のサーバーで必要とされる場合に便利です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、<span class="emphasis">ROWGUIDCOL</span> もレプリケーションに有効です。これを指定すると、列がグローバル一意識別子として識別され、複数のサーバーにおいて値が重複しないようになります。グローバルで一意な列として識別できるのは、1 つのテーブルにつき 1 つの列のみです。ただし、この指定では一意の値は作成されません。作成するには、<span class="emphasis">NEWID</span> 関数を使用して挿入する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">IDENTITY</span> プロパティを指定すると、整数型の列に適用する場合、MySQL の <span class="emphasis">AUTO_INCREMENT</span> と同じように、一意の増分数で列の値を自動的に生成します。ただし、これは AUTO_INCREMENT に比べ、より万能で柔軟性があります。<span class="emphasis">AUTO_INCREMENT</span> が常に 1 から開始されるのに対して、<span class="emphasis">IDENTITY</span> は、<span class="emphasis">seed</span> に指定した数から計算を開始します。また、<span class="emphasis">AUTO_INCREMENT</span> は新しい行が挿入されるたびに 1 ずつ増加するのに対して、<span class="emphasis">IDENTITY</span> では、<span class="emphasis">increment</span> に指定した数だけ増加します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、timestamp データタイプの列や <span class="emphasis">IDENTITY</span> プロパティを持つ列以外の任意の列に、<span class="emphasis">DEFAULT</span> を使用して初期設定値を適用できます。<span class="emphasis">DEFAULT</span> で定義できるのは、文字列や数などの定数値、<span class="emphasis">GETDATE( )</span> などのシステム関数、または <span class="emphasis">NULL</span> だけです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PRIMARY KEY</span> は、1 つのテーブルにつき 1 つだけ指定でき、<span class="emphasis">UNIQUE</span> または <span class="emphasis">FOREIGN KEY</span> 列は、1 つのテーブルに複数指定できます。これらにクラスター化または非クラスター化の指定、および開始時の埋め込み要素の定義を行えます。詳細については、<span class="emphasis">CREATE INDEX</span> の項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOREIGN KEY</span> を指定する場合、参照整合性を維持するテーブルおよび列を、<span class="emphasis">REFERENCES</span> 句を使用して指定できます。これにより、参照テーブル内で <span class="emphasis">PRIMARY KEY</span> または <span class="emphasis">UNIQUE</span> インデックスとして定義されている列のみを参照できます。参照アクションは、レコードの削除または更新時に <span class="emphasis">reference_table</span> に対して行われるよう指定できます。<span class="emphasis">NO ACTION</span> を指定した場合、レコードが削除または更新されても、参照テーブルでは何も起こりません。<span class="emphasis">CASCADE</span> を指定すると、親テーブルでの削除や更新は、<span class="emphasis">FOREIGN KEY</span> の値に従属する参照テーブル内のすべてのレコードに対して反映されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CHECK</span> 制約を指定すると、テーブルの指定列に挿入された値が <span class="emphasis">CHECK</span> 式に基づく有効な値に制限されます。列レベルの制約をテーブルに複数指定する例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE people
    (people_id     CHAR(4)
        CONSTRAINT pk_dist_id PRIMARY KEY CLUSTERED
        CONSTRAINT ck_dist_id CHECK (dist_id LIKE '[A-Z][A-Z][A-Z][A-Z]'),
     people_name   VARCHAR(40) NULL,
     people_addr1  VARCHAR(40) NULL,
     people_addr2  VARCHAR(40) NULL,
     city          VARCHAR(20) NULL,
     state         CHAR(2)     NULL
        CONSTRAINT def_st DEFAULT ("CA")
        CONSTRAINT chk_st REFERENCES states(state_ID),
     zip           CHAR(5)     NULL
        CONSTRAINT ck_dist_zip
        CHECK(zip LIKE '[0-9][0-9][0-9][0-9][0-9]'),
     phone         CHAR(12)    NULL,
     sales_rep     empid       NOT NULL DEFAULT USER)
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">people_id</span> 列に対する <span class="emphasis">CHECK</span> 制約では、すべてアルファベットの ID に制限されています。また、<span class="emphasis">zip</span> 列に対する制約では、すべて数値に制限されています。<span class="emphasis">state</span> 列に対する <span class="emphasis">REFERENCES</span> 制約では、<span class="emphasis">states</span> テーブルに対する参照が行われます。<span class="emphasis">REFERENCES</span> 制約は基本的に <span class="emphasis">CHECK</span> 制約と同じですが、REFERENCES 制約では、別の列に格納されている値から許容値のリストを導き出すことができます。この例では、<span class="emphasis">CONSTRAINT constraint_name.</span> <span class="emphasis">.</span> <span class="emphasis">.</span> 構文を使用して列レベル制約を指定する方法を示しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、SQL Server 2000 の新機能に <span class="emphasis">COLLATE</span> 列レベルプロパティがあります。この機能によって、列で使用されるソート順序および文字セットを列ごとに変更できます。これは高度な機能なため、列のデフォルトのソート順序や文字セットを変更する必要がある場合は、ベンダーのマニュアルを参照してください。<span class="emphasis">CREATE FUNCTION</span> の項でこの構文の例を示しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、SQL Server では、計算値を含む列を持つテーブルを作成できます。データは、実際には列に格納されません。この列は仮想列で、テーブルに既にある他の列を使用した式が格納されます。たとえば、計算列には、<span class="emphasis">order_cost AS (price</span> <span class="emphasis">*</span> <span class="emphasis">qty)</span> などの式を指定できます。計算列には、定数、関数、変数、非計算列、またはこれらを演算子で任意に組み合わせたものも使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ここまで示した列レベルの制約はすべて、テーブルレベルでも宣言できます。つまり、<span class="emphasis">PRIMARY KEY</span> 制約、<span class="emphasis">FOREIGN KEY</span> 制約、<span class="emphasis">CHECK</span> 制約、およびその他の制約を、<span class="emphasis">CREATE TABLE</span> ステートメントで定義されたすべての列に対して宣言できます。これは、複数の列を制限する制約に対して非常に便利です。たとえば、列レベルの <span class="emphasis">UNIQUE</span> 制約を宣言する場合、この制約はその列にのみ適用されます。しかし、テーブルレベルで制約を宣言すると、その制約は複数の列に適用されます。列レベルおよびテーブルレベルの両方の制約の例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- Creating a column-level constraint
CREATE TABLE favorite_books
    (isbn          CHAR(100)    PRIMARY KEY NONCLUSTERED,
     book_name     VARCHAR(40)  UNIQUE,
     category      VARCHAR(40)  NULL,
     subcategory   VARCHAR(40)  NULL,
     pub_date      DATETIME     NOT NULL,
     purchase_date DATETIME     NOT NULL)
GO

-- Creating a table-level constraint
CREATE TABLE favorite_books
    (isbn          CHAR(100)    NOT NULL,
     book_name     VARCHAR(40)  NOT NULL,
     category      VARCHAR(40)  NULL,
     subcategory   VARCHAR(40)  NULL,
     pub_date      DATETIME     NOT NULL,
     purchase_date DATETIME     NOT NULL,
        CONSTRAINT pk_book_id   PRIMARY KEY NONCLUSTERED (isbn)
           WITH FILLFACTOR=70,
        CONSTRAINT unq_book     UNIQUE CLUSTERED (book_name,pub_date))
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>これら 2 つのコマンドは、ほぼ同じ結果を返します。違いは、テーブルレベルの <span class="emphasis">UNIQUE</span> 制約は 2 つの列を含み、列レベルの <span class="emphasis">UNIQUE</span> 制約では 1 つの列だけを含みます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>最後に、Microsoft SQL Server には、テーブル (または主キーや一意インデックス) の物理的な配置方法を制御する <span class="emphasis">[ON {filegroup | DEFAULT} ]</span> および <span class="emphasis">[TEXTIMAGE_ON {filegroup | DEFAULT}]</span> の 2 つの句があります。<span class="emphasis">ON filegroup</span> 句は、テーブルまたはインデックスを指定ファイルグループに格納します。ファイルグループはデータベース内に存在している必要があります。<span class="emphasis">ON DEFAULT</span> を指定しているか、<span class="emphasis">ON</span> 句を全く使用していない場合、テーブルまたはインデックスは、データベースのデフォルトのファイルグループに格納されます。<span class="emphasis">TEXTIMAGE</span> 句もほぼ同じように機能しますが、違いはこの句が <span class="emphasis">text</span>、<span class="emphasis">ntext</span>、および <span class="emphasis">image</span> 列の配置を制御することです。これらの列は通常、その他のすべてのテーブルおよびデータベースオブジェクトと共にデフォルトのファイルグループに格納されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
<span class="emphasis">(</span>column_name datatype [NULL | NOT NULL] [DEFAULT default_value]
   [AUTO_INCREMENT]
   [PRIMARY KEY] [reference_definition] |
   [CHECK (expression) |
   [INDEX [index_name] index_col_name1[(length)],...n)] |
   [UNIQUE [INDEX] [index_name] (index_col_name1,...n)] |
   [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name1,...n)
      [REFERENCES table_name [(index_col_name,...)]
      [MATCH FULL | MATCH PARTIAL]
      [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
      [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}])
{[TYPE = {ISAM | MYISAM | HEAP} |
   AUTO_INCREMENT = int |
   AVG_ROW_LENGTH = int |
   CHECKSUM = {0 | 1} |
   COMMENT = "string" |
   DELAY_KEY_WRITE = {0 | 1} |
   MAX_ROWS = int |
   MIN_ROWS = int |
   PACK_KEYS = {0 | 1} |
   PASSWORD = "string" |
   ROW_FORMAT= { default | dynamic | static | compressed }] }
[[IGNORE | REPLACE] SELECT_statement]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、テーブルを作成する際に多くのオプションがあります。<span class="emphasis">TEMPORARY</span> オプションは、表作成時の接続期間のみ存続するテーブルを作成します。接続が切断されると、一時テーブルは自動的に削除されます。<span class="emphasis">IF NOT EXISTS</span> オプションを指定すると、テーブルが既に存在する場合のエラーを防止します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL でテーブルを作成する場合は、拡張子が <span class="emphasis">.frm</span> のテーブル定義ファイル、拡張子 <span class="emphasis">.myd</span> のデータファイル、拡張子 <span class="emphasis">.myi</span> のインデックスファイルの、通常 3 つのオペレーティングシステムファイルが作成されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AUTO_INCREMENT</span> 句は、整数型の列の値が 1 から開始して自動的に 1 ずつ増加するように設定します。MySQL で指定できる <span class="emphasis">AUTO_INCREMENT</span> 列は、1 つのテーブルに対して 1 つのみです。最大値が削除された場合は、その値は再利用されます。レコードがすべて削除された場合は、最初の値から開始されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PRIMARY KEY</span> 列を定義するには、その列を <span class="emphasis">NOT NULL</span> としても定義する必要があります。<span class="emphasis">INDEX</span> 特性を列に割り当てる場合は、そのインデックスの名前も指定できます。インデックス (<span class="emphasis">INDEX</span>) の MySQL でのシノニムは、キー (<span class="emphasis">KEY</span>) です。名前を指定しない場合、MySQL では、<span class="emphasis">index_column_name</span> の名前に数字の接尾辞 ( _2、_3、. . . ) を追加してその名前を一意にします。<span class="emphasis">NULL</span> 列、または <span class="emphasis">BLOB</span> や <span class="emphasis">TEXT</span> データタイプ列に対するインデックスは、MyISAM テーブル型でのみサポートされています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOREIGN KEY</span>、<span class="emphasis">CHECK</span>、および <span class="emphasis">REFERENCES</span> 句は何も行いません。これらの句にはテーブルに対する機能はなく、他の SQL データベースとの互換性を保つためだけに用意されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブルの <span class="emphasis">TYPE</span> オプションは、データの物理的な格納方法を指定します。<span class="emphasis">ISAM</span> は本来のテーブル定義です。<span class="emphasis">MyISAM</span> は比較的新しい構造で、移植性の高いバイナリの格納構造です。<span class="emphasis">HEAP</span> は、テーブルをメモリに格納します。その他のオプションは、テーブルパフォーマンスを最適化するために存在します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i><span class="emphasis">AUTO_INCREMENT</span></i><br>&#160;
						  自動増分 (<span class="emphasis">AUTO_INCREMENT</span>) 値をテーブルに設定します (MyISAM のみ)。</li><li><i><span class="emphasis">AVG_ROW_LENGTH</span></i><br>&#160;
						  可変サイズのレコードを持つテーブル行のおおよその平均長を設定します。MySQL では、<span class="emphasis">AVG_ROW_LENGTH</span> * <span class="emphasis">MAX_ROWS</span> を使用してテーブルの大きさを求めます。</li><li><i><span class="emphasis">CHECKSUM</span></i><br>&#160;
						  1 に設定すると、テーブル内のすべての行に対するチェックサムを維持します (MyISAM のみ)。これによって処理速度は遅くなりますが、破損しにくくなります。</li><li><i><span class="emphasis">COMMENT</span></i><br>&#160;
						  60 文字までのコメントを指定します。</li><li><i><span class="emphasis">DELAY_KEY_WRITE</span></i><br>&#160;
						  1 に設定すると、テーブルを閉じるまでキーテーブルの更新を遅らせます (MyISAM のみ)。</li><li><i><span class="emphasis">MAX_ROWS</span></i><br>&#160;
						  テーブルに格納できる最大行数を設定します。デフォルトの最大領域は 4 GB です。</li><li><i><span class="emphasis">MIN_ROWS</span></i><br>&#160;
						  テーブルに格納できる最小行数を設定します。</li><li><i><span class="emphasis">PACK_KEYS</span></i><br>&#160;
						  1 に設定した場合、テーブルのインデックスを圧縮します。これによって読み取り速度が向上しますが、更新は遅くなります (MyISAM および ISAM のみ)。デフォルトでは、文字列のみが圧縮されます。1 に設定すると、文字列および数値の両方が圧縮されます。</li><li><i><span class="emphasis">PASSWORD</span></i><br>&#160;
						  <span class="emphasis">.frm</span> ファイルをパスワードで暗号化しますが、テーブルは暗号化しません。</li><li><i><span class="emphasis">ROW_FORMAT</span></i><br>&#160;
						  行を今後どのようにテーブルに格納するかを定義します。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT</span>_<span class="emphasis">statement</span> 句を使用すると、<span class="emphasis">SELECT</span> ステートメントの要素に基づくフィールドを持つテーブルが作成されます。そのようにならない場合には、一部の実装のように、テーブルに <span class="emphasis">SELECT</span> ステートメントの結果を書き込むことができます。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE test_example
  (column_a INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY(column_a),
  INDEX(column_b))
TYPE=HEAP
SELECT column_b,column_c FROM samples;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この例では、<span class="emphasis">column_a</span>、<span class="emphasis">column_b</span>、および <span class="emphasis">column_c</span> の 3 つの列を持つヒープテーブルが作成されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [GLOBAL TEMPORARY] TABLE [schema.]table_name
( column_name datatype [DEFAULT] {column_constraint [...]} [,...n]
| table_constraint [,...n] } )
[ON COMMIT {DELETE | PRESERVE} ROWS]
( physical_characteristics )
( table_characteristics )</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコードブロックがシンプルで小さいのは見かけだけです。Oracle の <span class="emphasis">CREATE TABLE</span> ステートメントの極めて高度な実装は、単一のコマンドとしては、すべてのプログラミング言語の中で最も複雑な実装である可能性があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">CREATE TABLE</span> 句のコードには、従属句が多く含まれます。それらを 1 つのコマンド内ですべて示すよりも、そのコマンドを従属句ごとに分け、さらにそれに含まれる各従属句について説明します。この中には、平均的な SQL プログラマーにほとんど使用されることのない従属句もいくつかあります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 バージョンの <span class="emphasis">CREATE TABLE</span> と Oracle のバージョンの最も大きな違いは、<span class="emphasis">GLOBAL TEMPORARY</span> として作成されるテーブルが基本テーブルでなければならない点です。グローバル一時テーブルでは、Oracle が通常のテーブルで認めているパーティショニング、インデックス編集、またはテーブルのクラスター化などのほとんどの特殊機能を使用できません。グローバル一時テーブルはすべてのセッションで使用できますが、グローバル一時テーブルに格納されているデータは、そのデータを挿入したセッションでしか参照できません。<span class="emphasis">ON COMMIT</span> 句は、一時テーブルの作成時にのみ使用でき、各コミット後にテーブルを削除 (<span class="emphasis">DELETE ROWS</span>) するか、セッション終了時にテーブルを削除 (<span class="emphasis">PRESERVE ROWS</span>) するかを指定します。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE GLOBAL TEMPORARY TABLE shipping_schedule
  (ship_date DATE,
   receipt_date DATE,
   received_by VARCHAR2(30),
   amt NUMBER)
ON COMMIT PRESERVE ROWS;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>上記の <span class="emphasis">CREATE TABLE</span> ステートメントでは、<span class="emphasis">shipping_schedule</span> という名前のグローバル一時テーブルが作成され、挿入された行を複数セッション間で保有します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のテーブルの物理特性は、次のコードブロックおよびサブコードブロックを使用して定義します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- physical_characteristics
{[{[physical_attributes]
| TABLESPACE tablespace_name
| {LOGGING | NOLOGGING} }]
| {ORGANIZATION {HEAP [{[physical_attributes]
   | TABLESPACE tablespace_name
   | {LOGGING | NOLOGGING} }]
| INDEX indexed_table_clause)}
| CLUSTER cluster_name (column [,...n]) }
[special_storage_clause]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">physical_characteristics</span> 句は、ディスクサブシステム上にデータが物理的に格納される方法を制御します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">TABLESPACE</span> 句は、テーブルを特定の既存テーブル領域に割り当てます。<span class="emphasis">TABLESPACE</span> 句を指定しない場合、デフォルトのテーブル領域にインデックスが配置されます。<span class="emphasis">DEFAULT</span> キーワードを使用しても同じ結果になります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LOGGING</span> および <span class="emphasis">NOLOGGING</span> 句は、テーブル、ラージオブジェクト (LOB)、またはパーティションを REDO ログファイルに記録するかどうかを定義します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ORGANIZATION HEAP</span> 句を指定すると、任意の順序でテーブルの行を物理的に配置します。オプションで、<span class="emphasis">segment_characteristic</span> 句を指定できます。一方、<span class="emphasis">ORGANIZATION INDEX index_name</span> を使用すると、テーブルの行を指定インデックスに基づいて物理的にソートできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次のコードブロックに示されている <span class="emphasis">physical_attributes</span> 句を指定すると、テーブル全体の記憶域特性を定義できます。また、テーブルがパーティション化されている場合 (詳細については後述) は、指定のパーティションの記憶域特性を定義できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- physical_attributes
[{PCTFREE int | PCTUSED int | INITRANS int | MAXTRANS int | storage_
    clause}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PCTFREE</span> は、テーブル内の各データブロックに対して確保する空き領域の割合をパーセントで定義します。たとえば、値 10 を指定すると、挿入される新しい行のためにデータ領域の 10% が確保されます。<span class="emphasis">PCTUSED</span> は、新しい行を挿入するために必要な、ブロック内の空き領域の割合の最小値をパーセントで定義します。たとえば、値 90 を指定すると、使用領域が 90% を下回った場合にデータブロック内に新しい行が挿入されます。<span class="emphasis">PCTFREE</span> と <span class="emphasis">PCTUSED</span> の合計値は 100 を超えることはできません。<span class="emphasis">INITRANS</span> はほとんど使用しません。これは、データブロックに対する 1 ～ 255 番目の初期トランザクションの割り当てを定義します。<span class="emphasis">MAXTRANS</span> は、1 つのデータブロック上の同時トランザクションの最大数を定義します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">storage_clause</span> は、次に示すように、データの物理的な格納方法を規定する多くの属性を制御します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- storage_clause
STORAGE ( [ {INITIAL int [K | M]
            | NEXT int [K | M]
            | MINEXTENTS int
            | MAXEXTENTS {int | UNLIMITED}
            | PCTINCREASE int
            | FREELISTS int
            | FREELIST GROUPS int
            | OPTIMAL [{int [K | M] | NULL}]
            | BUFFER_POOL {KEEP | RECYCLE | DEFAULT} ] [...] )</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>storage_clause 句の属性を記述する場合は、<span class="emphasis">(INITIAL 32M NEXT8M)</span> のようにかっこで囲み、各属性をスペースで区切ります。<span class="emphasis">INITIAL int [K | M]</span> は、テーブルの初期エクステントサイズを、バイト単位、キロバイト単位 <span class="emphasis">(K)</span>、またはメガバイト単位 <span class="emphasis">(M)</span> で設定します。<span class="emphasis">NEXT int [K | M]</span> は、<span class="emphasis">INITIAL</span> で指定したエクステントが使用された後に割り当てる追加領域のサイズを指定します。<span class="emphasis">PCTINCREASE int</span> は、最初の増分後のオブジェクトの増分率を制御します。初期エクステントは指定値が割り当てられます。第 2 エクステントは、<span class="emphasis">NEXT</span> で指定されたサイズです。第 3 エクステントは、<span class="emphasis">NEXT + (NEXT * PCTINCREASE)</span> となります。<span class="emphasis">PCTINCREASE</span> を 0 に設定した場合、<span class="emphasis">NEXT</span> が常に使用されます。そうでない場合は、記憶領域の追加分エクステントはそれぞれ前のエクステントの <span class="emphasis">PCTINCREASE</span> 分だけ大きくなります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">MINEXTENTS int</span> は、最小エクステント数を指定します。デフォルトでは 1 つのみ作成されますが、オブジェクトが初期化されている場合は、より多くのエクステントが作成されます。<span class="emphasis">MAXEXTENTS int</span> では、エクステントの最大許容数を指定します。これは、無制限 (<span class="emphasis">UNLIMITED</span>) に設定できます。ただし、UNLIMITED はデータベースを破損する可能性があるため、注意して使用する必要があります。<span class="emphasis">FREELISTS int</span> は、各グループに空リストの数を指定します。デフォルトは 1 です。<span class="emphasis">FREELIST GROUPS int</span> は、空リストのグループ数を設定します。デフォルトは 1 です。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE book_sales
  (qty NUMBER,
   period_end_date DATE,
   period_nbr NUMBER)
TABLESPACE sales
STORAGE (INITIAL 8M NEXT 8M MINEXTENTS 1 MAXEXTENTS 8);</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">books_sales</span> テーブルは <span class="emphasis">sales</span> テーブル領域に定義され、初期領域 8 MB を消費し、最初のエクステントが消費された場合にさらに 8 MB 増加するよう指定されています。このテーブルには最小 1、最大 8 のエクステントが割り当てられているので、最大サイズは 64 MB に制限されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ORGANIZATION HEAP</span> 句を指定すると、任意の順序でテーブルの行を物理的に配置します。これは、オプションとして、<span class="emphasis">segment_characteristic_clause</span> を指定できます。一方、テーブルの行を指定インデックス (<span class="emphasis">INDEX</span>) に基づいて物理的にソートできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CLUSTER</span> 句は、テーブルを、クラスターキーに基づく既存のクラスター内に含めます。詳細については、Oracle の <span class="emphasis">CREATE CLUSTER</span> コマンドの説明を参照してください。クラスター内のすべてのテーブルには、クラスターキーの列に対応する列が必要です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">special_storage_clause</span> には、Oracle テーブル内で使用可能な LOB (イメージファイルなどのラージオブジェクト) 型、VARRAY 型、および NESTED TABLE 型の 3 つの特殊なデータ記憶型を指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>{LOB { (LOB_item [,n]) STORE AS {ENABLE | DISABLE} STORAGE IN ROW
      | (LOB_item) STORE AS
           {LOB_segment_name ({ENABLE | DISABLE} STORAGE IN ROW)
           | LOB_segment_name
           | ({ENABLE | DISABLE} STORAGE IN ROW)}
  | VARRAY varray_item STORE AS
  | NESTED TABLE nested_item STORE AS storage_table
      [(physical_characteristics)]
      [RETURN AS {LOCATOR | VALUE}] }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LOB</span> 句は、LOB データセグメントの記憶属性を定義します。LOB の項目は、テーブルで宣言された LOB 列の名前です。LOB オブジェクトは、長さが 4,000 バイト未満の場合、<span class="emphasis">ENABLE STORAGE IN ROW</span> 句を使用して行に格納できます。また、<span class="emphasis">DISABLE STORAGE IN ROW</span> 句を使用すると、サイズにかかわらず行外に保存されます。<span class="emphasis">LOB_storage_clause</span> を使用した LOB 記憶域の詳細については、Oracle のマニュアルを参照してください。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE large_objects
  (pretty_picture BLOB,
   interesting_text CLOB)
STORAGE (INITIAL 256M NEXT 256M)
LOG (pretty_picture, interesting_text)
   STORE AS (TABLESPACE large_object_segment
      STORAGE (INITIAL 512M NEXT 512M)
      NOCACHE LOGGING);</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">large_objects</span> テーブルは、イメージおよびテキストの格納に使用されています。ここでは、記憶特性に加えてログおよびキャッシュ特性も詳細に指定されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>VARRAY は、Oracle 独自のオブジェクトです。Oracle では、LOB 句と基本的に同じ構文を使用して、VARRAY 型で格納される LOB に対して個別に記憶パラメータを指定できます。VARRAY の詳細については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、テーブルが別のテーブルの列に仮想的に格納される <span class="emphasis">NESTED TABLE</span> 句を宣言できます。<span class="emphasis">STORE AS</span> 句では、テーブル内のテーブルに対してプロキシ名を指定できますが、ネストするテーブルはユーザー定義のデータタイプで最初に作成する必要があります。この機能は、値がまばらに配置されている場合は有効ですが、通常、日々のタスクには推奨されません。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TYPE prop_nested_tbl AS TABLE OF props_nt;

CREATE TABLE proposal_types
   (proposal_category VARCHAR2(50),
   proposals          PROPS_NT)
NESTED TABLE props_nt STORE AS props_nt_table;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、テーブルに対して、様々なテーブル特性を定義できます。これらの特性のいくつかを次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- table_characteristics
{ PARTITION characteristics }
[CACHE | NOCACHE] [MONITORING | NOMONITORING]
[{NOPARALLEL | PARALLEL [int] }]
[{ENABLE | DISABLE} [VALIDATE | NOVALIDATE]
  {UNIQUE (column [,...n] )
  | PRIMARY KEY
  | CONSTRAINT constraint_name}
[index_clause]
[EXCEPTION INTO [schema.]table_name]
[CASCADE] ]
[AS select_statement]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">PARTITION</span> 句を使用して、テーブルを複数のパーティションに分割することによって、パフォーマンスが向上します。テーブルパーティションのすべてを記述する完全な構文は、非常に長くなります。さらに、経験の少ない SQL プログラマーがこの構文を使用することはほとんどありません。テーブルパーティションの詳細については、Oracle のマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CACHE</span> を指定すると、高速読み取り用にテーブルをバッファリングし、<span class="emphasis">NOCACHE</span> はこの動作を解除します。インデックス構成テーブルでは、この <span class="emphasis">CACHE</span> 動作が提供されます。<span class="emphasis">MONITORING</span> を指定すると、パフォーマンスを高めるためテーブルの統計情報を収集し、<span class="emphasis">NOMONITORING</span> はこの機能を解除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE TABLE</span> ステートメントでは、<span class="emphasis">INDEX</span> 句は単に、テーブルと共に作成される主キーおよび一意インデックスのために使用します。<span class="emphasis">CREATE TABLE</span> コマンドを使用したインデックスの操作手段の詳細については、Oracle のマニュアルを参照してください。<span class="emphasis">CREATE INDEX</span> コマンドは、ほとんどの目的を果たすために推奨される操作手段です。ただし、Oracle では、主キー制約を持つテーブルを作成する場合、インデックスは自動的に作成されます。こうした状況では、ユーザーがインデックスを作成する必要はありません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PARALLEL</span> 句を使用すると、別個の CPU によってテーブルを並列に作成でき、処理が高速化します。作成後のテーブルに対するクエリーおよびその他のデータ操作処理を並列処理できます。オプションで整数値を指定すると、処理で使用される並列スレッドの数、および将来のテーブルで使用できる並列スレッドの数を定義できます。Oracle では、特定の並列処理で使用する最適スレッド数が計算されるので、この機能は省略可能です。デフォルトは <span class="emphasis">NOPARALLEL</span> です。これによってテーブルは直列に作成され、将来のクエリーおよびデータ操作処理の並列処理が無効となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DISABLE</span> および <span class="emphasis">ENABLE</span> 句は、テーブルに対する制約をそれぞれ無効または有効にします。基本的に、<span class="emphasis">DISABLE</span> 句は、任意のアクティブな整合性制約やトリガーを無効にできます。反対に、<span class="emphasis">ENABLE</span> は、任意の無効化された整合性制約やトリガーを有効にできます。これらの句の構文を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DISABLE | ENABLE {{UNIQUE(column[,...n] |
   PRIMARY KEY |
   CONSTRAINT constraint_name}
      [CASCADE]}
      [EXCEPTIONS INTO [owner.]table_name]
      [USING INDEX [INITRANS int][MAXTRANS int]
         [TABLESPACE tablespace_name][storage_characteristics]
         [PCTFREE int] |</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CASCADE</span> キーワードは、<span class="emphasis">DISABLE</span> 句でのみ使用可能で、カスケード制約やトリガーを無効にしません。代わりに、この句で指定した制約に依存するすべての整合性制約に無効化または有効化を連鎖させます。<span class="emphasis">EXCEPTIONS INTO</span> 句は、<span class="emphasis">ENABLE</span> でのみ使用可能で、すべての整合性制約違反の情報を既存の例外テーブルに格納します。<span class="emphasis">USING INDEX</span> 句も <span class="emphasis">ENABLE</span> でのみ使用可能で、指定インデックス、特に主キーおよび一意キーに対して様々な記憶特性を指定する機構を提供します。デフォルトでは、すべての制約が有効になっています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS SELECT_statement</span> 句は、有効な <span class="emphasis">SELECT</span> ステートメントからのレコードを新しいテーブルに書き込みます。PostgreSQL の <span class="emphasis">CREATE . . . AS SELECT</span> の実装とは異なり、<span class="emphasis">CREATE TABLE</span> ステートメントの列は、<span class="emphasis">SELECT</span> ステートメント内の列と一致する必要があります。<span class="emphasis">CREATE . . . AS SELECT</span> のロギングは、<span class="emphasis">NOLOGGING</span> キーワードを使用して解除できます。REDO ログファイルへのロギングはデフォルトの動作です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle は多数のオブジェクト指向の機能をサポートしていますが、本マニュアルではその機能については説明しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [TEMPORARY | TEMP] TABLE <span class="replaceable">table</span>
<span class="emphasis">(</span>column_name datatype [NULL | NOT NULL] [DEFAULT value]
<span class="emphasis">  </span>|<span class="emphasis"></span>[UNIQUE]
<span class="emphasis">  </span>| [PRIMARY KEY (column[,...n])]
   | [CHECK (expression) ]
   | REFERENCES reference_table (reference_column)
        [MATCH {FULL | PARTIAL | default}]
        [ON DELETE {CASCADE | NO ACTION | RESTRICT | SET NULL | SET
           DEFAULT}]
        [ON UPDATE {CASCADE | NO ACTION | RESTRICT | SET NULL | SET
           DEFAULT}]
        [[NOT] DEFERRABLE] [INITIALLY {DEFERRED | IMMEDIATE}] } [,...n]
|[table_constraint][,...n]
[INHERITS (inherited_table [,...n])]

| [ON COMMIT {DELETE | PRESERVE} ROWS]

| AS <span class="replaceable">SELECT</span>_statement</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、MySQL と同じような構文を使用して、一時 (<span class="emphasis">TEMPORARY</span>) テーブルを作成できます。一時テーブルは、一時テーブルが作成されたセッション期間内のみ存在し、セッションが終了すると自動的に削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">UNIQUE</span>、<span class="emphasis">PRIMARY KEY</span>、<span class="emphasis">CHECK</span> などの制約は、基本的に Microsoft SQL Server と同じです。ただし、PostgreSQL 特有の機能として、複数列を使用して列レベルの制約を作成できます。PostgreSQL では標準的なテーブルレベルの制約もサポートしているため、ANSI 規格のアプローチを推奨します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REFERENCES</span> 制約は <span class="emphasis">CHECK</span> 制約に似ていますが、別のテーブルの列の値に対して値を確認する点が異なります。REFERENCES 制約は、<span class="emphasis">FOREIGN KEY</span> 宣言の一部としても使用できます。<span class="emphasis">MATCH</span> オプションには、完全 (<span class="emphasis">FULL</span>)、一部 (<span class="emphasis">PARTIAL</span>)、およびデフォルト (<span class="emphasis">MATCH</span> にはキーワードはありません) を指定できます。FULL を指定した場合は、複数列外部キーのすべての列が、NULL になるか、有効な値を持つ必要があります。デフォルトでは、NULL と値は混在することができます。PARTIAL は有効な構文ですが、サポートされていません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>さらに、<span class="emphasis">REFERENCES</span> 句では、<span class="emphasis">ON DELETE</span> または <span class="emphasis">ON UPDATE</span> 参照整合性に対して様々な動作を宣言できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i><span class="emphasis">NO ACTION</span></i><br>&#160;
						  外部キー違反の場合は、エラーを表示します (デフォルト)。</li><li><i><span class="emphasis">RESTRICT</span></i><br>&#160;
						  <span class="emphasis">NO ACTION</span> のシノニムです。</li><li><i><span class="emphasis">CASCADE</span></i><br>&#160;
						  参照列の値に被参照列の値を設定します。</li><li><i><span class="emphasis">SET NULL</span></i><br>&#160;
						  参照列の値に NULL を設定します。</li><li><i><span class="emphasis">SET DEFAULT</span></i><br>&#160;
						  宣言された初期設定値を参照列に設定します。また、初期設定値が存在しない場合は NULL を設定します。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REFERENCES</span> 句の <span class="emphasis">DEFERRABLE</span> オプションを指定すると、すべての制約をトランザクションの終了時まで延期します。<span class="emphasis">REFERENCES</span> 句のデフォルトの動作は <span class="emphasis">NOT DEFERRABLE</span> です。<span class="emphasis">INITIALLY</span> 句は <span class="emphasis">DEFERRABLE</span> 句に似ています。<span class="emphasis">INITIALLY DEFERRED</span> を指定すると、トランザクションの終了時に制約が確認され、<span class="emphasis">INITIALLY IMMEDIATE</span> (デフォルト) を指定すると、各ステートメントの実行後に制約が確認されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server 同様、すべての列レベルの制約はテーブルレベルの制約として宣言できます。ただし、<span class="emphasis">FOREIGN KEY</span> 制約は、列レベルの制約としては宣言できず、テーブルレベルの制約としてのみ宣言できます。<span class="emphasis">REFERENCES</span> 句のすべてのオプションは、<span class="emphasis">FOREIGN KEYS</span> 句の一部としてサポートされています。次に構文を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>[FOREIGN KEY (column[,...n]) REFERENCES...]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INHERITS inherited_table</span> 句では、作成するテーブルのすべての列をどのテーブル (複数指定可) から継承するかを指定します。新しく作成されるテーブルは、上位階層のテーブルに添付されている関数も継承します。継承される列が重複している場合、このステートメントは失敗します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL で一時テーブルまたはグローバル一時テーブルを作成する場合、<span class="emphasis">ON COMMIT</span> 句を作成コマンドに追加することもできます。この句は、レコードがテーブルに対してコミットされた後の一時テーブルの動作を制御します。<span class="emphasis">ON COMMIT DELETE ROWS</span> を指定すると、各コミット後に一時テーブルのすべての行が削除されます。これがデフォルトです。<span class="emphasis">ON COMMIT PRESERVE ROWS</span> を指定すると、トランザクションのコミット後も一時テーブルの行が保持されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS SELECT_statement</span> 句を使用すると、有効な <span class="emphasis">SELECT</span> ステートメントからのデータを使用してテーブルの作成とデータ挿入を行います。列、データタイプ、または制約は、クエリーから継承されるため、宣言する必要はありません。これは、<span class="emphasis">SELECT . . . INTO</span> の機能に似ていますが、より分かりやすい構文になっています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、テーブルに外部キーを追加します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- Creating a column-level constraint
CREATE TABLE favorite_books
   (isbn         CHAR(100)    PRIMARY KEY NONCLUSTERED,
   book_name     VARCHAR(40)  UNIQUE,
   category      VARCHAR(40)  NULL,
   subcategory   VARCHAR(40)  NULL,
   pub_date      DATETIME     NOT NULL,
   purchase_date DATETIME     NOT NULL,
      CONSTRAINT fk_categories FOREIGN KEY (category)
         REFERENCES category(cat_name));</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">categories</span> 列の外部キーは、<span class="emphasis">category</span> テーブルの <span class="emphasis">cat_name</span> 列と関連付けられます。この構文は、本マニュアルで示しているすべてのベンダーでサポートされています。同様に、<span class="emphasis">category</span> および <span class="emphasis">subcategory</span> 列の両方を含む複数列キーとして外部キーを宣言することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>...
CONSTRAINT fk_categories FOREIGN KEY (category, subcategory)
         REFERENCES category(cat_name, subcat_name));</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>さらに、<span class="emphasis">pubs</span> データベース (<span class="emphasis">jobs</span> および <span class="emphasis">employee</span> テーブル) のより詳細な例を次に 2 つ示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- For a Microsoft SQL Server database
CREATE TABLE jobs
   (job_id  SMALLINT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
   job_desc VARCHAR(50) NOT NULL DEFAULT 'New Position',
   min_lvl  TINYINT NOT NULL CHECK (min_lvl &gt;= 10),
   max_lvl  TINYINT NOT NULL CHECK (max_lvl &lt;= 250))

-- For a MySQL  database
CREATE TABLE employee
   (emp_id INT AUTO_INCREMENT CONSTRAINT PK_emp_id PRIMARY KEY,
   fname VARCHAR(20) NOT NULL,
   minit CHAR(1) NULL,
   lname VARCHAR(30) NOT NULL,
   job_id SMALLINT NOT NULL DEFAULT 1
      REFERENCES jobs(job_id),
   job_lvl TINYINT DEFAULT 10,
   pub_id CHAR(4) NOT NULL DEFAULT ('9952')
      REFERENCES publishers(pub_id),
   hire_date DATETIME NOT NULL DEFAULT (CURRENT_DATE(  ));

CREATE TABLE publishers
   (pub_id char(4) NOT NULL
      CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
      CHECK (pub_id IN ('1389', '0736', '0877', '1622', '1756')
      OR pub_id LIKE '99[0-9][0-9]'),
   pub_name varchar(40) NULL,
   city varchar(20) NULL,
   state char(2) NULL,
   country varchar(30) NULL DEFAULT('USA'))</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>記憶プロパティが多数設定された Oracle の <span class="emphasis">CREATE TABLE</span> ステートメントの例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TABLE classical_music_cds
   (music_id        INT,
   composition      VARCHAR2(50),
   composer         VARCHAR2(50),
   performer        VARCHAR2(50),
   performance_date DATE DEFAULT SYSDATE,
   duration         INT,
   cd_name          VARCHAR2(100),
CONSTRAINT pk_class_cds PRIMARY KEY (music_id)
   USING INDEX TABLESPACE index_ts
   STORAGE (INITIAL 100K NEXT 20K),
CONSTRAINT uq_class_cds UNIQUE (composition, performer, performance_date)
   USING INDEX TABLESPACE index_ts
   STORAGE (INITIAL 100K NEXT 20K))
TABLESPACE tabledata_ts;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE TRIGGER">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE TRIGGER</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis"></span>  トリガーは、特殊なストアドプロシージャーで、データ変更ステートメントの実行時に自動的に起動されます。トリガーは、特定のテーブルに対する特定のデータ変更ステートメント (<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、または <span class="emphasis">DELETE</span>) に関連付けられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER trigger_name
{BEFORE | AFTER} {[DELETE] | [INSERT] | [UPDATE] [OF column [,...n]}
ON table_name
[REFERENCING {OLD [ROW] [AS] old_name | NEW [ROW] [AS] new_name
  OLD TABLE [AS] old_name | NEW TABLE [AS] new_name}]
[FOR EACH { ROW | STATEMENT }]
[WHEN (conditions)]
code block</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>トリガー (trigger_name) は、デフォルトでは、<span class="emphasis">ステートメントレベル</span>で 1 回起動されます。つまり、単一の <span class="emphasis">INSERT</span> ステートメントによってテーブルに 500 行が追加される場合でも、そのテーブルに対する挿入トリガーが起動されるのは 1 度のみです。データ変更処理の各行につき 1 回のトリガーを起動できるベンダーもあります。したがって、テーブル内に 500 行を挿入するステートメントに行レベルの挿入トリガーがあれば、各行が挿入されるたびに 1 回ずつ、計 500 回トリガーが起動されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>トリガーは、指定したテーブル (table_name) に対する特定のデータ変更ステートメント (<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、または <span class="emphasis">DELETE</span>) に関連付けられるだけでなく、起動する特定の<span class="emphasis">タイミング</span>も設定できます。一般的に、<span class="emphasis">BEFORE</span> を指定すると、トリガーはデータ変更ステートメントの処理前に起動され、<span class="emphasis">AFTER</span> を指定すると、処理後に起動されます。また、<span class="emphasis">INSTEAD OF</span> (ベンダーが対応している場合) を指定すると、そのステートメントの処理の代わりに起動されます。データ変更ステートメントの前、またはそのステートメントの代わりに起動されるトリガーでは、そのステートメントによる変化が分かりませんが、ステートメントの処理後に起動されるトリガーでは、データ変更ステートメントによる変更結果を知ることができるので、その変更に対して動作することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER trigger_name
ON {table_name | view_name}
[WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF} {[DELETE] [,] [INSERT] [,] [UPDATE]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS
  {
  T-SQL_block
  |
  { IF UPDATE(column) [{AND | OR} UPDATE(column)] [...n]
    |
    IF (COLUMNS_UPDATED(  ) {bitwise_operator} updated_bitmask)
    { comparison_operator} column_bitmask [...n] }
    T-SQL_block [...n]
   }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server の <span class="emphasis">CREATE TRIGGER</span> ステートメントでは、多数の興味深い機能をサポートしてます。まず、SQL Server では、指定したテーブル (table_name) または<span class="emphasis">ビュー</span> (view_name) に対する 1 つのデータ操作処理に対して複数のトリガー (trigger_name) を設定できます。したがって、1 つのテーブルに対して 3 つの <span class="emphasis">UPDATE</span> トリガーを設定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH ENCRYPTION</span> 句を使用すると、<span class="emphasis">syscomments</span> システムテーブル内に格納されるトリガーのテキストを暗号化します。<span class="emphasis">WITH APPEND</span> 句を指定すると、既存の種類のトリガーをテーブルまたはビューに追加します。この句は製品の下位互換性を保つためにあり、<span class="emphasis">FOR</span> トリガーでのみ使用できます。<span class="emphasis">NOT FOR REPLICATION</span> 句を指定すると、SQL Server の組み込みレプリケーション機能によって呼び出されるデータ操作処理におけるトリガーを無効にします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOR</span>、<span class="emphasis">AFTER</span>、および <span class="emphasis">INSTEAD OF</span> 句は、トリガーの起動時期を指定します。<span class="emphasis">FOR</span> および <span class="emphasis">AFTER</span> キーワードはシノニムで、同じ機能を提供します。これらのキーワードは実際、トリガーを起動するデータ変更ステートメント、カスケード動作および制約確認が正常に完了した後にのみトリガーが起動するよう指定します。1 つのテーブルに対して、複数の <span class="emphasis">AFTER</span> トリガーを指定できます。これらのトリガーの順番は定義されませんが、テーブルで実行される最初と最後の AFTER トリガーは <span class="emphasis">sp_settriggerorder</span> システムストアドプロシージャーを使用して指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AFTER</span> トリガーはビューに対しては定義できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSTEAD OF</span> 句は機能的に Oracle の <span class="emphasis">BEFORE</span> トリガーと同じです。この句を指定すると、トリガーを起動するデータ変更ステートメントの前 (つまり、そのステートメントの代わり) にトリガーが起動されますが、特定のテーブルに対する <span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、または <span class="emphasis">DELETE</span> の各ステートメントにつき指定できる <span class="emphasis">INSTEAD OF</span> トリガーは 1 つだけです。<span class="emphasis">AFTER</span> トリガーは複数指定できます。この種のトリガーはビューで使用できますが、<span class="emphasis">WITH CHECK OPTION</span> 句が指定されたビューでは使用できません。<span class="emphasis">INSTEAD OF DELETE</span> トリガーは、削除に関するカスケード動作がある場合は使用できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DELETE</span>、<span class="emphasis">INSERT</span>、および <span class="emphasis">UPDATE</span> は、トリガーを起動するデータ変更ステートメントを指定します。SQL Server では、トリガーの定義においてこれらを複数指定する場合、各オプションをコンマで区切ることによって、自由に組み合わせることができます。複数のオプションを指定する場合、組み合わせ定義の各ステートメントに対して同じコードが実行されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS T-SQL_block</span> 句には、データ操作処理が実行されるたびにトリガーによって起動されるプロシージャーコードを含めます。このセクションは、Transact-SQL の <span class="emphasis">BEGIN</span> および <span class="emphasis">END</span> 句で囲む必要があります。従来、このセクションには流れ制御言語がよく使用され、データ変更のタイプと量が検査されていました。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、トリガーの起動時に、<span class="emphasis">deleted</span> および <span class="emphasis">inserted</span> の 2 つの重要な疑似テーブルがインスタンス化されます。これらのテーブルは、トリガーが定義されるテーブルと構造が同じです。違いは、<span class="emphasis">deleted</span> テーブルには、データ変更ステートメントが実行される前の古いデータが格納され、実行後のテーブルの新しい値が、<span class="emphasis">inserted</span> テーブルに格納される点です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSTEAD OF</span> トリガーのみが <span class="emphasis">text</span>、<span class="emphasis">ntext</span>、または <span class="emphasis">image</span> 型の列にアクセスできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS IF UPDATE(column)</span> 句を指定すると、指定列に対する <span class="emphasis">INSERT</span> や <span class="emphasis">UPDATE</span> 操作を特別に検査します。別の <span class="emphasis">UPDATE(column)</span> 句を最初の句の後に追加して、複数の列を指定できます。その句の後に Transact-SQL の <span class="emphasis">BEGIN . . . END</span> ブロックを続けて指定すると、条件が整った場合に起動する Transact-SQL 操作を複数定義できます。この句は、機能的に <span class="emphasis">IF . . . THEN . . . ELSE</span> 処理と同じです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS IF (COLUMNS_UPDATE( ))</span> 句は、<span class="emphasis">AS IF UPDATE( )</span> 句と同様に、指定列に対する <span class="emphasis">INSERT</span> または <span class="emphasis">UPDATE</span> 操作についてのみ実行されます。これによって、挿入または更新された列を示し、列値を様々な方法で比較するビットごとの操作が可能な <span class="emphasis">varbinary</span> ビットパターンが返されます。比較演算子の等号 (=) は、updated_bitmask に指定した列すべてが変更されたかどうかを確認するのに使用し、指定した列のいずれかが変更されたかどうかを確認するには、大なり記号 (&gt;) 記号を使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>トリガーは、宣言的な参照整合性の制御によく使用されます。ただし、主キーおよび外部キーの宣言には、<span class="emphasis">CREATE TABLE</span> または <span class="emphasis">ALTER TABLE</span> ステートメントの使用が推奨されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、トリガーの Transact-SQL ブロック内で、<span class="emphasis">ALTER</span>、<span class="emphasis">CREATE</span>、<span class="emphasis">DROP</span>、<span class="emphasis">DENY</span>、<span class="emphasis">GRANT</span>、<span class="emphasis">REVOKE</span>、<span class="emphasis">LOAD</span>、<span class="emphasis">RESTORE</span>、<span class="emphasis">RECONFIGURE</span> または <span class="emphasis">TRUNCATE</span> のステートメントを使用<span class="emphasis">できません</span>。さらに、すべての <span class="emphasis">DISK</span> ステートメントや <span class="emphasis">UPDATE STATISTICS</span> コマンドも使用できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server ではまた、<span class="emphasis">sp_dboption</span> システムストアドプロシージャーの <span class="emphasis">recursive triggers</span> 設定を使用して、トリガーを再帰的に起動できます。再帰トリガーは、自身のアクションによって再び起動します。たとえば、<span class="emphasis">T1</span> テーブルの <span class="emphasis">INSERT</span> トリガーが、<span class="emphasis">T1</span> テーブルに対して <span class="emphasis">INSERT</span> 処理を実行する場合に、再帰処理が実行されます。再帰トリガーの使用には注意が必要なので、この機能はデフォルトで無効となっています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>同様に、SQL Server では、最大 32 段階のレベルまでの<span class="emphasis">ネストしたトリガー</span>を認めています。ネストしたトリガーのいずれかが <span class="emphasis">ROLLBACK</span> 処理を実行すると、それ以降のトリガーは実行されません。ネストしたトリガーとは、たとえば、<span class="emphasis">T1</span> テーブルのトリガーが <span class="emphasis">T2</span> テーブルに対する処理を実行すると、T2 テーブルのトリガーが <span class="emphasis">T3</span> テーブルに対する処理を実行するというものです。トリガーで無限ループが発生すると、トリガーはキャンセルされます。ネストしたトリガーは、システムストアドプロシージャー <span class="emphasis">sp_configure</span> のネストしたトリガーの設定を使用して有効化されます。ネストしたトリガーが無効に設定されている場合、<span class="emphasis">sp_dboption</span> の recursive triggers 設定にかかわらず、再帰トリガーも無効となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server の <span class="emphasis">CREATE</span> ステートメントでは、<span class="emphasis">名前の遅延解決</span> を認めています。これは、コマンドが、データベースに存在していないデータベースオブジェクトを参照した場合でも処理される機能です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [OR REPLACE] TRIGGER [owner.]trigger_name
{BEFORE | AFTER | INSTEAD OF}
{[DELETE] [OR] [INSERT] [OR] [UPDATE [OF column [,...n] ]] [...n]}
ON {table_name | view_name}
[REFERENCING {OLD [AS] old_name | NEW [AS] new_name}]
[FOR EACH { ROW | STATEMENT }]
[WHEN (conditions)]
PL/SQL block</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>他の標準的な <span class="emphasis">CREATE TRIGGER</span> ステートメント同様、このコマンドは、PL/SQL コードブロックを起動するデータ変更処理 (<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、または <span class="emphasis">DELETE</span>) および起動するタイミングを指定します。タイミングは、データ変更処理の前 (<span class="emphasis">BEFORE</span>)、後 (<span class="emphasis">AFTER</span>)、または代わり (<span class="emphasis">INSTEAD OF</span>) のいずれかです。<span class="emphasis">UPDATE</span> 処理では、列 (複数列も可) に <span class="emphasis">UPDATE OF</span> を指定して、この指定列が変更された場合にのみ更新トリガー (trigger_name) が起動するように指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、テーブルではなく、ビューに対してのみ <span class="emphasis">INSTEAD OF</span> トリガーを起動できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>また、<span class="emphasis">DROP TABLE</span> または <span class="emphasis">SHUTDOWN</span> などの特定のデータベースイベントに対してもトリガーを起動できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REFERENCING</span> 句では、古い (<span class="emphasis">OLD</span>) テーブルと新しい (<span class="emphasis">NEW</span>) テーブルのそれぞれのバージョンを保持する疑似テーブルの名前 (old_name と new_name) を指定します。SQL Server では、これらの疑似テーブルは自動的に <span class="emphasis">inserted</span> および <span class="emphasis">deleted</span> と名付けられます。Oracle では、これらの疑似テーブルのデフォルト名はそれぞれ <span class="emphasis">OLD</span> および <span class="emphasis">NEW</span> です。これらの疑似テーブルは、データ操作処理によって変更される前のレコード値 (<span class="emphasis">OLD</span> 疑似テーブルの値)、および、データ操作処理後の値 (<span class="emphasis">NEW</span> 疑似テーブルの値) と比較されます。疑似テーブルは、<span class="emphasis">PL/SQL_block</span> での条件操作も実行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">OLD</span>  および <span class="emphasis">NEW</span> 疑似テーブルの値を参照する場合、値の前にコロン (:) を付ける必要があります。ただし、トリガーの WHEN 句内ではコロンは使用されません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOR EACH ROW</span> 句を指定すると、トリガーは、ステートメントトリガーとして暗黙的に起動 (トランザクション全体に対して 1 回起動) されずに、個々の行に対して起動 (処理によって影響を受ける各行ごとに 1 回起動) されます。<span class="emphasis">WHEN</span> 句には、トリガーの実行を条件が満たされた場合のみに制限する SQL の条件 (conditions) を指定します。また、<span class="emphasis">WHEN</span> 句を使用すると、<span class="emphasis">OLD</span> および <span class="emphasis">NEW</span> テーブルを、これらのテーブルを比較する PL/SQL ブロックを構築せずに比較できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>同じテーブルの同じレベル (行レベルまたはステートメントレベル) に対する複数の種類のトリガーを、1 つのトリガーコマンドに結合できます。トリガーを 1 つのステートメントに結合する場合、<span class="emphasis">IF INSERTING THEN</span>、<span class="emphasis">IF UPDATING THEN</span>、および <span class="emphasis">IF DELETING THEN</span> 句を PL/SQL ブロック内で使用して、コードロジックを別個のセグメントに分割できます。この構造内で、<span class="emphasis">ELSE</span> 句を使用することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER trigger_name
{ BEFORE | AFTER }
{ {[DELETE] [OR | ,] [INSERT] [OR | ,] [UPDATE]} [OR ...] }
ON table_name
FOR EACH { ROW | STATEMENT }
EXECUTE PROCEDURE function_name (parameters)</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の <span class="emphasis">CREATE TRIGGER</span> 機能の実装は、その他のベンダーと類似しています。<span class="emphasis">BEFORE</span> を指定すると、レコードに対するデータ変更処理の実行前、および、任意の制約の確認前にトリガー (trigger_name) を起動できます。また、<span class="emphasis">AFTER</span> を指定すると、データ操作処理の実行後 (および制約の確認後) にトリガーを起動でき、トランザクションで行われるすべての処理がトリガーに可視となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle および SQL Server のようにプロシージャー型コードブロックを処理するのではなく、PostgreSQL では、<span class="emphasis">CREATE FUNCTION</span> を使用して作成した関数を、<span class="emphasis">EXECUTE PROCEDURE</span> 句で実行します。また、他のベンダーでは、トリガーはトランザクションのすべての行に対して暗黙的に処理されますが、PostgreSQL では、各行に対してトリガーを実行する場合は <span class="emphasis">FOR EACH ROW</span> 句を使用し、トランザクション全体に対してトリガーを 1 回だけ実行する場合は <span class="emphasis">FOR EACH STATEMENT</span> 句を使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の <span class="emphasis">BEFORE</span> トリガーの例を次に示します。このトリガーは、<span class="emphasis">sales</span> テーブルの行を挿入または更新する前に、指定された流通業者 (distributor) ID が <span class="emphasis">distributors</span> テーブルに存在することを行レベルで確認します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER if_dist_exists
BEFORE INSERT OR UPDATE ON sales
FOR EACH ROW
EXECUTE PROCEDURE check_primary_key ('did', 'distributors', 'did');</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">BEFORE</span> トリガーは、データ変更処理によって影響を受けるレコードが、テーブル内で変更される前に処理されるため、データ変更処理によってテーブルにコミットされた値を変更します。<span class="emphasis">AFTER</span> トリガーは、テーブル内で行が変更されるまで起動できないので、検査プロセスによく使用されます。<span class="emphasis">INSTEAD OF</span> は、ユーザーがトランザクションに提供したコードを実行するので、データ変更処理は完全に省略されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>値の比較に <span class="emphasis">OLD</span> および <span class="emphasis">NEW</span> 疑似テーブルを使用する Oracle の <span class="emphasis">BEFORE</span> トリガーの例を次に示します。SQL Server では、<span class="emphasis">DELETED</span> および <span class="emphasis">INSERTED</span> 疑似テーブルを同じ方法で比較に使用します。次のトリガーでは、従業員の給与レコードを変更する前に監査レコードを作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER if_emp_changes
BEFORE DELETE OR UPDATE ON employee
FOR EACH ROW
WHEN (new.emp_salary &lt;&gt; old.emp_salary)
BEGIN
  INSERT INTO employee_audit
  VALUES ('old', :old.emp_id, :old.emp_salary, :old.emp_ssn);
END;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、<span class="emphasis">IF DELETING THEN</span> 句を使用する Oracle の挿入トリガーと更新トリガーを構築します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER if_emp_changes
BEFORE DELETE OR UPDATE ON employee
FOR EACH ROW
BEGIN
  IF DELETING THEN
    INSERT INTO employee_audit
    VALUES ('DELETED', :old.emp_id, :old.emp_salary, :old.emp_ssn);
  ELSE
    INSERT INTO employee_audit
    VALUES ('UPDATED', :old.emp_id, :new.emp_salary, :old.emp_ssn);
  END IF;
END;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の SQL Server の例では、<span class="emphasis">contractor</span> という新しいテーブルをデータベースに追加します。また、<span class="emphasis">employee</span> テーブルの従業員が契約者であることを示す全レコードを、<span class="emphasis">contractor</span> テーブルに移動します。<span class="emphasis">employee</span> テーブルに挿入されるはずであったすべての新しい従業員は、<span class="emphasis">INSTEAD OF</span> トリガーを介して <span class="emphasis">contractor</span> テーブルに挿入されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE TRIGGER if_emp_is_contractor
INSTEAD OF INSERT ON employee
BEGIN
  INSERT INTO contractor
  SELECT * FROM inserted WHERE status = 'CON'

  INSERT INTO employee
  SELECT * FROM inserted WHERE status = 'FTE'
END
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="CREATE VIEW">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">CREATE VIEW</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>この  ステートメントは、<span class="emphasis">ビュー</span>を作成します。ビューは<span class="emphasis">仮想テーブル</span>とも呼ばれます。ビューはテーブルと同じように動作しますが、実際はクエリーとして定義されます。有効な <span class="emphasis">SELECT</span> ステートメントはほぼすべて、ビューの内容を定義できますが、<span class="emphasis">ORDER BY</span> 句は通常は使用できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ビューをステートメントで参照すると、そのステートメントが実行されている間、クエリーの結果セットがビューの内容となります。ビューを更新できる場合があり、その変更は基本テーブルの基底データに反映されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ビューは他のビューから構築することもできますが、これは推奨される方法ではないため、通常は行わないでください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE VIEW view_name [(column list)]
AS
(SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION] )</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ビューの効率は通常、ベースとなっているクエリーと同じです。したがって、定義する <span class="emphasis">SELECT</span> ステートメント (SELECT_statement) が高速で、よく記述されていることが重要になります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ビュー名の後には列リスト (<span class="emphasis">column list</span>) も指定できます。オプションの列リストには、<span class="emphasis">SELECT</span> ステートメントの結果セットにおける各要素のエイリアスを指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH CHECK OPTION</span> 句は、基本テーブルの更新を認めるビューにおいて<span class="emphasis">のみ</span>使用します。これを指定すると、ビューによって読み取られるデータだけが、ビューによって挿入、更新、または、削除できます。たとえば、<span class="emphasis">employees</span> テーブルのビューが、フルタイムの従業員列のみを表示し、パートタイムの従業員列を表示していない場合、パートタイムの従業員列のデータをそのビューから挿入、更新、または削除することはできません。ネストしたビューには、<span class="emphasis">CHECK OPTION</span> 句の <span class="emphasis">CASCADE</span> および <span class="emphasis">LOCAL</span> オプションを使用します。<span class="emphasis">CASCADE</span> オプションを指定すると、現在のビューおよび構築元のすべてのビューの整合性が確認されます。<span class="emphasis">LOCAL</span> オプションを指定すると、現在のビューが他のビューから構築されている場合でも、現在のビューの整合性しか確認しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ANSI SQL99 のビューは、次の条件を満たす場合に、ベースとなる基本テーブルを更新できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li><span class="emphasis">SELECT</span> ステートメントを 1 つのテーブルから定義している。</li><li>ビュー内に <span class="emphasis">UNION</span>、<span class="emphasis">MINUS</span>、または <span class="emphasis">INTERSECT</span> 演算子がない。</li><li><span class="emphasis">SELECT</span> ステートメントの定義内に、<span class="emphasis">GROUP BY</span> または <span class="emphasis">HAVING</span> 句がない。</li><li><span class="emphasis">SELECT</span> ステートメントの定義内に、<span class="emphasis">ROWNUM</span> または <span class="emphasis">ROWGUIDCOL</span> など、疑似列に対する参照がない。</li><li><span class="emphasis">SELECT</span> ステートメントの定義内にグループ関数がない。</li><li><span class="emphasis">SELECT</span> ステートメントの定義内に <span class="emphasis">DISTINCT</span> 句がない。</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [owner_name.]VIEW view_name [(column [,...n])]
[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA} [,...n]]
AS
select_statement
[WITH CHECK OPTION]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、SQL99 にない、<span class="emphasis">ENCRYPTION</span> および <span class="emphasis">SCHEMABINDING</span> の 2 つの新しいオプションを使用できます。<span class="emphasis">ENCRYPTION</span> オプションを指定すると、<span class="emphasis">syscomments</span> テーブル内のビュー (view_name) のテキストが暗号化されます。<span class="emphasis">SCHEMABINDING</span> オプションを指定すると、ビューが特定のスキーマにバインドされます。つまり、ビュー内のオブジェクトを参照するには、フルネーム (所有者とオブジェクト名の両方) を指定する必要があります。<span class="emphasis">SCHEMABINDING</span> を指定して作成したビュー (およびこれらのビューによって参照されるテーブル) を削除または変更するには、<span class="emphasis">ALTER VIEW</span> を使用してスキーマバインディングを削除する必要があります。<span class="emphasis">VIEW_METADATA</span> を指定すると、基本テーブルではなくビューに関するメタデータを、SQL Server が DBLIB および OLEDB API からの呼び出しに返します。<span class="emphasis">VIEW_METADATA</span> で作成または変更されたビューの列は、<span class="emphasis">INSERT</span> および <span class="emphasis">UPDATE INSTEAD OF</span> トリガーで更新できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server ではビューにインデックスを作成できます (<span class="emphasis">CREATE INDEX</span> 参照)。ビューに一意の、クラスターインデックスを作成することにより、SQL Server は実質的にビューの物理コピーをデータベースに格納します。基本テーブルを変更すると、インデックスビューも自動的に更新されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>インデックスビューは、基本テーブルに対して、<span class="emphasis">SCHEMABINDING</span> 句のみを使用して作成します。これは高度な技法であるため、熟練プログラマーによってのみ使われます。この技法の詳細については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE [OR REPLACE] [FORCE | NO FORCE] VIEW [owner_name.]view_name
  [(column [,...n])]
AS
SELECT_statement
[WITH [READ ONLY | CHECK OPTION [CONSTRAINT constraint_name] ] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">OR REPLACE</span> 句は、同じ名前を持つあらゆる既存のビューを新しいビューに置換します。<span class="emphasis">FORCE</span> 句を指定すると、基本テーブルが存在するかどうか、またはビューを作成するユーザーが基本テーブルに対する権限を所有しているかどうかにかかわらず、ビューを作成します。<span class="emphasis">NO FORCE</span> 句は、基本テーブルが存在し、適切な権限がある場合に限り、ビューを作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">CHECK</span> <span class="emphasis">OPTION</span> を使用でき、さらに <span class="emphasis">CONSTRAINT</span> 句を使用して制約の名前 (constraint_name) を指定できます。<span class="emphasis">CHECK</span> <span class="emphasis">OPTION</span> 句はネストしたビューで使用できますが、トップレベルビューの <span class="emphasis">CHECK</span> <span class="emphasis">OPTION</span> が有効な場合に限られます。制約の名前を省略すると、Oracle が新たに <span class="emphasis">SYS_C</span><span class="emphasis">n</span> という名前を付けます。<span class="emphasis">n</span> は整数です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、SQL99 要件を満たし、追加された要件にどのような式も含まれない場合に、ビューを介してデータ操作処理を実行できます。<span class="emphasis">WITH READ ONLY</span> 句を指定すると、ビューはデータの取得にのみ使用されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE VIEW view_name AS SELECT_statement</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の <span class="emphasis">CREATE VIEW</span> は、他のベンダーが対応している一部の複雑なオプションには対応していません。ただし、テーブルおよび他の定義済みクラスオブジェクトに基づいてビューを作成できます。PostgreSQL のビューは、通常、他のビューではなく、他のテーブルに基づいてのみ作成され、基底の基本テーブルのデータ変更には使用されません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>単一のテーブルの全内容に基づく最もシンプルなビューの例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE VIEW employees
AS
SELECT *
FROM employee_tbl;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この例では、カリフォルニア (California) 州の著者 (authors) にのみ適用されるデータ変更を可能とする <span class="emphasis">california_authors</span> ビューを示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE VIEW california_authors
AS
SELECT au_lname, au_fname, city, state
FROM authors
WHERE state = 'CA'
WITH CHECK OPTION
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DECLARE CURSOR">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DECLARE CURSOR</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DECLARE CURSOR</span>   コマンドを使用すると、テーブルから一度に 1 行ずつレコードの取得および操作を行うことができます。これによって、従来の SQL が提供していた集合処理ではなく、行単位の処理が行われます。この処理を正しく行うには、次のことを行う必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li>カーソルを宣言する (<span class="emphasis">DECLARE</span>)<ul>
								</ul>
							</li><li>カーソルを開く (<span class="emphasis">OPEN</span>)<ul>
								</ul>
							</li><li>カーソルから行を取得する (<span class="emphasis">FETCH</span>)<ul>
								</ul>
							</li><li>終了後、カーソルを閉じる (<span class="emphasis">CLOSE</span>)<ul>
								</ul>
							</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL は ANSI SQL スタイルのサーバーサイドカーソルには対応していませんが、同じ機能を提供する広範な C プログラミング拡張には対応しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DECLARE CURSOR</span> コマンドは、<span class="emphasis">SELECT</span> ステートメントを指定することによって機能します。<span class="emphasis">SELECT</span> ステートメントによって返される各行は、個々に取得および操作されます。<span class="emphasis">DECLARE CURSOR</span> コマンドは、サーバーサイドカーソルの特性も定義します。特性には、カーソルのスクロール方法、および <span class="emphasis">SELECT</span> ステートメントが結果セットを取得する方法が含まれます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">INSENSITIVE</span>  および <span class="emphasis">SCROLL</span> オプションが識別されます。<span class="emphasis">INSENSITIVE</span> キーワードを指定すると、カーソルは、カーソルによって使われる結果セットの一時コピーを作成します。カーソルに対するすべてのリクエストに対しては、基本テーブルからではなく、一時テーブルから答えが返されます。カーソルでは変更が認められていません。以降のカーソルによる取り出しは、カーソルによって行われたすべての変更を反映しません。<span class="emphasis">SCROLL</span> キーワードは、カーソルに対するすべての <span class="emphasis">FETCH</span> オプション (<span class="emphasis">FIRST</span>、<span class="emphasis">LAST</span>、<span class="emphasis">PRIOR</span>、<span class="emphasis">NEXT</span>、<span class="emphasis">RELATIVE</span>、および <span class="emphasis">ABSOLUTE</span>) を有効にします。詳細については、<span class="emphasis">FETCH</span> コマンドの項を参照してください。<span class="emphasis">SCROLL</span> を宣言しない場合、<span class="emphasis">FETCH</span> のオプションとして使用できるのは、<span class="emphasis">NEXT</span> だけです。<span class="emphasis">FOR READ ONLY</span> 句を使用して、読み取り専用のカーソルを宣言することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、最初に変数を宣言していない限り、<span class="emphasis">SELECT</span> ステートメントの <span class="emphasis">WHERE</span> 句内で変数を使用できません。<span class="emphasis">DECLARE</span> ではパラメータを割り当てられませんが、代わりに、<span class="emphasis">OPEN</span> コマンドでパラメータを割り当てられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の実装は、Microsoft SQL Server と非常に似ていますが、<span class="emphasis">BINARY</span> オプションが使用できる点が異なります。<span class="emphasis">BINARY</span> を指定すると、カーソルはテキスト形式のデータではなく、バイナリ形式のデータを取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title"> Oracle の構文</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE CURSOR cursor_name [parameter1 datatype1 [,...parameterN datatypeN]
IS select_statement
[FOR UPDATE [OF column_name [,...n]]}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE cursor_name [BINARY] [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では本章で前述した標準的なフォーマットに対応していますが、より複雑な拡張機能も用意しています。構文を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE cursor_name CURSOR
[LOCAL | GLOBAL] [FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR select_statement
[FOR UPDATE [OF column_name [,...n]]]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この構文は、ANSI 規格のカーソル宣言と同じ方法で機能しますが、新しい機能を多数提供しています。まず、カーソル (cursor_name) の有効範囲を <span class="emphasis">LOCAL</span> または <span class="emphasis">GLOBAL</span> として宣言できます。<span class="emphasis">LOCAL</span> を宣言した場合、カーソルは、宣言された現行の Transact-SQL のバッチ、ストアドプロシージャー、またはトリガーの中でしか使用できません。<span class="emphasis">GLOBAL</span> を宣言した場合、カーソルは、接続を通じて <span class="emphasis">OPEN</span> および <span class="emphasis">FETCH</span> コマンドで利用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Transact-SQL の表記を、Microsoft SQL Server の ANSI 規格のカーソル宣言と混同しないでください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次のいくつかのオプションを使用すると、カーソルがレコードセット内を検索する方法を決めることができます。<span class="emphasis">FORWARD_ONLY</span> は、<span class="emphasis">SCROLL</span> とは逆に、カーソルが最初のレコードから最後のレコード方向にしかスクロールできないように指定します。これを、<span class="emphasis">STATIC</span>、<span class="emphasis">KEYSET</span>、または <span class="emphasis">DYNAMIC</span> と共に使用することはできません。これは <span class="emphasis">DYNAMIC</span> カーソルとして機能します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">STATIC</span> の機能は、<span class="emphasis">INSENSITIVE</span> キーワードと類似しています。<span class="emphasis">KEYSET</span> は、<span class="emphasis">STATIC</span> および <span class="emphasis">INSENSITIVE</span> と似ていますが、結果セットを変更できる点が異なります。キーセットは、いったんカーソルが開いてから他のユーザーが挿入したレコードについては関知しません。しかし、他のユーザーが削除したレコードについては、<span class="emphasis">@@FETCH_STATUS</span> が -2 となります。新しい値は、<span class="emphasis">WHERE CURRENT OF</span> を指定することによって、更新が完了すると参照できるようになります。<span class="emphasis">DYNAMIC</span> は、カーソルを使用した処理中に結果セットに対して行ったすべてのデータ変更を反映します。結果セットは、<span class="emphasis">FETCH</span> の処理中にも変更できます。<span class="emphasis">FETCH ABSOLUTE</span> は、<span class="emphasis">DYNAMIC</span> カーソルではサポートされていません。<span class="emphasis">FAST_FORWARD</span> は、<span class="emphasis">FORWARD_ONLY</span>、<span class="emphasis">READ_ONLY</span> の省略表現ですが、付加的な機能もあります。<span class="emphasis">FAST_FORWARD</span> は、<span class="emphasis">SCROLL</span>、<span class="emphasis">FOR_UPDATE</span>、<span class="emphasis">SCROLL_LOCKS</span>、<span class="emphasis">OPTIMISTIC</span>、および <span class="emphasis">FORWARD_ONLY</span> と相互に排他的です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">READ_ONLY</span> には他に、<span class="emphasis">SCROLL_LOCKS</span> および <span class="emphasis">OPTIMISTIC</span> のオプションが使用できます。<span class="emphasis">SCROLL_LOCKS</span> は、新しいレコードを取り込むと必ずレコードレベルのロックを強制し、カーソルを介した更新と削除を正しく行うようにします。<span class="emphasis">OPTIMISTIC</span> は、カーソルを介して場所を指定した更新と削除が、別のユーザーが行を変更した場合には失敗するようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>最後に、<span class="emphasis">TYPE_WARNING</span> オプションは、<span class="emphasis">KEYSET</span> から <span class="emphasis">DYNAMIC</span> のように型が変更されると、SQL Server がクライアントに警告メッセージを送信するようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Microsoft SQL Server のシンプルな例では、<span class="emphasis">publishers</span> テーブルのカーソルを宣言して開きます。カーソルは <span class="emphasis">publishers</span> テーブルから <span class="emphasis">SELECT</span> ステートメントに一致する最初のレコードを取得し、別のテーブルにその値を挿入します。そして、すべてのレコードが処理されるまで、順次、次のレコードを処理します。最後に、カーソルを閉じ、解放 (<span class="emphasis">DEALLOCATE</span>) します。DEALLOCATE は Microsoft SQL Server でのみ使用されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE @publisher_name VARCHAR(20)

DECLARE pub_cursor CURSOR
FOR SELECT pub_name FROM publishers
    WHERE country &lt;&gt; 'USA'

OPEN pub_cursor
FETCH NEXT FROM pub_cursor INTO @publisher_name
WHILE @@FETCH_STATUS = 0
BEGIN
    INSERT INTO foreign_publishers VALUES(@publisher_name)
END

CLOSE pub_cursor
DEALLOCATE pub_cursor</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Oracle の例では、カーソルを他の変数と共に宣言ブロックで宣言し、カーソルの残りの部分はその後で処理します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE
   new_price NUMBER(10,2);
   CURSOR title_price_cursor IS
      SELECT title, price
      FROM titles
      WHERE price IS NOT NULL;
   title_price_val title_price_cursor%ROWTYPE;
BEGIN
   OPEN title_price_cursor;
   FETCH title_price_cursor INTO title_price_val;
   new_price := "title_price_val.price" * 1.25
   INSERT INTO new_title_price VALUES (title_price_val.title, new_price)
   CLOSE title_price_cursor;
END;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この例では PL/SQL を多用していますが、コードのほとんどは、本マニュアルでは説明していません。ただし、<span class="emphasis">DECLARE</span> ブロックでカーソルを宣言していることは明らかです。PL/SQL の実行ブロックでは、<span class="emphasis">OPEN</span> コマンドでカーソルを初期化し、<span class="emphasis">FETCH</span> コマンドで値を取得し、最後に <span class="emphasis">CLOSE</span> コマンドでカーソルを閉じます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DELETE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DELETE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DELETE</span>   ステートメントは、指定したテーブルからレコードを消去します。この処理はログに記録されます。つまり、<span class="emphasis">ROLLBACK</span> コマンドを使用して取り消すことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DELETE</span> ステートメントを <span class="emphasis">WHERE</span> 句なしで使用することはあまりありません。WHERE 句を使用しないと、影響を受けるテーブルから<span class="emphasis">すべての</span>行が削除されるからです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE [FROM] [owner.]table_name [WHERE clause]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブルの中のすべての行を削除する必要がある場合は、<span class="emphasis">TRUNCATE TABLE</span> ステートメントの使用を推奨します。このコマンドに対応しているデータベースでは、すべての行を物理的に削除するには、通常、このコマンドを使用したほうがすばやく行えます。<span class="emphasis">TRUNCATE TABLE</span> が <span class="emphasis">DELETE</span> より速いのは、<span class="emphasis">TRUNCATE</span> がログに記録されないためで、ロールバックも不可能です。ロギングのオーバーヘッドを省くことによって、多数のレコードを削除する際に時間を大幅に節約できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE [FROM] [owner.] {table_name | view_name}
[WITH (query_hint[,...n]]
[FROM table_source[,...n]]
[WHERE clause | [CURRENT OF [GLOBAL] cursor_name]]
[OPTION (query_hint[,...n])]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、テーブル (table_name)、および単一のテーブルを記述するビュー (view_name) の両方からレコードを削除できます。複数のビューから削除を行うためには、他にいくつかの特別な規則がありますが、それらは非常に複雑なため本マニュアルでは説明しません。最初の <span class="emphasis">FROM</span> の直後とステートメントの最後の 2 か所で、SQL Server のデフォルトのオプティマイザによる動作を無効にできますが、これは熟練者のみが行うようにしてください。これらのヒント (query_hint) は ANSI 規格には含まれていませんが、ほとんどのベンダーのマニュアルには含まれています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>さらに、SQL Server では、2 つ目の <span class="emphasis">FROM</span> 句を使用できます。2 つ目の <span class="emphasis">FROM</span> 句では、<span class="emphasis">JOIN</span> ステートメントを使用できるので、最初の <span class="emphasis">FROM</span> のテーブル (table_name) から、2 つ目の <span class="emphasis">FROM</span> で宣言されたテーブルの行に基づいて、非常に簡単に行を削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE CURRENT OF</span> 句は、カーソルで位置決めして削除を行うために使用します。カーソルと共に使用することにより、この形式の <span class="emphasis">DELETE</span> は現在カーソルが開いている行のみを消去します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE [LOW_PRIORITY] FROM table_name [WHERE clause] [LIMIT rows]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL はスピードが最適化されています。したがって、MySQL では、<span class="emphasis">LOW PRIORITY</span> を指定でき、テーブルを読むクライアントが他にいなくなるまで、<span class="emphasis">DELETE</span> の実行を遅延します。また、MySQL では、<span class="emphasis">LIMIT rows</span> 句を使用して、制御をクライアントに返すまでに削除するレコード数の上限を任意に設定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE FROM [schema.]{table_name | view_name | snapshot_name}
   {PARTITION (partition_name) | SUBPARTITION (subpartition_name)} |
[WHERE clause]
[subquery WITH {READ ONLY | CHECK OPTION [CONSTRAINT constraint_name]} ]
[RETURNING expression[,...] INTO variable[,...]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、テーブル (table_name)、ビュー (view_name)、およびパーティション化されたビューとテーブル (snapshot_name) から行を削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PARTITION</span> および <span class="emphasis">SUBPARTITION</span> は、削除するテーブル内のパーティション (partition_name)、またはサブパーティションの名前 (subpartition_name) を指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH</span> 句はサブクエリーと共に使用します。これは、<span class="emphasis">DELETE</span> ステートメントのアクションを制限します。<span class="emphasis">WITH READ ONLY</span> オプションを指定すると、コマンド内で使用するすべてのサブクエリーは更新されません。<span class="emphasis">WITH CHECK OPTION</span> を指定すると、サブクエリーに含まれないすべての行を削除 (<span class="emphasis">DELETE</span>) できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURNING</span> は、コマンドの影響を受ける行を取得します。単一行の削除に使用した場合、その行の値は PL/SQL 変数およびバインド変数に格納されます。複数行の削除に使用した場合、それらの行の値はバインド配列に格納されます。<span class="emphasis">INTO</span> キーワードを指定すると、削除された値が変数リストに格納されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE FROM [ONLY] <span class="replaceable">table</span>
[WHERE {clause | CURRENT OF cursor_name}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、テーブルから行および定義済みサブクラスを削除するのに <span class="emphasis">DELETE</span> コマンドを使用します。指定テーブルからのみ行を削除する場合、<span class="emphasis">ONLY</span> 句を使用します。<span class="emphasis">WHERE CURRENT OF</span> 句を指定すると、現在開かれている指定のオープンカーソルの行のみが削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">titles</span> テーブルのすべてのレコードを削除するには次のようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE titles</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">authors</span> テーブル内の "Mc" で始まる名字 (au_lname) のレコードをすべて削除するには次のようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE FROM authors
WHERE au_lname LIKE 'Mc%'</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>古い ID 番号 (title_id &gt;= 40) を持つすべてのタイトル (titles) を削除するには次のようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE titles WHERE title_id &gt;= 40</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>売上のない (ytd_sales IS NULL) すべてのタイトル (titles) を削除するには、次のようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE titles WHERE ytd_sales IS NULL</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>別のテーブルに対するサブクエリーの結果に基づいて、あるテーブルのレコードを削除するには、次のようなコマンドを実行します。次のケースでは、<span class="emphasis">titles</span> テーブルで "computers" という文字を含むレコードを検索し、そのレコードを <span class="emphasis">titleauthor</span> テーブルから削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DELETE FROM titleauthor
WHERE title_id IN
  (SELECT title_id
  FROM titles
  WHERE title LIKE '%computers%')</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DISCONNECT">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DISCONNECT</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DISCONNECT</span>   ステートメントは DBMS への接続を終了します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>制限付き対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DISCONNECT {CURRENT | ALL | connection_name}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは、現行の SQL プロセスとデータベースサーバーとの間で確立されている接続を終了します。<span class="emphasis">CURRENT</span> 句は現在アクティブなユーザー接続を閉じます。<span class="emphasis">ALL</span> 句は現在のユーザーが開いているすべての接続を閉じます。また、指定した接続のみを閉じることもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server は、Embedded-SQL (ESQL) でのみ <span class="emphasis">DISCONNECT</span> をサポートし、その検索ツールの SQL Query Analyzer ではサポートしていません。ESQL では SQL99 の構文を完全にサポートしています。ESQL プログラムで Microsoft SQL Server から接続を閉じる場合、データベースサーバーとの接続を完全に切断するために <span class="emphasis">DISCONNECT ALL</span> コマンドを使用する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DISC[ONNECT]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server とは対照的に、Oracle では、その検索ツールの SQL*Plus で<span class="emphasis">のみ</span>、<span class="emphasis">DISCONNECT</span> を使用できます。Oracle のこのコマンドは、データベースサーバーとの現行のセッションは終了しますが、SQL*Plus での作業は続行できます。たとえば、プログラマーは、バッファの編集や実行ファイルの保存などを続行できます。ただし、SQL コマンドを発行するには再接続を確立する必要があります。SQL*Plus を終了し、ファイルシステムへ戻るには、<span class="emphasis">EXIT</span> または <span class="emphasis">QUIT</span> コマンドを使用する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle ではまた、<span class="emphasis">ALTER SYSTEM DISCONNECT SESSION</span> でこの機能をサポートしています。ただし、これは DBA がデータベースとのセッション (通常、異常のあるセッション) を強制的に切断するための特権的なコマンドです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、DISCONNECT コマンドを明示的にサポートしていません。ただし、各プログラミングインターフェイスでは切断処理をサポートしています。たとえば、Server Programming Interface では、SPI_FINISH を使用でき、PL/tcl プログラミングパッケージでは、PG_CONNECT を使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle サーバーとの現行の接続を終了します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DISCONNECT;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、ESQL プログラムでのみ <span class="emphasis">DISCONNECT</span> をサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>EXEC SQL DISCONNECT new_york;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP DATABASE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP DATABASE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP DATABASE</span>   は、<span class="emphasis">CREATE DATABASE</span> コマンドで行ったすべての作業を取り消します。このコマンドは、既存のデータベースオブジェクトをすべて削除し、それらのデータベースオブジェクトが使用していた領域を解放します。ほとんどのベンダーでは、ユーザー (所有者を含む) が削除対象のデータベース内でアクティブである限り、このコマンドを実行できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>対応</td>
								</tr>
								<tr><td>Oracle</td><td>未対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP DATABASE database_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CREATE DATABASE</span> 同様、<span class="emphasis">DROP DATABASE</span> は、ANSI SQL では主要なコマンドではなく、拡張コマンドとしてのみサポートされています。SQL99 では、ほとんどの実装で "データベース" の問題として考えられている領域をカバーするため、<span class="emphasis">SCHEMA</span> および <span class="emphasis">DOMAIN</span> に関連するコマンドが優先されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>データベースベンダーによって作成されたシステムデータベースは決して削除しないでください。データベースの所有者またはシステム管理者以外がデータベースを削除するには、明示的な許可が必要です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP DATABASE database_name [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server では、各データベース名をコンマで区切ることにより、1 つのコマンドで複数のデータベースを削除できます。マスターデータベース内のユーザー、sys admin 権限を持つユーザー、またはデータベースの所有者のみがデータベースを削除できます。削除されるデータベースは、<span class="emphasis">ONLINE</span> である必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL と PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL および PostgreSQL でのこのコマンドは、データベース全体とすべての関連ファイルを削除します。データベースは、削除されたファイル数を示すメッセージを送信します。PostgreSQL の実装では、開いているデータベース、および使用されているデータベースは削除できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では <span class="emphasis">DROP DATABASE</span> をサポートしていません。削除するデータベースと同じ名前を指定して、パラメータなしでコマンド <span class="emphasis">CREATE DATABASE database_name</span> を発行すれば、そのデータベースを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP FUNCTION">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP FUNCTION </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  このコマンドは、現行のデータベースからユーザー定義関数を削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP FUNCTION function_name {RESTRICT | CASCADE}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは関数 (funstion_name) を恒久的に削除します。<span class="emphasis">RESTRICT</span> 句は、ビューなどのその他のデータベースオブジェクトが削除対象の関数に依存している場合に、このコマンドが失敗するようにします。反対に、<span class="emphasis">CASCADE</span> オプションを指定すると、関数、関数の権限、および関数に依存するデータベースオブジェクトを削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP FUNCTION [owner_name.]function_name [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server の他の <span class="emphasis">DROP</span> コマンド同様、各データベースオブジェクト名を、コンマで区切って指定することで、同じ型のデータベースオブジェクトを複数削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは関数を含むファイルを実際には削除しません。代わりに、システムテーブルから関数参照を削除します。削除した関数参照は <span class="emphasis">CREATE FUNCTION</span> ステートメントを使用して再び追加できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP FUNCTION [owner_name.]function_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の他の <span class="emphasis">DROP</span> コマンド同様、関数の所有者の名前 (owner_name) を指定できます。所有者の名前を指定しない場合は、現行のユーザーと見なされ、現行ユーザーの所有する関数のみが削除されます。また、ユーザーに <span class="emphasis">DROP ANY FUNCTION</span> システム権限があれば、あらゆる場所のすべての関数を削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP FUNCTION name ( [ type [,...n] ] )</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、どのようなプログラミング言語で宣言された関数でも削除できます。<span class="emphasis">type</span> は削除する関数の入力引数です。type は指定する必要があります。これは、指定した名前とパラメータの型を持つ関数のみを削除するためです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP INDEX">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP INDEX</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP INDEX</span>   コマンドは、現行のデータベース内のインデックスを削除します。インデックスを削除すると、それまでインデックスに消費されていたすべての領域が直ちに解放されます。ただし、<span class="emphasis">DROP INDEX</span> は、<span class="emphasis">PRIMARY KEY</span> または <span class="emphasis">UNIQUE</span> 制約を削除しません。これらを削除するには、<span class="emphasis">ALTER TABLE . . . DROP</span> コマンドを使用する必要があります。主キーまたは一意制約の詳細については、<span class="emphasis">CREATE TABLE</span> コマンドの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP INDEX table_name.index_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL は SQL99 標準に従っていますが、相違点があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP INDEX {table_name | view_name}.index_name [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、テーブル (table_name) およびビュー (view_name) のどちらで作成されたインデックス (index_name) も削除できます。非クラスターインデックスを含むテーブルのクラスターインデックスを削除すると、すべての非クラスターインデックスが再構築され、新しいポインタが割り当てられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション </span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP INDEX table_name.index_name [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の古いバージョンでは、互換性を保つためだけにこのコマンドが含まれていますが、新しいバージョンでは、指定したインデックスが実際に削除されます。このステートメントは機能的に、MySQL の <span class="emphasis">ALTER TABLE . . . DROP INDEX</span> ステートメントと同じです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、テーブル名とインデックス名の各組をコンマで区切ることによって、複数のインデックスを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP INDEX [owner_name.]index_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、インデックスの削除にテーブル名を指定せず、インデックス名 (index_name) を直接指定します。また、所有者の名前 (owner_name) を基にインデックスを削除することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP PROCEDURE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP PROCEDURE </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  このコマンドは、現行のユーザーデータベース内の既存のストアドプロシージャーを削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP PROCEDURE procedure_name {RESTRICT | CASCADE}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは、基本的に <span class="emphasis">DROP FUNCTION</span> と同じですが、関数ではなく、ストアドプロシージャーを削除する点が異なります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP PROCEDURE [owner_name.]procedure_name [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、各ストアドプロシージャーの名前をコンマで区切ることによって、複数のストアドプロシージャーを削除できます。特定のバージョンのストアドプロシージャーのみを削除することはできません。同じバージョングループのストアドプロシージャーが削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP PROCEDURE [owner_name.]procedure_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、プロシージャーの削除に所有者の名前 (owner_name) も指定できます。<span class="emphasis">DROP ANY PROCEDURE</span> システム権限を持つユーザーは、他のユーザーが所有するプロシージャーを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP ROLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP ROLE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  このコマンドは、現行ユーザーデータベースで、指定したユーザー権限セットを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>未対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP ROLE role_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP ROLE</span> コマンドは、指定したロール (role_name) を削除します。<span class="emphasis">WITH ADMIN OPTION</span> 権限のあるユーザーのみがロールを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP ROLE [owner_name.]role_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP ROLE</span> コマンドを実行すると、現行ユーザーデータベースのロール (role_name) が削除されます。一度削除すると、それまでそのロールを割り当てられていたユーザーやロールからは一切使用することができません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP TABLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP TABLE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  このコマンドは、削除するテーブルのテーブル定義、すべてのデータ、インデックス、トリガー、制約、および権限指定も削除します。削除したテーブルを参照するビューやストアドプロシージャーはすべて、明示的に変更するか削除されない限り、問題に直面することになります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブルの他の特性を先に削除しない限り、テーブルを削除できないベンダーもあります。たとえば、Microsoft SQL Server では、テーブル自体を削除する前に、テーブルをあらゆるレプリケーションスキーム、および <span class="emphasis">FOREIGN KEY</span> 参照から削除しておく必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TABLE table_name RESTRICT | CASCADE</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 の構文では、<span class="emphasis">RESTRICT</span> を指定すると、ビューや制約が削除対象のテーブルを現在参照している場合、DBMS によるこのコマンドの実行を禁止します。<span class="emphasis">CASCADE</span> 句を指定すると、テーブルを参照しているすべてのオブジェクトもテーブルと共に削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TABLE [database_name.][owner_name.]table_name [,...n]
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、各テーブル名 (table_name) をコンマで区切ることによって、複数のテーブルを一度に削除することができます。現在のコンテキストの外にあるデータベースのテーブルも、データベース名 (database_name) を指定して削除できます (ユーザーに必要な権限がある場合のみ)。テーブル上の制約やトリガーも、すべてテーブルと共に削除されます。明示的に宣言した規則および初期設定値は、それらの基底テーブルを削除したときにバインディングが失われます。削除したテーブルを参照していたビューおよびストアドプロシージャーでは、実行時にテーブルがないことが分かるとエラーとなります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TABLE [IF EXISTS] table_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、このコマンドを実行すると、テーブル (table_name) およびすべての関連ファイルが恒久的に完全に削除されます。<span class="emphasis">IF EXISTS</span> 構文を追加すると、存在しないテーブルを削除しようとした際に返されるエラーを防止できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TABLE [owner_name.]table_name [CASCADE CONSTRAINTS];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle でテーブルを削除すると、テーブルが使用していた領域が解放され、データベースに対する保留中のすべての 変更がコミットされます。テーブルを削除すると、それまでテーブルに消費されていたすべての領域が直ちに解放されます。削除したテーブルに関連付けられていたインデックスおよび権限はすべて失われます。テーブルに構築されていたビュー、ストアドプロシージャー、シノニムなどのオブジェクトは無効になり、機能も停止されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">ALTER</span>、<span class="emphasis">CREATE</span>、または <span class="emphasis">DROP</span> コマンドを実行すると、保留中のその他のトランザクションがすべてコミットされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">CASCADE CONSTRAINTS</span> 句を指定すると、削除するテーブルのキーを参照しているすべての整合性制約が削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TABLE table_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、基本的な <span class="emphasis">DROP TABLE</span> コマンドのみをサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP TRIGGER">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP TRIGGER</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP TRIGGER</span>    コマンドは現行のデータベース内のテーブルからトリガーを削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TRIGGER trigger_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP TRIGGER</span> は、現行のデータベースからトリガーを削除します。MySQL では、このコマンドをサポートしていません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TRIGGER [owner_name.]trigger_name [,...n]
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、各トリガー名 (trigger_name) をコンマで区切ることによって、複数のトリガーを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TRIGGER [owner_name.]trigger_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、このコマンドの実行時に指定したトリガー (trigger_name) を削除し、データベースに対する保留中の変更をコミットします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP TRIGGER trigger_name ON table_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、トリガー (trigger_name) のあるテーブル (table_name) を指定する必要があります。このコマンドを実行すると、既存のトリガーに対するすべての参照を削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="DROP VIEW">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">DROP VIEW</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>  この コマンドは、現行のデータベースからビューを恒久的に削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP VIEW view_name RESTRICT | CASCADE</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 の構文では、<span class="emphasis">RESTRICT</span> を指定すると、削除するビュー (view_name) が現在テーブルを参照しているか制約を持つ場合、DBMS によるそのビューの削除を禁止します。<span class="emphasis">CASCADE</span> 句を指定すると、ビューを参照しているすべてのオブジェクトもビューと共に削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では現在、このコマンドをサポートしていません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP VIEW [owner_name.]view_name [,...n]
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、各ビュー名 (view_name) をコンマで区切ることによって、1 回のコマンドで複数のビューを削除できます。これらのビューは同じデータベース内にある必要があります。ビューに関する情報は、すべてのシステムテーブルから削除されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP VIEW [owner_name.]view_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の他の <span class="emphasis">DROP</span> コマンド同様、ビュー名 (view_name) と共に、所有者の名前 (owner_name) を指定できます。<span class="emphasis">DROP ANY VIEW</span> システム権限を持つユーザーは、他のユーザーが所有するビューを削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DROP VIEW view_name;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">DROP VIEW</span> コマンドは、現行のデータベースから既存のビュー (view_name) を削除します。ビューを削除できるのは所有者だけです。PostgreSQL の <span class="emphasis">DROP TABLE</span>  コマンドは、ビューの削除にも使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="FETCH">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">FETCH</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FETCH</span>   コマンドは、カーソル処理で使用する 4 つのコマンドの中の 1 つです。<span class="emphasis">FETCH</span> は、サーバーサイドカーソルから特定の行を取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FETCH</span> コマンドは、カーソル <span class="emphasis">cursor_name</span> (<span class="emphasis">DECLARE CURSOR</span> ステートメントで作成) から、<span class="emphasis">NEXT</span>、<span class="emphasis">PRIOR</span>、<span class="emphasis">FIRST</span>、<span class="emphasis">LAST</span>、<span class="emphasis">ABSOLUTE</span>、または <span class="emphasis">RELATIVE</span> キーワードに基づいて、レコードを取得します。<span class="emphasis">FETCH</span> ステートメントで取得した値は、オプションで変数に格納できます。次のような <span class="emphasis">FETCH</span> 処理があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i><span class="emphasis">NEXT </span></i><br>&#160;
						  カーソルが現在の行の直後のレコードを返すようにし、返される行を現在の行にします。<span class="emphasis">FETCH NEXT</span> は <span class="emphasis">FETCH</span> のデフォルトの動作で、カーソルから初めて取得する場合は、最初のレコードを取得します。PostgreSQL では、<span class="emphasis">FORWARD</span> キーワード、または文字列 <span class="emphasis">FETCH RELATIVE NEXT</span> を使用します。</li><li><i><span class="emphasis">PRIOR </span></i><br>&#160;
						  カーソルが現在の行の直前のレコードを返すようにし、返される行を現在の行にします。<span class="emphasis">FETCH PRIOR</span> は、カーソルから初めて取得する場合は、レコードを取得しません。PostgreSQL では、<span class="emphasis">BACKWARD</span> キーワード、または文字列 <span class="emphasis">FETCH RELATIVE PRIOR</span> を使用します。</li><li><i><span class="emphasis">FIRST </span></i><br>&#160;
						  カーソルが最初のレコードを返すようにし、その行を現在の行にします。PostgreSQL ではサポートされていません。</li><li><i><span class="emphasis">LAST</span></i><br>&#160;
						  カーソルが最後のレコードを返すようにし、その行を現在の行にします。PostgreSQL ではサポートされていません。</li><li><i><span class="emphasis">ABSOLUTE</span> { n } </i><br>&#160;
						  カーソルが、レコードセットの最初から n 番目 (n が正の場合)、または最後から n 番目 (n が負の場合) のレコードを返すようにし、返されるレコードを新たにカーソルの現在のレコードとします。n が 0 の場合、行は返されません。PostgreSQL ではサポートされていません。</li><li><i><span class="emphasis">RELATIVE</span> { n } </i><br>&#160;
						  カーソルが、現在のレコードから n 行後のレコード (n が正の場合)、または現在のレコードの n 行前のレコード (n が負の場合) を返すようにし、返されるレコードを新たにカーソルの現在のレコードにします。n が 0 の場合、現在の行が返されます。PostgreSQL では、n が 0 の場合を除き、上記の説明どおりにサポートされています。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INTO</span> キーワードを使用すると、<span class="emphasis">FETCH</span> コマンド内の各列のデータを、ローカル変数に格納できます。<span class="emphasis">FETCH</span> コマンド内の各列は、<span class="emphasis">INTO</span> 句の対応する変数のデータタイプと一致する必要があります。<span class="emphasis">INTO</span> は PostgreSQL ではサポートされていません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL のカーソルは、<span class="emphasis">BEGIN</span>、<span class="emphasis">COMMIT</span>、または <span class="emphasis">ROLLBACK</span> を使用して明示的に宣言したトランザクション内でのみ使用できます。PostgreSQL では、数値または <span class="emphasis">ALL</span> キーワードを使用して、指定の数のレコード、またはすべてのレコードを取得できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>FETCH cursor_name
{INTO variable_name1 [,...n] ]
| BULK COLLECT INTO [collection_name [,...n] }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle のカーソルは、前方にスクロールするカーソルです。取得した値は一致する変数 (variable_name1) に挿入するか、<span class="emphasis">BULK COLLECT</span> 句を使用して、出力を PL/SQL パーサーに渡す前にバルク結合する必要があります。カーソルですべての行を処理するために <span class="emphasis">FETCH</span> を PL/SQL の <span class="emphasis">FOR</span> ループとペアでよく使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>FETCH [ FORWARD | BACKWARD | RELATIVE [ { [ # | ALL | NEXT | PRIOR ] } ]  ]
[ count ]
FROM <span class="replaceable">cursor_name</span></pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL のカーソルは、<span class="emphasis">BEGIN</span>、<span class="emphasis">COMMIT</span>、または <span class="emphasis">ROLLBACK</span> を使用して明示的に宣言したトランザクション内でのみ使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>カーソルのスクロール方法には、<span class="emphasis">FORWARD</span>、<span class="emphasis">BACKWARD</span>、または <span class="emphasis">RELATIVE</span> を指定できます。<span class="emphasis">RELATIVE</span> 句には、数値または <span class="emphasis">ALL</span> キーワードを指定して、指定数のレコードまたはすべてのレコードを取得できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Oracle の例では、<span class="emphasis">employee_new_hires_cursor</span> (<span class="emphasis">DECLARE CURSOR</span> の例を参照) のいくつかの要素を取得し、ローカル変数に格納します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>FETCH FROM employee_new_hires_cursor
INTO : emp_id, :fname, :lname, :job_id</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の PostgreSQL の例では、<span class="emphasis">employee</span> テーブルから 5 つのレコードを取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>FETCH FORWARD 5 IN employee_new_hires_cursor;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="GRANT">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">GRANT</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>SQL99 では、<span class="emphasis">GRANT</span>    ステートメントは、ユーザーおよびロールに、データベースオブジェクトを使用する許可を与えます。また、ほとんどのベンダーでは、データベースオブジェクトの作成、ストアドプロシージャーや関数の実行などの許可をユーザーおよびロールに与えるために <span class="emphasis">GRANT</span> ステートメントを使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT { ALL [PRIVILEGES] }
| SELECT
| INSERT [ (column_name [,...n]) ]
| DELETE
| UPDATE [ (column_name [,...n]) ]
| REFERENCES [ (column_name [,...n]) ]
| USAGE }[,...n]
ON { [TABLE] table_name
| DOMAIN domain_name
| COLLATION collation_name
| CHARACTER SET character_set_name
| TRANSLATION translation_name }
TO {grantee_name |  PUBLIC}
[WITH GRANT OPTION]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>権限のあるユーザーは、<span class="emphasis">GRANT</span> ステートメントを使用して、アクセス権限 (<span class="emphasis">SELECT</span>、<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、<span class="emphasis">DELETE</span>、<span class="emphasis">REFERENCES</span>、または <span class="emphasis">USAGE</span>) をユーザーに与えることができます。ユーザーは各権限でそれぞれのコマンドを実行できますが、<span class="emphasis">REFERENCES</span> および <span class="emphasis">USAGE</span> はその他の権限を提供します。複数のアクセス 権限を与えるには、各権限をコンマで区切り、すべてのアクセス権限を与えるには <span class="emphasis">ALL</span> を指定します。<span class="emphasis">PRIVILEGES</span> キーワードは省略可能です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">USAGE</span> 権限は、テーブルだけでなく、すべてのデータベースオブジェクトに適用されますが、その他の権限はテーブルにのみ適用されます。<span class="emphasis">USAGE</span> 権限のあるユーザーは、変換を使用して照合順序を構築するなど、別の定義に基づいてオブジェクトを作成できます。<span class="emphasis">REFERENCES</span> 権限は、制約内のテーブルを有効にし、外部キーを使用できるようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、および <span class="emphasis">REFERENCES</span> 権限は、テーブル内の指定列に割り当てることができます。列を指定しない場合は、すべての列に割り当てられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ON</span> 句では、ユーザーが権限を受け取る特定のテーブルまたはデータベースオブジェクトを宣言します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">TO</span> 句には、指定した権限を受け取るユーザーまたはロールを指定します。また、<span class="emphasis">PUBLIC</span> に権限を付与すると、将来作成されるユーザーも含めてすべてのユーザーに指定の権限が与えられます。<span class="emphasis">WITH GRANT OPTION</span> を使用すると他のユーザーに権限を与えることができます。つまり、この句を指定すると、アクセス権限を受け取るユーザーは、同じアクセス権限を他のユーザーに与えることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>特定のデータベースの実装によっては、ビューのアクセス権限が、基本テーブルと独立しているものやそうでないものもあります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT { ALL [PRIVILEGES] }
| SELECT
| INSERT
| DELETE
| UPDATE
| REFERENCES
| EXECUTE
| CREATE {DATABASE | DEFAULT | FUNCTION | PROCEDURE | RULE | TABLE | VIEW}
| BACKUP {DATABASE | LOG} } [,...n]
ON { {table_name | view_name} [(column [,...n])]
| stored_procedure_name
| extended_stored_procedure_name
| user_defined_function_name
| [(column [,...n] ON {table_name | view_name} }
TO {grantee_name | PUBLIC} [,...n]
[WITH GRANT OPTION]
[AS {group | role}]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">SELECT</span>、<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、<span class="emphasis">DELETE</span>、および <span class="emphasis">REFERENCES</span> アクセス権限をテーブル (table_name) に対して指定できます。列リスト (column) は、<span class="emphasis">SELECT</span> および <span class="emphasis">UPDATE</span> アクセス権限でのみ識別できます。デフォルトでは、すべての列に <span class="emphasis">SELECT</span> および <span class="emphasis">UPDATE</span> アクセス権限が与えられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ストアドプロシージャー、拡張ストアドプロシージャー、およびユーザー定義関数に与えられる権限は、<span class="emphasis">EXECUTE</span> 権限のみです。<span class="emphasis">FOREIGN KEY</span> 制約を作成するには、ユーザーに <span class="emphasis">REFERENCES</span> 権限がある必要があります。この権限は、<span class="emphasis">SCHEMABINDING</span> を指定してオブジェクトに依存する関数やビューを作成する場合にも必要です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AS</span> 句<span class="emphasis"></span>は、別のグループやロールのコンテキストであるかのように権限を与えます。グループおよびロールは <span class="emphasis">GRANT</span> コマンドを実行できないので、これは、別のグループやロールのユーザーに権限を与えるのに便利な方法です。現行のデータベースコンテキスト以外のデータベースに権限を与えることはできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>最初に、<span class="emphasis">CREATE DATABASE</span> および <span class="emphasis">CREATE TABLE</span> を使用する権限をユーザーの Emily と Sarah に与えます。次に、<span class="emphasis">titles</span> テーブルに関する多数の権限を editors グループに与えます。editors グループは、これらの権限を別のユーザーに与えることができるようになります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT CREATE DATABASE, CREATE TABLE TO emily, sarah
GO

GRANT SELECT, INSERT, UPDATE, DELETE ON titles
TO editors
WITH GRANT OPTION
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT { ALL PRIVILEGES
| SELECT
| INSERT [ (column_name [,...n]) ]
| DELETE
| UPDATE [ (column_name [,...n]) ]
| REFERENCES [ (column_name [,...n]) ]
| USAGE
| ALTER
| CREATE
| DROP
| FILE
| INDEX
| PROCESS
| RELOAD
| SHUTDOWN }[,...n]
ON {table_name | * | *.* | database_name.*}
TO grantee_name [IDENTIFIED BY 'password'] [,...n]
[WITH GRANT OPTION]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、データベース内のオブジェクト操作に主に関連する追加のアクセス権限が提供されています。他の権限と同様、<span class="emphasis">ALTER</span>、<span class="emphasis">CREATE</span>、<span class="emphasis">INDEX</span>、または <span class="emphasis">RELOAD</span> などの任意のアクセス権限をユーザーに与えることによって、ユーザーは与えられたコマンドを実行できます。<span class="emphasis">REFERENCES</span> はサポートされていますが、機能はありません。<span class="emphasis">USAGE</span> は、対象ユーザーの権限を実質的に<span class="emphasis">無効化</span>します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>テーブル (table_name) に適用できるアクセス権限には、<span class="emphasis">SELECT</span>、<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、<span class="emphasis">DELETE</span>、<span class="emphasis">CREATE</span>、<span class="emphasis">DROP</span>、<span class="emphasis">GRANT</span>、<span class="emphasis">INDEX</span>、および <span class="emphasis">ALTER</span> があります。<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、および <span class="emphasis">SELECT</span> は、列レベルでも適用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の <span class="emphasis">ON</span> 句の実装では、いくつかの興味深いオプションを設定できます。<span class="emphasis">ON *.*</span> と指定することによって、グローバル権限を設定し、サーバー上のすべてのデータベースに適用できます。<span class="emphasis">ON database_name.*</span> または、現行のデータベース内で <span class="emphasis">ON *</span> を指定することによって、データベース全体の権限を設定できます。ホスト、テーブル、データベース、および列の名前は、60 文字以下に設定する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL では、特定ホストの特定ユーザー <span class="emphasis">grantee_name</span> の名前が <span class="emphasis">USER@HOST</span> である場合、そのユーザーに権限を与えることができます。<span class="emphasis">grantee_name</span> 内にワイルドカードを指定して、一度に大勢のユーザーにアクセス権限を与えることができます。<span class="emphasis">grantee_name</span> は 16 文字以下である必要があります。ユーザーを指定する場合、<span class="emphasis">IDENTIFIED BY</span> 句を含めて、パスワード保護を実施できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、2 人のユーザーにパスワード付で権限を与えます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT SELECT ON employee TO Dylan IDENTIFIED BY 'porsche',
  kelly IDENTIFIED BY 'mercedes',
  emily IDENTIFIED BY 'saab';</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT { ALL [PRIVILEGES] }
{| GRANT ANY PRIVILEGE }
{| SELECT | INSERT  | DELETE | UPDATE | REFERENCES }
{| CREATE [ANY] {CLUSTER | CONTEXT | DATABASE| DATABASE LINK | DIMENSION
   | DIRECTORY | INDEXTYPE | INDEX | LIBRARY | OPERATOR | OUTLINE
   | PROCEDURE | PROFILE | ROLE | ROLLBACK SEGMENT | SEQUENCE | SESSION
   | SNAPSHOT | SYNONYM | TABLE | TABLESPACE | TRIGGER | TYPE |
   | USER | [MATERIALIZED] VIEW}
| DROP [ANY] {...as CREATE...}
| ALTER [ANYh] {...as CREATE...}
| AUDIT SYSTEM
| EXECUTE [ANY] {INDEXTYPE | OPERATOR | PROCEDURE | TYPE
| BACKUP [ANY] {TABLE | DATABASE | LOG} } [,...n] }
ON { [schema_name.]
{table_name | view_name} [ (column [,...n]) ]
| stored_procedure_name
| extended_stored_procedure_name
| user_defined_function_name
| DIRECTORY directory_name
| JAVA {SOURCE | RESOURCE} [schema_name.]object_name }
TO {{grantee_name | role_name} [,...n] | PUBLIC}
[WITH ADMIN OPTION];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">GRANT</span> コマンドはあらゆる機能を網羅しています。実際、上記の構文では、ステートメントの各順列がカバーされていません。GRANT コマンドで使用できる一般的な権限には、オブジェクト権限 (特定のテーブルからの <span class="emphasis">SELECT</span> や <span class="emphasis">DELETE</span> に対する権限など) とシステム権限 (<span class="emphasis">CREATE CLUSTER</span> や <span class="emphasis">DROP ANY TABLE</span> など) の 2 つのクラスがあります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、1 つの <span class="emphasis">GRANT</span> コマンド内にオブジェクト権限とシステム権限を組み合わせることはできません。1 つの <span class="emphasis">GRANT</span> コマンドで単一のユーザーやロールに複数のオブジェクト権限やシステム権限を与えることはできますが、1 つの <span class="emphasis">GRANT</span> コマンドでオブジェクト権限とシステム権限の両方を与えることはできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle でサポートされているほとんどの機能の権限は <span class="emphasis">GRANT</span> コマンドで与えられます。権限は、テーブルやビューなどのデータベースオブジェクトと <span class="emphasis">CREATE ANY TABLE</span> などのシステムコマンドに対してだけでなく、<span class="emphasis">DIRECTORY</span>、<span class="emphasis">JAVA SOURCE</span>、および <span class="emphasis">RESOURCE</span> などのスキーマオブジェクトにも与えることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ANY</span> オプションは、スキーマ内の任意のユーザーが所有する特定の型のオブジェクトに対して、指定のステートメントを実行する権限を与えます。Oracle のシステム権限の一覧を表 3.2 に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>権限の種類</th><th>システム権限</th><th>説明</th></tr>
								<tr><td>クラスター</td><td>CREATE CLUSTER</td><td>ユーザー自身のスキーマ内にクラスターを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY CLUSTER</td><td>任意のスキーマ内にクラスターを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY CLUSTER</td><td>任意のスキーマのクラスターを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY CLUSTER</td><td>任意のスキーマのクラスターを削除する権限を与えます。</td>
								</tr>
								<tr><td>コンテキスト</td><td>CREATE ANY CONTEXT</td><td>任意のコンテキスト名前空間を作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY CONTEXT</td><td>任意のコンテキスト名前空間を削除する権限を与えます。</td>
								</tr>
								<tr><td>データベース</td><td>ALTER DATABASE</td><td>データベースを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER SYSTEM</td><td><span class="emphasis">ALTER SYSTEM</span> ステートメントを発行する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>AUDIT SYSTEM</td><td><span class="emphasis">AUDIT</span> <span class="emphasis">sql_statements</span> ステートメントを発行する権限を与えます。</td>
								</tr>
								<tr><td>データベースリンク</td><td>CREATE DATABASE LINK</td><td>ユーザー自身のスキーマ内にプライベートデータベースリンクを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE PUBLICDATABASE LINK</td><td>パブリックデータベースリンクを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP PUBLICDATABASE LINK</td><td>パブリックデータベースリンクを削除する権限を与えます。</td>
								</tr>
								<tr><td>ディメンション</td><td>CREATE DIMENSION</td><td>ユーザー自身のスキーマ内にディメンションを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANYDIMENSION</td><td>任意のスキーマ内にディメンションを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANYDIMENSION</td><td>任意のスキーマのディメンションを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANYDIMENSION</td><td>任意のスキーマのディメンションを削除する権限を与えます。</td>
								</tr>
								<tr><td>ディレクトリ</td><td>CREATE ANYDIRECTORY</td><td>ディレクトリデータベースオブジェクトを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANYDIRECTORY</td><td>ディレクトリデータベースオブジ ェクトを削除する権限を与えます。</td>
								</tr>
								<tr><td>インデックス型</td><td>CREATE INDEXTYPE</td><td>ユーザー自身のスキーマ内にインデックス型を作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANYINDEXTYPE</td><td>任意のスキーマ内にインデックス型を作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANYINDEXTYPE</td><td>任意のスキーマのインデックス型を変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANYINDEXTYPE</td><td>任意のスキーマのインデックス型を削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>EXECUTE ANYINDEXTYPE</td><td>任意のスキーマのインデックス型を参照する権限を与えます。</td>
								</tr>
								<tr><td>インデックス</td><td>CREATE ANY INDEX</td><td>任意のスキーマ内にドメインインデックスを作成する権限、または任意のスキーマのテーブルにインデックスを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY INDEX</td><td>任意のスキーマのインデックスを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY INDEX</td><td>任意のスキーマのインデックスを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>QUERY REWRITE</td><td>マテリアライズドビューまたはインデックスが、ユーザー自身のスキーマ内のテーブルおよびビューを参照する場合、マテリアライズドビューを使用した書き換えを有効にする権限、または関数ベースのインデックスを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>GLOBAL QUERY REWRITE</td><td>マテリアライズドビューまたはインデックスが、任意のスキーマ内のテーブルおよびビューを参照する場合、マテリアライズドビューを使用した書き換えを有効にする権限、または関数ベースのインデックスを作成する権限を与えます。</td>
								</tr>
								<tr><td>ライブラリ</td><td>CREATE LIBRARY</td><td>ユーザー自身のスキーマ内に外部プロシージャーまたは関数ライブラリを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY LIBRARY</td><td>任意のスキーマ内に外部プロシージャーまたは関数ライブラリを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP LIBRARY</td><td>ユーザー自身のスキーマの外部プロシージャーまたは関数ライブラリを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY LIBRARY</td><td>任意のスキーマの外部プロシージャーまたは関数ライブラリを削除する権限を与えます。</td>
								</tr>
								<tr><td>マテリアライズドビュー (スナップショットと同じ)</td><td>CREATE MATERIALIZED VIEW</td><td>ユーザー自身のスキーマ内にマテリアライズドビューを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY MATERIALIZED VIEW</td><td>任意のスキーマ内にマテリアライズドビューを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY MATERIALIZED VIEW</td><td>任意のスキーマのマテリアライズドビューを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY MATERIALIZED VIEW</td><td>任意のスキーマのマテリアライズドビューを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>GLOBAL QUERY REWRITE</td><td>マテリアライズドビューまたはインデックスが、任意のスキーマのテーブルまたはビューを参照する場合、マテリアライズドビューを使用した書き換えを有効にする権限、または関数ベースのインデックスを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>QUERY REWRITE</td><td>マテリアライズドビューまたはインデックスが、ユーザー自身のスキーマのテーブルおよびビューを参照する場合、マテリアライズドビューを使用した書き換えを有効にする権限、または関数ベースのインデックスを作成する権限を与えます。</td>
								</tr>
								<tr><td>演算子</td><td>CREATE OPERATOR</td><td>ユーザー自身のスキーマ内に演算子およびそのバインディングを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANYOPERATOR</td><td>任意のスキーマ内に演算子およびそのバインディングを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY OPERATOR</td><td>任意のスキーマの演算子を削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>EXECUTE ANYOPERATOR</td><td>任意のスキーマの演算子を参照する権限を与えます。</td>
								</tr>
								<tr><td>アウトライン</td><td>CREATE ANY OUTLINE</td><td>アウトラインを使用する任意のスキーマ内で使用できるアウトラインを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY OUTLINE</td><td>アウトラインを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY OUTLINE</td><td>アウトラインを削除する権限を与えます。</td>
								</tr>
								<tr><td>プロシージャー</td><td>CREATE PROCEDURE</td><td>ユーザー自身のスキーマ内に、ストアドプロシージャー、関数、およびパッケージを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANYPROCEDURE</td><td>任意のスキーマ内に、ストアドプロシージャー、関数、およびパッケージを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANYPROCEDURE</td><td>任意のスキーマのストアドプロシージャー、関数、またはパッケージを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANYPROCEDURE</td><td>任意のスキーマのストアドプロシージャー、関数、またはパッケージを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>EXECUTE ANYPROCEDURE</td><td>プロシージャーまたは関数 (スタンドアローンまたはパッケージ) を実行する権限を与えます。</td>
								</tr>
								<tr><td>プロファイル</td><td>CREATE PROFILE</td><td>プロファイルを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER PROFILE</td><td>プロファイルを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP PROFILE</td><td>プロファイルを削除する権限を与えます。</td>
								</tr>
								<tr><td>ロール</td><td>CREATE ROLE</td><td>ロールを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY ROLE</td><td>データベースの任意のロールを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY ROLE</td><td>ロールを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>GRANT ANY ROLE</td><td>データベース内の任意のロールを与える権限を与えます。</td>
								</tr>
								<tr><td>ロールバックセグメント</td><td>CREATE ROLLBACK SEGMENT</td><td>ロールバックセグメントを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ROLLBACK SEGMENT</td><td>ロールバックセグメントを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ROLLBACK SEGMENT</td><td>ロールバックセグメントを削除する権限を与えます。</td>
								</tr>
								<tr><td>シーケンス</td><td>CREATE SEQUENCE</td><td>ユーザー自身のスキーマ内にシーケンスを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY SEQUENCE</td><td>任意のスキーマ内にシーケンスを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY SEQUENCE</td><td>データベースの任意のシーケンスを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY SEQUENCE</td><td>任意のスキーマのシーケンスを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>SELECT ANY SEQUENCE</td><td>任意のスキーマのシーケンスを参照する権限を与えます。</td>
								</tr>
								<tr><td>セッション</td><td>CREATE SESSION</td><td>データベースに接続する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER RESOURCE COST</td><td>セッションリソースのコストを設定する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER SESSION</td><td><span class="emphasis">ALTER SESSION</span> ステートメントを発行する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>RESTRICTED SESSION</td><td>SQL*Plus の <span class="emphasis">STARTUP RESTRICT</span> ステートメントを使用してインスタンスが開始された後にログオンする権限を与えます。</td>
								</tr>
								<tr><td>スナップショット (マテリアライズドビューと同じ)</td><td>CREATE SNAPSHOT</td><td>ユーザー自身のスキーマ内にスナップショットを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANYSNAPSHOT</td><td>任意のスキーマ内にスナップショットを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY SNAPSHOT</td><td>データベースの任意のスナップショットを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY SNAPSHOT</td><td>任意のスキーマのスナップショットを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>GLOBAL QUERY REWRITE</td><td>スナップショットまたはインデックスが、任意のスキーマ内のテーブルおよびビューを参照する場合、スナップショットを使用した書き換えを有効にする権限、または関数ベースのインデックスを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>QUERY REWRITE</td><td>スナップショットまたはインデックスが、ユーザー自身のスキーマ内のテーブルおよびビューを参照する場合、スナップショットを使用した書き換えを有効にする権限、または関数ベースのインデックスを作成する権限を与えます。</td>
								</tr>
								<tr><td>シノニム</td><td>CREATE SYNONYM</td><td>ユーザー自身のスキーマ内にシノニムを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY SYNONYM</td><td>任意のスキーマ内にプライベートシノニムを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE PUBLIC SYNONYM</td><td>パブリックシノニムを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY SYNONYM</td><td>任意のスキーマのプライベートシノニムを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP PUBLIC SYNONYM</td><td>パブリックシノニムを削除する権限を与えます。</td>
								</tr>
								<tr><td>テーブル</td><td>CREATE ANY TABLE</td><td>任意のスキーマ内にテーブルを作成する権限を与えます。テーブルを含むスキーマの所有者には、テーブル領域にテーブルを格納できるクオータがある必要があります。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY TABLE</td><td>スキーマのテーブルまたはビューを変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>BACKUP ANY TABLE</td><td>他のユーザーのスキーマからオブジェクトを増分エクスポートするエクスポートユーティリティを使用する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DELETE ANY TABLE</td><td>任意のスキーマのテーブル、テーブルのパーティション、またはビューから行を削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY TABLE</td><td>任意のスキーマのテーブル、またはテーブルのパーティションを削除または切り捨てる権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>INSERT ANY TABLE</td><td>任意のスキーマのテーブルまたはビューに行を挿入する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>LOCK ANY TABLE</td><td>任意のスキーマのテーブルまたはビューをロックする権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>UPDATE ANY TABLE</td><td>任意のスキーマのテーブルおよびビューの行を更新する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>SELECT ANY TABLE</td><td>任意のスキーマのテーブル、ビュー、またはスナップショットへの問い合わせを行う権限を与えます。</td>
								</tr>
								<tr><td>テーブル領域</td><td>CREATE TABLESPACE</td><td>テーブル領域を作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER TABLESPACE</td><td>テーブル領域を変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP TABLESPACE</td><td>テーブル領域を削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>MANAGE TABLESPACE</td><td>テーブル領域のオフライン化やオンライン化、およびテーブル領域のバックアップの開始と終了を行う権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>UNLIMITED TABLESPACE</td><td>任意のテーブル領域を無制限に使用する権限を与えます。この権限は、割り当てられているすべての個別のクオータに優先します。ユーザーのこの権限を取り消すと、ユーザーのスキーマオブジェクトは残りますが、個別のテーブル領域のクオータによって認証されない限り、以降のテーブル領域の割り当ては拒否されます。このシステム権限をロールに与えることはできません。</td>
								</tr>
								<tr><td>トリガー</td><td>CREATE TRIGGER</td><td>ユーザー自身のスキーマ内にデータベーストリガーを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY TRIGGER</td><td>任意のスキーマ内にデータベーストリガーを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY TRIGGER</td><td>任意のスキーマのデータベーストリガーを有効化、無効化、またはコンパイルする権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY TRIGGER</td><td>任意のスキーマのデータベーストリガーを削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ADMINISTER DATABASE TRIGGER</td><td><span class="emphasis">データベース</span>にトリガーを作成する権限を与えます。ユーザーは、<span class="emphasis">CREATE TRIGGER</span> または <span class="emphasis">CREATE ANY TRIGGER</span> 権限も持っている必要があります。</td>
								</tr>
								<tr><td>型</td><td>CREATE TYPE</td><td>ユーザー自身のスキーマ内にオブジェクト型およびオブジェクト型本体を作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY TYPE</td><td>任意のスキーマ内にオブジェクト型およびオブジェクト型本体を作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER ANY TYPE</td><td>任意のスキーマのオブジェクト型を変更する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY TYPE</td><td>任意のスキーマのオブジェクト型およびオブジェクト型本体を削除する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>EXECUTE ANY TYPE</td><td>任意のスキーマのオブジェクト型とコレクション型を使用または参照する権限、および、<span class="emphasis">特定のユーザーに権限を与える場合</span>、任意のスキーマのオブジェクト型のメソッドを呼び出す権限を与えます。ロールに <span class="emphasis">EXECUTE ANY TYPE</span> 権限を与えると、有効化されたロールを保持しているユーザーは、スキーマのオブジェクト型のメソッドを呼び出すことができなくなります。</td>
								</tr>
								<tr><td>ユーザー</td><td>CREATE USER</td><td>ユーザーを作成する権限を与えます。この権限により、作成者は次の操作も行えます。
										<ol><li><span class="emphasis">任意の</span><span class="emphasis"></span>テーブル領域へのクオータの割り当て</li><li>デフォルトおよび一時テーブル領域の設定</li><li><span class="emphasis">CREATE USER</span> ステートメントの一部としてのプロファイルの割り当て</li></ol>
									</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>ALTER USER</td><td>任意のユーザーを変更する権限を与えます。この権限により、ユーザーは次の操作も行えます。
										<ol><li>別のユーザーのパスワードまたは認証方法の変更</li><li><span class="emphasis">任意の</span><span class="emphasis"></span>テーブル領域へのクオータの割り当て</li><li>デフォルトおよび一時テーブル領域の設定</li><li>プロファイルおよびデフォルトロールの割り当て</li></ol>
									</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>BECOME USER</td><td>別のユーザーになる権限を与えます (フルデータベースインポートを実行するユーザーに必須)。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP USER</td><td>ユーザーを削除する権限を与えます。</td>
								</tr>
								<tr><td>ビュー</td><td>CREATE VIEW</td><td>ユーザー自身のスキーマ内にビューを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>CREATE ANY VIEW</td><td>任意のスキーマ内にビューを作成する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>DROP ANY VIEW</td><td>任意のスキーマのビューを削除する権限を与えます。</td>
								</tr>
								<tr><td>その他</td><td>ANALYZE ANY</td><td>任意のスキーマ内の任意のテーブル、クラスター、またはインデックスを分析する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>AUDIT ANY</td><td>任意のスキーマの任意のオブジェクトを、<span class="emphasis">AUDIT</span> <span class="emphasis">schema_objects</span> ステートメントを使用して監査する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>COMMENT ANY TABLE</td><td>任意のスキーマの任意のテーブル、ビュー、または列にコメントを付ける権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>FORCE ANYTRANSACTION</td><td>ローカルデータベースのインダウト分散トランザクションのコミットまたはロールバックを強制し、分散トランザクション障害を誘発する権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>FORCE TRANSACTION</td><td>ローカルデータベースの権限を与えられたユーザー自身のインダウト分散トランザクションのコミットまたはロールバックを強制する権限が与えられます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>GRANT ANYPRIVILEGE</td><td>任意のシステム権限を与える権限を与えます。</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>SYSDBA</td><td>ユーザーに次の権限を与えます。
										<ol><li><span class="emphasis">STARTUP</span> および <span class="emphasis">SHUTDOWN</span> 処理の実行</li><li><span class="emphasis">ALTER DATABASE</span><span class="literal">:</span>オープン、マウント、バックアップ、または文字セットの変更</li><li><span class="emphasis">CREATE DATABASE</span></li><li><span class="emphasis">ARCHIVELOG</span> および <span class="emphasis">RECOVERY</span></li><li><span class="emphasis">RESTRICTED SESSION</span> 権限の包含</li></ol>
									</td>
								</tr>
								<tr>
									<td>&nbsp;</td><td>SYSOPER</td><td>ユーザーに次の権限を与えます。
										<ol><li><span class="emphasis">STARTUP</span> および <span class="emphasis">SHUTDOWN</span> 処理の実行</li>
										<li><span class="emphasis">ALTER DATABASE OPEN/MOUNT/BACKUP  ARCHIVELOG </span>および <span class="emphasis">RECOVERY</span></li>
										<li><span class="emphasis">RESTRICTED SESSION</span> 権限の包含</li></ol>
									</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT { ALL
| SELECT
| INSERT
| DELETE
| UPDATE
| RULE } [,...n]
ON { object_name }
TO {grantee_name | PUBLIC | GROUP group_name}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">WITH GRANT OPTION</span> 句や列レベルの許可をサポートしていません。PostgreSQL の <span class="emphasis">GRANT</span> の実装は、<span class="emphasis">WITH GRANT OPTION</span> 句が常に有効とされているかのように機能します。つまり、権限を与えられたすべてのユーザー (grantee_name) は、他のユーザーにその権限を与えることができます。PostgreSQL では、既存のグループ (<span class="emphasis">group_name</span>) が有効な場合、権限を <span class="emphasis">GROUP</span> に割り当てることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、システムコマンドに対する <span class="emphasis">GRANT</span> をサポートしていませんが、サポートしているベンダーもあります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の <span class="emphasis">GRANT</span> ステートメントのサポートは基礎的なものです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>GRANT INSERT ON publishers TO PUBLIC;

GRANT SELECT, UPDATE ON sales TO emily;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="INSERT">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">INSERT</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSERT</span>    ステートメントは、テーブルまたはビューにデータ行を追加します。<span class="emphasis">INSERT</span> ステートメントは、次の方法のいずれかを使用して、テーブルにレコードを入力できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li>指定のテーブル列に <span class="emphasis">CREATE TABLE</span> または <span class="emphasis">ALTER TABLE</span> ステートメントで作成した <span class="emphasis">DEFAULT</span> 値を使用してレコードを挿入する方法。Oracle ではこの方法をサポートしていません。</li><li>レコードの各列に挿入する実際の値を宣言する方法。最も一般的に使用されています。</li><li><span class="emphasis">SELECT</span> ステートメントの結果セットをテーブルに挿入する方法。最もすばやくテーブルに多くの値を挿入できます。</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT [INTO] [[database_name.]owner.] {table_name | view_name} [(column_
    list)]
{[DEFAULT] VALUES | VALUES (value[,...]) | SELECT_statement }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSERT</span> ステートメントを使用するには、データの挿入対象のテーブルまたはビューを最初に宣言します。<span class="emphasis">INTO</span> キーワードは省略可能です。<span class="emphasis">column_list</span> に、データを受け取るテーブルの各列をコンマで区切り、かっこで囲んで指定します。<span class="emphasis">column_list</span> を省略した場合は、テーブル内に定義されたすべての列を指定したものと想定されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DEFAULT VALUES</span> メソッドは、<span class="emphasis">VALUES (value[,...])</span> および <span class="emphasis">SELECT_statement</span> メソッドと相互に排他的です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSERT . . . VALUES</span> ステートメントは、ステートメントに与えられたリテラル値を使用して、テーブルに 1 行のデータを追加します。<span class="emphasis">INSERT</span> ステートメントを、ネストした <span class="emphasis">SELECT</span> ステートメントと組み合わせて使用すると、テーブルに複数の行をすばやく挿入できます。2 つのテーブル間で <span class="emphasis">INSERT . . . SELECT</span> を使用する場合、両方のテーブルに互換性のあるデータタイプと構造があるようにしてください。ただし、互換性がない個所は <span class="emphasis">SELECT</span> ステートメントで補うことができます。<span class="emphasis">INSERT . . . SELECT</span> は PostgreSQL もサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT [INTO] [[database_name.]owner.]
    {table_name | view_name} [(column_list)]
{[DEFAULT] VALUES | list_of_values | SELECT_statement |
 EXEC[UTE] { procedure_name }
    [[@parameter_name=] {value [OUTPUT] | DEFAULT}[,...]}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server の <span class="emphasis">INSERT</span> コマンドの実装は、<span class="emphasis">DEFAULT</span> キーワードを使用できる点が異なります。<span class="emphasis">DEFAULT</span> を指定すると、<span class="emphasis">INSERT</span> ステートメントは、新しいレコードの作成時に、指定のテーブルに宣言した初期設定値をすべて使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このベンダーの実装の大きな違いは、<span class="emphasis">EXECUTE</span> キーワードです。<span class="emphasis">EXECUTE</span> 句は、動的な Transact-SQL ステートメント、システムストアドプロシージャー、ユーザーストアドプロシージャー、リモートプロシージャーコール (RPC)、または拡張ストアドプロシージャーによって返された結果セットを、SQL Server がローカルテーブルに格納するようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>たとえば、次の <span class="emphasis">INSERT</span> は、<span class="emphasis">C:\temp</span> ディレクトリを取得して、<span class="emphasis">#ins_exec_container</span> という一時テーブルに格納します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT INTO #ins_exec_container
EXEC master..xp_cmdshell "dir c:\temp"
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] [[database_name.]owner.] {table_name | view_name} [(column_list)]
{VALUES (value[,...]) | SELECT_statement | SET column=value[,...n]}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>オプション <span class="emphasis">LOW_PRIORITY</span> を指定すると、MySQL は、テーブルを読むクライアントが他にいなくなるまで、<span class="emphasis">INSERT</span> の実行を遅らせます。これによって、長時間待機する場合があります。<span class="emphasis">DELAYED</span> オプションを指定すると、<span class="emphasis">INSERT</span> がまだ完了していなくても、クライアントは直ちに続行できます。<span class="emphasis">IGNORE</span> キーワードを指定すると、MySQL は、主キーまたは一意キーの値が重複するようなレコードの挿入を行いません。この句を指定せずに、主キーまたは一意キーが重複する挿入を行った場合、<span class="emphasis">INSERT</span> は失敗します。<span class="emphasis">SET column=value</span> 構文は、テーブルの列を宣言し、その列に値 (value) を挿入できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT [INTO] [[database_name.]owner.] {table_name | view_name}
   [PARTITION partition_name | SUBPARTITION subpartition_name]
[(column_list)]
{VALUES (value1[,...n]) RETURNING expression1 [,...n] INTO variable1
   [,...n]
 |
SELECT_statement
[WITH {READ ONLY | CHECK OPTION [CONSTRAINT constraint_name]} }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">INSERT</span> ステートメントの実装では、指定のテーブル (table_name)、ビュー (view_name)、またはスナップショットだけでなく、<span class="emphasis">PARTITION</span> や <span class="emphasis">SUBPARTITION</span> キーワードを使用して、テーブル内の指定のパーティション (partition_name) やサブパーティション (subpartition_name) にデータを挿入できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSERT</span> ステートメントが <span class="emphasis">SELECT</span> 句と関連している場合は、いくつかの新たな規則が適用されます。<span class="emphasis">SELECT</span> 句を <span class="emphasis">VALUES</span> 句と組み合わせた場合、<span class="emphasis">SELECT</span> 句によって返される最初の 1 行のみがテーブルに挿入されます。<span class="emphasis">SELECT</span> を <span class="emphasis">VALUES</span> なしで使用すると、クエリーによって返されるすべての行がテーブルに挿入されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURNING</span> 句は、テーブルではなく、変数に値を挿入するために使用します。<span class="emphasis">RETURNING</span> 句の式と変数は、一対一で対応している必要があります。この句によって返される式は、<span class="emphasis">VALUES</span> 句で記述されているものである必要はありません。たとえば、次の INSERT ステートメントは、<span class="emphasis">sales</span> テーブルにレコードを挿入しますが、バインド変数には完全に別個の値を挿入します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT authors (au_id, au_lname, au_fname, contract )
VALUES ('111-11-1111', 'Rabbit', 'Jessica', 1)
RETURNING hire_date INTO :temp_hr_dt;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ここで、<span class="emphasis">RETURNING</span> 句は、<span class="emphasis">hire_date</span> が <span class="emphasis">VALUES</span> 句にリストされていないにもかかわらず、<span class="emphasis">hire_date</span> を返していることが分かります。この例では、<span class="emphasis">hire_date</span> 列に対して初期設定値が確立されているものと想定すると合理的です。LONG データタイプを <span class="emphasis">RETURNING</span> 句で扱うことはできません。<span class="emphasis">RETURNING</span> 句は、<span class="emphasis">INSTEAD OF</span> トリガーのあるビューでは使用できません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>さらに、<span class="emphasis">SELECT</span> 句では、<span class="emphasis">WITH</span> オプションを使用できます。<span class="emphasis">WITH READ ONLY</span> は、<span class="emphasis">SELECT</span> 句によって取得された結果セットを <span class="emphasis">INSERT</span> ステートメントが変更できないように指定します。<span class="emphasis">WITH CHECK OPTION</span> 句を指定すると、<span class="emphasis">SELECT</span> 句の結果セットに含まれない行を生成する可能性のあるデータ変更が禁止されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL は、SQL99 標準の <span class="emphasis">INSERT</span> ステートメントをサポートしています。前述の SQL99 の構文と使用方法を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、Microsoft SQL Server データベースの <span class="emphasis">authors</span> テーブルに、作家 Jessica Rabbit の新しい行を挿入します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT INTO authors (au_id, au_lname, au_fname, phone, address, city,
     state, zip, contract )
VALUES ('111-11-1111', 'Rabbit', 'Jessica', DEFAULT, '1717 Main St', NULL,
    'CA', '90675', 1)</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>各列には特定のリテラル値が割り当てられていますが、<span class="emphasis">phone</span> 列には、<span class="emphasis">CREATE TABLE</span> または <span class="emphasis">ALTER TABLE</span> ステートメントで設定された初期設定値が割り当てられ、<span class="emphasis">city</span> 列には NULL が割り当てられます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次は、同じデータを一部使用し、INTO を省略した Microsoft SQL Server の <span class="emphasis">INSERT</span> ステートメントです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT authors (au_id, au_lname, au_fname,  phone, contract )
VALUES ('111-11-1111', 'Rabbit', 'Jessica', DEFAULT, 1)</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">INSERT . . . SELECT</span> を使用して、<span class="emphasis">sales</span> テーブルから <span class="emphasis">new_sales</span> テーブルにデータを読み込みます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT sales
    (stor_id,
    ord_num,
    ord_date,
    qty,
    payterms,
    title_id)
SELECT
    CAST(store_nbr AS CHAR(4)),
    CAST(order_nbr AS VARCHAR(20)),
    order_date,
    quantity,
    SUBSTRING(payment_terms,1,12),
    CAST(title_nbr AS CHAR(1))
FROM new_sales
WHERE order_date &gt;= '01/01/2000'         -- retrieve only the newer records</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="LIKE 演算子">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">LIKE 演算子</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LIKE</span>   演算子は、<span class="emphasis">SELECT</span>   、<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、および <span class="emphasis">DELETE</span> ステートメントで指定した文字列パターンの一致を可能とします。指定するパターンには、特別なワイルドカード文字を含めることもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>WHERE expression [NOT] LIKE string_pattern</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LIKE</span> の利便性は、LIKE でサポートされているワイルドカード演算子に依存します。<span class="emphasis">LIKE</span> は、比較において一致する値が見つかった場合、ブール値 <span class="emphasis">TRUE</span> を返します。大文字小文字の区別に関する DBMS のデフォルトは、<span class="emphasis">LIKE</span> の動作にとって非常に重要です。たとえば、Microsoft SQL Server はデフォルトでは大文字小文字を区別しません。ただし、区別するように設定できます。クエリーの例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT *
FROM authors
WHERE lname LIKE 'LARS%'</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このクエリーでは、大文字の LARS% で検索した場合でも、姓 (lname) が larson または lars の作家を取り出します。Oracle では、<span class="emphasis">%</span> および <span class="emphasis">_</span> のパターン文字に対して大文字小文字を区別し、<span class="emphasis">LIKE</span> 以外の演算子を使用した他の正規表現パターン一致があります。ワイルドカード演算子を表 3.3 に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ワイルドカード演算子</th><th>例</th><th>説明</th></tr>
								<tr><td><span class="emphasis">%</span></td><td>city 列に "ville" が含まれる名前のすべてのレコードを検索します。すべてのベンダーがサポートしています。<pre>SELECT * FROM authors
WHERE city LIKE '%ville%'</pre>
									</td><td>あらゆる文字列に一致します。DOS の * の操作に似ています。</td>
								</tr>
								<tr><td><span class="emphasis">[ ]</span></td><td>姓 (au_name) が、Carson、Carsen、Karson、または Karsen のすべての作家を検索します。Oracle ではサポートされていませんが、Microsoft SQL Server ではサポートされています。<pre>SELECT * FROM authors
WHERE au_lname LIKE '[CK]ars[eo]n'</pre>
									</td><td>[abc] や [k-n] のように指定した集合や範囲に含まれる文字に一致します。</td>
								</tr>
								<tr><td><span class="emphasis">[^ ]</span></td><td>姓 (au_name) が arson または arsen (ただし Larsen や Larson <span class="emphasis">ではない</span>) で終わるすべての作家を検索します。Microsoft SQL Server でサポートされています。<pre>SELECT * FROM authors
WHERE au_lname LIKE '[A-Z^L]ars[eo]n'</pre>
									</td><td>指定した集合や範囲に含まれないすべての文字に一致します。</td>
								</tr>
								<tr><td><span class="emphasis">_ (アンダースコア)</span></td><td>名前 (au_fname) が Sheryl や Cheryl などでは<span class="emphasis">ない</span>、すべての作家を検索します。すべてのベンダーがサポートしています。<pre>SELECT * FROM authors
WHERE au_fname NOT LIKE '_heryl'</pre>
									</td><td>任意の 1 文字に一致します。</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">LIKE</span> を使用して文字列を比較する場合は、前後の空白スペースを含むパターン文字列内のすべての文字が比較対象となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="OPEN">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">OPEN </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">OPEN</span>   コマンドは、<span class="emphasis">DECLARE CURSOR</span> ステートメントで作成したサーバーカーソルを開きます。MySQL では、ANSI 方式のサーバーサイドカーソルはサポートしていません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>OPEN { cursor_name }</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">cursor_name</span> には、<span class="emphasis">DECLARE CURSOR</span> コマンドで作成したカーソルの名前を指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>標準的なサーバーカーソルに加えて、Microsoft SQL Server では、複数のユーザーが参照できるグローバルカーソルを <span class="emphasis">OPEN GLOBAL cursor_name</span> のフォーマットで宣言できます。また、Oracle では、<span class="emphasis">OPEN cursor_name parameter1 [,...n]</span> のフォーマットを使用して、カーソルを開く際にパラメータをカーソルに直接渡すことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の Microsoft SQL Server の例では、カーソルを開き、すべての行を取得します。Oracle および PostgreSQL では、最後の <span class="emphasis">DEALLOCATAE</span> 句を使用せずに同じ機能を実行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>DECLARE employee_cursor CURSOR FOR
  SELECT lname, fname
  FROM pubs.dbo.authors
  WHERE lname LIKE 'K%'

OPEN employee_cursor

FETCH NEXT FROM employee_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
  FETCH NEXT FROM Employee_Cursor
END

CLOSE employee_cursor

DEALLOCATE employee_cursor
-- DEALLOCATE is specific to Microsoft SQL Server and non-ANSI
-- standard.</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="演算子">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">演算子</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>演算子は、式に対して行う操作を指定する記号です。演算子は、<span class="emphasis">DELETE</span>   、<span class="emphasis">INSERT</span>、<span class="emphasis">SELECT</span>、または <span class="emphasis">UPDATE</span> ステートメントだけでなく、ストアドプロシージャー、関数、トリガー、およびビューなどの    データベースオブジェクトの作成にもよく使用されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>演算子は、通常、次の論理カテゴリに分かれます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i><span class="emphasis">算術演算子</span></i><br>&#160;
						  すべてのデータベースでサポートされています。</li><li><i><span class="emphasis">代入演算子</span></i><br>&#160;
						  すべてのデータベースでサポートされています。</li><li><i><span class="emphasis">ビットごとの</span><span class="emphasis">演算子</span></i><br>&#160;
						  Microsoft SQL Server でサポートされています。</li><li><i><span class="emphasis">比較</span><span class="emphasis">演算子</span></i><br>&#160;
						  すべてのデータベースでサポートされています。</li><li><i><span class="emphasis">論理</span><span class="emphasis">演算子</span></i><br>&#160;
						  Oracle、Microsoft SQL Server、および PostgreSQL でサポートされています。</li><li><i><span class="emphasis">単項演算子</span></i><br>&#160;
						  Oracle でサポートされています。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">算術演算子</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>算術演算子は、数値データタイプに分類される任意のデータタイプを持つ 2 つの式の算術演算を行います。算術演算子の一覧を表 3.4 に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>算術演算子</th><th>意味</th></tr>
								<tr><td><span class="emphasis">+</span>     </td><td>   加算</td>
								</tr>
								<tr><td><span class="emphasis">- </span></td><td>減算</td>
								</tr>
								<tr><td><span class="emphasis">* </span></td><td>乗算</td>
								</tr>
								<tr><td><span class="emphasis">/ </span></td><td>除算</td>
								</tr>
								<tr><td><span class="emphasis">% </span></td><td>剰余 (SQL Server のみ) : 除算による余りを整数で返します。</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle および SQL Server では、+ 演算子と - 演算子を日付値の算術演算にも使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">代入演算子</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle を除いて、 代入演算子 (<span class="emphasis">=</span>) は、値を変数または列見出しのエイリアスに代入します。Microsoft SQL Server では、キーワード <span class="emphasis">AS</span> を、テーブル見出しまたは列見出しのエイリアスに代入を行う演算子に割り当てています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">ビットごとの演算子</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、2 つの整数式の間でビット演算を簡単に行うためにビットごとの演算子を提供しています (表 3.5 参照)。ビットごとの演算子にアクセスできる有効なデータタイプは、<span class="emphasis">binary</span>、<span class="emphasis">bit</span>、<span class="emphasis">int</span>、<span class="emphasis">smallint</span>、<span class="emphasis">tinyint</span>、および <span class="emphasis">varbinary</span> です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ビットごとの演算子</th><th>意味</th></tr>
								<tr><td><span class="emphasis">&amp; </span> </td><td>ビットごとの論理積 (2 オペランド)</td>
								</tr>
								<tr><td><span class="emphasis">| </span> </td><td>ビットごとの論理和 (2 オペランド)</td>
								</tr>
								<tr><td><span class="emphasis">^ </span> </td><td>ビットごとの排他的論理和 (2 オペランド)</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">比較演算子</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p> 比較演算子は、2 つの式が等しいかどうかをテストします。比較演算子の結果は、<span class="emphasis">TRUE</span>、<span class="emphasis">FALSE</span> または <span class="emphasis">UNKNOWN</span> のいずれかのブール値です。また、ANSI 規格では、比較演算対象式のいずれかが <span class="emphasis">NULL</span> の場合は <span class="emphasis">NULL</span> が返されます。たとえば、式 <span class="emphasis">23 + NULL</span> は <span class="emphasis">NULL</span> を返します。式 <span class="emphasis">Feb 23, 2002 + NULL</span> も同様です。比較演算子の一覧を表 3.6 に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>比較演算子</th><th>意味</th></tr>
								<tr><td><span class="emphasis">=</span>     </td><td>等しい</td>
								</tr>
								<tr><td><span class="emphasis">&gt;</span></td><td>より大きい</td>
								</tr>
								<tr><td><span class="emphasis">&lt;</span></td><td>より小さい</td>
								</tr>
								<tr><td><span class="emphasis">&gt;=</span> </td><td>より大きいか等しい (以上)</td>
								</tr>
								<tr><td><span class="emphasis">&lt;=</span></td><td>より小さいか等しい (以下)</td>
								</tr>
								<tr><td><span class="emphasis">&lt;&gt;</span></td><td>等しくない</td>
								</tr>
								<tr><td><span class="emphasis">!=</span>     </td><td>等しくない (ANSI 規格外)</td>
								</tr>
								<tr><td><span class="emphasis">!&lt;</span></td><td>小さくない (ANSI 規格外)</td>
								</tr>
								<tr><td><span class="emphasis">!&gt;</span></td><td>大きくない (ANSI 規格外)</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ブール値比較演算子は、検索条件を満たす行を見つけるために、 <span class="emphasis">WHERE</span> 句でよく使用されます。次の Microsoft SQL Server の例では、比較演算子の "以上" が使用されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT *
   FROM Products
   WHERE ProductID &gt;= @MyProduct</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">論理演算子</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>論理演算子は、一般に、特定の条件の真偽をテストするために <span class="emphasis">WHERE</span> 句で使用されます。論理演算子は、<span class="emphasis">TRUE</span> または <span class="emphasis">FALSE</span> のいずれかのブール値を返します。論理演算子については、<span class="emphasis">SELECT</span> の項でも説明します。すべての RDBMS ですべての演算子がサポートされているわけではありません。論理演算子の一覧を表 3.7 に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>論理演算子</th><th>意味</th></tr>
								<tr><td><span class="emphasis">ALL</span></td><td>比較セットがすべて TRUE の場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">AND </span>         </td><td>両方の論理式が TRUE の場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">ANY</span></td><td>比較セットのいずれかが TRUE の場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">BETWEEN</span></td><td>オペランドが範囲内の場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">EXISTS</span></td><td>サブクエリーに行が含まれる場合、TRUE<span class="emphasis"></span> を返します。</td>
								</tr>
								<tr><td><span class="emphasis">IN</span></td><td>オペランドが式リストのいずれかに等しい場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">LIKE</span></td><td>オペランドがパターンと一致する場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">NOT</span></td><td>他の論理演算子の値を反転します。</td>
								</tr>
								<tr><td><span class="emphasis">OR</span></td><td>論理式のいずれかが TRUE の場合、TRUE を返します。</td>
								</tr>
								<tr><td><span class="emphasis">SOME</span></td><td>比較セットのいくつかが TRUE の場合、TRUE を返します。</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">単項演算子</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>単項演算子は、数値データタイプに分類される任意のデータタイプの 1 つの式に対してのみ演算を行います。単項演算子は、整数データタイプに対して使用できますが、正負は、任意の数値データタイプで使用できます (表 3.8 参照)。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>単項演算子</th><th>意味</th></tr>
								<tr><td><span class="emphasis">+</span></td><td>数値は正です。</td>
								</tr>
								<tr><td><span class="emphasis">-</span>  </td><td>数値は負です。</td>
								</tr>
								<tr><td><span class="emphasis">~</span></td><td>ビットごとの NOT で、値の補数を返します。Oracle ではサポートされていません。</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">演算子の優先順位</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p> 演算子の式が複雑になる場合があります。式に複数の演算子が含まれる場合、<span class="emphasis">演算子の優先順位</span>によって、演算が実行される順序が決定されます。実行順序は結果の値に大きく影響します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>演算子には次の優先レベルがあります。レベルの高い演算子は、低い演算子より前に評価されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li>( ) (かっこ)</li><li>+, -, ~ (単項演算子)</li><li>*, /, % (乗除算演算子)</li><li>+, - (加減演算子)</li><li>=, &gt;, &lt;, &gt;=, &lt;=, &lt;&gt;, !=, !&gt;, !&lt; (比較演算子)</li><li>^ (ビットごとの排他的論理和), &amp; (ビットごとの論理積), | (ビットごとの論理和)</li><li><span class="emphasis">NOT</span></li><li><span class="emphasis">AND</span></li><li><span class="emphasis">ALL</span>, <span class="emphasis">ANY</span>, <span class="emphasis">BETWEEN</span>, <span class="emphasis">IN</span>, <span class="emphasis">LIKE</span>, <span class="emphasis">OR</span>, <span class="emphasis">SOME</span></li><li>= (変数への代入)</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>同じ優先順位の演算子は、左から右の順に評価されます。ただし、かっこは式の中の演算子のデフォルト順位に優先して使用されます。かっこ内の式が最初に評価され、次にかっこ外の演算が評価されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>たとえば、次の Oracle のクエリー内の式は、それぞれ全く異なる結果を返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT 2 * 4 + 5 FROM dual
-- Evaluates to 8 + 5 which yields an expression result of 13.

SELECT 2 * (4 + 5) FROM dual
-- Evaluates to 2 * 9 which yields an expression result of 18.</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p> ネストしたかっこを使用した式では、最も深くネストした式が最初に評価されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、<span class="emphasis">5 - 3</span> という最も深くネストしたかっこの組が式に含まれています。この式の値は <span class="emphasis">2</span> となります。次に、加算演算子 (+) がこの結果を <span class="emphasis">4</span> に追加して、値が <span class="emphasis">6</span> となります。最後に、<span class="emphasis">6</span> に <span class="emphasis">2</span> が掛けられ、式の結果は <span class="emphasis">12</span> となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT 2 * (4 + (5 - 3) ) FROM dual
-- Evaluates to 2 * (4 + 2) which further evaluates to 2 * 6, and
-- yields an expression result of 12.</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="RETURN">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">RETURN </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURN</span>  ステートメントは、ホストが起動した関数ではなく、SQL で起動した関数内の処理を終了し、関数の結果値を返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>RETURNS return_parameter_value | NULL</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURN</span> 関数は関数内で使用され、その関数の処理を終了します。<span class="emphasis">NULL</span> 句を指定すると、関数は実際の値を返さずに終了します。NULL 句を指定しない場合は、指定したパラメータ値 (return_parameter_value) が、変数またはリテラル式として返されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURN</span> ステートメントは、SQL 内では独立したコマンドとして分類されますが、このステートメントは、<span class="emphasis">CREATE FUNCTION</span> ステートメントと深く関係しています。各ベンダーの <span class="emphasis">RETURN</span> の実装の詳細については、<span class="emphasis">CREATE FUNCTION</span> ステートメントの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、関数 (project_revenue) を作成します。この関数は、<span class="emphasis">proj_rev</span> 変数に格納されている値を呼び出しセッションに返します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION project_revenue (project IN varchar2)
RETURN NUMBER
AS
   proj_rev NUMBER(10,2);
BEGIN
   SELECT SUM(DECODE(action,'COMPLETED',amount,0) -
          SUM(DECODE(action,'STARTED',amount,0)   +
          SUM(DECODE(action,'PAYMENT',amount,0)
   INTO proj_rev
   FROM construction_actions
   WHERE project_name = project;
   RETURN (proj_rev);
END;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、計算結果の値を呼び出しセッションに返す関数 (metric_volume) を作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>CREATE FUNCTION metric_volume -- Input dimensions in centimeters.
   (@length decimal(4,1),
   @width decimal(4,1),
   @height decimal(4,1) )
RETURNS decimal(12,3) -- Cubic Centimeters.
AS
BEGIN
   RETURN ( @length * @width * @height )
END
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="REVOKE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">REVOKE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REVOKE</span>     ステートメントは、特定のデータベースオブジェクトまたはシステムコマンドに対するユーザー、グループ、またはロールの権限を取り消します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE [GRANT OPTION FOR]
{ ALL PRIVILEGES }
| SELECT
| INSERT
| DELETE
| UPDATE
| REFERENCES
| USAGE }[,...n]
ON { [TABLE] table_name
| DOMAIN domain_name
| COLLATION collation_name
| CHARACTER SET character_set_name
| TRANSLATION translation_name }
FROM {grantee_name | PUBLIC} [,...n]
{CASCADE | RESTRICT}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>特定のデータベースオブジェクトに対する特定の権限を単一のユーザーから取り消すには、<span class="emphasis">REVOKE privilege_name ON object_name FROM grantee_name</span> というコマンドを使用します。特定のオブジェクトに対する特定の権限をすべてのユーザーから取り消すには、<span class="emphasis">PUBLIC</span> 句を使用します。また、<span class="emphasis">REVOKE GRANT OPTION FOR</span> 句を使用すると、<span class="emphasis">WITH GRANT OPTION</span> による権限を取り消すことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RESTRICT</span> オプションは、指定した権限のみを取り消します。<span class="emphasis">CASCADE</span> オプションは、指定した権限とその権限に依存するすべての権限を取り消します。依存する権限を取り消すオプションの動作は、データベースによって異なる場合があります。このオプションの実際の動作については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE [GRANT OPTION FOR]
{ALL [ PRIVILEGES ]
| SELECT
| INSERT
| DELETE
| UPDATE
| REFERENCES
| EXECUTE
| CREATE {DATABASE | DEFAULT | FUNCTION | PROCEDURE | RULE | TABLE | VIEW}
| BACKUP {DATABASE | LOG} } [,...n]
ON { {table_name | view_name} [(column [,...n])]
| stored_procedure_name
| extended_stored_procedure_name
| user_defined_function_name
| [(column [,...n] ON {table_name | view_name} }
{TO | FROM} {grantee_name} [,...n]
[CASCADE]
[AS {group_name | role_name} ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは基本的に SQL99 に準拠していますが、<span class="emphasis">GRANT</span> コマンドに実装されている拡張機能については相違点があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>権限が <span class="emphasis">WITH GRANT OPTION</span> でユーザーに付与されている場合、その権限を取り消すには、<span class="emphasis">GRANT OPTION FOR</span> と <span class="emphasis">CASCADE</span> の両方を使用する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REVOKE</span> は、現在のデータベースでのみ使用できます。また <span class="emphasis">REVOKE</span> は、<span class="emphasis">DENY</span> 設定を無効にするためにも使用されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">DENY</span> ステートメントが独自にサポートされています。<span class="emphasis">DENY</span> は、構文上は <span class="emphasis">REVOKE</span> と似ていますが、概念が異なります。<span class="emphasis">REVOKE</span> がユーザーの権限を取り消すものであるのに対し、<span class="emphasis">DENY</span> はユーザーの権限を明示的に禁止します。<span class="emphasis">DENY</span> ステートメントは、ユーザーまたはロールによる権限へのアクセスを禁止する場合に使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE CREATE DATABASE, CREATE TABLE FROM emily, sarah
GO

REVOKE GRANT OPTION FOR
SELECT, INSERT, UPDATE, DELETE ON titles
TO editors
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE { ALL PRIVILEGES
| SELECT
| INSERT [ (column_name [,...n]) ]
| UPDATE [ (column_name [,...n]) ]
| REFERENCES [ (column_name [,...n]) ]
| DELETE
| USAGE
| ALTER
| CREATE
| DROP
| FILE
| INDEX
| PROCESS
| RELOAD
| SHUTDOWN } [,...n]
ON {table_name | * | *.* | database_name.*}
FROM user_name [,...n]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REVOKE</span> ステートメントは、ユーザーに付与されている任意の権限を取り消します。<span class="emphasis">GRANT</span> ステートメントの項で説明したように、権限はグローバルに取り消すことができます。また、MySQL による <span class="emphasis">REVOKE</span> の実装では、削除済みのオブジェクトに対する権限は明示的には取り消されません。したがって、テーブルが既に削除済みであっても、そのテーブルに対する権限を明示的に <span class="emphasis">REVOKE</span> で取り消す必要があります。これ以外の点では、MySQL は <span class="emphasis">REVOKE</span> コマンドの SQL99 標準に準拠しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>1 つ目のコマンドは、<span class="emphasis">sales</span> テーブルに対する Emily と Dylan のすべての権限を取り消します。2 つ目のコマンドは、現在のデータベースにおける Kelly のすべての権限を取り消します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE ALL PRIVILEGES ON sales FROM emily, dylan;

REVOKE * employee FROM kelly;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE {ALL [PRIVILEGES] | [object_privilege] }
ON { [schema_name.][object] | [DIRECTORY directory_object_name] }
FROM {grantee_name | role | PUBLIC} [,...n]
[CASCADE [CONSTRAINTS] ] [FORCE];

REVOKE {system_privilege | role}
FROM {grantee_name | role | PUBLIC} [,...n];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">REVOKE</span> コマンドは、オブジェクト権限 (object_privilege) やシステム権限 (system_privilege) を取り消せるだけでなく、ロール (role) を、指定したユーザー (grantee_name) または別のロールから取り消せます。<span class="emphasis">REVOKE</span> コマンドでサポートされている特定のオブジェクト権限およびシステム権限の詳細については、<span class="emphasis">GRANT</span> ステートメントの項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REVOKE</span> コマンドの 2 つの形態である <span class="emphasis">REVOKE object_privilege</span> と <span class="emphasis">REVOKE system_privilege</span> は、相互に排他的です。両方の操作を 1 つのステートメントで実行することはできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>あるユーザーの権限を取り消すと、そのユーザーによって付与されたすべてのユーザーの権限も取り消されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">GRANT ANY ROLE</span> システム権限を付与されたユーザーは、任意のロールを取り消すこともできます。<span class="emphasis">REVOKE</span> コマンドで取り消すことができるのは <span class="emphasis">GRANT</span> コマンドで明示的に付与された権限のみであり、ロールまたはオペレーティングシステムを介して付与された権限を取り消すことはできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ON DIRECTORY</span> 句では、権限を取り消すディレクトリオブジェクトを指定します。<span class="emphasis">CASCADE CONSTRAINTS</span> 句は、<span class="emphasis">REFERENCES</span> 権限が取り消された場合に、ユーザーによって作成されたすべての参照整合性制約を削除します。<span class="emphasis">FORCE</span> 句は、依存関係を持つユーザー定義テーブルおよび型オブジェクトに対する <span class="emphasis">EXECUTE</span> 権限を取り消します。この結果、これらのオブジェクトは再コンパイルされるまで無効または使用不可となります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ロールからユーザーを取り消します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE read-only FROM sarah;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>システムコマンド権限を取り消します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE CREATE ANY SEQUENCE, CREATE ANY DIRECTORY FROM read_only;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">REFERENCES</span> 権限を取り消します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE REFERENCES
ON pubs_new_york.emp
FROM dylan
CASCADE CONSTRAINTS;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>REVOKE { ALL
| SELECT
| INSERT
| DELETE
| UPDATE
| RULE
| REFERENCES
| USAGE} [,...n]
ON {object_name}
TO {grantee_name | PUBLIC | GROUP group_name}
{CASCADE | RESTRICT}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、テーブル、ビュー、およびシーケンスに対するアクセス権を取り消せます。それ以外の点は、SQL99 のコマンドと同じです。SQL99 の <span class="emphasis">REVOKE</span> の構文の説明と、<span class="emphasis">GRANT</span> の説明を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="ROLLBACK">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">ROLLBACK</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ROLLBACK</span>   ステートメントは、開始地点または <span class="emphasis">SAVEPOINT</span> で宣言された地点までトランザクションを取り消します。このコマンドは、<span class="emphasis">COMMIT</span> と同様に、開いているカーソルを閉じ、ロックを解放します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ROLLBACK [WORK]
[TO SAVEPOINT savepoint_name]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ROLLBACK</span> ステートメントは、単一のデータ操作処理またはデータ操作処理のグループを終了し、最後に発行された <span class="emphasis">BEGIN</span> または <span class="emphasis">SAVEPOINT</span> ステートメントの地点までトランザクションを取り消します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 では、オプションのキーワード <span class="emphasis">AND CHAIN</span> が新たに定義されています。このコマンドに対応しているベンダーはまだありません。この新しい構文を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ROLLBACK [WORK] [AND [NO] CHAIN]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">AND CHAIN</span> オプションは、現在のトランザクションを停止し、トランザクション隔離レベルなどの共通のトランザクション環境を次のトランザクションと共有するよう指示します。<span class="emphasis">AND NO CHAIN</span> オプションを指定すると、単に 1 つのトランザクションが終了されます。<span class="emphasis">ROLLBACK</span> コマンドは、<span class="emphasis">ROLLBACK WORK AND NO CHAIN</span> コマンドの機能と同じです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ROLLBACK [TRAN[SACTION] [transaction_name |
 @tran_name_variable |
savepoint_name | @savepoint_variable] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ROLLBACK</span> は、現在のオープントランザクション (transaction_name) に対するデータ変更、または指定した既存のセーブポイント (savepoint_name) までのデータ変更をすべて取り消します。<span class="emphasis">ROLLBACK</span> を単独で発行した場合は、現在のオープントランザクションがロールバックされます。通常、<span class="emphasis">ROLLBACK</span> はロックを解放しますが、セーブポイントへのロールバックの場合は解放しません。ネストしたトリガーに関しては、<span class="emphasis">ROLLBACK</span> は <span class="emphasis">COMMIT</span> と同じように動作し、<span class="emphasis">@@TRANCOUNT</span> システム変数の値を 1 ずつ減少します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>トリガーの中で発行された場合、<span class="emphasis">ROLLBACK TRANSACTION</span> は、そのトリガーで実行されたものも含め、<span class="emphasis">ROLLBACK</span> ステートメントまでのすべてのデータ変更を取り消します。ネストしたトリガーは、トリガーの中で <span class="emphasis">ROLLBACK</span> 以降にある場合は実行されません。ただし、そのトリガーの中で ROLLBACK 以降にあるステートメントはロールバックの影響を受けません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>ROLLBACK [WORK] [TO savepoint_name] [FORCE text];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ROLLBACK</span> は、現在のオープントランザクション (transaction_name) に対するデータ変更、または指定した既存のセーブポイント (savepoint_name) までのデータ変更をすべて取り消します。Oracle の実装は、ほぼ SQL 標準に準拠していますが、<span class="emphasis">FORCE</span> オプションを指定できる点が異なります。<span class="emphasis">ROLLBACK FORCE</span> は、インダウト分散トランザクションまでロールバックします。インダウト分散トランザクションに関する情報は、Oracle のシステムビュー <span class="emphasis">DBA_2PC_PENDING</span> に格納されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>{ROLLBACK | ABORT} [WORK | TRANSACTION];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ROLLBACK</span> は、現在のオープントランザクション (transaction_name) に対するデータ変更、または指定した既存のセーブポイント (savepoint_name) までのデータ変更をすべて取り消します。PostgreSQL は、SQL99 の <span class="emphasis">WORK</span> オプションと <span class="emphasis">TRANSACTION</span> オプションの両方をサポートしています。セーブポイントへのロールバックはサポートしてません。<span class="emphasis">ABORT</span> オプションは、<span class="emphasis">ROLLBACK</span> の完全なシノニムとして使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">COMMIT</span> および <span class="emphasis">ROLLBACK</span> を使用した Microsoft SQL Server の Transact-SQL バッチを次に示します。このバッチは、<span class="emphasis">sales</span> テーブルにレコードを挿入します。レコードの挿入に失敗した場合、トランザクションはロールバックされます。ステートメントの実行に成功した場合、トランザクションはコミットされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>BEGIN TRAN -- initializes a transaction

-- the transaction itself
INSERT INTO sales
VALUES('7896','JR3435','Oct 28 1997',25,'Net 60','BU7832')

-- some error-handling in the event of a failure
IF @@ERROR &lt;&gt; 0
BEGIN
    -- raises an error in the event log and skips to the end
    RAISERROR 50000 'Insert of sales record failed'
    ROLLBACK WORK
    GOTO end_of_batch
END

-- the transaction is committed if no errors are detected
COMMIT TRAN

-- the GOTO label that enables the batch to skip to the end without
-- committing
end_of_batch:
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="SAVEPOINT">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">SAVEPOINT </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p> このコマンドは、現在のトランザクション内にセーブポイントを作成します。<span class="emphasis">SAVEPOINT</span> コマンドを使用すると、トランザクションを論理的なブレークポイントで分割できます。セーブポイントは、1 つのトランザクション内に複数指定することができます。<span class="emphasis">SAVEPOINT</span> コマンドの最大の利点は、<span class="emphasis">ROLLBACK</span> コマンドを使用して、トランザクションを固有のセーブポイントマーカーまで部分的にロールバックできることです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SAVEPOINT savepoint_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>一部のベンダーでは、1 つのトランザクション内に重複した名前のセーブポイントを作成できますが、これは推奨されません。":X" のフォーマットで代替セーブポイント識別子を指定すると、名前の代わりに整数値でセーブポイントを追跡できます。ただし、この方法はすべてのベンダーでサポートされているわけではないので、これが最善な方法というわけではありません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 では、既存のセーブポイントを削除する <span class="emphasis">RELEASE SAVEPOINT savepoint_name</span> ステートメントがサポートされていますが、これは本マニュアルで扱ういずれのベンダーでもサポートされていません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SAVE TRAN[SACTION] {savepoint_name | @savepoint_variable}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">SAVEPOINT</span> コマンドはサポートされていません。代わりに、<span class="emphasis">SAVE</span> コマンドを使用します。セーブポイントのリテラル名を宣言する代わりに、セーブポイントの名前を格納した変数を参照できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ROLLBACK TRAN savepoint_name</span> コマンドが実行されると、SQL Server はトランザクションを適切なセーブポイントまでロールバックします。次に、<span class="emphasis">ROLLBACK</span> ステートメント以降にある有効な Transact-SQL コマンドの位置から処理を続行します。そして、<span class="emphasis">COMMIT</span> ステートメントまたは最後の <span class="emphasis">ROLLBACK</span> ステートメントでトランザクションを終了させます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SAVEPOINT savepoint_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle は SQL99 の実装を完全にサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例は、いくつかのデータを変更し、セーブポイントにロールバックした後、トランザクションを完全にロールバックします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>INSERT INTO sales VALUES('7896','JR3435','Oct 28 1997',25,'Net
60','BU7832');

SAVEPOINT after_insert;

UPDATE sales SET terms = 'Net 90'
WHERE sales_id = '7896';

SAVEPOINT after_update;

DELETE sales;

ROLLBACK TO after_insert;
ROLLBACK;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="SELECT">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name"> SELECT</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis"></span>     <span class="emphasis">SELECT</span> ステートメントは、データベースに格納されているテーブルから、行、列、および演算で得られる値を取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応 (ANSI 結合に対応)</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応 (ANSI 結合に一部対応)</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応 (ANSI 結合には未対応)</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応 (ANSI 結合に一部対応)</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT</span> ステートメントの構文は高機能かつ複雑ですが、次の主要な句に分けることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT [ALL | DISTINCT] select_list
FROM table_name1 [,..., table_nameN]
[JOIN join_condition]
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT</span> ステートメントの句には、それぞれ固有の用途があります。そのため、<span class="emphasis">FROM</span> 句、<span class="emphasis">WHERE</span> 句、または <span class="emphasis">GROUP BY</span> 句について個別に説明することも可能です。しかし、すべてのクエリーですべての句が必要なわけではありません。クエリーに最低限必要なのは、<span class="emphasis">SELECT</span> 項目リストと <span class="emphasis">FROM</span> 句です。Microsoft SQL Server と PostgreSQL では、<span class="emphasis">FROM</span> 句を必要としない特定のタイプのクエリーがサポートされています。詳細については、次の例を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SELECT 項目リスト</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>基本的に、<span class="emphasis">SELECT 項目リスト</span>には、データベースから取得する情報の項目をすべて指定します。SELECT 項目リストにはタイプの異なる要素を指定することもでき、リテラル文字列、集計関数、および数値計算を取得できます。Microsoft SQL Server では、<span class="emphasis">SELECT</span> 項目リストにサブクエリーを含めることもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ALL</span> はデフォルトで、初期設定値を含め、すべてのレコードが返されることを意味します。<span class="emphasis">DISTINCT</span> キーワードは、重複するレコードを返さないようにする場合に指定します。この場合、結果セットには同じレコードは 1 つしか含まれないことになります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT</span> 項目リストに指定できる要素については、他にも次のような規則があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li>通常、取得する列は、コンマで区切ってすべて指定する必要があります。</li><li>アスタリスク (*) は、<span class="emphasis">FROM</span> 句に指定したすべてのテーブルから、<span class="emphasis">CREATE TABLE</span> ステートメントで指定したすべての列を取得するための省略表記として使用できます。</li><li>列エイリアスを指定すると、結果セットでデフォルトの列見出しの代わりにこのエイリアスが使用されます。列エイリアスは、<span class="emphasis">column AS "alias"</span> または <span class="emphasis">column alias</span> のフォーマットで指定します。これは、列見出しが簡潔すぎたり長すぎたりして意味が分かりにくい場合に特に便利です。次に例を示します。</li><li>ローカル変数およびグローバル変数 (サポートされている場合) を SELECT 項目リストに指定できます。</li><li>2 連ダッシュ (<span class="emphasis"> </span>) またはスラッシュとアスタリスク (<span class="emphasis">/* ... */</span>) を使用して、任意の SQL または Transact-SQL ステートメント中にコメントを記述できます。2 連ダッシュを指定した場合、それ以降、行末までにあるテキストは無視されます。スラッシュを指定した場合は、スラッシュとアスタリスク (/*) およびアスタリスクとスラッシュ (*/) に囲まれているテキストが無視されます。</li><li>クエリーで複数のテーブルを指定する場合は、列名の前にテーブル名を付ける必要があります。厳密に言えば、テーブル名は<span class="emphasis">両方</span>のテーブルのすべての列名に付ける必要があります。一般的にも、このようにしておくことが推奨されます。たとえば、次のように <span class="emphasis">jobs</span> テーブルと <span class="emphasis">employee</span> テーブルの両方に <span class="emphasis">job_id</span> という列が存在する場合があります。</li><li>現在のユーザーのコンテキスト外からデータを取り出す場合は、列名の前にスキーマ名または所有者名を指定する必要があります。テーブルが別のユーザー名で所有されている場合は、そのユーザー名を列参照に含めなければなりません。たとえば、次のクエリーは <span class="emphasis">PUBS</span> データベースで実行していますが、<span class="emphasis">SALES</span> データベースからもデータを取り出しています。</li><li>リテラル式を SELECT リスト項目として使用できます。</li><li>算術演算を SELECT リスト項目に指定できます。この場合、Microsoft SQL Server では <span class="emphasis">FROM</span> 句は不要です。Oracle では、このような計算は <span class="emphasis">DUAL</span> というシステムテーブルに対して実行する必要があります。このテーブルを使用することにより、テーブルの存在しない値を SELECT コマンドで取得することができます。次に例を示します。</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">FROM 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>一般に、<span class="emphasis">FROM</span> 句には次の 2 つの目的があります。クエリーによるデータの取得元となるテーブルおよびビューを指定する (各テーブル名はコンマで区切る) ことと、長いテーブル名にエイリアスを割り当て、長いクエリーの作成を容易にすることです。<span class="emphasis">FROM</span> 句でエイリアスを割り当てるには、テーブル名、スペース 1 つ、エイリアスの順に記述するか、またはテーブル名、<span class="emphasis">AS</span>、エイリアスの順に記述します。この 2 つの割り当て方法の例を以下に示します。複数のテーブルからデータを取得するクエリーでは、<span class="emphasis">FROM</span> 句および <span class="emphasis">WHERE</span> 句は次のように記述される場合があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT   e.emp_id,
         e.fname,
         e.lname,
         j.job_desc
FROM     employee e,
         jobs AS  j
WHERE    e.job_id = j.job_id
ORDER BY e.fname,
         e.lname</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>クエリーの中でいったんエイリアスを割り当てたら、そのクエリー内でのテーブル参照には、必ずそのエイリアスを使用する必要があります。1 つのクエリーの中で、完全なテーブル名への参照とエイリアスへの参照を混在させることは<span class="emphasis">できません</span>。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>上記のクエリーは、<span class="emphasis">employee</span> テーブルに格納されている従業員の個人コード (<span class="emphasis">emp_id</span>)、姓、名と <span class="emphasis">JOBS</span> テーブルにある職種の説明 (job_desc) を、従業員の職種コードである <span class="emphasis">job_id</span> を使用して結合しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">JOIN 句 </span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>非 ANSI 規格の実装では、結合操作は <span class="emphasis">WHERE</span> 句で行います (<span class="emphasis">WHERE</span> 句の説明を参照)。ANSI SQL-92 標準では、結合はクエリーの <span class="emphasis">JOIN</span> 句で行います。これらの結合方法はそれぞれ、<span class="emphasis">シータ結合</span>、および <span class="emphasis">ANSI 結合</span>と呼ばれています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>2 つ以上のテーブルのデータを結合して取得するには、まずそれらのテーブルが意味のある関係を共有している必要があります。<span class="emphasis">結合対象のテーブルを意味のある形でリンクするには、それらのテーブルに、共通の値セットを持つ列がなければなりません。</span>このような列のことを、<span class="emphasis">結合キー</span>または<span class="emphasis">共通キー</span>と呼びます。必ずというわけではありませんが、ほとんどの場合、結合キーは一方のテーブルの主キーであり、他方のテーブルの外部キーです。これらの列のデータが一致していれば、結合を実行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">PUBS</span> データベースの <span class="emphasis">employee</span> テーブルと <span class="emphasis">jobs</span> テーブルには、どちらも <span class="emphasis">job_id</span> 列があります。したがって、<span class="emphasis">job_id</span> が <span class="emphasis">employee</span> テーブルと <span class="emphasis">jobs</span> テーブルの共通キーとなります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ANSI 結合を使用するクエリーでは、1 つ目のテーブルと <span class="emphasis">JOIN</span> キーワードに続けて、結合対象のテーブルを指定します。2 つ目のテーブルを指定した後、<span class="emphasis">ON</span> キーワードと、以前のスタイルのクエリーで使用されていた結合条件を指定します。現在 ANSI 結合となった、元の形式のクエリーを次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT   e.emp_id,
         e.fname,
         e.lname,
         j.job_desc
FROM     employee AS e
JOIN     jobs AS j ON e.job_id = j.job_id
ORDER BY e.fname,
         e.lname</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">結合の種類</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>これらの問題は、ANSI 結合においては結合の種類を指定することによって解決します。また、シータ結合においては  等号とアスタリスク (<span class="emphasis">=*</span>) の組み合わせ (Microsoft SQL Server)、または  プラス記号とアスタリスク (<span class="emphasis">+*</span>) の組み合わせ (Oracle) を使用することによって解決します。次に結合の種類ごとの動作を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i>クロス結合</i><br>&#160;
						  2 つのテーブルに対して完全なクロス積を実行します。1 つ目のテーブルの各レコードが 2 つ目のテーブルのすべてのレコードと結合され、<span class="emphasis">巨大</span>な結果セットが生成されます。このコマンドでは、結合条件を指定しない場合と同じ結果が得られ、デカルト積とも呼ばれます。クロス結合を使用することはお勧めできません。クロス結合は、現在 Microsoft SQL Server でサポートされています。</li><li><i><span class="emphasis">内部結合</span></i><br>&#160;
						  結合対象テーブルのいずれかに一致しない行がある場合、その行を破棄します。ANSI 結合で結合の種類が明示的に定義されていない場合は、デフォルトで内部結合が行われます。内部結合は、現在 Microsoft SQL Server、PostgreSQL、および MySQL でサポートされています。</li><li><i><span class="emphasis">左 [外部] 結合</span></i><br>&#160;
						   JOIN ステートメントの左側に指定されているテーブルのすべてのレコードを返します。結合の左側のテーブルのレコードは、右側のテーブルに一致するレコードがない場合でも返されます。このとき、右側のテーブルの列は NULL 値を返します。次の例では、職種の説明 (job_desc) があるかどうかに関係なく、すべての従業員のレコードが返されます。多くの専門家は、一貫性の問題がない限りは、外部結合を左結合として記述することを推奨しています。左結合は、現在 Microsoft SQL Server でサポートされています。</li><li><i><span class="emphasis">右 [外部] 結合</span></i><br>&#160;
						  JOIN ステートメントの左側に指定されているテーブルに一致するレコードない場合でも、右側のテーブルのすべてのレコードを返します。このとき、左側のテーブルの列は NULL 値を返します。次の例では、<span class="emphasis">employee</span> テーブルに一致するレコードがあるかどうかに関係なく、<span class="emphasis">jobs</span> テーブルのすべてのレコードが返されます。右結合は、現在 Microsoft SQL Server でサポートされています。</li><li><i><span class="emphasis">完全結合</span></i><br>&#160;
						  他方のテーブルに一致するレコードがあるかどうかに関係なく、両方のテーブルのすべての行を返します。結果セットでは、結合の際にデータが存在しなかった部分は NULL 値で示されます。完全結合は、現在 Microsoft SQL Server でサポートされています。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ANSI 結合の場合、<span class="emphasis">LEFT JOIN</span> ではどちらのテーブルが左なのか、<span class="emphasis">RIGHT JOIN</span> ではどちらのテーブルが右なのかをクエリー自体が示しているため、シータ結合よりも分かりやすくなっています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>複数のキーを使用して複数のテーブルを結合するクエリーの構文は、基本的には同じ手法を拡張したものです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">複数のテーブルの結合例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--theta style query with multiple tables
SELECT   a.au_lname,
         a.au_fname,
         t2.title
FROM     authors a,
         titleauthor t1,
         titles t2
WHERE    a.au_id     = t1.au_id
  AND    t1.title_id = t2.title_id
ORDER BY t2.title

-- ANSI style query with multiple tables
SELECT   a.au_lname,
         a.au_fname,
         t2.title
FROM     authors a
JOIN     titleauthor AS t1 ON a.au_id     = t1.au_id
JOIN     titles      AS t2 ON t1.title_id = t2.title_id
ORDER BY t2.title</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">複数のキーを使用する結合の例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--theta style query with multipart key
SELECT   s1.store_id,
         s1.title_id,
         s2.qty
FROM     sales s1,
         sales_projections s2
WHERE    s1.store_id = s2.store_id
  AND  s1.title_id = s2.title_id
ORDER BY s1.store_id, s2.title_id

-- ANSI style query with multipart key
SELECT   s1.store_id,
         s1.title_id,
         s2.qty
FROM     sales s1
JOIN     sales_projections s2 ON s1.store_id = s2.store_id
   AND   s1.title_id = s2.title_id
ORDER BY s1.store_id, s2.title_id</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">WHERE 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE</span>  句は、<span class="emphasis">SELECT</span> ステートメントの極めて重要な要素です。<span class="emphasis">WHERE</span> 句には、クエリーで不要なデータが返されないようにする検索条件のほとんどを指定できます。それ以外の検索条件は、この項で後述する <span class="emphasis">HAVING</span> 句で指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE</span> 句の記述が適切でない場合、<span class="emphasis">SELECT</span> ステートメントの他の記述が正しくても適切な結果は得られません。したがって、<span class="emphasis">WHERE</span> 句は細かな部分まで完全に<span class="emphasis">理解しておく必要があります</span>。複数の条件からなる <span class="emphasis">WHERE</span> 句を持つ典型的なクエリーの例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT   a.au_lname,
         a.au_fname,
         t2.title,
         convert(char,t2.pubdate)
FROM     authors a
JOIN     titleauthor t1 ON a.au_id = t1.au_id
JOIN     titles t2 ON t1.title_id = t2.title_id
WHERE    (t2.type = 'business' OR t2.type = 'popular_comp')
  AND    t2.advance &gt; $5500
ORDER BY t2.title</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この例では、<span class="emphasis">演算子の優先順位</span>に従った <span class="emphasis">WHERE</span> 条件の処理順位が、かっこによって変更されています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>データベースのデフォルトの<span class="emphasis">ソート順序</span>によって、クエリーの結果セットを <span class="emphasis">WHERE</span> 句がどのように取り出すかが決まります。たとえば、Microsoft SQL Server はデフォルトで<span class="emphasis">辞書順</span>および<span class="emphasis">大文字小文字を区別しない</span>に設定されており、"Smith"、"smith"、"SMITH" を区別しません。しかし Oracle は<span class="emphasis">辞書順</span>および<span class="emphasis">大文字小文字を区別する</span>を使用しており、"Smith"、"smith"、"SMITH" を異なる値として扱います。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE</span> 句には、この例に示した機能の他に、さらに詳細な機能があります。表 3.9 に、<span class="emphasis">WHERE</span> 句の一般的な機能の概要を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>検索条件の概要</th><th>構文</th><th>例</th><th>使用方法と説明</th></tr>
								<tr><td>単純なブール値チェック</td>
									<td><pre>WHERE [NOT] expression
comparison_operator  expression</pre>
									</td>
									<td><pre>SELECT au_id
FROM   authors
WHERE  au_id = '172-32-1176'

SELECT au_id
FROM   authors
WHERE  au_lname NOT LIKE 'John%'</pre>
									</td><td>&lt;、&gt;、&lt;&gt;、&gt;=、&lt;=、および = の各演算子を使用して式 (expression) を比較できます。他にも、<span class="emphasis">LIKE</span> などの特殊な比較演算子がいくつかあります。これらについてはこの表で後述します。<span class="emphasis">NOT</span> キーワードは、通常の演算子 (&lt;、&gt;、&lt;&gt;、&gt;=、&lt;=、および =) と特殊な演算子 (<span class="emphasis">LIKE</span>、<span class="emphasis">NULL</span>、<span class="emphasis">BETWEEN</span>、<span class="emphasis">IN</span>、<span class="emphasis">EXISTS</span>、<span class="emphasis">ANY</span>、および <span class="emphasis">ALL</span>) に基づくブール値チェックの逆をチェックします。</td>
								</tr>
								<tr><td>複数の検索条件</td>
									<td><pre>WHERE [NOT] expression
comparison_operator expression
{AND | OR}
expression comparison_operator
expression</pre>
									</td>
									<td><pre>SELECT au_id
FROM   authors
WHERE  au_id = '172-32-1176'
  AND  au_lname = 'White'</pre>
									</td><td><span class="emphasis">AND</span> は複数の条件を結合し、<span class="emphasis">両方</span>の条件が true の場合に結果を返します。<span class="emphasis">AND</span> はその他の演算子よりも優先されます。<span class="emphasis">WHERE</span> 句でかっこを使用すると、演算子の優先順序に影響を与えることができます。<span class="emphasis">OR</span> は複数の条件を結合し、<span class="emphasis">いずれか</span>の条件が true の場合に結果を返します。<span class="emphasis">OR</span> は <span class="emphasis">AND</span> の次に優先されます。</td>
								</tr>
								<tr><td><span class="emphasis">NULL</span> チェック</td>
									<td><pre>WHERE [NOT] column_name IS [NOT]
NULL</pre>
									</td>
									<td><pre>SELECT *
FROM   titles
WHERE  price IS NULL</pre>
									</td><td><span class="emphasis">IS NULL</span> は NULL 値をチェックし、<span class="emphasis">IS NOT NULL</span> は NULL 値以外のすべての値をチェックします。</td>
								</tr>
								<tr><td><span class="emphasis">JOIN</span> チェック</td><td><pre>WHERE [NOT] column_value(s)
[(+)]=[(+)] column_value(s)</pre> または<pre>WHERE [NOT] column_value(s)
[*]=[*] column_value(s)</pre>
									</td>
									<td><pre>SELECT a.au_lname,
       a.au_fname,
       t2.title
FROM  authors a,
      titleauthor t1,
      titles t2
WHERE a.au_id = t1.au_id
  AND t1.title_id = t2.title_id
ORDER BY t2.title</pre>
									</td><td><span class="emphasis">JOIN</span> チェックは、複数のテーブル間の共通キーを評価することで行います。PostgreSQL で外部結合を行うには、すべてのレコードが取得される側にアスタリスクを指定します。Oracle で外部結合を行うには、NULL 値を許可する側にかっこで囲んだプラス記号 (+) を指定します。これは、基本的なアスタリスク指定方法とは異なります。詳細については、前の <span class="emphasis">JOIN</span> の項を参照してください。</td>
								</tr>
								<tr><td><span class="emphasis">LIKE</span> チェック</td>
									<td><pre>WHERE [NOT] column_name [NOT]
LIKE 'match_string'</pre>
									</td>
									<td><pre>/* get any phone number starting with 415 */
SELECT * FROM authors
WHERE phone LIKE '415%'</pre>
									</td><td><span class="emphasis">LIKE</span> は、引用符で囲んだ文字列に対するパターンマッチングを行います。使用できるワイルドカード記号については、<span class="emphasis">LIKE</span> の説明を参照してください。</td>
								</tr>
								<tr><td><span class="emphasis">EXISTS</span> チェック</td>
									<td><pre>WHERE [NOT] EXISTS (subquery)</pre>
									</td>
									<td><pre>SELECT p1.pub_name
FROM publishers p1
WHERE EXISTS
    (SELECT *
    FROM titles t1
    WHERE pub_id =p1.pub_id
      AND type =
      'psychology')</pre>
									</td><td><span class="emphasis">EXISTS</span> は、常にサブクエリーと共に使用されます。この場合、サブクエリーはデータを返すのではなく、データが存在するかどうかのブール値チェックを行います。この例は、心理学 (psychology) に関する書籍を発行しているすべての出版社 (pub_name) を返します。</td>
								</tr>
								<tr><td><span class="emphasis">BETWEEN</span> 範囲チェック</td>
									<td><pre>WHERE [NOT] expression [NOT] BETWEEN expression AND expression</pre>
									</td>
									<td><pre>SELECT *
FROM titles
WHERE ytd_sales BETWEEN 4000 AND 9000</pre>
									</td><td><span class="emphasis">BETWEEN</span> は、対象が範囲に含まれているかどうかをチェックします。これは、<span class="emphasis">WHERE</span> <span class="emphasis">(expression</span>&gt;= <span class="emphasis">x and expression</span>&lt;= <span class="emphasis">y)</span> と同じです。</td>
								</tr>
								<tr><td><span class="emphasis">IN</span> 範囲チェック</td>
									<td><pre>WHERE [NOT] expression [NOT] IN
(value_list | subquery)</pre>
									</td>
									<td><pre>SELECT *
FROM stores
WHERE state IN ('WA','IL','NY')

SELECT *
FROM stores
WHERE stor_id IN
  (SELECT stor_id
  FROM sales
  WHERE ord_date LIKE
  'Oct%')</pre>
									</td><td><span class="emphasis">IN</span> は、値のリストのいずれかに一致する結果セットを返すか、またはサブクエリーで返された値に一致する外側のクエリーの結果セットを返します。値のリスト (<span class="emphasis">value_list</span>) とサブクエリーはかっこで囲む必要があります。</td>
								</tr>
								<tr><td><span class="emphasis">SOME | ALL</span> 範囲チェック</td>
									<td><pre>WHERE [NOT] expression
comparison_operator
{[ANY | SOME] | ALL} (subquery)</pre>
									</td>
									<td><pre>-- to duplicate the functionality of IN
SELECT au_lname,
       au_fname
FROM   authors
WHERE city = ANY
    (SELECT city
     FROM   publishers)
-- to duplicate the functionality of NOT IN
SELECT au_lname,
       au_fname
FROM authors
WHERE city &lt;&gt; ALL
    (SELECT city
     FROM   publishers)
/* to find the titles that got an
advance larger than the minimum
advance amount paid New Moon Books*/
SELECT title
FROM   titles
WHERE  advance &gt; ANY
    (SELECT  advance
     FROM publishers,
      titles
     WHERE titles.pub_id =
       publishers.pub_id
     AND pub_name = 'New
       Moon Books')</pre>
									</td><td><span class="emphasis">ALL</span> と <span class="emphasis">SOME</span> は、常にサブクエリーおよび比較演算子 (&lt;、&gt;、&lt;&gt;、&gt;=、&lt;= など) と共に使用されます。<span class="emphasis">ALL</span> を使用するクエリーは、サブクエリーで取得された<span class="emphasis">すべて</span>の値が <span class="emphasis">WHERE</span> (または <span class="emphasis">HAVING</span>) 句の値と一致する場合に TRUE を返し、サブクエリーが外側のステートメントの行を返さない場合に FALSE を返します。<span class="emphasis">SOME</span> の機能は <span class="emphasis">EXISTS</span> と同じです。このオプションは <span class="emphasis">ALL</span> と同じように機能しますが、サブクエリーで取得された<span class="emphasis">いずれか</span>の値が、外側のステートメントの <span class="emphasis">WHERE</span> 句に指定された比較述語を満たす場合に TRUE と評価する点が異なります。</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>表 3.9 に示したように、 ワイルドカード文字を使用して検索オプションを拡張できます。ワイルドカード文字は、特に <span class="emphasis">LIKE</span> 演算子で使用すると便利です。ワイルドカード文字の種類の詳細については、<span class="emphasis">LIKE</span> の説明を参照してください。<span class="emphasis"></span> </p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">集計と GROUP BY 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">GROUP BY</span> 句 (および <span class="emphasis">HAVING</span> 句) は、本章で既に説明した<span class="emphasis">集計関数</span>を利用するクエリーでのみ必要になります。クエリーで集計関数を使用すると、さまざまな集計情報を得ることができます。次に一般的な集計関数を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li><span class="emphasis">AVG</span> は、指定した列に含まれるすべての非 NULL 値の平均を返します。</li><li><span class="emphasis">COUNT</span> は、指定した列に含まれるすべての非 NULL 値の数をカウントします。</li><li><span class="emphasis">COUNT DISTINCT</span> は、指定した列に含まれるすべての非 NULL の個別値の数をカウントします。</li><li><span class="emphasis">COUNT(*)</span> は、テーブルに格納されている全レコードの数をカウントします。</li><li><span class="emphasis">MAX</span> は、指定した列に含まれる非 NULL の最大値を返します。</li><li><span class="emphasis">MIN</span> は、指定した列に含まれる非 NULL の最小値を返します。</li><li><span class="emphasis">SUM</span> は、指定した列に含まれるすべての非 NULL 値を合計します。</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>使用できる集計関数は、対象となる列のデータタイプによって制限されます。任意のデータタイプの列に対して使用できるのは、<span class="emphasis">COUNT</span> と <span class="emphasis">COUNT DISTINCT</span> だけです。<span class="emphasis">MIN</span> と <span class="emphasis">MAX</span> は、任意のデータタイプの数値列、日付データタイプの列、および文字列データタイプの列に対して使用できます。<span class="emphasis">SUM</span> と <span class="emphasis">AVG</span> は、数値データタイプの列に対してのみ使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>NULL 値を含む列に対して集計関数を実行する必要がある場合は、<span class="emphasis">ISNULL( )</span> 関数 (SQL Server の場合) または <span class="emphasis">NVL</span> 関数 (Oracle の場合) を使用して NULL 値に値を代入します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>単一の値を返すクエリーは、<span class="emphasis">スカラー集計</span>と呼ばれます。スカラー集計では、<span class="emphasis">GROUP BY</span> 句は不要です。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--Query
SELECT AVG(price)
FROM titles

--Results
14.77</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>通常の列値と集計関数の両方を返すクエリーは、一般的に<span class="emphasis">ベクトル集計</span>と呼ばれます。ベクトル集計は <span class="emphasis">GROUP BY</span> 句を使用し、1 行または複数の行を返します。<span class="emphasis">GROUP BY</span> 句を使用する際は、次の規則に従う必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ol><li><span class="emphasis">GROUP BY</span> 句は、<span class="emphasis">WHERE</span> 句の後、<span class="emphasis">ORDER BY</span> 句の前に配置します。</li><li>すべての非集計列を <span class="emphasis">GROUP BY</span> 句に指定します。</li><li><span class="emphasis">GROUP BY</span> 句で列エイリアスを使用することはできません。テーブルエイリアスは使用できます。</li></ol>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例は、社内における職種 (job_desc) 別の従業員の数を調べます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--Query
SELECT   j.job_desc AS "Job Description",
         COUNT(e.job_id) AS "Nbr in Job"
FROM     employee e
JOIN     jobs j ON e.job_id = j.job_id
GROUP BY j.job_desc

--Results
Job Description                                    Nbr in Job
-------------------------------------------------- -----------
Acquisitions Manager                               4
Business Operations Manager                        1
Chief Executive Officer                            1
Chief Financial Officer                            1
Designer                                           3
Editor                                             3
Managing Editor                                    4
Marketing Manager                                  4
Operations Manager                                 4
Productions Manager                                4
Public Relations Manager                           4
Publisher                                          7
Sales Representative                               3</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">HAVING 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">HAVING</span> 句は、<span class="emphasis">GROUP BY</span> 句の結果に検索条件を設定します。<span class="emphasis">HAVING</span> 句は、集計に使用される行には作用しません。クエリーで返される行にのみ作用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">HAVING</span> 句の動作は、<span class="emphasis">WHERE</span> 句の動作とよく似ています。<span class="emphasis">HAVING</span> 句では、表 3.9 で説明した WHERE 句の検索条件をすべて使用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>たとえば、4 人以上の従業員が割り当てられている職種 (job_desc) を調べるには次のようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--Query
SELECT   j.job_desc "Job Description",
         COUNT(e.job_id) "Nbr in Job"
FROM     employee e
JOIN     jobs j ON e.job_id = j.job_id
GROUP BY j.job_desc
HAVING   COUNT(e.job_id) &gt; 3

--Results
Job Description                                    Nbr in Job
-------------------------------------------------- -----------
Acquisitions Manager                               4
Managing Editor                                    4
Marketing Manager                                  4
Operations Manager                                 4
Productions Manager                                4
Public Relations Manager                           4
Publisher                                          7</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">HAVING</span> 句は、<span class="emphasis">WHERE</span> 句で排除できる行を排除するために使用しないでください。<span class="emphasis">HAVING</span> 条件には、必ず集計値を含める必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">ORDER BY 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p> <span class="emphasis">ORDER BY</span> 句を使用すると、データベースのソート順序に従って結果セットをソートできます。<span class="emphasis"></span>結果セットは、昇順 (<span class="emphasis">ASC</span>) または降順 (<span class="emphasis">DESC</span>) のどちらでもソートできます。デフォルトは昇順です。次に例を示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--QUERY
SELECT   e.emp_id "Emp ID",
         rtrim(e.fname) || " " || rtrim(e.lname) "Name",
         j.job_desc "Job Desc"
FROM     employee e,
         jobs j
WHERE    e.job_id = j.job_id
  AND    j.job_desc = 'Acquisitions Manager'
ORDER BY e.fname DESC,
         e.lname ASC

--RESULTS
Emp ID    Name                           Job Desc
--------- ------------------------------ --------------------
M-R38834F Martine Ranc                  Acquisitions Manager
MAS70474F Margaret Smith                 Acquisitions Manager
KJJ92907F Karla Jablonski                Acquisitions Manager
GHT50241M Gary Thomas                    Acquisitions Manager</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>結果セットは、検索条件に従って絞り込まれた後、著者の姓 (lname) を基準に降順でソートされています。複数の著者の姓が同じである場合は、著者の名 (fname) を基準に昇順でソートされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>すべての実装では、<span class="emphasis">ORDER BY</span> 句で列番号を使用することもできます。列名または列エイリアスの代わりに、列の位置を表す整数で結果セットのソート順序を指定できます。たとえば、<span class="emphasis">au_id</span>、<span class="emphasis">au_fname</span>、そして最後に <span class="emphasis">au_lname</span> を基準にソートするには、次のようにします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT au_fname, au_lname, au_id
FROM authors
ORDER BY 3, 1, 2</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>通常は、ORDER BY 句を使用してクエリーの結果セットの順序を制御します。<span class="emphasis">ORDER BY</span> 句を指定しない場合、ほとんどの実装では、テーブル内でのデータの物理順序、またはクエリーが使用したインデックスの順序に従ってデータが返されます。そのため、インデックスまたはデータの物理ソート順序が変更された場合に問題が生じる可能性があります。したがって、明示的に順序を指定することをお勧めします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション </span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis"></span>Microsoft SQL Server の <span class="emphasis">SELECT</span> ステートメントには、オプティマイザヒント、<span class="emphasis">INTO</span> 句、<span class="emphasis">TOP</span> 句、<span class="emphasis">GROUP BY</span> の拡張、<span class="emphasis">COMPUTE</span>、<span class="emphasis">WITH OPTIONS</span> など、いくつもの変更が加えられています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SELECT . . . INTO</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT select_list
INTO   new_table_name
FROM   table_source
WHERE  clause</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT . . . INTO</span>  は SQL Server 独自のコマンドオプションで、一部で議論の的になっています。<span class="emphasis">SELECT . . . INTO</span> コマンドを使用すると、あるテーブルからクエリーで取得した行および列を、新しいテーブルに簡単にコピーできます。この操作はログには記録されません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例は、<span class="emphasis">SELECT . . . INTO</span> を使用して <span class="emphasis">non_mgr_employees</span> というテーブルを作成します。このテーブルには、<span class="emphasis">employee</span> テーブルに格納されているマネージャ以外の従業員の <span class="emphasis">emp_id</span>、名 (fname)、および姓 (lname) と、<span class="emphasis">jobs</span> テーブルから取得した職種の説明 (job_desc) を結合して格納します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--QUERY
SELECT   e.emp_id "emp_id",
         convert(char(25),rtrim(e.fname) + " " + rtrim(e.lname)) "name",
         substring(j.job_desc,1,30) "job_desc"
INTO     non_mgr_employee
FROM     employee e
    JOIN jobs AS j ON e.job_id = j.job_id
WHERE    j.job_desc NOT LIKE '%MANAG%'
ORDER BY 2,3,1</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>新たに作成および読み込まれた <span class="emphasis">non_mgr_employee</span> テーブルに対し、クエリーを発行できます。このテーブルに対し、簡単なクエリーを発行してデータを取得します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>--QUERY
SELECT   emp_id,
         name,
         job_desc
FROM     non_mgr_emp
ORDER BY 3,2,1

--RESULTS
emp_id    name                      job_desc
--------- ------------------------- ------------------------------
PTC11962M Philip Cramer             Chief Executive Officer
F-C16315M Francisco Chang           Chief Financial Officer
&lt;...edited for brevity...&gt;
PMA42628M Paolo Accorti             Sales Representative
TPO55093M Timothy O'Rourke          Sales Representative</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT . . . INTO</span> は、開発用または非公開用のコードでの使用にとどめることを強くお勧めします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">TOP 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">TOP</span>  句の構文を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT [TOP n [PERCENT] [WITH TIES]] select list
FROM table_name</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは、クエリーの結果セットに先頭 <span class="emphasis">n</span> 行のみを取得するよう指定します。パーセンテージ (PERCENT) も指定した場合は、行全体の最初の <span class="emphasis">n</span>% が取得されます。<span class="emphasis">WITH TIES</span> キーワードは、<span class="emphasis">ORDER BY</span> 句が指定されたクエリーでのみ使用できます。このキーワードは、基本の結果セットから、<span class="emphasis">ORDER BY</span> 句に指定した列の値が <span class="emphasis">TOP</span> 句の最終行と同じである行をすべて返すように指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">GROUP BY の拡張</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server の <span class="emphasis">GROUP BY</span>  は、<span class="emphasis">ALL</span>、<span class="emphasis">WITH CUBE</span>、および <span class="emphasis">WITH ROLLUP</span> をサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>[ GROUP BY [ALL] <span class="replaceable">group_by_expression </span>[,...n]
[ WITH { CUBE | ROLLUP } ] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ALL</span> は、<span class="emphasis">WHERE</span> 句のフィルタに一致する行を持たないグループを含め、すべてのグループを結果セットに含めるよう強制します。<span class="emphasis">ALL</span> は、<span class="emphasis">CUBE</span> または <span class="emphasis">ROLLUP</span> と併用することはできません。<span class="emphasis">CUBE</span> は、結果セットと共に、グループおよびサブグループの組み合わせごとの集計行を取得するよう指定します。<span class="emphasis">ROLLUP</span> は <span class="emphasis">CUBE</span> と似ていますが、集計された階層順序 (グループ内の最下位レベルから最上位レベルへの順) でグループを返す点が異なります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">COMPUTE 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">COMPUTE</span>  句は合計を生成し、これを集計列として結果セットの末尾に追記します。<span class="emphasis">COMPUTE BY</span> 句は、結果セット内に制御の切れ目と小計を生成します。同じクエリーの中に <span class="emphasis">COMPUTE BY</span> と <span class="emphasis">COMPUTE</span> の両方を指定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>[ COMPUTE { { AVG | COUNT | MAX | MIN | STDEV | STDEVP |VAR | VARP | SUM }
(expression) } [,...n]
[ BY expression [,...n] ] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>各引数 (<span class="emphasis">AVG</span>、<span class="emphasis">COUNT</span>、<span class="emphasis">MAX</span>、<span class="emphasis">MIN</span>、<span class="emphasis">STDEV</span>、<span class="emphasis">STDEVP</span>、<span class="emphasis">VAR</span>、<span class="emphasis">VARP</span>、<span class="emphasis">SUM</span>) は、<span class="emphasis">COMPUTE</span> 句で実行する集計の種類を指定します。通常、<span class="emphasis">expression</span> には列の名前を指定します。<span class="emphasis">BY expression</span> には、クエリーの <span class="emphasis">ORDER BY</span> 句に指定されている列を指定できます。<span class="emphasis">COMPUTE</span> 句は、クエリーの <span class="emphasis">ORDER BY</span> 句の後に記述します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">OPTION 句</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">OPTION</span>  句は、Microsoft SQL Server のクエリーの中で最後に指定する句です。この句は、クエリー全体を通して<span class="emphasis">クエリーヒント</span>を使用するよう指定します。クエリーヒントは、クエリーのデフォルトの処理方法より優先される非 ANSI 規格の手法です。クエリーヒントと <span class="emphasis">OPTION</span> 句の完全な構文およびその用法については、本マニュアルでは扱いません。詳細については SQL Server のマニュアルを参照してください。<span class="emphasis"></span></p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT [STRAIGHT_JOIN][SQL_SMALL_RESULT][SQL_BIG_RESULT][HIGH_PRIORITY]
[INTO {OUTFILE | DUMPFILE} 'file_name' options]
FROM...
JOIN...
[LIMIT [[offset_record,] number_of_rows]];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL の拡張には、デフォルトの <span class="emphasis">SELECT</span> キーワードに対する変更、<span class="emphasis">JOIN</span> の一部サポート、<span class="emphasis">LIMIT</span> 句、および <span class="emphasis">PROCEDURE</span> 句があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>デフォルトの <span class="emphasis">SELECT</span> 句に対する 1 つ目の拡張は、<span class="emphasis">STRAIGHT_JOIN</span> です。<span class="emphasis">STRAIGHT_JOIN</span> は、FROM 句に指定されたとおりの順序でテーブルを結合するようオプティマイザに強制します。<span class="emphasis">SQL_SMALL_RESULT</span> と <span class="emphasis">SQL_BIG_RESULT</span> はそれぞれ、小さい結果セットまたは大きい結果セットにするようオプティマイザに指示します。これらは、クエリーに <span class="emphasis">GROUP BY</span> 句または <span class="emphasis">DISTINCT</span> 句が含まれている場合に使用できます。クエリーに <span class="emphasis">DISTINCT</span> 句または <span class="emphasis">GROUP BY</span> 句が含まれている場合、MySQL は一時テーブルを作成します。これらのオプション句は、ワークテーブルを処理するために、MySQL に対してメモリー内に高速な一時テーブルを作成するよう指示したり (<span class="emphasis">SQL_SMALL_RESULT</span> の場合)、低速なディスクベースの一時テーブルを作成するよう指示したり (<span class="emphasis">SQL_BIG_RESULT</span> の場合) します。<span class="emphasis">HIGH_PRIORITY</span> は、クエリーに対し、テーブル内のデータを変更するステートメントよりも高い優先順位を与えます。この句は、特別な高速クエリーに対してのみ使用します。<span class="emphasis">LIMIT</span> 句は、クエリーによって返される行の数を制限します。<span class="emphasis">offset_record</span> の位置から <span class="emphasis">returning number_of_rows</span> 個の行が返されます。指定した整数が 1 つだけの場合、その数が必要なレコードの数と見なされ、デフォルトのオフセットは 0 と見なされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT . . . INTO OUTFILE `file_name'</span> 句は、クエリーの結果セットをホストファイルシステム上のファイルに書き込みます。既存のファイルを file_name に指定することはできません。<span class="emphasis">SELECT . . . INTO DUMPFILE</span> は、列の区切り、行の区切り、およびエスケープ文字なしで、1 つの連続した行としてデータを書き込みます。このオプションは、主に BLOB ファイル用に使用します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL がサポートする <span class="emphasis">JOIN</span> の構文は、次のタイプのみです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>[CROSS JOIN]
INNER JOIN
STRAIGHT_JOIN
LEFT [OUTER] JOIN
NATURAL LEFT [OUTER] JOIN</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT {[ALL] [DISTINCT] | [UNIQUE]}...
{columns_and_expressions_list} [,...n] AS alias
[INTO {variable[,...n] | record}]
FROM {[table_name [@database_link]| view_name | snapshot_name]
   | subquery [WITH {READ ONLY | CHECK OPTION [CONSTRAINT constraint_name]}]
   | TABLE {(nested_tbl_column)}
      [PARTITION {partition_name}]
      [SUBPARTITION {subpartition_name}
         [SAMPLE [BLOCK] [sample_percentage]}
WHERE
[[START WITH clause] CONNECT BY clause]
GROUP BY...
[ORDER BY... [NULLS FIRST | NULLS LAST] |
 FOR UPDATE [OF [schema.]table[,...n]] [NOWAIT] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、サーバー内部の <span class="emphasis">SELECT</span> サポート追加機能に対して、いくつかの拡張を加えることができます。たとえば、ネストしたテーブルとパーティションテーブルの両方を作成できるので (<span class="emphasis">CREATE TABLE</span> の説明を参照)、<span class="emphasis">SELECT</span> ステートメントでこれらのテーブルを明示的に指定してクエリーを実行できます。デフォルトパーティションに対してクエリーを実行する場合、<span class="emphasis">PARTITION</span> 句は不要です。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SAMPLE</span> 句を指定すると、テーブル全体からではなく、結果セット内でランダムにサンプリングされた行からレコードが選択されます。<span class="emphasis">SAMPLE BLOCK</span> 句を指定すると、行サンプリングではなくブロックサンプリングが行われます。sample_percentage には、サンプルに含めるブロック数または行数のパーセンテージを 0.000001 ～ 99 で指定します。サンプリングは、単一テーブルに対するクエリーでのみ行うことができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SELECT . . . INTO</span> 構文は、PL/SQL コードでのみ使用できます。この構文を使用すると、<span class="emphasis">SELECT</span> ステートメントで変数に値を代入できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ネストしたテーブルに対してクエリーを実行する場合は、<span class="emphasis">FROM TABLE nested_table_column</span> 句を使用する必要があります。<span class="emphasis">@database_link</span> 句を使用すると、<span class="emphasis">db_link</span> として宣言されている他のデータベースまたはサーバーに格納されているテーブルにクエリーでアクセスできます。db_link の詳細については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ORDER BY</span> 句に <span class="emphasis">NULL FIRST</span> オプションまたは <span class="emphasis">NULL LAST</span> オプションを付けると、そのオプションに応じて、NULL を含む行が結果セットの先頭または末尾に表示されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、結果セットを階層順序で表示するよう指定できます。これらのいわゆる<span class="emphasis">階層クエリー</span>にはさまざまな規則があり、独特の動作をします。この種のクエリーの使用上の規則については、ベンダーのマニュアルを参照してください。<span class="emphasis">START WITH</span> 句は階層クエリーに必須の句で、階層のルート行を指定します。<span class="emphasis">CONNECT BY</span> 句には、階層内の親行と子行の関係を記述します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">FOR UPDATE OF</span> 句は、クエリーで返される行を排他的にロックします。この句の直後には、<span class="emphasis">UPDATE . . . WHERE</span> コマンドと、<span class="emphasis">COMMIT</span> または <span class="emphasis">ROLLBACK</span> を指定する必要があります。<span class="emphasis">NOWAIT</span> オプションは、目的のレコードが既にロックされている場合には待機しないよう指示します。レコードが既にロックされていた場合、クエリーは終了し、直ちに制御がユーザーに返されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SELECT...
[INTO [TEMPORARY | TEMP] [TABLE] new_table_name]
FROM...
WHERE...
[FOR UPDATE [OF class_name[,...n]]
[LIMIT {count | ALL} [offset [,number_of_records]] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">SELECT . . . INTO</span> 構文を使用して新しいテーブルを作成できます。これは、基本的には Microsoft SQL Server でサポートされているものと同じです。<span class="emphasis">FOR UPDATE</span> 句は、クエリーで選択されたレコードを排他的にロックします。また MySQL と同様に、クエリーで返される行数を制限する <span class="emphasis">LIMIT</span> 句もサポートされています。<span class="emphasis"></span>     </p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="SET CONNECTION">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">SET CONNECTION</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET CONNECTION</span>  ステートメントを使用すると、データベースサーバーに対して開かれている複数の接続を切り替えることができます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>制限付き対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>未対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET CONNECTION {DEFAULT | connection_name}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>これは、接続を終了するコマンドではありません。このコマンドは、現在の接続からコマンドに指定された接続に切り替えるか、または <span class="emphasis">DEFAULT</span> 句を使用して現在の接続に切り替えるために使用します。接続を切り替える際、古い接続は変更を一切コミットすることなく休止状態になり、新しい接続がアクティブになります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>新しい接続を作成する場合は <span class="emphasis">CONNECT</span> コマンドを使用し、接続を終了させる場合は <span class="emphasis">DISCONNECT</span> コマンドを使用する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server は、Embedded-SQL (ESQL) でのみ <span class="emphasis">SET CONNECTION</span> をサポートし、その検索ツールの SQL Query Analyzer ではサポートしていません。ESQL では SQL99 の構文を完全にサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL Server の完全な ESQL プログラムでの <span class="emphasis">CONNECT</span>、<span class="emphasis">DISCONNECT</span>、および <span class="emphasis">SET CONNECTION</span> の使用例を次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>EXEC SQL CONNECT TO chicago.pubs AS chicago1 USER sa;
EXEC SQL CONNECT TO new_york.pubs AS new_york1 USER read-only;
// opens connections to the servers named "chicago" //
//   and "new_york"//

EXEC SQL SET CONNECTION chicago1;
EXEC SQL SELECT name FROM employee INTO :name;
// sets the chicago1 connection as active and performs work //
//   within that session //

EXEC SQL SET CONNECTION new_york1;
EXEC SQL SELECT name FROM employee INTO :name;
// sets the new_york1 connection as active and performs work //
//   within that session //

EXEC SQL DISCONNECT ALL;
// Terminates all sessions.  You could alternately use two //
//   DISCONNECT commands, one for each named connection. //</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="SET ROLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">SET ROLE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET ROLE</span>      コマンドは、現在のセッションで特定のセキュリティロールを有効または無効にします。セッションは <span class="emphasis">CONNECT</span> ステートメントを使用して作成し、ロールは <span class="emphasis">CREATE ROLE</span> ステートメントを使用して作成します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>未対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET ROLE {NONE | role_name}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>セッションは、<span class="emphasis">CONNECT</span> ステートメントを使用して開始します。ユーザーセッションが開始された後、<span class="emphasis">SET ROLE</span> ステートメントを発行すると、ロールに関連付けられた権限のセットがそのセッションに付与されます。<span class="emphasis">SET ROLE</span> コマンドは、トランザクションの外部からのみ発行できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET ROLE NONE</span> は、現在のセッションを <span class="emphasis">NULL</span> ロールに割り当てます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>現在アクティブなユーザーセッションにロールが割り当てられている場合は、文字列、データベース変数、さらには <span class="emphasis">CURRENT_ROLE</span> や <span class="emphasis">SYSTEM_ROLE</span> などのシステム関数を使用できます。いずれの場合でも、指定する値は有効なロール名でなければなりません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET ROLE {role_name [IDENTIFIED BY password] [,...n]
| [ALL [EXCEPT role_name [,...]]
|  NONE;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ユーザーが接続を開始すると、Oracle は明示的に権限 (ロール) をユーザーに割り当てます。そのセッションが実行されるロールは、<span class="emphasis">SET ROLE</span> コマンドで変更できます。Oracle では、<span class="emphasis">MAX_ENABLED_ROLES</span> 初期化パラメータを使用して、同時に開くことのできるロールの最大数を制御します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>指定するロール名 (<span class="emphasis">role_name</span>) は、Oracle 内に作成済みの有効なロール名でなければなりません。指定されていないロールを現在のセッションで利用することはできません。<span class="emphasis">role_name</span> にパスワードが設定されている場合は、<span class="emphasis">IDENTIFIED BY password</span> 句を使用してそのパスワードを記述する必要があります。複数の ロールを指定する場合は、各ロールをコンマで区切ります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET ROLE ALL</span> ステートメントは、現在のセッションに付与されているすべてのロールを有効にします。これには、他のロールを介して付与されているロールも含まれます。<span class="emphasis">EXCEPT</span> 句を使用すると、対象外とするロールを指定できます。<span class="emphasis">SET ROLE ALL</span> は、パスワードを指定する必要がある場合には使用できません。パスワードの設定されたロールにアクセスするには、<span class="emphasis">SET ROLE role_name IDENTIFIED BY password</span> ステートメントを使用する必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET ROLE NONE</span> ステートメントは、デフォルトロールを含め、すべてのロールを無効にします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>現在のセッション用に、それぞれパスワード <span class="emphasis">editor</span> と <span class="emphasis">red_marker</span> で識別される <span class="emphasis">read_only</span> ロールと <span class="emphasis">updater</span> ロールを有効にするには次のコマンドを実行します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET ROLE read_only IDENTIFIED BY editor, updater IDENTIFIED BY red_marker;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">read_write</span> ロールを除くすべてのロールを有効にします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET ROLE ALL EXCEPT read_write;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="SET TIME ZONE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">SET TIME ZONE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET TIME ZONE</span>    ステートメントは、現在のセッションのタイムゾーンをデフォルトとは別のタイムゾーンに変更します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>未対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>未対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>変則対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TIME ZONE {LOCAL | INTERVAL {+ | -}'00:00' HOUR TO MINUTE}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ほとんどの <span class="emphasis">SET</span> コマンドと同様に、<span class="emphasis">SET TIME ZONE</span> は明示的なトランザクションの外部からのみ実行できます。<span class="emphasis">LOCAL</span> 句は、現在のセッションの時刻値をサーバーのデフォルトタイムゾーンの時刻値に設定します。または INTERVAL を使用して、デフォルトの時刻を増減 (+ または -) する間隔値を設定することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TIME ZONE {'timezone' | LOCAL | DEFAULT
| INTERVAL {+ | -}'00:00' HOUR TO MINUTE};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">LOCAL</span> 句または <span class="emphasis">DEFAULT</span> 句を使用してセッションの時刻値をサーバーのデフォルトに設定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>タイムゾーンに指定する値は、オペレーティングシステムによって異なります。たとえば、`PST8PDT' は Linux システムでのカリフォルニアのタイムゾーンとして有効です。また、`Europe/Rome' は Linux およびその他システムでのイタリアのタイムゾーンとして有効です。無効なタイムゾーンが指定された場合、タイムゾーンはグリニッジ標準時 (GMT) に設定されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>タイムゾーンは、サーバーのデフォルトタイムゾーンとの間隔として設定することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、現在のデフォルトタイムゾーンを 3 時間進めたタイムゾーンに設定しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TIME ZONE INTERVAL +'03:00' HOUR TO MINUTE;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次に、現在のセッションの現在の時刻を 4 時間半遅らせています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TIME ZONE INTERVAL -'04:30' HOUR TO MINUTE;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>そして、現在のセッションの時刻をデフォルトに戻しています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TIME ZONE LOCAL;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="SET TRANSACTION">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">SET TRANSACTION</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET TRANSACTION</span>   ステートメントは、データの読み取りや書き込み、またはその隔離レベルなど、データ変更に関する多くの特性を制御します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>制限付き対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET [LOCAL] TRANSACTION { {READ ONLY | READ WRITE}[,...]
| ISOLATION LEVEL
  {READ COMMITTED
  | READ UNCOMMITTED
  | REPEATABLE READ
  | SERIALIZABLE}[,...]
| DIAGNOSTIC SIZE INT};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このコマンドは、発行時にはトランザクションのコンテキスト外にありますが、次の有効なトランザクションに適用されます。コンマで区切ることで、複数のオプションを適用できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>トランザクション設定をローカルサーバーにだけ適用する場合は、<span class="emphasis">LOCAL</span> コマンドを指定します。このオプションを指定しない場合は、トランザクションの実行場所に関係なくそのトランザクション設定が適用されます。このオプションは、SQL99 に新しく導入されたものです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>トランザクションは、読み取り専用 (<span class="emphasis">READ ONLY</span>) または読み書き用 (<span class="emphasis">READ WRITE</span>) として指定することもできます。<span class="emphasis">DIAGNOSTIC SIZE</span> 句に続けて整数を指定すると、1 つのトランザクションについて記録するエラーメッセージの数を指定できます。この情報は、<span class="emphasis">GET DIAGNOSTICS</span> ステートメントで取得できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">ISOLATION LEVEL</span> 句は、あるトランザクションにおける、同時トランザクションに影響するいくつかの動作を制御します。隔離レベルは、<span class="emphasis">内容を保証しない読み込み</span>、<span class="emphasis">非リピータブル読み込み</span>、および<span class="emphasis">ファントムレコード</span>に関するトランザクションの動作を制御します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<ul><li><i><span class="emphasis">内容を保証しない読み込み</span> </i><br>&#160;
						  あるトランザクションが、他のトランザクションが変更したレコードをそのトランザクションの完了前に読み込んだ場合に発生します。この場合、データベースにコミットされていない可能性のあるレコードに対するデータ変更が可能になってしまいます。</li><li><i><span class="emphasis">非リピータブル読み込み</span> </i><br>&#160;
						  あるトランザクションが、他のトランザクションが変更中のレコードを読み込んだ場合に発生します。この場合、前者のトランザクションがレコードを再読み込みしようとしても、そのレコードは見つからなくなります。</li><li><i><span class="emphasis">ファントムレコード</span> </i><br>&#160;
						  あるトランザクションがレコードのグループを読み込んだ後にデータの追加や変更が行われ、そのトランザクションの条件を満たすレコードが増える結果になった場合に発生します。</li></ul>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>隔離レベルの設定は、これらのデータ矛盾に関して、表 3.10 のような影響を与えます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>隔離レベル</th><th>内容を保証しない読み込み</th><th>非リピータブル読み込み</th><th>ファントムレコード</th></tr>
								<tr><td>READ COMMITTED</td><td>発生しない</td><td>発生する</td><td>発生する</td>
								</tr>
								<tr><td>READ UNCOMMITTED</td><td>発生する</td><td>発生する</td><td>発生する</td>
								</tr>
								<tr><td>REPEATABLE READ</td><td>発生しない</td><td>発生しない</td><td>発生する</td>
								</tr>
								<tr><td>SERIALIZABLE</td><td>発生しない</td><td>発生しない</td><td>発生しない</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 では、<span class="emphasis">SERIALIZABLE</span> がデフォルトの隔離レベルです。<span class="emphasis">READ WRITE</span> トランザクションでは、<span class="emphasis">READ UNCOMMITTED</span> に設定することはできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TRANSACTION ISOLATION LEVEL
{READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE}</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>SQL99 のデフォルトは SERIALIZABLE ですが、SQL Server のデフォルトは <span class="emphasis">READ COMMITTED</span> です。隔離レベルは、SQL99 とは異なり、トランザクション単位ではなくセッション全体を通じて維持されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TRANSACTION READ ONLY;</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、<span class="emphasis">SET TRANSACTION</span> ステートメントの完全な構文はサポートされていません。また、<span class="emphasis">READ ONLY</span> の実装にも若干の違いがあります。Oracle では、<span class="emphasis">READ COMMITTED</span> と <span class="emphasis">SERIALIZABLE</span> のみがサポートされています。デフォルトの動作は <span class="emphasis">READ COMMITTED</span> です。Oracle でこのコマンドを実行すると、トランザクションは隔離レベル <span class="emphasis">SERIALIZABLE</span> で開始されます。Oracle では、<span class="emphasis">READ ONLY</span>、<span class="emphasis">ALTER SESSION</span>、<span class="emphasis">ALTER SYSTEM</span>、<span class="emphasis">LOCK TABLE</span>、および <span class="emphasis">SET ROLE</span> の各コマンドが設定されている場合、実行できるのは <span class="emphasis">SELECT</span> コマンドのみになります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>SET TRANSACTION ISOLATION LEVEL {READ COMMITTED | SERIALIZABLE};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、<span class="emphasis">SET TRANSACTION</span> ステートメントの完全な構文はサポートされていません。PostgreSQL では、<span class="emphasis">SET TRANSACTION ISOLATION LEVEL READ COMMITTED</span><span class="emphasis"></span> を指定すると、トランザクションの開始前に現在のトランザクションの読み取り専用行がコミットされます。これがデフォルトです。<span class="emphasis">SERIALIZABLE</span> (ANSI のデフォルト隔離レベル) を指定した場合は、バッチの中の最初のデータ変更が行われる前に、現在のトランザクションの読み取り専用行がコミットされます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="START TRANSACTION">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">START TRANSACTION</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p>SQL99 で導入された <span class="emphasis">START TRANSACTION</span>  ステートメントを使用すると、<span class="emphasis">SET TRANSACTION</span> のすべての機能を実行したり、新しいトランザクションを開始したりできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>未対応 (後述の <span class="emphasis">BEGIN TRAN</span> の項を参照)</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>未対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>未対応 (後述の <span class="emphasis">BEGIN TRAN</span> の項を参照)</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>START TRANSACTION { {READ ONLY | READ WRITE}[,...]
| ISOLATION LEVEL
  {READ COMMITTED
  | READ UNCOMMITTED
  | REPEATABLE READ
  | SERIALIZABLE}[,...]
| DIAGNOSTIC SIZE INT};</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET</span> と <span class="emphasis">START</span> の違いは、<span class="emphasis">SET</span> は現在のトランザクションの外部と見なされ、<span class="emphasis">START</span> は新しいトランザクションが始まるマークと見なされるという点だけです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">BEGIN TRANSACTION</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">BEGIN TRANSACTION</span>  の機能は、<span class="emphasis">START TRANSACTION</span> と似ています。Microsoft SQL Server と PostgreSQL は、構文に多少の違いはありますが、どちらも <span class="emphasis">BEGIN TRANSACTION</span> をサポートしています。Oracle は、暗黙的なトランザクションはサポートしていますが、明示的なトランザクションはサポートしていません。MySQL は、アトミックトランザクションを一切サポートしていません。<span class="emphasis">BEGIN TRANSACTION</span> は、明示的なトランザクションを宣言しますが、隔離レベルは設定しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server の構文</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>BEGIN TRAN[SACTION] [transaction_name | @transaction_variable
[WITH MARK [ 'log_description' ] ] ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、トランザクションに名前を割り当てたり、変数を使用してトランザクションを参照したりできます。これが機能に影響を与えることはありません。トランザクションをネストする場合、このトランザクション名 (トランザクション名がある場合) を参照する必要があるのは、最も外側にある <span class="emphasis">BEGIN . . . COMMIT</span> または <span class="emphasis">BEGIN . . . ROLLBACK</span> の組だけです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WITH MARK</span> オプションを指定すると、トランザクションが SQL Server のイベントログに記録されます。<span class="emphasis">WITH MARK `log_description'</span><span class="emphasis"></span> と指定することで、ログに記録されるイベントに、そのイベントを説明する文字列を追記できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL の構文</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>BEGIN [ WORK | TRANSACTION ]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>通常、PostgreSQL は自動コミットモードで実行されています。このモードでは、各データ変更やクエリーそれ自体がトランザクションとなります。PostgreSQL は通常、トランザクションの最後に <span class="emphasis">COMMIT</span> または <span class="emphasis">ROLLBACK</span> を暗黙的に適用します。<span class="emphasis">BEGIN</span> ステートメントを使用すると、次の <span class="emphasis">COMMIT</span> または <span class="emphasis">ROLLBACK</span> を明示的に宣言できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">BEGIN</span> は、<span class="emphasis">COMMIT</span> または <span class="emphasis">ROLLBACK</span> と対にして発行する必要があります。発行しない場合、DBMS は <span class="emphasis">COMMIT</span> または <span class="emphasis">ROLLBACK</span> が出現するまでコマンドを完了しません。これにより、予期せぬ結果をデータにもたらす巨大なトランザクションとなる可能性があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL では、手動で記述したトランザクションの方が、自動コミットされるトランザクションよりもはるかに高速です。トランザクションの隔離性を高めるため、<span class="emphasis">BEGIN</span> ステートメントの直後に <span class="emphasis">SET TRANSACTION ISOLATION LEVEL</span><span class="emphasis"></span> を <span class="emphasis">SERIALIZABLE</span> に設定する必要があります。<span class="emphasis">BEGIN . . . COMMIT</span> ブロックには、数多くのデータ変更ステートメント (<span class="emphasis">INSERT</span>、<span class="emphasis">UPDATE</span>、<span class="emphasis">DELETE</span>) が指定される可能性があります。<span class="emphasis">COMMIT</span> コマンドを発行した場合、このコマンドが成功するか失敗するかによって、トランザクションがすべて実行されるか、またはまったく実行されないかのどちらかになります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例では、3 つの <span class="emphasis">INSERT</span> ステートメントすべてが 1 つのトランザクションとして扱われます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>BEGIN TRANSACTION
   INSERT INTO sales VALUES('7896','JR3435','Oct 28 2001',25,
   'Net 60','BU7832')

   INSERT INTO sales VALUES('7901','JR3435','Oct 28 2001',17,
   'Net 60','BU7832')

   INSERT INTO sales VALUES('7907','JR3435','Oct 28 2001',6,
   'Net 60','BU7832')

COMMIT
GO</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>ただし、いずれかの <span class="emphasis">INSERT</span> ステートメントに主キー制約が含まれているなどの場合は、トランザクショングループ全体が失敗します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="TRUNCATE TABLE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">TRUNCATE TABLE </td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">TRUNCATE TABLE</span>   コマンドは非 ANSI ステートメントで、テーブルのすべての行を削除します。個々の行削除はログには記録されません。テーブル構造を変更することなくすべてのレコードを簡単に消去することが可能で、さらに REDO ログやトランザクションログの領域をほとんど消費しないという非常に便利なコマンドです。ただしログに記録されないので、リカバリしたりバックアップしたりできないというデメリットもあります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>対応</td>
								</tr>
								<tr><td>MySQL</td><td>未対応</td>
								</tr>
								<tr><td>Oracle</td><td>対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>TRUNCATE TABLE <span class="replaceable">name</span></pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">TRUNCATE TABLE</span> ステートメントの機能は、<span class="emphasis">WHERE</span> 句を付けない <span class="emphasis">DELETE</span> ステートメントと同じです。どちらも、指定したテーブルの行をすべて削除します。ただし、大きな違いが 2 つあります。<span class="emphasis">TRUNCATE TABLE</span> はより高速である一方、ログに記録されません。つまり、エラーが発生してもロールバックはできません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>一般的に、<span class="emphasis">TRUNCATE TABLE</span> がトリガーを起動することはありません。また、指定したテーブルに外部キーが設定されている場合は機能しません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例は、<span class="emphasis">publishers</span> テーブルのすべてのレコードを削除します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>TRUNCATE TABLE publishers</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>TRUNCATE { CLUSTER [owner.]cluster
   | TABLE [owner.]table [{PRESERVE | PURGE} SNAPSHOT LOG]}
[{DROP | REUSE} STORAGE]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、テーブルまたはインデックス付けされたクラスター (ハッシュクラスターを除く) を削除できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle では、テーブルを削除する際、テーブルに定義されているスナップショットログを保持するか削除するかを指定できます。<span class="emphasis">PRESERVE</span> を指定すると、マスターテーブルを削除してもスナップショットログは保持されます。<span class="emphasis">PURGE</span> を指定した場合、スナップショットログは消去されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DROP STORAGE</span> 句を付けた場合は、行の削除によって解放されたディスク領域の割り当てが解除されます。<span class="emphasis">REUSE STORAGE</span> 句を付けた場合は、テーブルまたはクラスターに割り当てられていた削除行の領域はそのまま保持されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server と PostgreSQL</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server と PostgreSQL は、どちらも SQL99 のデフォルト構文をサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div><div id="UPDATE">
			<table width="100%" cellspacing="0" cellpadding="0" border="0" class="main"><tr>				<td valign="top" class="name">UPDATE</td><td valign="top" nowrap class="compatibility">&#160;</td>
				</tr>
				<tr>
					<td colspan="2" class="divider"><img src="dwres:18084" width="100%" height="1"></td>
				</tr>
				<tr>
					<td><p><span class="emphasis">UPDATE</span>  コマンドは、テーブル内の既存データを変更します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td>
						<table border="1"><tbody><tr><th>ベンダー</th><th>コマンド</th></tr>
								<tr><td>SQL Server</td><td>変則対応</td>
								</tr>
								<tr><td>MySQL</td><td>変則対応</td>
								</tr>
								<tr><td>Oracle</td><td>変則対応</td>
								</tr>
								<tr><td>PostgreSQL</td><td>対応</td>
								</tr>
							</tbody></table>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">SQL99 の構文および説明</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE {table_name | view_name}
SET {column_name | variable_name} = {DEFAULT | expression} [,...n]
WHERE conditions</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">DELETE</span> ステートメントと同様、<span class="emphasis">UPDATE</span> コマンドは、ほとんどの場合 <span class="emphasis">WHERE</span> 句を付けて発行します。テーブルのすべての行に影響を与えるのを避けるためです。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>実際に <span class="emphasis">UPDATE</span> ステートメントを発行する前に、同じ内容の <span class="emphasis">WHERE</span> 句を付けた <span class="emphasis">SELECT</span> コマンドを発行してみることをお勧めします。これによって、実際に <span class="emphasis">UPDATE</span> を行う前に結果セットのすべての行をチェックできます。この <span class="emphasis">SELECT</span> で返されたすべての行が <span class="emphasis">UPDATE</span> で変更されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">例</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE</span> 句を付けない基本的な <span class="emphasis">UPDATE</span> ステートメントを次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE authors
SET contract = 0</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE</span> 句を付けない場合、<span class="emphasis">authors</span> テーブルのすべての著者の契約状況 (contract) が 0 に設定されます。つまり、いずれの著者も契約を持たない状態になります。同様に、<span class="emphasis">UPDATE</span> ステートメントで値を数学的に調整することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE titles
SET price = price * 1.1</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>この <span class="emphasis">UPDATE</span> ステートメントは、すべての書籍の価格 (price) を 10% 値上げします。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">UPDATE</span> ステートメントに <span class="emphasis">WHERE</span> 句を付け加えると、テーブル内の指定のレコードだけを変更できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE titles
SET    type  = 'pers_comp',
       price = (price * 1.15)
WHERE  type  = 'popular_com'</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>このクエリーは、種別 (type) が <span class="emphasis">`popular_com'</span> であるすべてのレコードに対し、2 つの変更を加えます。これらのレコードの価格 (price) を 15% 値上げし、その種別を <span class="emphasis">`pers_comp'</span> に変更します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>場合によっては、指定したテーブルの値を別のテーブルの値に基づいて更新しなければならないこともあります。たとえば、特定の著者の全著作の出版日 (pubdate) を更新する必要がある場合には、次のように、まずサブクエリーでその著者 (au_id) と著作 (title_id) のリストを検索しなければなりません。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE titles
SET    pubdate = 'Jan 01 2002'
WHERE  title_id IN
    (SELECT title_id
     FROM   titleauthor
     WHERE  au_id IN
         (SELECT au_id
          FROM   authors
          WHERE  au_lname = 'White'))</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Microsoft SQL Server の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE {table_name | view_name} [WITH (table_hint [,...n])]
SET {column_name | variable_name} = {DEFAULT | expression | NULL} [,...n]
[FROM {table [,...n]}]
WHERE {conditions | CURRENT OF [GLOBAL] cursor_name}
[OPTION (query_hint [,...n])]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、ビューとテーブルの両方を更新できます。<span class="emphasis">WITH table_hint</span> 句と <span class="emphasis">OPTION</span> 句を使用して、テーブルレベルおよびクエリーレベルのオプティマイザヒントを宣言できます。オプティマイザヒントは、クエリーオプティマイザのデフォルトの機能より優先されます。オプティマイザヒントの詳細については、ベンダーのマニュアルを参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Microsoft SQL Server では、<span class="emphasis">UPDATE</span> ステートメントで <span class="emphasis">FROM</span> 句を使用できます。この拡張の主な利点は、複数テーブルの結合が容易になることです。テーブルの結合例を両スタイルの構文で次に示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>-- ANSI style
UPDATE titles
SET    pubdate = GETDATE(  )
WHERE  title_id IN
    (SELECT title_id
     FROM   titleauthor
     WHERE  au_id IN
         (SELECT au_id
          FROM   authors
          WHERE  au_lname = 'White'))

-- Microsoft Transact-SQL style
UPDATE  titles
SET     pubdate = GETDATE(  )
FROM    authors a,
        titleauthor t2
WHERE   a.au_id     = t2.au_id
    AND t2.title_id = titles.title_id
    AND a.au_lname  = 'White'</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Transact-SQL スタイルでの更新は、単純に <span class="emphasis">authors</span>、<span class="emphasis">titles</span>、および <span class="emphasis">titleauthor</span> の 3 つのテーブルを結合するだけで行うことができます。しかし、同じ操作を ANSI 準拠のコードで実行する場合は、まず <span class="emphasis">authors</span> テーブルで <span class="emphasis">au_id</span> を検索して <span class="emphasis">titleauthor</span> テーブルに渡し、このテーブルで <span class="emphasis">title_id</span> を確認してメインの UPDATE ステートメントに渡す必要があります。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">WHERE CURRENT OF cursor_name</span> 句にカーソルを指定した場合は、現在カーソルが位置している単一のレコードだけが更新されます。カーソルは、ローカルカーソルを指定することも、<span class="emphasis">GLOBAL</span> キーワードを使用してグローバルカーソルを指定することもできます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>次の例は、<span class="emphasis">authors</span> テーブルに格納されている著者のうち先頭 10 人の <span class="emphasis">state</span> 列を更新します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE authors
SET state = 'ZZ'
FROM (SELECT TOP 10 * FROM authors ORDER BY au_lname) AS t1
WHERE authors.au_id = t1.au_id</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">MySQL の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE [LOW PRIORITY] table_name
SET {column_name | variable_name} = {DEFAULT | expression}
WHERE conditions
[LIMIT integer]</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>MySQL は SQL99 標準をサポートしていますが、<span class="emphasis">LOW PRIORITY</span> 句と <span class="emphasis">LIMIT</span> 句という 2 つの拡張があります。<span class="emphasis">LOW PRIORITY</span> 句は、対象テーブルを読み込み中のクライアントがいなくなるまで <span class="emphasis">UPDATE</span> ステートメントの実行を待機するよう指示します。<span class="emphasis">LIMIT</span> 句は、<span class="emphasis">UPDATE</span> アクションの対象を整数値で指定された行数に制限します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">Oracle の構文およびバリエーション</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><span class="programlisting"><pre>UPDATE [schema.]{view_name | snapshot_name
   | table_name [@database_link]
      {[PARTITION partition_name] | [SUBPARTITION subpartition_name]}
   | subquery [WITH {[READ ONLY]
      | [CHECK OPTION [CONSTRAINT constraint_name] ]
SET {column [,...] = {expression [,...n] | subquery} | VALUE value}
WHERE conditions | CURRENT OF cursor_name}
RETURNING expression [,...n] INTO variable [,...n];</pre>
						</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle による <span class="emphasis">UPDATE</span> の実装では、許可されたスキーマ内のビュー、スナップショット、およびテーブルを更新できます。更新できるテーブルは、ローカルテーブルまたは <span class="emphasis">@dblink</span> を介してアクセス可能なテーブルです。更新は、常にパーティションに対して行われます。ただし、<span class="emphasis">UPDATE</span> コマンドは、指定のパーティション (<span class="emphasis">PARTITION</span>) またはサブパーティション (<span class="emphasis">SUBPARTITION</span>) に対する更新をサポートしています。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>サブクエリーに対して更新を行う場合は、<span class="emphasis">WITH</span> 句を使用できます。<span class="emphasis">WITH READ ONLY</span> 句は、サブクエリーを更新できないように指定します。<span class="emphasis">WITH CHECK OPTION</span> は、更新対象テーブルに対する変更のうち、サブクエリーの結果セットに含まれないレコードに対する変更は行わないよう指示します。<span class="emphasis">CONSTRAINT</span> 従属句は、特定の制約に基づいてさらに変更を制限するよう指示します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">SET VALUE</span> 句を使用すると、行値全体を任意のデータタイプ値に設定できます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>Oracle の <span class="emphasis">WHERE CURRENT OF</span> 句は、そのカーソルコンテキスト内の現在のレコードに対してのみ <span class="emphasis">UPDATE</span> を実行するよう指定します。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p><span class="emphasis">RETURNING</span> は、コマンドの影響を受ける行を取得します。単一行の更新に使用した場合、その行の値を PL/SQL 変数およびバインド変数に格納できます。複数行の削除に使用した場合、それらの行の値はバインド配列に格納されます。<span class="emphasis">INTO</span> キーワードを指定すると、更新された値が変数リストに格納されます。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td valign="top" colspan="2"><span class="title">PostgreSQL</span></td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
				<tr>
					<td><p>PostgreSQL は SQL99 標準をサポートしています。<span class="emphasis">UPDATE</span> コマンドの詳細については、前述の項を参照してください。</p>
					</td>
				</tr>
				<tr><td valign="top" colspan="2" class="clearseparation">&#160;</td>
				</tr>
			</table>
		</div>
	</body></html>