...

Informix Guide to SQL Syntax

by user

on
Category: Documents
63

views

Report

Comments

Transcript

Informix Guide to SQL Syntax
Informix Guide to SQL
®
Syntax
Informix Dynamic Server, Version 7.3
Informix Dynamic Server with Advanced Decision Support and Extended Parallel Options, Version 8.2
Informix Dynamic Server, Developer Edition, Version 7.3
Informix Dynamic Server, Workgroup Edition, Version 7.3
Version 7.3
September 1998
Part No. 000-4367-8
Informix のソフトウェアおよびユーザ・マニュアルは「現状のまま」提供され、商品性の黙示的な保証およ
び特定の目的への適合性の黙示的な保証など、明示的か黙示的かを問わず、いかなる種類の保証も提供され
ません。Informix のソフトウェアおよびユーザマニュアルの品質と性能についてのリスクは、すべて、お客
様の負担です。Informix のソフトウェアおよびユーザ・マニュアルに欠陥があった場合には、すべての必要
なサービス、修理または修正のための費用は、すべて、(Informix または Informix の正規取扱店ではなく)
お客様の負担となります。いかなる場合においても、Informix は Informix または Informix の正規代理店そう
した損害の可能性を知らされていた場合であっても、Informix のソフトウェアまたはユーザ・マニュアルの
使用または使用不能から生じた、利益の喪失、節約の喪失あるいは他の偶発的または結果的な損害など、い
かなる損害についても責任を負わず、また第三者からのいかなる請求についても責任を負いません。加え
て、Informix は、厳格責任あるいは Informix の過失に基づく請求で Informix のソフトウェアまたはユーザ・
マニュアルの使用または使用不能から生じた一切の請求についても責任を負いません。管轄地によっては、
黙示的な保証の排除を認めていない管轄地もあり、その場合には上記の排除の全部または一部が適用されな
いこともあります。この保証は、お客様に特定の法的な権利を付与するものですが、管轄地によって異な
る、その他の権利がお客様に認められることもあります。
すべての権利は Informix に保留されます。本書についての著作権で保護される本書のいかなる部分も、グラ
フィック、電子的方法、あるいは、コピー機、記録装置、テープ、情報記憶媒体、検索システムなどの機械
的方法など、形態あるいは方法を問わず、発行元の許可を得ないで、複製または使用することはできません。
発行者: INFORMIX Press
Informix Software, Inc.
4100 Bohannon Drive
Menlo Park, CA 94025-1032
Answers OnLine、INFORMIX、Informix、Illustra、C-ISAM、DataBlade、Dynamic Server、Gateway および
NewEra は Informix Software, Inc. の登録商標です。
その他の名前やマークはすべて、それぞれの所有者の登録商標または商標である可能性があります。
権利制限
Informix のソフトウェアおよび付随する資料は、制限された権利のもとに提供されます。政府による使用、
複製、または開示については、DFARS 252.227-7013 の Rights in Technical Data and Computer Software Clause
( 技術データおよびコンピュータ・ソフトウェアについての権利)に関するサブパラグラフ (c)(1)(ii) または
48CFR52.227-19 の Commercial Computer Software-Restricted Rights ( 商用コンピュータ・ソフトウェア - 制限
された権利)に関するサブパラグラフ (c)(1) および (2) の適用がある部分(および政府契約に規定されたそ
の他の適用のライセンス規定)に限定された制限が適用されます。
Copyright © 1981-1998 by Informix Software, Inc.
ii
Informix Guide to SQL:Syntax
目次
目次
序
このマニュアルについて . . . . . .
対象ユーザ . . . . . . .
ソフトウェアの要件 . . . . .
使用するロケール . . . . .
デモンストレーションデータベース
. . . .
. . .
. . .
. . .
. . .
序3
序3
序4
序4
序5
新機能 . . . . . . . . . . . . . . . . . . . . . . .
バージョン 7.3 の新機能 . . . . . . . . . . . . .
バージョン 8.2 の新機能 . . . . . . . . . . . . .
序5
序5
序7
マニュアル表記上のきまり
文字の表記 . . .
アイコンの表記 . .
構文の表記 . . .
サンプルコードの表記
第1章
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . 序7
. . .
序8
. . .
序9
. . . 序 11
. . . 序 15
関連マニュアル . . . . . . . . . . . . . . .
オンライン マニュアル . . . . . . . . .
ペーパー マニュアル . . . . . . . . . .
エラーメッセージファイル . . . . . . . .
ドキュメントノート、リリースノート、マシンノート
参考文献 . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
業界標準への準拠
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
序 16
序 16
序 17
序 17
序 18
序 19
.
. .
. .
.
. .
.
. .
. .
.
. .
.
. . 序 20
SQL 文の入力方法 .
. .
. .
.
. .
.
. .
. .
.
. .
.
. .
1-3
SQL コメントの入力方法 .
. .
.
. .
.
. .
. .
.
. .
.
. .
1-6
SQL 文のカテゴリ . . . . . . . . .
ストアドプロシジャ文 . . . . .
. . . . . . . . . .
. . . . . . . .
1-9
1-11
ANSI 標準準拠と機能拡張
. .
1-12
SQL 構文の概要
. .
.
. .
.
. .
.
. .
.
. .
第2章
SQL 文
ALLOCATE DESCRIPTOR 文 . .
ALTER FRAGMENT 文. . . .
ALTER INDEX 文 . . . . .
ALTER TABLE 文 . . . . .
BEGIN WORK 文 . . . . .
CLOSE 文 . . . . . . .
CLOSE DATABASE 文 . . . .
COMMIT WORK 文 . . . . .
CONNECT 文 . . . . . .
CREATE DATABASE 文 . . .
CREATE EXTERNAL TABLE 文 .
CREATE INDEX 文 . . . . .
CREATE PROCEDURE 文 . . .
CREATE PROCEDURE FROM 文 .
CREATE ROLE 文 . . . . .
CREATE SCHEMA 文 . . . .
CREATE SYNONYM 文 . . .
CREATE TABLE 文 . . . . .
CREATE TRIGGER 文 . . . .
CREATE VIEW 文 . . . . .
DATABASE 文 . . . . . .
DEALLOCATE DESCRIPTOR 文 .
DECLARE 文 . . . . . .
DELETE 文 . . . . . . .
DESCRIBE 文 . . . . . . . .
DISCONNECT 文 . . . . .
DROP DATABASE 文 . . . .
DROP INDEX 文 . . . . .
DROP PROCEDURE 文 . . . .
DROP ROLE 文 . . . . . .
DROP SYNONYM 文 . . . .
DROP TABLE 文 . . . . .
DROP TRIGGER 文 . . . . .
DROP VIEW 文 . . . . . .
EXECUTE 文 . . . . . .
EXECUTE IMMEDIATE 文 . .
EXECUTE PROCEDURE 文 . .
FETCH 文 . . . . . . . . .
FLUSH 文 . . . . . . .
FREE 文 . . . . . . . .
GET DESCRIPTOR 文 . . . .
GET DIAGNOSTICS 文 . . . .
GRANT 文 . . . . . . .
iv
Informix Guide to SQL:Syntax
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . . . . . .
2-6
. . . . . . .
2-8
. . . . . . .
2-34
. . . . . . .
2-37
. . . . . . .
2-67
. . . . . . .
2-70
. . . . . . .
2-73
. . . . . . .
2-75
. . . . . . .
2-77
. . . . . . .
2-89
. . . . . . .
2-92
. . . . . . .
2-106
. . . . . . .
2-134
. . . . . . .
2-144
. . . . . . .
2-146
. . . . . . .
2-148
. . . . . . .
2-151
. . . . . . .
2-155
. . . . . . .
2-198
. . . . . . .
2-230
. . . . . . .
2-236
. . . . . . .
2-239
. . . . . . .
2-241
. . . . . . .
2-258
. . . . . . . . . 2-262
. . . . . . .
2-267
. . . . . . .
2-271
. . . . . . .
2-273
. . . . . . .
2-275
. . . . . . .
2-276
. . . . . . .
2-277
. . . . . . .
2-279
. . . . . . .
2-282
. . . . . . .
2-283
. . . . . . .
2-285
. . . . . . .
2-294
. . . . . . .
2-297
. . . . . . . . . 2-301
. . . . . . .
2-312
. . . . . . .
2-315
. . . . . . .
2-318
. . . . . . .
2-325
. . . . . . .
2-342
GRANT FRAGMENT 文 . . . . .
INFO 文. . . . . . . . .
INSERT 文 . . . . . . . .
LOAD 文 . . . . . . . .
LOCK TABLE 文 . . . . . .
OPEN 文 . . . . . . . .
OUTPUT 文 . . . . . . .
PREPARE 文 . . . . . . . . .
PUT 文 . . . . . . . . .
RENAME COLUMN 文 . . . .
RENAME DATABASE 文. . . .
RENAME TABLE 文 . . . . .
REVOKE 文 . . . . . . .
REVOKE FRAGMENT 文. . . .
ROLLBACK WORK 文 . . . .
SELECT 文 . . . . . . . .
SET AUTOFREE 文 . . . . .
SET CONNECTION 文 . . . .
SET Database Object Mode 文 . . .
SET DATASKIP 文 . . . . .
SET DEBUG FILE TO 文 . . . .
SET DEFERRED_PREPARE 文 . .
SET DESCRIPTOR 文 . . . . .
SET EXPLAIN 文 . . . . . .
SET ISOLATION 文 . . . . .
SET LOCK MODE 文 . . . . .
SET LOG 文 . . . . . . .
SET OPTIMIZATION 文 . . . .
SET PDQPRIORITY 文 . . . .
SET PLOAD FILE 文 . . . . .
SET Residency 文 . . . . . .
SET ROLE 文 . . . . . . .
SET SCHEDULE LEVEL 文 . . .
SET SESSION AUTHORIZATION 文
SET TRANSACTION 文 . . . .
SET Transaction Mode 文 . . . .
START VIOLATIONS TABLE 文 .
STOP VIOLATIONS TABLE 文 . .
UNLOAD 文 . . . . . . .
UNLOCK TABLE 文 . . . . . .
UPDATE 文 . . . . . . . . .
UPDATE STATISTICS 文 . . . .
WHENEVER 文 . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
.
.
. .
.
.
.
.
.
.
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 2-359
2-368
2-372
2-383
2-390
2-393
2-401
. . 2-403
. 2-417
. 2-425
. 2-427
. 2-428
. 2-431
. 2-443
. 2-448
. 2-450
. 2-502
. 2-505
. 2-512
. 2-534
. 2-537
. 2-540
. 2-544
. 2-552
. 2-555
. 2-560
. 2-563
. 2-565
. 2-569
. 2-573
. 2-575
. 2-578
. 2-580
. 2-581
. 2-584
. 2-590
. 2-594
. 2-613
. 2-615
. . 2-620
. . 2-622
. 2-634
. 2-645
.
.
.
.
.
.
目次
v
第3章
SPL 文
CALL 文 . . . .
CONTINUE 文 . .
DEFINE 文 . . .
EXIT 文 . . . .
FOR 文 . . . .
FOREACH 文 . .
IF 文 . . . . .
LET 文 . . . . .
ON EXCEPTION 文 .
RAISE EXCEPTION 文
RETURN 文 . . .
SYSTEM 文 . . . .
TRACE 文 . . . .
WHILE 文 . . .
第4章
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . .
. . .
. . .
. . . .
. . . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
予約語
索引
vi
.
.
.
.
.
.
.
. .
.
.
.
. .
. .
.
. . . .
. . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
.
4-5
. . 4-22
.
4-25
.
4-27
.
4-31
.
4-33
.
4-112
.
4-129
.
4-132
.
4-135
.
4-138
.
4-140
.
4-153
.
4-156
.
4-160
3-4
3-7
3-8
3-16
3-18
3-23
3-27
3-31
3-34
3-39
3-41
3-44
3-47
3-50
セグメント
条件セグメント . . . . . . . .
データベース名 . . . . . . . . .
データベース オブジェクト名. . . .
データ型 . . . . . . . . . .
日時 (DATETIME) 型フィールド修飾子 .
式. . . . . . . . . . . .
識別子 . . . . . . . . . .
時間隔 (INTERVAL) 型フィールド修飾子
リテラル日時 (DATETIME) 型 . . .
リテラル時間隔 (INTERVAL) 型 . . .
リテラル番号 . . . . . . . .
オプティマイザ ディレクティブ . . .
所有者名 . . . . . . . . . .
引用符付き文字列 . . . . . . .
関係演算子 . . . . . . . . .
付録 A
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . . .
. . . . . . .
. . . . . .
Informix Guide to SQL:Syntax
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
序
序
このマニュアルについて . . . .
対象ユーザ . . . . . . .
ソフトウェアの要件 . . . .
使用するロケール . . . . .
デモンストレーションデータベース
新機能 . . . . . . . .
バージョン 7.3 の新機能 .
バージョン 8.2 の新機能 .
.
.
.
.
.
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
. .
. .
. .
序
序
序
序
序
3
3
4
4
5
序 5
序 5
序 7
マニュアル表記上のきまり . . . . . . . . . . . . .
文字の表記 . . . . . . . . . . . . . . . .
アイコンの表記 . . . . . . . . . . . . . . .
コメントアイコン . . . . . . . . . . . . .
機能アイコン、製品アイコン、プラットフォーム アイコン .
準拠アイコン . . . . . . . . . . . . . .
構文の表記 . . . . . . . . . . . . . . . .
パスに含まれる要素 . . . . . . . . . . . .
構文ダイヤグラムの読み方 . . . . . . . . . .
サンプルコードの表記 . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
序 7
序 8
序 9
序 9
序 10
序 11
序 11
序 12
序 14
序 15
関連マニュアル . . . . . . . . . . . . .
オンライン マニュアル . . . . . . . . . .
ペーパー マニュアル . . . . . . . . . .
エラーメッセージファイル . . . . . . . .
ドキュメントノート、リリースノート、マシンノート
参考文献 . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
序
序
序
序
序
序
業界標準への準拠
. .
. .
. . .
. . .
.
.
.
.
.
.
. . .
.
.
.
.
.
.
.
.
.
.
.
.
. . .
16
16
17
17
18
19
. . 序 20
序
2 Informix Guide to SQL:Syntax
このマニュアルで提供する情報の概要と、使用されている表記上のきまりについて
は、この序を読んでください。
このマニュアルについて
このマニュアルは、
『Informix Guide to SQL: Reference』
、
『Informix Guide to SQL:
、および『Informix Guide to Database Design and Implementation』の姉妹編です。
Tutorial』
このマニュアルには、構造化問合せ言語 (SQL) 文およびストアド プロシジャ言語
『Informix Guide to Database
(SPL) 文のための構文の説明がすべて含まれています。
Design and Implementation』では、リレーショナル データベースの背後にある設計思
想と概念を説明しています。
『Informix Guide to SQL: Reference』では、SQL 文以外で
SQL に関わるレファレンス情報が提供されます。『Informix Guide to Database Design
and Implementation』には、入門的な例だけでなく、SQL のさまざまな面について詳
しい説明があります。
対象ユーザ
このマニュアルは次のユーザを対象にして書かれています。
■
データベース アプリケーション プログラマ
■
データベース管理者
■
データベース ユーザ
序 3
ソフトウェアの要件
このマニュアルでは、読者に次の知識と経験があるものと想定しています。
■
リレーショナル データベースを使用して作業した経験またはデータベース
概念の理解
■
コンピュータ プログラミングの経験
リレーショナル データベース、SQL、またはオペレーティング システムに関する経
験が豊富でない場合、それを補うためのマニュアルの一覧については、使用してい
るデータベース サーバの『Getting Started』マニュアルを参照してください。
ソフトウェアの要件
このマニュアルでは、データベース サーバとして、次の製品のどれかを使用してい
ることを前提としています。
■
Informix Dynamic Server, バージョン 7.3
■
Dynamic Server with AD and XP Options, バージョン 8.2
■
Informix Dynamic Server, Developer Edition, バージョン 7.3
■
Informix Dynamic Server, Workgroup Edition, バージョン 7.3
使用するロケール
Informix 製品は多くの言語、文化およびコード セットをサポートできます。文化の
違いに基づくすべての情報は、GLS ( 広域言語サポート ) ロケールという単一環境
にまとめられています。
このマニュアルでは、ユーザがデフォルト ロケールの en_us.8859-1 を使用すると想
定しています。このロケールは、日付、時刻、通貨の形式として米国英語形式をサ
ポートします。また、このロケールは、ASCII コード セットと多くの 8 ビット文字
(é、è、ñ など ) を含む ISO 8859-1 コード セットもサポートします。
データまたは SQL 識別子でデフォルト以外の文字を使用する場合や、文字データに
ついてデフォルト以外の照合規則に従う場合は、デフォルト以外の適切なロケール
を指定する必要があります。
デフォルト以外のロケールや追加の構文など、GLS ロケール関連事項の指定方法に
ついては、
『Informix Guide to GLS Functionality』を参照してください。
序
4 Informix Guide to SQL:Syntax
デモンストレーションデータベース
デモンストレーションデータベース
お手持ちのデータベース サーバ製品に付随する DB-Access ユーティリティには、架
空のスポーツ用品卸売業者についての情報が入っている stores7 というデモンスト
レーション データベースが含まれています。DB-Access とともに提供される SQL ス
クリプトを使用して sales_demo という第 2 のデータベースを導出することができま
す。このデータベースでは、データ ウェアハウジング アプリケーションの次元ス
キーマを説明しています。これらのデータベースの構築のためのサンプル コマンド
ファイルも含まれています。
Informix マニュアル内の多くの例は、デモンストレーションデータベース stores7 を
基にしています。データベース stores7 の詳細説明や内容の一覧は『Informix Guide
to SQL: Reference』にあります。
デモンストレーション データベースのインストールに使用するスクリプトは、
UNIX プラットフォームの場合はディレクトリ $INFORMIXDIR/bin にあり、
Windows NT プラットフォームの場合はディレクトリ %INFORMIXDIR%¥bin にあり
ます。デモンストレーション データベース stores7 の構築方法の詳しい説明につい
ては、
『DB-Access User Manual』を参照してください。データベース sales_demo の
構築方法の説明については、
『Informix Guide to Database Design and Implementation』
を参照してください。
新機能
以降の項では、このマニュアルに関連する新しいデータベース サーバ機能について
説明します。新機能を網羅した一覧表については、使用しているデータベース サー
バのリリース ノートを参照してください。
バージョン 7.3 の新機能
Informix Dynamic Server バージョン 7.3 の新機能は、そのほとんどが次の 5 つの分野
に大別されます。
■
信頼性、可用性、および保守性
■
パフォーマンス
序 5
バージョン 7.3 の新機能
■
Windows NT 固有機能
■
アプリケーションの移行
■
管理容易性
追加された機能の中には、接続、レプリケーション、および光ディスク記憶サブシ
ステムに影響を与えるものがあります。
このマニュアルには、次の新機能についての情報が含まれています。
■
■
序
パフォーマンス
❑
最初の n 行の選択を可能とする SELECT 文への機能追加
❑
新しい文 : SET Residency
❑
SET OPTIMIZATION 文への機能追加
❑
オプティマイザ ディレクティブ向けの新しい構文
アプリケーションの移行
❑
大文字と小文字の意識して検索するための新機能 (UPPER、LOWER、
INITCAP)
❑
文字列操作のための新関数 (REPLACE、SUBSTR、LPAD、RPAD)
❑
新しい CASE 式
❑
新しい NVL 関数と DECODE 関数
❑
新しい日付変換関数 (TO_CHAR と TO_DATE)
❑
DBINFO 関数向けの新しいオプション
❑
CREATE VIEW 文、DESCRIBE 文、および EXECUTE PROCEDURE 文
への機能追加
6 Informix Guide to SQL:Syntax
バージョン 8.2 の新機能
バージョン 8.2 の新機能
次の新機能が Dynamic Server with AD and XP Options のバージョン 8.2 で実装されま
した。このマニュアルでは、その新機能について説明します。
■
表データのフラグメント化の機能強化
■
問合せスケジューリングのサポート
■
データウェアハウジング アプリケーションをサポートするためのインデッ
クスの機能強化
■
広域言語サポート (GLS)
■
新しい集計関数 : 標準偏差、範囲、分散
■
オプティマイザ報告書の機能強化
■
CREATE VIEW 文への機能追加
次の機能は Dynamic Server with AD and XP Options のバージョン 8.1 で導入済みです。
このマニュアルでは、その機能についても説明します。
■
複数のコンピュータ間で使用するための新しい結合方法
■
構造化問合せ言語 (SQL) 文の一部に CASE 式
■
ログなし表
■
ハイパフォーマンスのロードとアンロードのための外部表
マニュアル表記上のきまり
ここでは、このマニュアルで使用する表記上のきまりを説明します。この表記上の
きまりを覚えておくと、このマニュアルや他の Informix マニュアルでの情報が探し
やすくなります。
以下の表記について説明しています。
■
文字の表記
■
アイコンの表記
■
構文の表記
■
サンプルコードの表記
序 7
文字の表記
文字の表記
このマニュアルでは、新しい用語の紹介、画面表示の図示、コマンドの構文の記述
などに、以下の標準的な表記を使用しています。
表記
意味
computer
製品が表示する情報とユーザが入力する情報は、サンセリフ
フォントで示します。
KEYWORD
キーワードはすべてセリフフォントの大文字で示します。
♦
この記号は、製品、プラットフォームまたは標準準拠に固有
の情報の終わりを示します。
➞
この記号はメニュー項目を示します。たとえば、
「Tools →
Options を選択してください」は、Tools メニューの Options 項
目を選択することを意味します。
ヒント : 文字を「入力する」またはコマンドを「実行する」ように指示されたとき
は、入力したらすぐに Return キーを押してください。テキストを「タイプする」ま
たは他のキーを「押す」ように指示されたときは、Return キーを押す必要はありま
せん。
序
8 Informix Guide to SQL:Syntax
アイコンの表記
アイコンの表記
このマニュアルには、いろいろなアイコンを伴ったテキストがあります。ここで
は、これらのアイコンについて説明します。
コメントアイコン
コメントアイコンは、警告、重要な情報、またはヒントを示します。この情報は常
にゴシックで表示されます。
アイコン
説明
警告アイコンは、重要な指示、注意、情報を示します。
重要アイコンは、説明されている機能や操作に関する重
要な情報を示します。
ヒントアイコンは、説明されている機能に関する、追加
情報や省略方法を示します。
序 9
アイコンの表記
機能アイコン、製品アイコン、プラットフォーム アイコン
機能アイコン、製品アイコン、およびプラットフォーム アイコンは、それぞれ、機
能固有の情報、製品固有の情報、プラットフォーム固有の情報を説明しているパラ
グラフを示します。
アイコン
AD/XP
DB-Access にだけ有効な情報を示します。
E/C
INFORMIX-ESQL/C にだけ有効な情報を示します。
IDS
UNIX
SQLE
W/D
WIN NT
10
Informix Dynamic Server with Advanced Decision Support and
Extended Parallel Options にだけ有効な情報を示します。
DB
GLS
序
説明
Informix Guide to SQL:Syntax
Informix 広域言語サポート (GLS) 機能に関連する情報を
示します。
各種の Dynamic Server にだけ有効な情報を示します。こ
のアイコンが表示された項は、Informix Dynamic Server に
だけ適用され、Informix Dynamic Server Workgroup Edition
と Developer Edition には適用されない場合もあります。そ
のような情報は明確に識別されます。
UNIX プラットフォームにだけ有効な情報を示します。
Informix Dynamic Server に対する Informix Enterprise
Command Center のコンポーネントの SQL エディタにだけ
有効な情報を示します。
Informix Dynamic Server Workgroup Edition と Developer
Edition にだけ有効な情報を示します。
Windows NT 環境にだけ有効な情報を示します。
構文の表記
これらのアイコンは、表内の行や、1 つまたは複数のパラグラフ、あるいは項全体
に適用されます。あるアイコンが項の見出しの隣に表示されている場合、示されて
いる機能、製品、またはプラットフォームに当てはまる情報は、それ以後の見出し
のうち、そのアイコンの付いた見出しと同じレベルまたはそれ以上のレベルの見出
しで終わりになります。記号 ♦ は、機能固有の情報や、製品固有の情報、または
プラットフォーム固有の情報が表内の行または項内のパラグラフ群に現れる場合
に、その情報の終わりを示します。
準拠アイコン
準拠アイコンは、標準に準拠するための指針となるパラグラフを示します。
アイコン
ANSI
+
X/O
説明
ANSI 標準準拠のデータベースに固有の情報を示します。
ANSI SQL-92 エントリレベルの標準 SQL に対する
Informix の拡張機能に関する情報を示します。
X/Open に準拠する機能を指します。この機能は、SQL API
を -xopen フラグでコンパイルしていれば使用できます。
これらのアイコンは、表内の行や、1 つまたは複数のパラグラフ、あるいは項全体
に適用されます。あるアイコンが項の見出しの隣に表示されている場合、準拠の情
報は、それ以後の見出しのうち、そのアイコンの付いた見出しと同じレベルまたは
それ以上のレベルの見出しで終わりになります。記号 ♦ は、準拠の情報が表内の
行または項内のパラグラフ群に現れる場合に、その情報の終わりを示します。 ♦
構文の表記
ここでは、構文ダイヤグラムに関するきまりを説明します。各ダイヤグラムでは、
所定の文またはセグメントで有効な、キーワード、語句、シンボルの必須部分とオ
プション部分を示しています。図 1 にその例を示しています。
序
11
構文の表記
図1
単純な構文ダイヤグラムの例
SET EXPLAIN
ON
OFF
構文ダイヤグラムは、左上から始まり、右上の縦線で終了します。開始と終了の間
では、停止したり後戻りしたりしない限り、どのパスでもとることができ、その文
の可能な形式が記述されます。
パス内の構文の要素は、文に記述することのできる用語、キーワード、シンボルや
セグメントを表しています。ループ内の分離記号以外は、パスは常に左から右に進
みます。ループ内の分離記号の場合は、パスは右から左回りに進みます。注釈が付
けられていない限り、少なくとも一つの空白文字で構文の要素を区切ります。
パスに含まれる要素
パスには、次の要素が少なくとも一つ使用されています。
要素
説明
KEYWORD
すべて大文字の語はキーワードです。示されたとお
りに入力してください。大文字と小文字のどちらを
使っても構いません。
(.,;@+*-/)
句読点と算術記号は、示されているとおりに入力し
てください。
''
引用符は、示されているとおりに入力してください。
< 変数 >
< > 内の語は、データベース名、ファイル名、プログ
ラム名など、値を与える必要がある変数を表します。
ダイヤグラムの後の表に、この値についての説明が
あります。
ADD 節
1-14 ページ
ADD 節
四角の枠で囲まれた語はサブダイヤグラムです。サ
ブダイヤグラムはこの時点でメイン ダイヤグラムと
合流します。ページ番号が指定されていない場合、
サブダイヤグラムは同一ページに現れます。
(1/3)
序
12
Informix Guide to SQL:Syntax
構文の表記
要素
説明
ADD 節へ戻る
1-14 ページ
E/C
右上隅のサブダイアグラムは、このサブダイアグラ
ムと同じ種類の次の高いレベルのダイアグラムを参
照します。
アイコンは、このパスがある製品でだけ、またはあ
る条件でだけ有効であることを示す警告です。アイ
コン上の文字は、そのパスをサポートする製品や条
件を示しています。
構文ダイヤグラムには以下のアイコンが出てきます。
ALL
DB
このパスは DB-Access にだけ有効です。
E/C
このパスは INFORMIX-ESQL/C にだけ
有効です。
SPL
このパスは Informix ストアドプロシジャ
言語 (SPL) を使用している場合にだけ有
効です。
+
このパスは ANSI SQL-92 エントリレベル
の標準 SQL に対する Informix の拡張機
能です。Informix 拡張機能の検査を開始
した場合、この構文分岐が含まれている
と警告が出されます。コンパイル時に環
境変数 DBANSIWARN を設定するか、
またはコンパイル フラグ -ansi を使用す
ると、コンパイル時に警告が出されま
す。実行時に DBANSIWARN を設定す
るか、-ansi フラグでコンパイルすると、
警告フラグが sqlwarn 構造体に設定され
ます。Informix の拡張機能の警告は厳し
目に出されます。構文パスが ANSI 標準
に準拠している場合でも、警告が出され
ることがあります。
GLS
このパスはデータベースやアプリケーショ
ンが GLS 準拠の場合にだけ有効です。
網掛けのオプションはデフォルトの動作です。
(2/3)
序
13
構文の表記
要素
説明
2 本の矢印に挟まれた構文は、サブダイヤグラムであ
ることを示しています。
縦線は構文ダイヤグラムを終了させます。
IS
NULL
NOT
NOT FOUND
ERROR
メインラインの下の分岐ラインは、オプションを示
しています ( 分岐して迂回できない場合は、メイン
パス上に条件を補う必要があります )。
異なるパスが 3 つ以上のある場合は、多数の分岐ラ
インで示されます。
WARNING
,
ループは繰り返すことのできるパスを示しています。
この例に示すようなループ上の句読点は、リストの
ための分離記号を示しています。記号がない場合は、
空白が分離記号になります。
< 変数 >
<文>
,
3
< サイズ >
パス上のゲート ( 3 ) は、たとえそのパスが大きな
ループ内にある場合でも示された回数しか使用でき
ないことを表します。この例では、サイズを指定で
きるのは 3 回までです。
(3/3)
構文ダイヤグラムの読み方
図 2 に、前出の表で示したパス要素のほとんどが使われている構文ダイヤグラムを
示します。
図2
構文ダイヤグラムの要素
DELETE FROM
<表>
< ビュー >
< シノニム >
条件
4-6 ページ
WHERE
E/C
CURRENT OF
序
14
Informix Guide to SQL:Syntax
< カーソル >
サンプルコードの表記
このダイヤグラムで文を組み立てるには、左上のキーワード DELETE FROM から始
めます。必要なオプションを経由しながらダイヤグラムを右に向かってたどります。
DELETE 文を構築するには
1.
DELETE FROM とタイプします。
2.
表、ビュー、シノニムを削除できます。
3.
■
ダイヤグラムに従って、表名、ビュー名、あるいはシノニムのうち、
望みのものをタイプします。
■
削除する行を制限するために、キーワード WHERE とタイプしなけれ
ばなりません。
■
DB-Access または SQL エディタを使用している場合には、Condition 節
を含めて削除する条件を指定しなければなりません。条件を削除する
ための構文を見つけるには、1-803 ページの「条件」セグメントに進
みます。
■
ESQL/C または SPL を使用している場合には、特定の条件を削除する
ための Condition 節または表から行を削除するための CURRENT OF <
カーソル名 > 節のどちらかを含めることができます。
ダイヤグラムに従って、終端記号に達します。これで DELETE 文が完結し
ます。
サンプルコードの表記
このマニュアルでは、SQL コードを使用した例が多数示されています。特に明記さ
れている場合を除き、このコードはほとんどの Informix アプリケーション開発支援
ツールに対応しています。SQL 文のリストだけが例示されている場合、文の区切り
にセミコロン (;) は使用されていません。たとえば、次の例のようなコードになっ
ています。
CONNECT TO stores7
...
DELETE FROM customer
WHERE customer_num = 121
...
COMMIT WORK
DISCONNECT CURRENT
序
15
関連マニュアル
この SQL コードを特定の製品に使用するには、その製品の構文規則を適用しなけれ
ばなりません。たとえば、DB-Access の問合せ言語オプションを使用している場合
には、複数の文をセミコロンで区切らなければなりません。ESQL/C を使用してい
る場合には、それぞれの文の始めに EXEC SQL を、文の終わりにセミコロン ( また
は他の適切な区切り記号 ) を使用しなければなりません。
ヒント : コード例に現われる省略のドットは、完全なアプリケーションではもっと
多くのコードが追加されることを示しますが、そのコードはここでの説明には必要
がないものです。
特定の製品用に SQL 文を使用する場合、その詳細については、ご使用の製品のマ
ニュアルを参照してください。
関連マニュアル
ここでは、次のマニュアルセットについて説明します。
■
オンラインマニュアル
■
ペーパーマニュアル
■
エラーメッセージファイル
■
ドキュメントノート、リリースノート、マシンノート
■
参考文献
オンライン マニュアル
Informix 製品には、ペーパー マニュアルを電子化したオンライン マニュアルの CD
が付属しています。このオンライン マニュアルはインストールすることも、CD か
ら直接読み取ることもできます。オンライン マニュアルのインストール、読取り、
印刷についての詳細は、Answers OnLine に添付されているインストール説明書を参
照してください。
序
16
Informix Guide to SQL:Syntax
ペーパー マニュアル
ペーパー マニュアル
Informix Dynamic Server マニュアル セットでは、Informix Dynamic Server、その SQL
の実装、およびその関連するアプリケーション プログラミング インターフェイス
について説明しています。さらに、Informix Dynamic Server キットには、各キット
の各種コンポーネントをサポートするマニュアルが含まれています。
Informix Dynamic Server マニュアル セットの各マニュアルと Informix Dynamic Server
キットのマニュアルの概要については、
『Getting Started with Informix Dynamic
Server』を参照してください。
エラーメッセージファイル
Informix ソフトウェア製品では、すべての Informix エラーメッセージとその対処方
法が書き込まれたテキストファイルが提供されています。エラーメッセージについ
ての説明は、Answers OnLine の『Informix Error Messages』を参照してください。
UNIX
UNIX でエラー メッセージを読むには、次のコマンドを使用します。
コマンド
説明
finderr
オンラインでエラー メッセージを表示します。
rofferr
印刷のためにエラー メッセージの整形処理を行います。
♦
WIN NT
Windows NT でエラー メッセージと対処方法を読むには、Informix Find Error ユー
ティリティを使用します。このユーティリティを表示するには、タスク バーから
[ スタート ] ➞ [ プログラム ] ➞ [Informix] を選択してください。 ♦
序
17
ドキュメントノート、リリースノート、マシンノート
ドキュメントノート、リリースノート、マシンノート
ペーパー マニュアルのほかに、次の項では、このマニュアルの補足情報を提供する
オンライン ファイルについて説明しています。データベース サーバを使い始める
前に、これらのファイルを参照してください。これらのファイルには、アプリケー
ションとパフォーマンスに関する重要な情報が含まれています。
UNIX
UNIX プラットフォームでは、以下のオンライン ファイルはディレクトリ
$INFORMIXDIR/release/en_us/0333 にあります。
オンラインファ
イル
SQLSDOC_x.y
このマニュアルのバージョン用のドキュメント ノート ファイ
ルでは、このマニュアルに記載されていない機能、またはこ
のマニュアルの発行後に変更された機能について説明してい
ます。ファイル名に付いている x.y をご使用のデータベース
サーバのバージョン番号に置き換えると、このマニュアルの
ドキュメント ノート ファイルの名前になります。
SERVERS_x.y
リリース ノート ファイルは、以前のバージョンの Informix 製
品との違い、およびこの違いが現在の製品に与える影響につ
いて説明しています。このファイルには、すでにわかってい
る問題やその対処方法についての情報も含まれています。
ファイル名に付いている x.y をご使用のデータベース サーバの
バージョン番号に置き換えると、このマニュアルのリリース
ノート ファイルの名前になります。
IDS_x.y
マシン ノート ファイルは、コンピュータにインストールされ
ている Informix 製品の構成、および使用に必要な特殊操作につ
いて説明しています。マシン ノートには、製品と同じ名前が
付いています。ファイル名に付いている x.y をご使用のデータ
ベース サーバのバージョン番号に置き換えると、このマニュ
アルのマシン ノート ファイルの名前になります。
♦
序
18
用途
Informix Guide to SQL:Syntax
参考文献
WIN NT
Informix フォルダには、次の項目があります。このフォルダを表示するには、タス
ク バーから [ スタート ] ➞ [ プログラム ] ➞ [Informix] を選択してください。
項目
説明
ドキュメント ノート
この項目には、マニュアルに対する追加事項や修正事
項が含まれており、さらにマニュアルに記載されてい
ない機能や、マニュアルの発行後に変更された機能に
関する情報も含まれています。
リリース ノート
この項目は、旧バージョンの Informix 製品との機能上
の違い、およびこの違いが現バージョンに与える影響
について説明しています。このファイルでは、すでに
わかっている問題とその対処方法も示しています。
Windows NT プラットフォームでは、マシンノートに相当するものはありません。 ♦
参考文献
次に示す各出版物には、このマニュアルで記述しているトピックについてさらに詳
しい説明があります。データベース サーバとオペレーティング システム プラット
フォームを紹介している出版物の一覧については、
『Getting Started』マニュアルを
参照してください。
■
『A Guide to the SQL Standard』C. J. Date、H. Darwen 共著 (Addison-Wesley
Publishing、1993 年 )
■
『Understanding the New SQL: A Complete Guide』J. Melton、A. Simon 共著
(Morgan Kaufmann Publishers、1993 年 )
■
『Using SQL』J. Groff、P. Weinberg 共著 (Osborne McGraw-Hill、1990 年 )
序
19
業界標準への準拠
業界標準への準拠
米国規格協会 (ANSI) によって、SQL に関する業界標準が定められていま
す。Informix の SQL ベースの製品は、SQL-92 エントリレベル (ANSI X3.135-1992 と
して公開 ) に完全に準拠しています。この標準は、INFORMIX-Universal Server が準
拠する ISO 9075:1992 と全く同じものです。また、OnLine の数々の機能も、SQL-92
の暫定レベルや完全レベル、および X/Open SQL CAE( 共通アプリケーション環境 )
標準に準拠しています。
序
20
Informix Guide to SQL:Syntax
第1章
SQL 構文の概要
SQL 文の入力方法
. .
. .
. . .
. . .
. . .
. . .
. .
1-3
SQL コメントの入力方法
. .
. . .
. . .
. . .
. . .
. .
1-6
SQL 文のカテゴリ . . . .
ストアドプロシジャ文 . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. .
. .
1-9
1-11
ANSI 標準準拠と機能拡張 . .
. . .
. . .
. . .
. . .
. .
1-12
1-2
Informix Guide to SQL:Syntax
この章では、SQL 文、SPL 文、およびこのマニュアルの後の章で説明するセグメン
トの使用方法について説明します。次の節で構成されています。
節
開始ページ
範囲
「SQL 文の入力方法」 1-3
この節では、文の説明を使用して正し
く SQL 文を入力する方法を示します。
「SQL コメントの入
力方法」
1-6
この節では、SQL コメントを入力する
方法を示します。
「SQL 文のカテゴリ」 1-9
この節に機能カテゴリごとの SQL 文の
一覧があります。
「ANSI 標準準拠と機
能拡張」
この節には、ANSI 標準準拠の程度ごと
の SQL 文の一覧があります。
1-12
SQL 文の入力方法
このマニュアルで文について説明する目的は、ユーザが正常に SQL 文を入力でき
るようにすることです。各文の説明には次の情報が含まれます。
■
文の目的の簡単な説明
■
正しい文の入力方法を示す構文ダイヤグラム
■
構文ダイヤグラム内のそれぞれの入力パラメータを説明する構文表
■
使用規則とそれらの規則を説明するための例
SQL 構文の概要
1-3
SQL 文の入力方法
文が複数の節で構成されている場合は、文の説明ではそれぞれの節ごとに同じ情報
セットが提供されます。
それぞれの文の説明の終わりに、このマニュアルや他のマニュアルに掲載されてい
る関連情報を紹介します。
SQL 文を正常に入力する方法を説明する主な手段として、次のものが含まれます。
■
構文ダイヤグラムと構文表の組合わせ
■
使用規則で示される構文例
■
関連情報への参照
構文ダイヤグラムと構文表の使用
この章の構文ダイヤグラムを使用する前に、序 11 ページ「構文の表記」を読んで
おくと役に立ちます。この節は、文を説明する構文ダイヤグラムを理解するための
キーとなります。
「構文の表記」では、構文ダイヤグラムで使用される要素と要素同士を互いに接続
するパスについて説明します。すべての構文ダイヤグラムで使用される主な要素を
説明する、サンプル構文ダイヤグラムも示します。サンプルダイヤグラムに沿っ
て、文を正常に入力するためのダイヤグラムの読解方法を示します。
文の説明中の構文ダイヤグラムに入力パラメータがある場合、構文ダイヤグラムの
後に構文表を示し、エラーを発生させずにパラメータを入力する方法を示します。
各構文表には次の列があります。
1-4
■
構文ダイヤグラムに示される各パラメータ名をリストした要素列。
■
パラメータの目的を簡単に述べた目的列。パラメータにデフォルト値があ
ればこの列に示されます。
■
受入れ可能な値の範囲など、パラメータの制限を要約した制限列。
■
パラメータの詳しい構文を説明する SQL セグメントを示す構文列。
Informix Guide to SQL:Syntax
SQL 文の入力方法
使用例
文のメイン構文ダイヤグラムとサブ構文ダイヤグラムを理解するために、各文の使
用規則で示される構文例を読んでください。これらの例には、次の二つの目的があ
ります。
■
文や節を使用して個々のタスクを実現する方法を示す。
■
文や節の構文の使用方法を具体的に示す。
ヒント : 効果的に構文ダイヤグラムを理解するには、構文例を探し、構文ダイヤグ
ラムのキーワードやパラメータと比較することです。例で使用している具体的な要
素を構文ダイヤグラムの抽象的な要素にマップすることにより、構文ダイヤグラム
を理解し、より効果的に使うことができます。
このマニュアルの例で使用している規約の説明については、序 15 ページ「サンプ
ルコードの表記」を参照してください。
参照の使用
SQL 文の説明の概念や用語を理解するために、説明の最後にある「参照」節を
チェックしてください。
「参照」節では、対象となっている文を理解するために役立つ、このマニュアルや
他のマニュアルの関連情報を示します。この節では、次の情報の一部または全部を
提供します。
■
この文のトピックの詳しい説明に含まれる、関連する文の名前
■
この文のトピックの詳しい説明が記載されている他のマニュアル名
■
この文のトピックのタスクを主体とした説明が記載されている『Informix
Guide to SQL: Tutorial』の章
ヒント : SQL について詳しい知識と経験をお持ちでない場合、
『Informix Guide to
SQL: Tutorial』を読むと、このマニュアルの文の説明を理解し、使用するのに必要
な SQL の基本的な知識を得ることができます。
SQL 構文の概要
1-5
SQL コメントの入力方法
SQL コメントの入力方法
個々の SQL 文の目的や効果を明確にするためにコメントを追加できます。コメン
トは、コメントを付けたユーザ自身や他のユーザが、プログラム、ストアドプロシ
ジャおよびコマンドファイル内でのその文のロールを理解するために役立ちます。
このマニュアルのコード例では、コード内での SQL 文のロールを明確にするため
にコメントが付けられていることがあります。
次の表は、コードで入力できる SQL コメントシンボルを示しています。列中の Y
は、そのシンボルを列見出しに示した製品またはデータベースタイプで使用できる
ことを表します。列中の N は、そのシンボルを列見出しに示した製品またはデータ
ベースタイプでは使用できないことを表します。
コメント
シンボル
ESQL/C
二重
ハイフン
(--)
中かっこ
({})
1-6
ストアド
プロシジャ
(SPL)
DB-Access
ANSI 標
準準拠の
データ
ベース
ANSI 標
準準拠で
ないデー
タベース
説明
Y
Y
Y
Y
Y
コメントの前に二重ハイフン
を付けます。二重ハイフンは
一行だけをコメントにできま
す。複数行をコメントにする
場合は、各行の最初に二重ハ
イフンを付けなければなりま
せん。
N
Y
Y
Y
Y
中かっこでコメントを囲みま
す。コメントの前に {、後ろ
に } を付けます。中かっこは
一行でも複数行でもコメント
にできます。
Informix Guide to SQL:Syntax
SQL コメントの入力方法
ご使用の製品が両方のコメントシンボルの使用をサポートしている場合、コメント
シンボルの選択は ANSI 標準準拠の要件に依存します。
■
二重ハイフン (--) は ANSI SQL 標準に準拠します。
■
中かっこ ({}) は ANSI 標準からみて Informix 拡張機能です。
ANSI 標準準拠が問題でない場合、コメントシンボルの選択は個人の好みの問題です。
DB
SPL
E/C
DB-Access で SQL エディタを使用して SQL 文を入力する場合、または SQL エディ
タかシステムエディタを使用して SQL コマンドファイルを作成する場合、どちらの
コメントシンボルでも使用できます。SQL コマンドファイルは、一つあるいは複数
の SQL 文を含むオペレーティングシステムファイルです。コマンドファイルはコマ
ンドスクリプトとも言います。コマンドファイルについての詳細は『Informix Guide
to SQL: Tutorial』のコマンドスクリプトの説明を参照してください。SQL エディタま
たは DB-Access のシステムエディタを使用して、SQL コマンドファイルを作成およ
び修正する方法については、
『DB-Access User Manual』を参照してください。
ストアド プロシジャのすべての行では、どちらのコメント シンボルでも使用でき
ます。詳細は、2-139 ページの「プロシジャへのコメントの追加」を参照してくだ
さい。また、
『Informix Guide to SQL: Tutorial』のプロシジャのコメント化とドキュ
メント化についての説明も参照してください。♦
ESQL/C では、SQL 文のコメントに二重ハイフン (--) を使用できます。ESQL/C プ
ログラムでの SQL コメント シンボルと言語固有のコメント シンボルの使用につい
ての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。 ♦
SQL コメントシンボルの例
次に示すいくつかの簡単な例は、SQL コメントシンボルのいろいろな使用方法を説
明するのに役に立ちます。
二重ハイフンシンボルの例
次の例は、SQL 文にコメントを付けるための二重ハイフン (--) の使用法を示してい
ます。この例では、文と同じ行にコメントを記述しています。
SELECT * FROM customer -- Selects all columns and rows
次の例では、先程の例と同じ SQL 文と同じコメントを入力していますが、コメン
トはコメントだけで一行に記述しています。
SELECT * FROM customer
-- Selects all columns and rows
SQL 構文の概要
1-7
SQL コメントの入力方法
次の例では、先程の例と同じ SQL 文を入力していますが、複数行のコメントを入
力しています。
SELECT * FROM customer
-- Selects all columns and rows
-- from the customer table
DB
SPL
中かっこシンボルの例
次の例は、SQL 文にコメントを付けるための中かっこ ({}) の使用法を示していま
す。この例では、文と同じ行にコメントを記述しています。
SELECT * FROM customer {Selects all columns and rows}
次の例では、先程の例と同じ SQL 文と同じコメントを入力していますが、コメン
トはコメントだけで一行に記述しています。
SELECT * FROM customer
{Selects all columns and rows}
次の例では、先程の例と同じ SQL 文を入力していますが、複数行のコメントを入
力しています。
SELECT * FROM customer
{Selects all columns and rows
from the customer table}
GLS
SQL コメントでの非 ASCII 文字
ご使用のローケルが非 ASCII 文字のコードセットをサポートしている場合、SQL コ
メントに ( マルチバイト文字を含めた ) 非 ASCII 文字を入力できます。SQL コメン
トの GLS についての詳細は、
『Informix Guide to GLS Functionality』を参照してくだ
さい。
1-8
Informix Guide to SQL:Syntax
SQL 文のカテゴリ
SQL 文のカテゴリ
SQL 文は次のカテゴリに分けられます。
■
データ定義文
■
データ操作文
■
カーソル接続文
■
カーソル最適化文
■
動的管理文
■
データアクセス文
■
データ整合性文
■
最適化文
■
ストアドプロシジャ文
■
補助文
■
クライアント / サーバの接続文
■
光ディスク記憶サブシステム文
それぞれのカテゴリに含まれる文は次のとおりです。
データ定義文
ALTER FRAGMENT
ALTER INDEX
ALTER TABLE
CLOSE DATABASE
CREATE DATABASE
CREATE EXTERNAL TABLE
CREATE INDEX
CREATE PROCEDURE
CREATE PROCEDURE FROM
CREATE ROLEdCREATE SCHEMA
CREATE SYNONYM
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DATABASE
DROP DATABASE
DROP INDEX
DROP PROCEDURE
DROP ROLE
DROP SYNONYM
DROP TABLE
DROP TRIGGER
DROP VIEW
RENAME COLUMN
RENAME DATABASE
RENAME TABLE
SQL 構文の概要
1-9
SQL 文のカテゴリ
データ操作文
DELETE
INSERT
LOAD
SELECT
UNLOAD
UPDATE
カーソル操作文
CLOSE
DECLARE
FETCH
FLUSH
FREE
OPEN
PUT
SET AUTOFREE
カーソル最適化文
SET AUTOFREE
SET DEFERRED_PREPARE
動的管理文
ALLOCATE DESCRIPTOR
DEALLOCATE DESCRIPTOR
DESCRIBE
EXECUTE
EXECUTE IMMEDIATE
FREE
GET DESCRIPTOR
PREPARE
SET DEFERRED_PREPARE
SET DESCRIPTOR
データアクセス文
GRANT
GRANT FRAGMENT
LOCK TABLE
REVOKE
REVOKE FRAGMENT
1-10
Informix Guide to SQL:Syntax
SET ISOLATION
SET LOCK MODE
SET ROLE
SET SESSION AUTHORIZATION
SET TRANSACTION
UNLOCK TABLE
ストアドプロシジャ文
データ整合性文
BEGIN WORK
COMMIT WORK
ROLLBACK WORK
SET Database Object Mode
SET LOG
SET PLOAD FILE
SET Transaction Mode
START VIOLATIONS TABLE
STOP VIOLATIONS TABLE
最適化文
SET EXPLAIN
SET OPTIMIZATION
SET PDQPRIORITY
SET Residency
SET SCHEDULE LEVEL
UPDATE STATISTICS
ストアドプロシジャ文
EXECUTE PROCEDURE
SET DEBUG FILE TO
補助文
INFO
OUTPUT
GET DIAGNOSTICS
WHENEVER
クライアント / サーバの接続文
CONNECT
DISCONNECT
IDS
SET CONNECTION
光ディスク記憶サブシステム文
ALTER OPTICAL CLUSTER
CREATE OPTICAL CLUSTER
DROP OPTICAL CLUSTER
RELEASE
RESERVE
SET MOUNTING TIMEOUT
重要 : Optical Subsystem 文については、
『Guide to the Optical Subsystem』を参照
してください。Optical Subsystem 文は、Dynamic Server、Workgroup Edition と
Developer Edition では使用できません。
SQL 構文の概要 1-11
ANSI 標準準拠と機能拡張
ANSI 標準準拠と機能拡張
以下に、ANSI SQL-92 標準にエントリレベルで準拠している文、ANSI 標準に準拠
しているが Informix 機能拡張がある文、および ANSI 標準から見て Informix 機能拡
張である文の一覧を示します。
ANSI 標準準拠文
CLOSE
COMMIT WORK
ROLLBACK WORK
SET SESSION AUTHORIZATION
SET TRANSACTION
Informix 機能拡張のある ANSI 標準準拠文
CREATE SCHEMA AUTHORIZATION
CREATE TABLE
CREATE VIEW
DECLARE
DELETE
EXECUTE
FETCH
1-12
Informix Guide to SQL:Syntax
GRANT
INSERT
OPEN
SELECT
SET CONNECTION
UPDATE
WHENEVER
ANSI 標準準拠と機能拡張
ANSI 標準から見て機能拡張である文
ALLOCATE COLLECTION
ALLOCATE DESCRIPTOR
ALLOCATE ROW
ALTER FRAGMENT
ALTER INDEX
ALTER OPTICAL CLUSTER
ALTER TABLE
BEGIN WORK
CLOSE DATABASE
CONNECT
CREATE CAST
CREATE DATABASE
CREATE DISTINCT TYPE
CREATE FUNCTION
CREATE FUNCTION FROM
CREATE INDEX
CREATE OPAQUE TYPE
CREATE OPCLASS
CREATE PROCEDURE
CREATE PROCEDURE FROM
CREATE ROLE
CREATE ROUTNE
CREATE ROUTINE FROM
CREATE ROW TYPE
CREATE SYNONYM
CREATE TRIGGER
DATABASE
DEALLOCATE COLLECTION
DEALLOCATE DESCRIPTOR
DEALLOCATE ROW
DESCRIBE
DISCONNECT
DROP CAST
DROP DATABASE
DROP FUNCTION
DROP INDEX
DROP OPCLASS
DROP PROCEDURE
DROP ROLE
DROP ROW TYPE
DROP SYNONYM
DROP TABLE
DROP TRIGGER
DROP TYPE
DROP VIEW
EXECUTE FUNCTION
EXECUTE IMMEDIATE
EXECUTE PROCEDURE
FLUSH
FREE
GET DESCRIPTOR
GET DIAGNOSTICS
GRANT FRAGMENT
INFO
LOAD
LOCK TABLE
OUTPUT
PREPARE
PUT
RENAME COLUMN
RENAME DATABASE
RENAME TABLE
REVOKE
REVOKE FRAGMENT
SET
SET DATASKIP
SET DEBUG FILE TO
SET DESCRIPTOR
SET EXPLAIN
SET ISOLATION
SET LOCK MODE
SET LOG
SET OPTIMIZATION
SET PDQPRIORITY
SET ROLE
START VIOLATIONS TABLE
STOP VIOLATIONS TABLE
UNLOAD
UNLOCK TABLE
UPDATE STATISTICS
SQL 構文の概要 1-13
第2章
SQL 文
ALLOCATE DESCRIPTOR 文 .
ALTER FRAGMENT 文 . . .
ALTER INDEX 文 . . . .
ALTER TABLE 文 . . . .
BEGIN WORK 文 . . . .
CLOSE 文. . . . . . .
CLOSE DATABASE 文 . . .
COMMIT WORK 文 . . . .
CONNECT 文 . . . . .
CREATE DATABASE 文 . .
CREATE EXTERNAL TABLE 文
CREATE INDEX 文 . . . .
CREATE PROCEDURE 文 . .
CREATE PROCEDURE FROM 文
CREATE ROLE 文 . . . .
CREATE SCHEMA 文 . . .
CREATE SYNONYM 文. . .
CREATE TABLE 文 . . . .
CREATE TRIGGER 文 . . .
CREATE VIEW 文 . . . .
DATABASE 文 . . . . .
DEALLOCATE DESCRIPTOR 文
DECLARE 文. . . . . .
DELETE 文 . . . . . .
DESCRIBE 文 . . . . . .
DISCONNECT 文 . . . .
DROP DATABASE 文 . . .
DROP INDEX 文 . . . . .
DROP PROCEDURE 文 . . .
DROP ROLE 文 . . . . .
DROP SYNONYM 文 . . .
DROP TABLE 文. . . . .
DROP TRIGGER 文 . . . .
DROP VIEW 文 . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. .
. .
. .
. .
. .
. .
. .
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
.
.
.
.
.
.
2-6
2-8
2-34
2-37
2-67
2-70
2-73
2-75
2-77
2-89
2-92
2-106
2-134
2-144
2-146
2-148
2-151
2-155
2-198
2-230
2-236
2-239
2-241
2-258
2-262
2-267
2-271
2-273
2-275
2-276
2-277
2-279
2-282
2-283
EXECUTE 文 . . . . . . .
EXECUTE IMMEDIATE 文 . . .
EXECUTE PROCEDURE 文 . . .
FETCH 文 . . . . . . . . . .
FLUSH 文 . . . . . . . .
FREE 文 . . . . . . . .
GET DESCRIPTOR 文 . . . .
GET DIAGNOSTICS 文 . . . .
GRANT 文 . . . . . . . .
GRANT FRAGMENT 文 . . . . .
INFO 文 . . . . . . . .
INSERT 文 . . . . . . . .
LOAD 文 . . . . . . . .
LOCK TABLE 文 . . . . . .
OPEN 文 . . . . . . . .
OUTPUT 文 . . . . . . .
PREPARE 文 . . . . . . . . .
PUT 文 . . . . . . . . .
RENAME COLUMN 文 . . . .
RENAME DATABASE 文 . . .
RENAME TABLE 文 . . . . .
REVOKE 文 . . . . . . .
REVOKE FRAGMENT 文 . . .
ROLLBACK WORK 文 . . . .
SELECT 文. . . . . . . .
SET AUTOFREE 文 . . . . .
SET CONNECTION 文 . . . .
SET Database Object Mode 文. . .
SET DATASKIP 文 . . . . .
SET DEBUG FILE TO 文 . . . .
SET DEFERRED_PREPARE 文 . .
SET DESCRIPTOR 文. . . . .
SET EXPLAIN 文 . . . . . .
SET ISOLATION 文 . . . . .
SET LOCK MODE 文 . . . . .
SET LOG 文 . . . . . . .
SET OPTIMIZATION 文 . . . .
SET PDQPRIORITY 文 . . . .
SET PLOAD FILE 文 . . . . .
SET Residency 文 . . . . . .
SET ROLE 文 . . . . . . .
SET SCHEDULE LEVEL 文 . . .
SET SESSION AUTHORIZATION 文
SET TRANSACTION 文 . . . .
2-2
Informix Guide to SQL:Syntax
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
. .
. . .
. .
. .
. .
. .
. .
. . .
. .
. .
. .
. .
. .
. .
. . .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . .
. . .
. . .
. . . .
. . .
. . .
. . .
. . .
. . .
. . . .
. . .
. . .
. . .
. . .
. . .
. . .
. . . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2-285
2-294
2-297
2-301
2-312
2-315
2-318
2-325
2-342
2-359
2-368
2-372
2-383
2-390
2-393
2-401
2-403
2-417
2-425
2-427
2-428
2-431
2-443
2-448
2-450
2-502
2-505
2-512
2-534
2-537
2-540
2-544
2-552
2-555
2-560
2-563
2-565
2-569
2-573
2-575
2-578
2-580
2-581
2-584
SET Transaction Mode 文 . .
START VIOLATIONS TABLE 文
STOP VIOLATIONS TABLE 文
UNLOAD 文 . . . . . .
UNLOCK TABLE 文 . . . .
UPDATE 文 . . . . . . .
UPDATE STATISTICS 文 . .
WHENEVER 文 . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . .
. . . .
. . .
. . .
.
.
.
.
.
.
.
.
. . .
. . .
. . .
. . .
. . . .
. . . .
. . .
. . .
.
.
.
.
.
.
.
.
. .
. .
. .
. .
.
.
.
.
.
.
.
.
2-590
2-594
2-613
2-615
2-620
2-622
2-634
2-645
SQL 文
2-3
2-4
Informix Guide to SQL:Syntax
この章では、SQL 文について包括的に説明します。文の記述はアルファベット順で
表示されます。文記述の構造の説明については、第 1 章「SQL 構文の概要」を参照
してください。
SQL 文
2-5
ALLOCATE DESCRIPTOR 文
ALLOCATE DESCRIPTOR 文
+
E/C
ALLOCATE DESCRIPTOR 文は、システム記述子領域にメモリを割り当てるのに使
用します。この文は、DESCRIBE 文が獲得する情報を保持または文の WHERE 節に
関する情報を保持する場所をメモリに作成します。
この文は ESQL/C とともに使用します。
構文
ALLOCATE DESCRIPTOR
'< 記述子 > '
'< 記述子変数 >'
< 項目 >
WITH MAX
< 項目変数 >
要素
< 記述子 >
目的
システム記述子領域を識別する
引用符付き文字列です。
< 記述子変数 > システム記述子領域を識別する
ホスト変数名です。
< 項目 >
< 項目変数 >
2-6
システム記述子領域の中の項目
記述子の数です。デフォルト値
は 100 です。
< オカレンス ( 発生数 )> の数を
含んでいるホスト変数です。
Informix Guide to SQL:Syntax
制限
単一引用符を使用します。
文字列は割当てられていないシ
ステム記述子領域名を表してい
なければなりません。
変数は、割当てられていないシ
ステム記述子領域の名前を含ん
でいなければなりません。
値は符号なし整数 (INTEGER)
型でなければなりません。
構文
引用符付き文字列、
4-156 ページ
変数名は、変数名に
適用される言語仕様
に従っている必要が
あります。
リテラル番号、
4-138 ページ
データ型は整数 (INTEGER) 型、 名前は、変数名に適
または小桁整数 (SMALLINT) 型 用される言語仕様に
でなければなりません。
従っている必要があ
ります。
ALLOCATE DESCRIPTOR 文
説明
ALLOCATE DESCRIPTOR 文は、メモリにシステム記述子領域を作成します。シス
テム記述子領域は、一つ以上の項目記述子と呼ばれるフィールドを含んでいます。
それぞれの項目記述子は、データベース サーバが受け取る、あるいは送出するデー
タ値を保持します。データ記述子は、データの型、長さ、小数点以下桁数、精度お
よび NULL を許すかどうかといったデータに関する情報も含みます。
システム記述子領域に割り当てた名前が既存のシステム記述子領域の名前に一致す
ると、データベースサーバはエラーを返します。DEALLOCATE DESCRIPTOR 文を
使って記述子を解放すると、その記述子を再利用できます。
WITH MAX 節
WITH MAX 節オプションを使って、必要な値記述子の個数を指定することができ
ます。< オカレンス ( 発生数 )> パラメータまたは < 実現値変数 > パラメータによっ
て、システム記述子領域内の項目記述子数を指定します。この値はゼロよりも大き
くなければなりません。WITH MAX 節を使って指定しなかったときは、データ
ベースサーバは < オカレンス ( 発生数 )> パラメータにデフォルト値の 100 を使用し
ます。
次の例は、WITH MAX 節を含む ALLOCATE DESCRIPTOR 文を示しています。最初
の行で埋込み変数名を使用してシステム記述子領域と必要な項目記述子の数を識別
します。2 番目の行で引用符付き文字列を使用してシステム記述子領域を識別し、
符号なし整数を使用して必要な項目記述子の数を指定しています。
EXEC SQL allocate descriptor :descname with max :occ;
EXEC SQL allocate descriptor 'desc1' with max 3;
参照
関連する文は、
「DEALLOCATE DESCRIPTOR 文」
、「DECLARE 文」
、「DESCRIBE
文」
、「EXECUTE 文」
、「FETCH 文」
、「GET DESCRIPTOR 文」
、「OPEN 文」
、
「PREPARE 文」
、「PUT 文」、
「SET DESCRIPTOR 文」です。
システム記述子領域についての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』
を参照して下さい。
SQL 文
2-7
ALTER FRAGMENT 文
+
ALTER FRAGMENT 文
ALTER FRAGMENT 文は、既存の表やインデックスの分散ストラテジや格納域を変
更したり、最初にフラグメントを作成したりするのに使用します。
W/D
この文は、Dynamic Server、Workgroup Edition と Developer Edition では利用できま
せん。 ♦
構文
ALTER FRAGMENT ON
TABLE
ATTACH 節
2-11 ページ
< 残される表 >
IDS
DETACH 節
2-19 ページ
INDEX
< 残されるインデックス >
INIT 節
2-21 ページ
IDS
ADD 節
2-28 ページ
DROP 節
2-30 ページ
MODIFY 節
2-31 ページ
2-8
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
要素
目的
< 残されるイン ALTER FRAGMENT 文を実行す
デックス >
るインデックスです。
< 残される表 >
ALTER FRAGMENT 文を実行す
る表です。
制限
インデックスは、文を実行する
前にあらかじめ存在していなけ
ればなりません。
表は、文を実行する前にあらか
じめ存在していなければなりま
せん。
構文
インデックス名、
4-25 ページ
表名、4-25 ページ
説明
ALTER FRAGMENT 文の各節によって、次のようなことが行えます。
節
目的
ATTACH
同一の表構造を持つ表同士を一つの断片化された表に組み合わせ
ます。
DETACH
表フラグメントをフラグメンテーションストラテジから切り離
し、新しい表に配置します。
INIT
次のオプションを提供します。
■
表にフラグメンテーション ストラテジを定義し、初期化します。
■
表のためのフラグメンテーション ストラテジを作成します。
■
フラグメント式の評価順序を変更します。
■
既存の表またはインデックスのフラグメンテーション ストラ
テジを変更します。
■
既存の表の格納域を変更します。
ADD
既存の断片化リストにフラグメントを追加します。
DROP
断片化リストから既存のフラグメントを削除します。
MODIFY
既存の式を変更します。
一時表、外部表またはビューでは ALTER FRAGMENT 文を使用できません。
AD/XP
Dynamic Server with AD and XP Options では、ALTER FRAGMENT 文は一般キー (GK)
インデックスで使用できません。また、ALTER FRAGMENT 文で定義された依存型
GK インデックスを持つ表では ALTER FRAGMENT 文を使用できません。 ♦
SQL 文
2-9
ALTER FRAGMENT 文
表のフラグメンテーションストラテジを変更するには、変更アクセス権またはデー
タベースアクセス権 DBA を持っていなければなりません。インデックスのフラグ
メンテーションストラテジを変更するにはインデックスアクセス権、またはデータ
ベースアクセス権 DBA を持っている必要があります。
ALTER FRAGMENT 文は、現在のサイト ( または Dynamic Server with AD and XP
Options 用のクラスタ ) にある表またはインデックス フラグメントにのみ適用され
ます。リモート情報には、アクセスすることも更新することもできません。
まだ断片化されていない表およびインデックスに対して実行できる操作は、INIT と
ATTACH 節のみです。
ALTER FRAGMENT 文の実行方法
データベースがログ機能を使用する場合には、ALTER FRAGMENT 文は単一のトラ
ンザクション内で実行されます。フラグメンテーション ストラテジが大量のレコー
ドを使用する場合には、ログ領域あるいはディスク領域が不足することが考えられ
ます。( データベース サーバは、その操作のために特別にディスク領域を必要とし
ますが、そのディスク領域は後で解放されます。)
領域の増加方法
ログ領域あるいはディスク領域が足りなくなった場合には、次のいずれかの操作で
利用できる領域を増やしてください。
■
操作の終了段階でログ機能をオフにし、再度オンにします。この操作を行
うと間接的にルート DB 領域のバックアップが必要となります。
■
操作を複数の ALTER FRAGMENT 文に分割し、1 回に移動するレコードの
量を少なくします。
ログ領域とディスク領域の要件についての詳細は、
『Administrator’s Guide』を参照
してください。このガイドには、ログ機能をオフにする方法についての詳細な指示
も含まれています。バックアップについての詳細は、
『Backup and Restore Guide』を
参照してください。
2-10
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
フラグメント内の行数の決定
使用可能な DB 領域の範囲内で、フラグメントにはいくらでも行を置くことができ
ます。
フラグメントにどれだけの行があるかを知るには
AD/XP
1.
表に対して UPDATE STATISTICS 文を実行します。これにより、システム
カタログ表 sysfragments に現行表の情報が読み込まれます。
2.
システムカタログ表 sysfragments に問い合わせを行って、フィールド
npused と nrows を調べます。フィールド npused はフラグメント内で使用
されているデータページの数を、フィールド nrows はフラグメント内の行
数を知らせてくれます。
ハイブリッドに断片化された表の修正
Dynamic Server with AD and XP Options では、ハイブリッドに断片化された表を
ATTACH 節と DETACH 節で修正する場合、格納の単位はハイブリッドに断片化さ
れた表の基本フラグメンテーション ストラテジの所定の式に関連する DB 領域セッ
トです。DB 領域名は、関連 DB 領域番号を DB スライス名に付与することにより
形成される導出 DB 領域識別子です。表がその DB スライスで作成された場合、関
連 DB 領域番号に .l を使用できます。ハイブリッドに断片化された表と導出 DB 領
域識別子の説明については、
『Informix Guide to Database Design and Implementation』
を参照してください。
ATTACH 節
重要 : 断片化された表を作成するには、CREATE TABLE 文か ALTER FRAGMENT
INIT 文を使用します。
同じ表構造を持っている表同士を、一つのフラグメンテーションストラテジに結合
するには、ATTACH 節を使用します。同じ表構造の表を、一つの表のフラグメント
へ変換する場合には、断片化の管理はアプリケーションではなくデータベースサー
バが行います。ラウンドロビンアルゴリズム、式ベース、ハッシュ、またはハイブ
リッドの分散スキームが使用できます。
SQL 文
2-11
ALTER FRAGMENT 文
ALTER FRAGMENT 文へ戻る
2-8 ページ
ATTACH 節
,
ATTACH
< 残される表 >
1
< 併合される表 >
<AS 式 >
BEFORE
<DB 領域 >
AFTER
1
要素
< 併合される
表>
<DB 領域 >
目的
ATTACH 節の実行対象である
AS REMAINDER
制限
表は、文を実行する前にあらか
じめ存在していなければなりま
せん。
構文
データベースオブ
ジェクト名、
4-25 ページ
断片化されていない表です。
Dynamic Server with AD and XP
シリアル型列、参照制約、主
Options では、< 併合される表 >
はハッシュで断片化された表でも キー制約、または一意な制約が
表にあってはなりません。検査
あります。
制約と NULL 値不可制約は表に
存在してもかまいませんが、こ
れらの制約は ATTACH 節が実
行された後に削除されます。
DB 領域に断片化リストで併合さ DB 領域は、文を実行する前に 識別子、
れる表の式が発生する場所を指定 あらかじめ存在していなければ 4-112 ページ
します。
なりません。
(1/2)
2-12
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
要素
<式>
目的
制限
フラグメントが、定義している式 < 断片化式 > は、現行表の列と
です。
単一行のデータ値だけを含むこ
とができます。
< 式 > に、副問合せ、ストアド
プロシジャ、現行の日付 / 時刻
関数、集計式を含むことはでき
ません。
< 残される表 > ALTER FRAGMENT 文の実行の結 表は、文を実行する前にあらか
果残される断片化された表です。 じめ存在していなければなりま
せん。
構文
条件セグメント、
4-5 ページ
式 4-33 ページ
表名、4-25 ページ
シリアル型列、参照制約、主
キー制約、または一意な制約が
表にあってはなりません。
(2/2)
結合する表は、別々の DB 領域で作成されている必要があります。同じ表を複数回
結合することはできません。断片化された表を他の断片化された表に結合すること
はできません。
ATTACH 節を使用するには、DBA、または表の所有者である必要があります。
表が結合されると、ATTACH 節で指定されたすべての併合される表は存在しなくな
ります。併合される表のレコードは、残される表から参照します。
ATTACH 節で一覧表示される、併合される表はすべて、残される表と構造的に同一
でなければなりません。すなわち、すべての列の定義が一致しなければなりませ
ん。列の数、名前、データ型、相対的な位置関係が同じである必要があります。シ
リアル列を含む表は結合できません。残される表のインデックスとビューは
ATTACH 節の実行後も残りますが、併合される表のインデックスとビューは削除さ
れます。
IDS
Dynamic Server では、残される表のトリガは ATTACH 節の実行後も残りますが、併
合される表のトリガは削除されます。ATTACH 節では、トリガは起動されません。
♦
SQL 文
2-13
ALTER FRAGMENT 文
AD/XP
ATTACH 節の使用方法
Dynamic Server with AD and XP Option では、ハイブリッドに断片化された表を作成
または付与する場合、配置仕様 (BEFORE、AFTER または REMAINDER) はスライ
ス全体に適用されます。BEFORE 位置または AFTER 位置のスライスを識別するた
めに、スライスのどの DB 領域も使用できます。
同じ構造に加えて、すべての併合される表は残される表と同じ型でなければなりま
せん。表の型を指定する方法についての詳細は、CREATE TABLE 文を参照してく
ださい。
次の表は、ATTACH 節で述べられた表の種々異なる分散スキームの結果生じ得る分
散スキームを示しています。
併合される表の以前の分散スキーム
残される表の以前の
分散スキーム
なし
ハッシュ
なし
ラウンド ロビンまたは
式
ハイブリッド
ラウンド ロビン
ラウンド ロビン
--
式
式
--
ハッシュ
ハイブリッド
ハイブリッド
ハイブリッド
ハイブリッド
ハイブリッド
ATTACH 節の制限
ATTACH 節を使用できないことがあります。その場合結合操作は失敗します。
2-14
■
残される表の既存のフラグメントに属するデータが併合される表にある場合。
■
残される表の既存のデータが新しいフラグメントに属する場合。
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
同一の構造を持つ断片化されていない表の結合
二つ以上の断片化されていない表から、単一の断片化された表を作成する場合に
は、残される表は、ATTACH 節の結合リストになければなりません。結合リストと
は、ATTACH 節に含まれる表のリストです。
IDS
Dynamic Server では、新たに作成された単一の断片化された表に行 ID を作りたい場
合、まずすべての表を結合し、それから ALTER TABLE 文を使用して行 ID を追加
します。 ♦
断片化されていない表を断片化された表に結合する方法
断片化されていない表を既に断片化された表に結合する場合、断片化されていない
表は、異なる DB 領域で作成され、断片化された表と同じ表構造を持っている必要
があります。次の例では、ラウンド ロビン分散スキームは表 cur_acct を断片化し、
表 old_acct は異なる DB 領域に常駐する断片化されていない表を表します。この例
は、表 old_acct を表 cur_acct に結合する方法を示しています。
ALTER FRAGMENT ON TABLE cur_acct ATTACH old_acct
BEFORE 節と AFTER 節
BEFORE 節と AFTER 節を使用すると、新しいフラグメントを既存の DB 領域の前
または後ろに配置することができます。分散スキームがラウンド ロビンの場合、
BEFORE 節と AFTER 節は使用できません。
明示的に BEFORE 節または AFTER 節を指定しないで新しいフラグメントを結合す
ると、残存のフラグメントが存在しなければ、追加されるフラグメントは断片化リ
ストの最後に配置されます。残存のフラグメントが存在する場合、新しいフラグメ
ントは残存フラグメントの直前に配置されます。新しいフラグメントを残存のフラ
グメントの後に結合することはできません。
SQL 文
2-15
ALTER FRAGMENT 文
AD/XP
ハイブリッドに断片化された表への ATTACH 節の使用方法
Dynamic Server with AD and XP Options では、ハッシュで断片化された表をハイブ
リッドに断片化された表 ( または別のハッシュで断片化された表で作成されたハイ
ブリッドに断片化された表 ) に結合する場合、BEFORE 節と AFTER 節を使用でき
ます。この場合、BEFORE 節と AFTER 節により、別のフラグメント式と関連する
フラグメントの前後に、所定の式に関連する ( スライスと呼ばれる ) フラグメント
のセットを配置することができます。
BEFORE 節や AFTER 節のスライスのどのフラグメントの DB 領域名も指定できま
す。データベース サーバはその DB 領域を含むスライスを識別し、結合するフラグ
メントを配置します。
ハイブリッドな断片化の例
月間販売データが下に定義される表 sales_info に追加される場合を考えてみましょ
う。大量のデータのため、表は、システム定義のハッシュ機能で、複数のコサーバ
に均等に分散されます。月ごとの表へのデータの追加を管理するために、データ式
による断片化もされます。組み合わされたハイブリッドな断片化は、次の CREATE
TABLE 文で宣言されます。
CREATE TABLE sales_info (order_num int, sale_date date, ...)
FRAGMENT BY HYBRID (order_num) EXPRESSION
sale_date >= '01/01/1996' AND sale_date < '02/01/1996'
IN sales_slice_9601,
sale_date >= '02/01/1996' AND sale_date < '03/01/1996'
IN sales_slice_9602,
.
.
.
sale_date >= '12/01/1996' AND sale_date < '01/01/1997'
IN sales_slice_9612
新しい月のデータは、最初、外部ソースからロードされます。データは、同じ列の
システム定義のハッシュ機能を使用して、表 sales_info が定義される名前コサーバ
に均等に分散されます。
CREATE TABLE jan_97 (order_num int, sale_date date, ...)
FRAGMENT BY HASH (order_num) IN sales_slice_9701
INSERT INTO jan_97 SELECT (...) FROM ...
2-16
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
一度データがロードされると、新しい表を sales_info に結合できます。次の ALTER
FRAGMENT 文で新しい表を結合できます。
ALTER FRAGMENT ON TABLE sales_info ATTACH jan_97
AS sale_date >= '01/01/1997' AND sale_date < '02/01/1997'
表を断片化するために ATTACH 節を使用する方法ラウンドロビンアルゴ
リズム
次の例では、断片化されていない表 pen_types と pen_makers を断片化された一つの
表 pen_types に結合しています。表 pen_types は DB 領域 dbsp1 に格納されていて、
表 pen_makers は DB 領域 dbsp2 に格納されています。それぞれの表の表構造は同一
です。
ALTER FRAGMENT ON TABLE pen_types
ATTACH pen_types, pen_makers
ATTACH 節を実行すると、データベースサーバは、pen_types が含まれていた DB
領域と pen_makers が含まれてた DB 領域の二つの DB 領域に、ラウンドロビンアル
ゴリズムによって表 pen_types を断片化します。表 pen_makers は併合され存在しな
くなります。表 pen_makers にあったすべての行は、今では表 pen_types にありま
す。
表を断片化するために ATTACH 節を使う式
式ベースの分散スキームを使って表 cur_acct と new_acct を結合する例を考えます。
表 cur_acct は最初から断片化された表として作成され、DB 領域 dbsp1 と dbsp2 にフ
ラグメントがあります。例の最初の文は、表 cur_acct が式ベースの分散スキームを
使って作成されていることを示しています。2 番目の文は、フラグメンテーション
ストラテジを使用しないで表 new_acct を dbsp3 に作成します。3 番目の文は、表
cur_acct と new_acct を結合します。それぞれの表の表構造 ( 列 ) は同一です。
CREATE TABLE cur_acct (a int) FRAGMENT BY EXPRESSION
a < 5 in dbsp1,
a >= 5 and a < 10 in dbsp2;
CREATE TABLE new_acct (a int) IN dbsp3;
ALTER FRAGMENT ON TABLE cur_acct ATTACH new_acct AS a>=10;
SQL 文
2-17
ALTER FRAGMENT 文
フラグメントを変更した後でシステムカタログ表 sysfragments を調べると、表
cur_acct が式によって 3 つの DB 領域に断片化されているのが分かります。システ
ムカタログ表 sysfragments についての詳細は、
『Informix Guide to SQL: Reference』を
参照してください。
ATTACH 文を使用して式による断片化を行う場合、単純な範囲規則の他に、ハッ
シュ規則または任意の規則を使用することができます。式ベースの分散スキームの
あらゆる式についての説明は、2-22 ページの「表のための FRAGMENT BY 節」を
参照してください。
インデックスとトリガへの影響
別個にインデックスのフラグメントを作成しない限り、インデックスの断片化は表
の断片化と同じです。
表を結合すると、併合される表に定義されているどのインデックスも存在しなくな
ります。併合される表 (new_acct) にあるすべての行には、残される表 (cur_acct) に
定義されているインデックスが適用されます。
明示的にフラグメンテーションストラテジが指定された残される表のインデックス
は、ATTACH 操作の最後までそのフラグメンテーションストラテジによって影響さ
れません。
バイト (BYTE) 型列とテキスト (TEXT) 型列に起こること
Dynamic Server では、ATTACH 節で名前を付けられるすべての表の各バイト
(BYTE) 型列とテキスト (TEXT) 型列は、BLOB 領域または TBL 領域のどちらかと
同じ格納型を持たなければなりません。バイト (BYTE) 型列またはテキスト (TEXT)
型列が BLOB 領域に格納されると、すべての表の同じ列は同じ BLOB 領域になけれ
ばなりません。バイト (BYTE) 型列またはテキスト (TEXT) 型列が TBL 領域に格納さ
れると、同じ列はすべての表で TBL 領域に格納されなければなりません。 ♦
IDS
AD/XP
2-18
Dynamic Server with AD and XP Options では、バイト (BYTE) 型列とテキスト (TEXT)
型列は、その目的のために作成された別個のフラグメントに格納されます。表にバ
イト (BYTE) 型列またはテキスト (TEXT) 型列が含まれると、データベース サーバ
は、それぞれの通常の表フラグメントと同じ DB 領域に別個の、追加フラグメントを
作成します。バイト (BYTE) 型列とテキスト (TEXT) 型列は、所定の行が常駐する通
常の表フラグメントに関連する別個のフラグメントに格納されます。 ♦
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
トリガに起こること
IDS
Dynamic Server では、表を結合すると、併合される表に定義されたトリガは存在せ
ず、併合される表 (new_acct) のすべての行に、残される表 (cur_acct) に定義される
トリガが適用されます。どのトリガも ATTACH 節では起動されませんが、新しい
行の後続のデータ操作オペレーションはトリガを起動できます。
DETACH 節
DETACH 節は、分散スキームから表フラグメントを切り離して、新しい断片化され
ていない表に内容を格納するのに使用します。分散スキームについては、2-22 ペー
ジの「表のための FRAGMENT BY 節」を参照してください。
ALTER FRAGMENT 文へ戻る
2-8 ページ
DETACH 節
DETACH
要素
<DB 領域名 >
< 新しい表 >
<DB 領域 >
< 新しい表 >
目的
制限
切り離されるフラグメントを含 DB 領域は、文を実行する前に
む DB 領域の名前です。
あらかじめ存在していなければ
なりません。
ALTER FRAGMENT 文を実行し 表は、文を実行する前に存在し
ていてはいけません。
た結果残される表です。
構文
識別子、
4-112 ページ
データベースオブ
ジェクト名、
4-25 ページ
表が参照制約の親表であったり、表に行 ID が定義されている場合には、DETACH
節を表に対して適用することはできません。
DETACH 節を実行した結果作成される新しい表は、元の表のインデックスや制約を
一切引き継ぎません。データだけが引き継がれます。
DETACH 節を実行した結果作成される新しい表は、元の表のアクセス権を一切引き
継ぎません。その代わり、この表はどの新しい表についてもデフォルトのアクセス
権を持っています。デフォルトの表レベルのアクセス権についての詳細は、2-342
ページの「GRANT 文」を参照してください。
SQL 文
2-19
ALTER FRAGMENT 文
次の例は、二つの DB 領域 dbsp1 と dpsp2 に断片化された表 cur_acct を示しています。
ALTER FRAGMENT ON TABLE cur_acct DETACH dbsp2 accounts
この例は、cur_acct の分散スキームから dbsp2 を切り離し、行を新しい表 accounts
に格納します。表 accounts は、表 cur_acct と同じ構造 ( 列名、列数、データ型など )
を持つようになりますが、表 cur_acct のインデックスや制約を一切含みません。ど
ちらの表も断片化されていない状態になります。
次の例は、3 つのフラグメントを含んでいる表を示しています。
ALTER FRAGMENT ON TABLE bus_acct DETACH dbsp3 cli_acct
この文は、bus_acct の分散スキームから dbsp3 を切り離し、行を新しい表 cli_acct に格
納します。表 cli_acct は、表 bus_acct と同じ構造 ( 列名、列数、データ型など ) を持つ
ようになりますが、表 bus_acct のインデックスや制約を一切含みません。表 cli_acct
は断片化されていない表で、表 bus_acct は断片化された表のままになります。
AD/XP
DETACH 節の使用方法
Dynamic Server with AD and XP Options では、表に DETACH 節で定義される依存型
GK インデックスがある場合、DETACH 節を使用できません。
DETACH 操作の残される表はハイブリッドに断片化され、分離スライスに二つ以上
のフラグメントがある場合、新しい表にはハッシュで断片化されます。ハイブリッ
ドに断片化された表では、そのスライスのどの DB 領域でもその名前を呼ぶことに
より切り離されるスライスを指定できます。
DETACH 節の例
2-16 ページの「ハイブリッドな断片化の例」で説明した表 sales_info について考え
てみましょう。1997 年 1 月のデータが表 sales_info で利用可能になると、1 年分の
sales_info データをアーカイブできます。
ALTER FRAGMENT ON TABLE sales_info
DETACH sales_slice_9601.1 jan_96
この例では、1996 年 1 月のデータが表 sales_info から切り離され、jan_96 と呼ばれ
る新しい表に設定されます。
2-20
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
INIT 節
INIT 節により、表を再定義しないで断片化されていない既存の表を断片化したり、
断片化された表を断片化されていない表に変換したり、断片化されていない表を一
つの DB 領域から別の DB 領域に移動したりできます。
Dynamic Server では、INIT 節は、インデックスを再定義しないで断片化されていな
い既存のインデックスを断片化したり、断片化されたインデックスを断片化されて
いないインデックスに変換したりもできます。 ♦
IDS
INIT 節で、既存のフラグメンテーション ストラテジを別のフラグメンテーション
ストラテジに変換もできます。既存のどのフラグメンテーション ストラテジも廃棄
され、新しいフラグメンテーション ストラテジの定義に従って、レコードがフラグ
メントに移されます。
表を修正するために INIT 節を使用すると、影響を受けた表についてシステム カタ
ログ表の表識別子の値が変化します。表にあるすべての一意の制約と参照制約の制
約識別子の値も変化します。
ALTER FRAGMENT 文へ戻る
2-8 ページ
INIT 節
表のための
FRAGMENT BY 節
2-22 ページ
INIT
IDS
WITH ROWIDS
IDS
インデックスのための
FRAGMENT BY 節
2-26 ページ
IN <DB 領域 >
AD/XP
IN < スライス >
SQL 文
2-21
ALTER FRAGMENT 文
要素
目的
<DB スライス > DB スライスの断片化された
情報です。
<DB 領域 >
IDS
DB 領域の断片化された情報
です。
制限
構文
DB スライスは、文を実行する 識別子、4-112 ページ
前にあらかじめ存在していなけ
ればなりません。
DB 領域は、文を実行する前に 識別子、4-112 ページ
あらかじめ存在していなければ
なりません。
Dynamic Server では、INIT 節を使用して既存の断片化されていない表を断片化する
と、表のすべてのインデックスは、表と同じ方法で断片化されます。 ♦
Dynamic Server with AD and XP Option では、INIT 節を使用して既存の断片化されて
いない表を断片化すると、インデックスはその既存のフラグメンテーション ストラ
テジを保持します。
GK インデックスを持つ表のフラグメンテーション ストラテジを変更するために
INIT 節を使用することはできません。 ♦
表のための FRAGMENT BY 節
表のための INIT FRAGMENT BY 節で次のことができます。
2-22
■
既存の断片化されていない表を、表を再定義することなく断片化すること。
■
既存のフラグメンテーション ストラテジを別のフラグメンテーション ス
トラテジに変換すること。既存のフラグメンテーション ストラテジはすで
に廃棄されおり、レコードは新しいフラグメンテーション ストラテジの定
義に従ってフラグメントに移されます。
■
断片化された表を断片化されていない表に変換すること。
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
表のための
FRAGMENT BY 節
INIT 節へ戻る
2-21 ページ
,
FRAGMENT BY
,
IN<DB 領域 >
ROUND ROBIN
<DB 領域 >
AD/XP
IN<DB スライス >
,
< 式 >IN<DB 領域 >
EXPRESSION
,
< 式 >IN<DB 領域 >
,
REMAINDER IN<DB 領域 >
AD/XP
,
HASH
(
,
<列>
)
,
IN<DB 領域 >
<DB 領域 >
IN<DB スライス >
,
(
HYBRID
ハイブリッドな
EXPRESSION 節
)
<列>
,
(
HASH
(
<列>
)
)
ハイブリッドな
EXPRESSION 節
,
EXPRESSION
< 式 >IN<DB スライス >
,
< 式 >IN<DB スライス >
,
REMAINDER IN<DB スライス >
SQL 文
2-23
ALTER FRAGMENT 文
要素
<列>
<DB 領域 >
目的
列の断片化された情報です。
DB 領域の断片化された情報
です。
<DB スライス > DB スライスの断片化された
情報です。
フラグメントが、範囲規則、
<式>
ハッシュ規則、任意の規則の
内どの規則を使用するかを定
義している式です。
制限
構文
列が存在しなければなりません。 識別子、4-112 ページ
少なくとも二つの DB 領域を指 識別子、4-112 ページ
定しなければなりません。最大
で 2,048 の DB 領域を指定でき
ます。
DB スライスを定義しなければ 識別子、4-112 ページ
なりません。
各フラグメント式は、現行表の 条件、4-5 ページおよ
列と単一行のデータ値だけを含 び式、4-33 ページ
むことができます。
< 式 > に、副問合せ、ストアド
プロシジャ、現行の日付 / 時刻
関数、集計式を含めることはで
きません。
既存のフラグメンテーションストラテジの変更
最初のフラグメンテーションストラテジが要求を満たしていない場合には、フラグ
メンテーションストラテジを再定義することができます。次の例は、表 account の
フラグメンテーションストラテジを最初に定義した文を示し、次にそのフラグメン
テーションストラテジを再定義する ALTER FRAGMENT 文を示しています。
CREATE TABLE account (col1 int, col2 int)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp2;
ALTER FRAGMENT ON TABLE account
INIT FRAGMENT BY EXPRESSION
col1 < 0 in dbsp1,
col2 >= 0in dbsp2;
フラグメンテーション ストラテジを再定義するとき、既存のすべての DB 領域が
いっぱいの場合には、そのいっぱいになっている DB 領域ではなく別の DB 領域に
表を断片化しなければなりません。
2-24
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
断片化された表を断片化されていない表に変換する方法
断片化された表を断片化されていない表に変換したいことがあります。このような
場合には、INIT 節を使って断片化された表を断片化されていない表に変換すること
ができます。次の例は、最初の断片化の定義とともに、ALTER FRAGMENT 文を使
用した表の変換方法を示しています。
CREATE TABLE checks (col1 int, col2 int)
FRAGMENT BY ROUND ROBIN IN dbsp1, dbsp2, dbsp3;
ALTER FRAGMENT ON TABLE checks INIT IN dbsp1;
表を明示的に DB 領域に配置するためには、IN DB 領域節を使用しなければなりま
せん。
INIT 節を使って、断片化された表を断片化されていない表に変換すると ( すなわ
ち、表からフラグメンテーションストラテジを取り除くと )、表と同じ方法で断片
化されていたすべてのインデックスは、断片化されていないインデックスになりま
す。システムインデックスは表に対する INIT 節の使用の影響を受けません。
断片化されていない表にフラグメンテーションストラテジを定義する方法
INIT 節を使用して、断片化されていない表にフラグメンテーションストラテジを定
義することができます。表が格納オプションを用いて作成されているかどうかは関
係ありません。次の例は、最初の表定義とともに、ALTER FRAGMENT 文を使用し
た表の断片化を示しています。
CREATE TABLE balances (col1 int, col2 int) IN dbsp1;
ALTER FRAGMENT ON TABLE balances INIT
FRAGMENT BY EXPRESSION
col1 <= 500 IN dbsp1,
col1 > 500 and col1 <=1000 IN dbsp2,
REMAINDER IN dbsp3;
SQL 文
2-25
ALTER FRAGMENT 文
WITH ROWIDS 節
IDS
Dynamic Server では、断片化されていない表には、行 ID と呼ばれる疑似列が含まれ
ています。断片化された表には、明示的にそれを作成しない限り、この列は含まれ
ていません。
行 ID を新たに追加するには、WITH ROWIDS 節を使用します。データベースサー
バは、行が存在する限り変更されない一意な番号をそれぞれの行に割り当てます。
データベースサーバは行の物理的な格納場所を探索するのに使用するインデックス
を作成します。WITH ROWID 節を追加すると、それぞれの行は行識別子列を格納
するための追加の 4 バイトを含むようになります。型付き表では、WITH ROW 節
は使用できません。
重要 : Informix は、アクセス方法として、行 ID ではなく主キーを使用することをお
勧めします。
インデックスのための FRAGMENT BY 節
IDS
Dynamic Server では、インデックスのための INIT FRAGMENT BY 節により、イン
デックスを再定義しないで断片化されていない既存のインデックスを断片化できま
す。既存のフラグメンテーション ストラテジを別のフラグメンテーション ストラ
テジに変換できます。既存のフラグメンテーション ストラテジはすべて廃棄され、
レコードは新しいフラグメンテーション ストラテジの定義に従ってフラグメントに
移されます。断片化されたインデックスを断片化さていないインデックスに変換す
ることもできます。
インデックスのための FRAGMENT BY 節を使用して、式ベースの分散スキームを
定義します。表のための FRAGMENT BY 節と同様、インデックスのための
FRAGMENT BY 節も範囲規則と任意の規則をサポートします。これらの規則につい
ては、2-22 ページの「表のための FRAGMENT BY 節」を参照してください。
インデックスのための
FRAGMENT BY 節
INIT 節へ戻る 2-21 ページ
,
FRAGMENT BY
2-26
EXPRESSION
Informix Guide to SQL:Syntax
< 式 >IN<DB 領域 >
,
< 式 >IN<DB 領域 >
,
REMAINDER IN<DB 領域 >
ALTER FRAGMENT 文
要素
目的
制限
<DB 領域 > DB 領域の断片化された情報です。 少なくとも二つの DB 領域を指定
しなければなりません。最大で
2,048 の DB 領域を指定できます。
フラグメントが、範囲規則、ハッ 各フラグメント式は、現行表の列
<式>
シュ規則、任意の規則の内どの規 と単一行のデータ値だけを含むこ
則を使用するかを定義している式 とができます。< 式 > に、副問合
です。
せ、ストアド プロシジャ、現行
の日付 / 時刻関数、集計式を含め
ることはできません。
構文
識別子、
4-112 ページ
条件、4-5 ページお
よび式、4-33 ページ
一意のインデックスとシステム インデックスの断片化
表が式ベースの分散スキームを使用する場合にのみ、一意のインデックスを断片化
できます。フラグメント式で参照される列は、インデックス付き列でなければなり
ません。ALTER FRAGMENT INIT 文がこれらの制限のいずれかを満たしていない場
合には、INIT 節は失敗し、作業はロール バックされます。
列 A により断片化された表に、結合された一意のインデックスを持つ場合がありま
す。INIT 節を使用して、列 B への表の断片化を変更すると、一意のインデックス
は列 A で定義されているのでその INIT 節は失敗します。この問題を解決するため
に、インデックスの INIT 節を使用して、これを表のフラグメンテーション ストラ
テジから切り離し、別個に断片化できます。
( 参照制約や一意の制約で使用されるような ) システム インデックスは、ユーザ イ
ンデックスが存在する場合にはそれを使用します。ユーザ インデックスが使用でき
ない場合には、システム インデックスは非フラグメントのままに止まり、データ
ベースが作成された DB 領域に移されます。システム インデックスをフラグメント
化するには、制約付き列にフラグメント インデックスを作成し、ALTER TABLE 文
を使用してその制約を追加します。
表のフラグメンテーション ストラテジからインデックスを切り離す方法
INIT 節で表のフラグメンテーション ストラテジからインデックスを切り離すこと
ができますが、これにより、連結インデックスが分離インデックスになります。こ
れは、表のフラグメンテーション ストラテジのインデックスの依存性をブレークし
ます。
SQL 文
2-27
ALTER FRAGMENT 文
ADD 節
IDS
Dynamic Server では、ADD 節を使用して既存の断片化リストに別のフラグメントを
追加します。
ALTER FRAGMENT 文へ戻る 2-8 ページ
ADD 節
< 新しい DB 領域 >
ADD
< 式 >IN< 新しい DB 領域 >
BEFORE
< 既存の DB 領域 >
AFTER
REMAINDER IN
< 新しい DB 領域 >
要素
目的
制限
< 既存の DB 領 既存の断片化リストで指定され DB 領域は、文を実行するとき
ている DB 領域名です。
域>
に存在していなければなりま
せん。
追加されるフラグメントを定義 < 式 > は、現行表の列と単一
<式>
する式です。
行のデータ値だけを含むこと
ができます。< 式 > に、副問
合せ、ストアド プロシジャ、
現行の日付 / 時刻関数、集計式
を含めることはできません。
< 新しい DB 領 断片化機構に追加される DB 領 DB 領域は、文を実行するとき
域名です。
域>
に存在していなければなりま
せん。
構文
識別子、
4-112 ページ
条件、4-5 ページお
よび式、4-33 ページ
識別子、
4-112 ページ
新しい DB 領域をラウンドロビンアルゴリズム分散スキームに追加する方法
ラウンドロビンアルゴリズム方式の分散スキームに、DB 領域を追加することがで
きます。次の例は、元のラウンドロビンアルゴリズムの定義を示しています。
CREATE TABLE book (col1 int, col2 title)
FRAGMENT BY ROUND ROBIN in dbsp1, dbsp4;
2-28
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
次の例で示しているように、新しく DB 領域を追加するには ADD 節を使用します。
ALTER FRAGMENT ON TABLE book ADD dbsp3;
式の追加
式ベースの分散スキームにおいて、断片化リストに式を追加すると、既存のフラグ
メントから新しいフラグメントにレコードをシャッフルすることができます。断片
化リストの途中に新しいフラグメントを追加すると、新しいフラグメントの後のフ
ラグメント内のすべてのデータは再評価されなければなりません。次の例は、元の
式の定義を示しています。
.
.
.
FRAGMENT BY EXPRESSION
c1 < 100 IN dbsp1,
c1 >= 100 and c1 < 200 IN dbsp2,
REMAINDER IN dbsp3;
この断片化リストに新しくフラグメントを追加して、200 と 300 の間の行をそのフ
ラグメントに保持させるには、次の ALTER FRAGMENT 文を使用します。
ALTER FRAGMENT ON TABLE news ADD
c1 >= 200 and c1 < 300 IN dbsp4;
残余フラグメントに以前存在していた行で、c1>=200 と c1<300 の規準に適合する
行は新しい DB 領域に移されます。
BEFORE 節と AFTER 節
BEFORE 節と AFTER 節によって、新しいフラグメントを既存の DB 領域の前また
は後の DB 領域に配置することができます。BEFORE 節と AFTER 節は分散スキー
ムが式ベースの場合 ( ラウンドロビンアルゴリズムではない場合 ) のみ使用するよ
うにしてください。新しいフラグメントは、残余フラグメントの後に追加すること
はできません。BEFORE 節と AFTER 節を明示的に使用しないで新しいフラグメン
トを追加すると、追加されたフラグメントは断片化リストの最後に配置されます。
しかし、断片化リストが REMAINDER 節を含んでいる場合は、追加のフラグメン
トは残余フラグメントの前に追加されます ( すなわち、残余フラグメントは断片化
リストの最後の項目として留まります )。
SQL 文
2-29
ALTER FRAGMENT 文
REMAINDER 節
残余フラグメントがすでに存在する場合には、さらに追加することはできません。
新しいフラグメントを断片化リストの最後に追加する際に残余フラグメントが存在
すると、残余フラグメントにあるレコードは抽出され、再評価されます。これらの
レコードを新しいフラグメントに移すことができます。残余フラグメントは常に断
片化リストの最後の項目として留まります。
DROP 節
IDS
DROP 節は、断片化リストから既存のフラグメントを削除するのに使用します。
ALTER FRAGMENT 文へ戻る
2-8 ページ
DROP 節
DROP
要素
<DB 領域 >
目的
削除したフラグメントを含む
DB 領域名です。
<DB 領域 >
制限
構文
DB 領域は、文を実行する前に 識別子、
あらかじめ存在していなければ 4-112 ページ
なりません。
表が二つのフラグメントしか含んでいない場合は、フラグメントの一つを削除する
ことはできません。式ベースの分散スキームで断片化された表のフラグメントは、
そのフラグメントに他のフラグメントに移すことができないデータが含まれている
場合には削除することはできません。分散スキームに REMAINDER 節が含まれて
いるか、あるいは式がオーバラップするように構成されている場合には、データを
含んでいるフラグメントを削除することができます。
断片化されている表を断片化されていない状態にするには、INIT 節または
DETACH 節を使用します。
DB 領域からフラグメントを削除しても、その基礎となっている DB 領域は影響を受け
ません。その DB 領域内にあるフラグメントデータのみが影響を受けます。フラグメン
トを削除すると、そのフラグメントに配置されていたすべてのレコードは別のフラグメ
ントに移されます。移動先のフラグメントに、追加レコードを受け入れるだけの十分な
空き領域がない場合もあります。このような場合には、2-10 ページの「領域の増加方
法」に説明されている手順にしたがって、領域を増やしてから再度実行してください。
2-30
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
次の例は、断片化リストからフラグメントを削除する方法を示しています。最初の
行はインデックスのフラグメントを、2 番目の行は表のフラグメントを削除する方
法を示しています。
ALTER FRAGMENT ON INDEX cust_indx DROP dbsp2;
ALTER FRAGMENT ON TABLE customer DROP dbsp1;
MODIFY 節
IDS
Dynamic Server では MODIFY 節は、既存の DB 領域上の既存の式を変更するのに使
用します。また MODIFY 節を使用して、ある DB 領域から別の DB 領域に式を移す
ことができます。
ALTER FRAGMENT 文へ戻る
2-8 ページ
MODIFY 節
,
MODIFY
要素
<式>
< 式 >IN< 新しい DB 領域 >
TO
< 変更する
DB 領域 >
1
REMAINDER IN < 新しい DB 領域 >
目的
制限
変更した範囲式、ハッシュ式、 式は、現行表の列と単一行の
または任意式です。
データ値だけを含むことができ
ます。
構文
条件セグメント
4-5 ページ、
式 4-33 ページ
< 式 > に、副問合せ、ストアド
プロシジャ、現行の日付 / 時刻
関数、集計式を含むことはでき
ません。
< 変更する DB 変更した DB 領域です。
DB 領域は、文を実行する前に 識別子 4-112 ページ
領域 >
あらかじめ存在していなければ
なりません。
変更情報を含む DB 領域です。 DB 領域は、文を実行する前に 識別子 4-112 ページ
< 新しい DB
領域 >
あらかじめ存在していなければ
なりません。
SQL 文
2-31
ALTER FRAGMENT 文
一般的な使用方法
MODIFY 節を使用する場合、その基礎となっている DB 領域は影響を受けません。
DB 領域内にあるフラグメントデータだけが影響を受けます。
REMAINDER フラグメントにあるレコードが新しい式に適合しない場合には、
REMAINDER フラグメントを非残余フラグメントに変更することはできません。
既存の DB 領域で式を変更する方法
MODIFY 節を使用して、式の DB 領域記憶域を変更せずに式の変更を行う場合に
は、< 変更する DB 領域 > と < 新しい DB 領域 > に同じ名前を使用しなければなり
ません。
次の例は、既存の式を変更する場合の MODIFY 節の使用方法を示しています。
ALTER FRAGMENT ON TABLE cust_acct
MODIFY dbsp1 to acct_num < 65 IN dbsp1
DB 領域間の式の移動
MODIFY 節を使ってある DB 領域から別の DB 領域へ式を移動する場合、< 変更す
る DB 領域 > には前に式が格納されていた DB 領域名を指定し、< 新しい DB 領域 >
には式の新しい格納場所を指定します。
次の例は、ある DB 領域から他の DB 領域へ式を移動するための MODIFY 節の使用
方法を示しています。
ALTER FRAGMENT ON TABLE cust_acct
MODIFY dbsp1 to acct_num < 35 in dbsp2
この例では、列 acct_num の行項目の中で 35 より小さいものは DB 領域 dbsp2 に含
まれるように表 cust_acct の分散スキームを変更しています。これらの項目は、以前
は DB 領域 dbsp1 に含まれていました。
2-32
Informix Guide to SQL:Syntax
ALTER FRAGMENT 文
式の変更と新しい DB 領域への移動
MODIFY 節を使用して、式を変更し、その式を新しい DB 領域に移動するには、式
名と DB 領域名の両方を変更します。
インデックスに起こること
インデックスがインデックスに結合され、表が変更される場合、インデックスのフ
ラグメンテーション ストラテジも変更されます。
参照
関連する文は、
「CREATE TABLE 文」、
「CREATE INDEX 文」、
「ALTER TABLE 文」
です。また、条件、データ型、式、識別子セグメントも参照してください。
フラグメンテーション ストラテジについての説明は、
『Informix Guide to Database
Design and Implementation』を参照してください。
フラグメントの変更を行うときパフォーマンスを最大化する方法の詳細について
は、
『Performance Guide』を参照してください。
SQL 文
2-33
ALTER INDEX 文
ALTER INDEX 文
+
IDS
ALTER INDEX 文は、既存のインデックスの順序でデータを表に配置したり、イン
デックスをクラスタ属性から解放したりするのに使用します。
この文は、Dynamic Server でのみ使用します。
構文
ALTER INDEX
< インデックス >
TO
CLUSTER
NOT
要素
目的
< インデックス > 変更するインデックスの名前
です。
制限
構文
インデックスが存在してい データベースオブジェク
なければなりません。
ト名、4-25 ページ
説明
ALTER INDEX 文は、CREATE INDEX 文を使って作成されたインデックスのみに使
用できます。また、CREATE TABLE 文で作成された制約には影響を及ぼしません。
一時表のインデックスを変更することはできません。
TO CLUSTER オプション
TO CLUSTER オプションを使用すると、物理的な表の行がインデックスの順序で並
べ替えられます。
次の例では、ALTER INDEX TO CLUSTER 文を使用して、表 orders にある行を物理
的に並べ替える方法を示しています。CREATE INDEX 文が表の列 customer_num に
対してインデックスを作成します。次に ALTER INDEX 文が行を物理的に並べ替え
ます。
CREATE INDEX ix_cust ON orders (customer_num);
ALTER INDEX ix_cust TO CLUSTER;
2-34
Informix Guide to SQL:Syntax
ALTER INDEX 文
並べ替えを行うとファイル全体が再書込みされます。このプロセスは時間がかかる
上に、二つの表を保持するだけの十分なディスク領域を必要とします。
表がクラスタ化されている間、表は IN EXCLUSIVE MODE でロックされています。
< インデックス名 > が属している表を他のプロセスが使用していると、データベー
スサーバは TO CLUSTER オプションを使って ALTER INDEX 文を実行することが
できません。ロックモードでキーワード WAIT が設定されていない限り、データ
ベースサーバはエラーを返します ( ロックモードでキーワード WAIT が設定されて
いると、データベースサーバは ALTER INDEX 文を再試行します )。
クラスタ化を行ってから時間が経過して表が更新されていくと、クラスタ化した効
果が薄れてきます。これは、連続したインデックスの順序ではなく、領域の空いて
いる順序で行が追加されるためです。このような場合には、クラスタ化されたイン
デックスに対して再び ALTER INDEX 文で TO CLUSTER オプションを実行して、
表を再クラスタ化し、性能を回復させることができます。すでにクラスタ化されて
いるインデックスに対し再び ALTER INDEX 文で TO CLUSTER オプションを実行
する場合クラスタ化されたインデックスを削除する必要はありません。
TO NOT CLUSTER オプション
NOT オプションは、物理的な表の状態に影響を及ぼさずに、< インデックス名 > の
クラスタ化属性を解除します。一つの表に対してクラスタ化インデックスは一つし
か存在できません。このために、他のインデックスにクラスタ化属性を割り当てる
前に、NOT オプションを使用して、すでにあるクラスタ化インデックスからクラス
タ化属性を解除しなければなりません。次の文は、あるインデックスのクラスタ属
性が解除され、別のインデックスによって表が物理的に再クラスタ化される例を示
します。
CREATE UNIQUE INDEX ix_ord
ON orders (order_num);
CREATE CLUSTER INDEX ix_cust
ON orders (customer_num);
.
.
.
ALTER INDEX ix_cust TO NOT CLUSTER;
ALTER INDEX ix_ord TO CLUSTER;
最初の二つの文は、表 orders にインデックスを作成し、列 customer_num を使い昇
順で物理的な表をクラスタ化しています。最後の二つの文は、列 order_num を使い
昇順で物理的な表を再クラスタ化しています。
SQL 文
2-35
ALTER INDEX 文
参照
関連する文は、
「CREATE INDEX 文」および「CREATE TABLE 文」です。
クラスタ化インデックスの説明については、
『Performance Guide』を参照してください。
2-36
Informix Guide to SQL:Syntax
ALTER TABLE 文
+
ALTER TABLE 文
表の設定を変更するために ALTER TABLE 文を使用します。
構文
ALTER TABLE
<表>
ALTER TABLE オプション
2-39 ページ
< シノニム >
要素
<表>
目的
変更する表の名前です。
< シノニム >
変更する表のシノニム名
です。
制限
構文
表が存在していなければなりま データベースオブジェク
せん。
ト名、4-25 ページ
シノニムとシノニムの指す表が データベースオブジェク
存在していなければなりません。 ト名、4-25 ページ
説明
ALTER TABLE 文を使用するには、次の条件のいずれかの条件を満たさなければな
りません。
■
表が含まれているデータベースに対してデータベースアクセス権 DBA を
持っている。
■
表の所有者である。
■
指定された表に対する変更アクセス権を持ち、表が含まれているデータ
ベースに対してリソースアクセス権を持っている。
一時表を変更することはできません。
参照制約を追加するには、参照される列または参照される表のいずれかに対して
DBA あるいは References アクセス権を持っていなければなりません。
どの種類の制約を追加する場合でも、制約名はデータベース内で一意でなければな
りません。
SQL 文
2-37
ALTER TABLE 文
ANSI
ANSI 標準準拠のデータベースでは、どの種類の制約を追加する場合でも、< 所有者
名 >.< 名前 > の組み合わせ ( 所有者名と制約名を組み合わせたもの ) はデータベー
ス内で一意でなければなりません。 ♦
データベースの制約を削除するには、DBA アクセス権を持っているか制約の所有者
でなければなりません。制約の所有者であっても表の所有者でない場合は、指定さ
れた表に対する変更アクセス権を持っていなければなりません。制約を削除するに
は、参照アクセス権は必要ありません。
ビューがそれに依存している表を変更すると、ビューが無効になることがあります。
違反表および診断表に対する制限
違反表および診断表に関連して ALTER TABLE 文を使用するときは、次の点を考慮
してください。
■
表が違反表および診断表を伴っているときは、その表の列を追加、削除あ
るいは変更することはできません。
■
違反表あるいは診断表を変更することはできません。
■
違反表あるいは診断表に制約を追加することはできません。
違反および診断表についての詳細は、2-594 ページ「START VIOLATIONS TABLE
文」を参照してください。
2-38
Informix Guide to SQL:Syntax
ALTER TABLE 文
ALTER TABLE オプション
データベース サーバは、指定される順番で ALTER オプションの操作を実行します。
操作のどれかに失敗すると、すべてのオペレーションがキャンセルされます。
ALTER TABLE 文へ戻る
2-37 ページ
ALTER TABLE オプション
,
ADD 節
2-42 ページ
DROP 節
2-54 ページ
MODIFY 節
2-56 ページ
ADD CONSTRAINT 節
2-60 ページ
DROP CONSTRAINT 節
2-63 ページ
1
MODIFY NEXT SIZE 節
2-64 ページ
1
LOCK MODE 節
2-65 ページ
IDS
ADD ROWIDS
DROP ROWIDS
ADD CRCOLS
DROP CRCOLS
AD/XP
TYPE
(
RAW
)
STATIC
OPERATIONAL
STANDARD
SQL 文
2-39
ALTER TABLE 文
IDS
ADD ROWIDS 節
Dynamic Server では、デフォルトとして断片化された表は隠れた行 ID を持ちません。
断片化された表で使用する、rowid と呼ばれる新しい列を追加するには、ADD
ROWIDS 節を使用します。データベース サーバは、行が存在する限り変わらない一
意な番号をそれぞれの行に割り当てます。データベース サーバは、行の物理的な格
納場所を検索するために使用するインデックスを作成します。ADD ROWIDS 節は他
の ALTER TABLE コマンドと同時に使用することはできません。行 ID を追加する
と、それぞれの行は行 ID を格納するための追加の 4 バイトを含むようになります。
ヒント : 断片化された表でのみ ADD ROWIDS 節を使用してください。断片化され
ていない表では、行 ID は変更されません。Informix では、行 ID を利用するのではな
く、アクセス方法として主キーを使用することをお勧めします。
行 ID についての詳細は、『Administrator’s Guide』を参照してください。
IDS
DROP ROWIDS 節
Dynamic Server では、CREATE TABLE 文や ALTER FRAGMENT 文で断片化された
表に行 ID を作成した場合にのみ、行 ID を削除するために DROP ROWIDS を使用
できます。断片化されていない表の行 ID を削除することはできません。DROP
ROWIDS 節は他の ALTER TABLE コマンドと同時に使用することはできません。
IDS
ADD CRCOLS 節と DROP CRCOLS 節
Dynamic Server では、エンタプライズレプリケーションが衝突の解決に使用する
シャドウ列、cdrserver および cdrtime を作成するために ADD CRCOLS 節を使用でき
ます。タイムスタンプまたはストアドプロシジャの衝突の解決に使用するには、先
にこれらの列を追加する必要があります。
シャドウ列 cdrserver と cdrtime を削除するには、DROP CLAUSE 節を使用します。
エンタプライズレプリケーションの使用中には、これらの列は削除できません。
詳細については、2-178 ページの「キーワード WITH CRCOLS」および『Guide to
Informix Enterprise Replication』を参照してください。
2-40
Informix Guide to SQL:Syntax
ALTER TABLE 文
AD/XP
TYPE オプション
Dynamic Server with AD and XP Options では、静的表またはロウ表に使用できるオプ
ションは TYPE オプションだけです。
TYPE オプションは、永続表の型を変更するために使用します。永続表には次の型
があります。
■
RAW は、簡単な追加を使用するログなし表です。
■
STATIC は、インデックスと参照制約を持つログなし表です。
■
OPERATIONAL は、アーカイブから復元することのできない、簡単な追加
を使用するログ付き表です。
■
STANDARD( 永続表のデフォルトの型 ) は、アーカイブからのロールバッ
ク、復旧、復元ができるログ付き表です。
TYPE オプションに関する制限
TYPE オプションには次の制限があります。
■
永続型は一時型に変更できません。
■
TEMP または SCRATCH の一時型は他の型に変更できません。
■
依型 GK インデックスを持つ表の型は変更できません。
■
表の型を STANDARD に変更するには、先にレベル 0 のアーカイブを実行す
る必要があります。
永続表の 4 つの型の詳細については、
『Informix Guide to SQL: Reference』を参照して
ください。
SQL 文
2-41
ALTER TABLE 文
ADD 節
表に列を追加するには ADD 節を使用します。
ALTER TABLE オプションへ
戻る
2-39 ページ
ADD 節
追加列節
ADD
,
(
追加列節
)
追加列節
< 新しい列名 >
データ型
4-27 ページ
新しい列に
対する制約の
定義
2-44 ページ
DEFAULT
節
2-43 ページ
要素
<列>
< 新しい列 >
目的
新しい列が配置される前の列の
名前です。
追加する列の名前です。
BEFORE
制限
列は、あらかじめ表に存在して
いなければなりません。
表がデータを含んでいる場合に
は、シリアル (SERIAL) 型列を
追加することはできません。
< 列名 >
構文
識別子、
4-112 ページ
識別子、
4-112 ページ
ADD 節には次の制限があります。
AD/XP
2-42
■
表にデータが含まれていると、表にシリアル (SERIAL) 型列を追加できません。
■
Dynamic Server with AD and XP Options では、ビットマップ インデックスを
持つ表には列を追加できません。 ♦
Informix Guide to SQL:Syntax
ALTER TABLE 文
DEFAULT 節
明示的に値を指定しないと、テータベースサーバが挿入するデフォルト値を指定で
きます。
DEFAULT 節
ADD 節へ戻る
2-42 ページ
DEFAULT
< リテラル >
NULL
USER
+
CURRENT
DATETIME
フィールド記述子
4-31 ページ
TODAY
SITENAME
DBSERVERNAME
要素
< リテラル >
目的
列のデフォルト値として英数字
の文字定数を使用することを定
義する定数項です。
制限
定数項は列に適切なタイプでな
ければなりません。
構文
式、4-33 ページ
2-161 ページの「デフォルト値と
しての定数項」を参照してくだ
さい。
シリアル (SERIAL) 列にデフォルトを設定することはできません。
変更された表にすでに行が存在する場合には、そのすべての行の新しい列にデフォ
ルト値が含まれます。
SQL 文
2-43
ALTER TABLE 文
「CREATE 文」の DEFAULT 節の説
DEFAULT 節のオプションについての詳細は、
明を参照して下さい。
新しい列制約の定義
新しい列制約の
定義
ADD 節へ戻る
2-42 ページ
UNIQUE
+
NOT NULL
+
DISTINCT
+
IDS
PRIMARY KEY
制約モード
オプション
2-45 ページ
制約モード
オプション
2-45 ページ
REFERENCES 節
2-47 ページ
CHECK 節
2-52 ページ
表にデータが含まれていると、新しい列に主キーあるいは一意性制約を指定できま
せん。しかし、一意性制約の場合は表は 1 行のデータを含むことができます。主
キー制約を持つ列を追加したい場合は、ALTER TABLE 文を実行する時点で、表が
空でなければなりません。
既存の列に主キーあるいは一意性制約を設定するときは、次の規則が適用されます。
2-44
■
列あるいは列のセットに主キーまたは一意性制約を設定する際に、その列
あるいは列のセットにすでに一意性のインデックスが存在する場合は、制
約はインデックスを共有します。既存のインデックスが重複を許容する場
合は、データベースサーバはエラーを返します。その場合は、制約を追加
する前に既存のインデックスを削除する必要があります。
■
列あるいは列のセットに主キーまたは一意性制約を設定する際に、その列
あるいは列のセットにすでに参照制約が存在する場合は、重複インデック
スは一意性インデックスにアップグレードされ ( 可能な場合 )、インデッ
クスが共有されます。
Informix Guide to SQL:Syntax
ALTER TABLE 文
バイト (BYTE) 型またはテキスト (TEXT) 型列に一意性の制約を設定することはで
きません。また、これらのタイプの列に参照制約を設定することもできません。検
査制約は設定できますが、検査できるのは IS NULL、IS NOT NULL、あるいは
LENGTH だけです。
ADD 節での NULL 値不可制約の使用
表にデータが含まれている場合、列を追加する際に NULL 値不可制約を指定すると
きは、DEFAULT 節も指定する必要があります。表にデータが含まれていない場合
は、追加の制限はないので、列の追加の際に NULL 値不可制約だけを指定できます。
次の文は、表のデータの有無にかかわらず、有効です。
ALTER TABLE items
ADD (item_weight DECIMAL(6,2)
DEFAULT 2.0 NOT NULL
BEFORE total_price)
制約モードオプション
IDS
Dynamic Server では、制約モードを使用して制約に名前を割り当て、制約のモード
を無効、有効、フィルタのどれかに設定します。 ♦
SQL 文
2-45
ALTER TABLE 文
AD/XP
Dynamic Server with AD and XP Options では、制約モードオプションを使用して制約
に名前を割り当てます。 ♦
新しい列制約の定義へ戻る 2-44 ページ
表レベル制約の定義へ戻る 2-61 ページ
制約モードの
オプション
CONSTRAINT
< 制約 >
IDS
DISABLED
ENABLED
FILTERING
WITH ERROR
WITHOUT ERROR
要素
< 制約 >
目的
制約に割り当てる名前です。
制限
なし
構文
識別子、
4-112 ページ
制約モードのオプションについての詳細は、2-172 ページの「制約モード オプショ
ン」を参照してください。
2-46
Informix Guide to SQL:Syntax
ALTER TABLE 文
REFERENCES 節
REFERENCES 節を使用すると、列に外部キー参照を指定できます。被参照列は、
参照列と同じ表にあることも、同じデータベースの別の表にあることもできます。
新しい列制約の定義へ戻る 2-44 ページ
表レベル制約の定義へ戻る 2-61 ページ
REFERENCES 節
REFERENCES
<表>
,
(
要素
<列>
<表>
<列>
+
)
ON DELETE CASCADE
目的
制限
構文
被参照列または被参照表の列の 2-48 ページの「REFERENCES 識別子、4-112 ページ
セットです。
節の < 列 > 変数に対する制限」
被参照表が参照表と異なる場合 を参照してください。
には、デフォルトは主キー列に
なります。被参照表が参照表と
同じ場合には、デフォルトはあ
りません。
被参照表の名前です。
被参照表は参照表と同じ表で
表名、4-25 ページ
も、同じデータベース上の異な
る表でも構いません。
SQL 文
2-47
ALTER TABLE 文
REFERENCES 節の < 列 > 変数に対する制限
被参照列 (< 列 > 変数で指定する列または列のセット ) に対する次の制限を守ってく
ださい。
■
被参照列のデータ型は、対応している参照列のデータ型と同じでなければ
なりません。唯一の例外は、被参照列がシリアル (SERIAL) 型の場合で、
このときは、参照列は整数 (INTEGER) 型でなければなりません。
■
被参照列あるいは被参照列のセットは、主キー列か一意な列でなければな
りません。すなわち、被参照表の被参照列はすでに主キーあるいは一意性
の制約を持っていなければなりません。
< 列 > 変数に指定する列の数には次の制限があります。
■
被参照表の被参照列の数は、参照表の参照列の数と一致しなければなりま
せん。
■
ADD 節あるいは MODIFY 節で REFERENCES 節を使用する場合は、< 列名 >
変数に一つの列だけを指定できます。
■
ADD CONSTRAINT 節で REFERENCES 節を使用した場合は、< 列名 > 変数に
一つの列あるいは複数の列を指定できます。
■
最大で 16 列名まで指定できます。すべての列の合計長が 255 バイトを超え
ることはできません。
ALTER TABLE 文での REFERENCES 節の使用
REFERENCES 節は、別の表または同じ表の列あるいは列のセットを参照するのに
使用します。ADD 節または MODIFY 節を使用しているときは、単一の列のみ参照
できます。ADD CONSTRAINT 節を使用しているときは、単一の列あるいは列の
セットを参照できます。
REFERENCES 節で参照される表は、変更される表と同じデータベースに格納され
ていなければなりません。
2-48
Informix Guide to SQL:Syntax
ALTER TABLE 文
参照制約により二つの表あるいは同じ表にある列間の関係が設定されます。列間の
関係は普通「親子」関係で表されます。すべての子 ( 参照 ) 列のエントリに対して、
親 ( 被参照 ) 列に一致するエントリがなければなりません。
被参照列 ( 親あるいは主キー列 ) は、主キー制約または一意性を持った列でなけれ
ばなりません。この規準を満たさない列を REFERENCES 節で指定すると、データ
ベースサーバはエラーを返します。
列追加節で指定する参照列 ( 子列あるいは外部キー列 ) は、NULL あるいは重複値
を含むことができます。しかし、参照列にあるすべての値 ( すなわち、非 NULL を
含んでいるすべての外部キー列の値 ) は被参照列の値と一致しなければなりません。
参照列と被参照列の間の関係
参照制約は、参照列と被参照列の間に 1 対 1 の関係を規定します。主キーが列の
セットである場合、外部キーも主キーに対応した列のセットでなければなりませ
ん。次の例では、表 cust_calls に新しい列 ref_order を作成しています。ref_order 列
は表 orders にある列 order_num を参照している外部キーです。
ALTER TABLE cust_calls ADD
ref_order INTEGER
REFERENCES orders (order_num) BEFORE user_id
他の表の主キーを参照する場合、その表の主キー列を明示的に記述する必要はあり
ません。被参照列が指定されていない被参照表があるときは、デフォルトにより主
キー列になります。前出の例では、列 order_num が表 orders の主キーなので、その
列を明示的に参照する必要はありません。
ある列または列のセットに参照制約を設定するときに、その列または列のセットに
すでに重複インデックスか一意性インデックスが存在する場合は、インデックスは
共有されます。
主キー列のデータ型がシリアル (SERIAL) 型である場合を除き、参照列のデータ型
と被参照列のデータ型は同一でなければなりません。シリアル (SERIAL) 型列を参
照する列を追加するときは、追加される列は整数 (INTEGER) 型列でなければなり
ません。
SQL 文
2-49
ALTER TABLE 文
ON DELETE CASCADE 節の使用
カスケード削除を使って、親表の行を削除するときに子表にある行も削除するかど
うかを指定することができます。通常は、子表が親表にあるデータに関連付けされ
ているときはそのデータを削除できません。ON DELETE CASCADE 節を使用して、
子表にある行を削除するかどうかを決定することができます。ON DELETE
CASCADE 節を使って ( あるいはカスケード削除により ) 親表にある行を削除する
と、子表にあるその行に関連付けされているすべての行 ( 外部キー ) も削除されま
す。カスケード削除機能の主な利点は、削除操作を実行する際に記述しなければな
らない SQL 文の量を減らせることです。
たとえば、表 stock は列 stock_num を主キーとして含んでいます。表 catalog は外部
キーとして列 stock_num を参照しています。次の ALTER TABLE 文は ( カスケード
削除を使わずに ) 既存の外部キー制約を削除し、カスケード削除を指定する新しい
制約を追加しています。
ALTER TABLE catalog DROP CONSTRAINT aa
ALTER TABLE catalog ADD CONSTRAINT
(FOREIGN KEY (stock_num, manu_code) REFERENCES stock
ON DELETE CASCADE CONSTRAINT ab)
子表に指定されたカスケード削除により、表 stock から取扱品目が削除されるだけ
でなく、stock_num 外部キーにより関連付けされている表 catalog へ削除がカスケー
ドされます。もちろんこのカスケード削除が作動するのは、削除されようとしてい
る stock_num がまだ注文されていないときに限ります。そうでないときは、表 items
の制約によりカスケード削除は許容されません。詳細については 2-51 ページの「複
数の子表への影響」を参照してください。
カスケード削除は ADD CONSTRAINT 節における REFERENCES 節によって指定し
ます。カスケード削除を指定するには参照アクセス権だけが必要です。表にカス
ケード削除を指定するためには、削除アクセス権は必要ありません。しかし
DELETE 文で参照される表に対する削除アクセス権は必要です。カスケード削除を
指定して、親表から行を削除すると、データベースサーバは関連付けされているす
べての一致する行を子表から削除します。
ON DELETE CASCADE 節制約付きで REFERENCES 節を追加するときは、ADD
CONSTRAINT 節を使用してください。
2-50
Informix Guide to SQL:Syntax
ALTER TABLE 文
複数の子表への影響
一つの親表と二つの子表があり、一つの子表にはカスケード削除が指定され、他の
子表には指定されていない場合に、両方の子表に関連がある行を親表から削除しよ
うとすると削除文は失敗します。その場合、親表と子表どちらからも行は削除され
ません。
前出の例では、表 stock は表 items の親でもあります。注文されていない項目のみを
削除する場合には、表 items にカスケード削除節を追加する必要はありません。表
items は注文があった取扱品目だけに使用されるからです。
ロック機能とログ機能
削除の実行中、データベースサーバは参照表と被参照表にあるすべての関連行をロッ
クします。削除を実行するときはログ機能をオンにしなければなりません。データ
ベースのログ機能をオフにしておくと、それが一時的なものであっても削除はカス
ケードされません。ログ機能がオフになっているとロールバックを行うことができな
くなるため、このような制限が用意されています。たとえば、親行が削除された後、
子行が削除される前にシステムがクラッシュした場合、データベースは親なしの子レ
コードを持ってしまうからです。そのようなレコードは参照整合性に違反します。た
だしログ機能がオンに戻ると、それ以降の削除はカスケードされます。
カスケード削除に対する制限
相関副問合せの場合を除き、ほとんどの削除にカスケード削除を使用できます。相
関副問合せでは、副問合せ ( あるいは内部 SELECT 文 ) が生成する値が、これを含
む外部 SELECT 文によって生成される値に依存する場合、副問合せが相関状態にな
ります。カスケード削除を指定すると、相関副問い合わせで子表を使用する削除を
記述することはできません。このような相関副問い合わせを含んでいる問い合わせ
から削除を行おうとすると、エラーが返されます。
削除トリガのある表に対してもカスケード削除参照制約は指定できません。削除ト
リガのある表に ON DELETE CASCADE 節を指定する参照制約を追加しようとする
と、エラーが返されます。
SQL 文
2-51
ALTER TABLE 文
参照制約作成時のロック
参照制約を作成するとき、排他ロックが被参照表に設定されます。このロックは、
ALTER TABLE 文が終了するか、( トランザクションでデータベースの表を変更し
ている場合 ) トランザクションの最後に解放されます。
CHECK 節
検査制約は、データが列に挿入される前に適合しなければならない条件を指定しま
す。挿入あるいは更新の際に、表に定義されている検査制約に基づいた行の評価が
偽となると、データベースはエラーを返します。
新しい列制約の定義へ戻る 2-44 ページ
表レベル制約の定義へ戻る 2-61 ページ
CHECK 節
CHECK
(
条件セグメン
ト 4-5 ページ
)
検査制約は検索条件を使用して定義されます。検索条件には次の項目を含むことは
できません。副問合せ、集計式、ホスト変数、行 ID あるいはストアドプロシジャ
呼出し、さらに、探索条件は次の CURRENT 関数、USER 関数、SITENAME 関数、
DBSERVERNAME 関数、TODAY 関数も含むことはできません。
複数の表の列に関係するような検査制約を作成することはできません。ADD 節あ
るいは MODIFY 節を使用している場合は、検査制約は同じ表の他の列の値に依存
することはできません。次の例は、表 items に新しい列 unit_price を追加し、それに
入力された値が 0 よりも大きいことを確認する検査制約を設定しています。
ALTER TABLE items
ADD (unit_price MONEY (6,2) CHECK (unit_price > 0) )
2-52
Informix Guide to SQL:Syntax
ALTER TABLE 文
複数の列にある値を検査する制約を作成するには、ADD CONSTRAINT 節を使用し
ます。次の例は、前出の例で追加された列に制約を作成しています。この検査制約
は表の二つの列にまたがっています。
ALTER TABLE items ADD CONSTRAINT
CHECK (unit_price < total_price)
BEFORE オプション
新しい列あるいは列のリストをどの列の前に追加するかを指定するのに ADD 節の
BEFORE オプションを使用します。BEFORE オプションで指定する列は表に既存の
列でなければなりません。
ADD 節に BEFORE オプションを指定しないときには、データベースサーバは新し
い列または列のリストを、デフォルトである表の定義範囲の最後に追加します。
次の例では、列 item_weight を列 total_price の前に追加するために、ADD 節に
BEFORE オプションを指定しています。
ALTER TABLE items
ADD (item_weight DECIMAL(6,2) NOT NULL
BEFORE total_price)
次の例では、表の最後に列 item_weight を追加すればよいため、ADD 節に BEFORE
オプションを使用していません。
ALTER TABLE items
ADD (item_weight DECIMAL(6,2) NOT NULL)
SQL 文
2-53
ALTER TABLE 文
DROP 節
DROP 節は表から一つ以上の列を削除するのに使用します。
DROP 節
ALTER TABLE オプションへ
戻る 2-39 ページ
DROP
< 列名 >
,
(
要素
<列>
目的
削除する列の名前です。
< 列名 >
)
制限
構文
列が表の最後の列の場合には削 識別子、
除することはできません。
4-112 ページ
列は、表にあらかじめ存在して
いなければなりません。列が式
で参照されている場合には削除
することはできません。
表のすべての列を削除する ALTER TABLE DROP 文は実行できません。最低一つの
列が表に残る必要があります。
断片化ストラテジの一部である列は削除できません。
AD/XP
Dynamic Server with AD and XP Options では、依存型 GK インデックスを持つ表に対
しては DROP 節を使用できません。 ♦
列の削除が制約に与える影響
次のリストで示しているように、列を削除するとその列に設定されていたすべての
制約は削除されます。
2-54
■
すべての単一列制約は削除されます。
■
その列を参照しているすべての参照制約は削除されます。
Informix Guide to SQL:Syntax
ALTER TABLE 文
■
その列を参照しているすべての検査制約は削除されます。
■
その列が複数列の一意性または主キー制約の一部である場合は、その複数
列に設定されている制約も削除されます。結果として、その複数列を参照
しているすべての参照制約の削除してしまいます。
ある列が削除されるとその列に関連付けされていたすべての制約が削除されるため
この節を使用すると他の表の構造を変更してしまう場合があります。たとえば、他
の表から参照されている主キーまたは一意性である列を削除すると、その参照制約
も削除されます。この場合、他の表もその構造が変更されることになります。
IDS
列の削除がトリガに与える影響
Dynamic Server では、UPDATE トリガのトリガ列リストで実行される列を削除する
と、その列はトリガ列リストから削除されます。その列がトリガ列リストの唯一の
メンバ列であるときは表からトリガが削除されます。UPDATE トリガのトリガ列に
ついての詳細は、2-198 ページの「CREATE TRIGGER 文」を参照してください。
列の削除がビューに与える影響
列を削除することにより表を変更しても、その列に依存しているビューは変更され
ません。しかしながら、そのビューを使用しようとすると、列が見つかりませんと
いうエラーメッセージが返されます。
ある列を削除してから同じ名前の新しい列を追加する場合は、表にある列の順番を
変更することができるためビューは削除されません。変更した表に基づいている
ビューは引き続き機能し、当初の列順を維持します。
AD/XP
列の削除が GK インデックスに与える影響
Dynamic Server with AD and XP Options では、依存型 GK インデックスを持つ表の列
を削除すると、削除された列を参照する、その表の GK インデックスも削除されま
す。削除された表を参照する、別の表の GK インデックスも削除されます。
SQL 文
2-55
ALTER TABLE 文
MODIFY 節
MODIFY 節は、列のデータ型および文字型列の長さの変更、列へのデフォルト値の
追加 / 変更、列に対する NULL の許可 / 不許可に使用します。
MODIFY 節
ALTER TABLE オプションへ戻る
2-39 ページ
列変更節
MODIFY
,
(
列変更節
)
列変更節
<列>
データ型
4-27 ページ
DEFAULT 節
2-43 ページ
要素
<列>
AD/XP
2-56
目的
変更する列の名前です。
新しい列に対す
る制約の定義
2-44 ページ
制限
列は、表にあらかじめ存在して
いなければなりません。
構文
識別子、4-112 ページ
Dynamic Server with AD and XP Options では、依存型 GK インデックスを持つ表に対
しては MODIFY 節を使用できません。 ♦
Informix Guide to SQL:Syntax
ALTER TABLE 文
列を変更すると、列にそれまで関連付けられていたすべての属性 ( すなわち、デ
フォルト値、単一列検査制約または参照制約 ) が削除されます。列に主キーのよう
な特定の属性を引き続き持たせたい場合は、それらの属性を再び指定してくださ
い。たとえば、既存の列 quantity のデータ型を小桁整数 (SMALLINT) 型に変更し、
そのデフォルト値 ( この場合は 1) およびその列の非 NULL 属性を保持したいとき
は、次のような ALTER TABLE 文を実行します。
ALTER TABLE items
MODIFY (quantity SMALLINT DEFAULT '1' NOT NULL)
ヒント : どちらの属性も MODIFY 節でもう一度指定されます。
関連付けされている列制約を持つ列を変更すると、次に示す制約は削除されます。
■
すべての単一列制約は削除されます。
■
その列を参照しているすべての参照制約は削除されます。
■
変更された列が複数列複数列主キー制約または一意性制約の一部である場
合は、その複数列を参照しているすべての参照制約も削除されます。
たとえば、一意性制約を持っている列を変更すると、その一意性制約は削除されま
す。その列が他の表の列によって参照されていると、それらの参照制約も削除され
ます。さらに、この列が複数列複数列主キー制約または一意性制約の一部であると
きは、その複数列制約は削除されませんが、他の表によりその列に設定されている
あらゆる参照制約は削除されます。たとえば、ある列が複数列主キー制約の一部で
あるとします。この主キーは他の二つの表にある外部キーによって参照されていま
す。この列が変更されると、その複数列主キー制約は削除されませんが、他の二つ
の表によってその列に設定されている参照制約は削除されます。
IDS
Dynamic Server では、UPDATE トリガのトリガ列リストにある列を変更しても、ト
リガは変更されません。♦
バイト (BYTE) 型列およびテキスト (TEXT) 型列の変更
MODIFY 節を使用してバイト (BYTE) 型列をテキスト (TEXT) 型列に変更できます。
また、その逆の変更もできます。しかし、MODIFY 節を使用してバイト (BYTE) 型
列またはテキスト (TEXT) 型列をほかの型の列に変更したり、ほかの型の列をバイ
ト (BYTE) 型列またはテキスト (TEXT) 型列に変更することはできません。
SQL 文
2-57
ALTER TABLE 文
次のシリアル番号の変更
シリアル (SERIAL) 型列の次の値をリセットするのに MODIFY 節を使用できます。
データベースサーバが重複値を生成する原因となるので、列のその時点での最も大
きい値より小さい値を次の値として設定することはできません。しかし、現在の最
も大きい値よりもさらに大きい値を次の値として設定し、番号を飛ばすことは可能
です。
表の構造の変更
MODIFY 節を使って他の表の構造を変更することもできます。変更された列が他の
表により参照されていると、それらの参照制約は削除されます。その場合、ALTER
TABLE 文を使って参照表に再度それらの制約を追加しなければなりません。
既存の列のデータ型を変更すると、すべてのデータは新しいデータ型に変換されま
す。これには、文字から数値、数値から文字への変換を含みます。次の文は列
quantity のデータ型を変更します。
ALTER TABLE items MODIFY (quantity CHAR(6))
主キー制約あるいは一意性が存在しているときは、その制約に対して違反にならな
い場合にのみ変換が行われます。データ型変換が重複値を生じさせるときは ( たと
えば、実数 (FLOAT) 型を小桁実数 (SMALLFLOAT) 型に変更する、あるいは文字
(CHAR) 型値を切り捨てることにより )、ALTER TABLE 文の実行は失敗します。
NULL を持つ表の変更
変更前に NULL を許していた既存の列を、実際その列に NULL が含まれていなけれ
ば NULL を許さないように変更することができます。これを行うには、MODIFY
節に同じ < 列名 >、データ型およびキーワード NOT NULL を指定します。キーワー
ド NOT NULL は、その列に NULL 値不可制約を作成します。
変更前に NULL を許していなかった既存の列を、NULL を許すように変更できま
す。これを行うには、MODIFY 節に < 列名 > および既存のデータ型を指定し、キー
ワード NOT NULL を省略します。キーワード NOT NULL が省略されると、その列
に対する NULL 値不可制約は削除されます。
2-58
Informix Guide to SQL:Syntax
ALTER TABLE 文
変更前に NULL を許していなかった既存の列を、NULL を許すようにするもう一つ
の方法は、DROP CONSTRAINT 節を使用して列の NULL 値不可制約を削除するこ
とです。
IDS
既存の行が制約に違反するときに制約を追加する方法
Dynamic Server では、MODIFY 節を使用して有効モードで制約を追加しようとした
ときに、既存の行が制約に違反しているためにエラーメッセージを受け取る場合
は、次の手順によって制約を追加することができます。
1.
無効モードで制約を追加します。
ALTER TABLE 文を再度実行します。ただし、今回は MODIFY 節にキー
ワード DISABLED を指定します。
2.
START VIOLATIONS TABLE 文を使って、対象の表に対して違反表と診断
表を起動します。
3.
SET 文を実行して、制約のデータベースオブジェクトモードを有効モードに
切り替えます。
この文を実行すると、対象となる表の制約に違反している既存の行が違反
表に複写されます。ただし、整合性違反エラーメッセージが返され、制約
は無効のままです。
4.
違反表に SELECT 文を実行して、対象の表から複写された制約に反する行
を取り込みます。
必要な情報のすべてを得るためには、違反表と診断表を結合する必要があ
るかも知れません。
5.
対象の表の制約に違反している行について訂正処置をとります。
6.
対象の表にあるすべての違反行を訂正したら、SET 文を実行して制約無効
モードを有効モードに切り替えます。
今度は制約が有効になります。また、対象となっている表にある、すべて
の行が新しい制約を満たしているので整合性違反エラーメッセージも返さ
れません。
SQL 文
2-59
ALTER TABLE 文
AD/XP
列の変更が GK インデックスに与える影響
Dynamic Server with AD and XP Options では、列を変更すると、その列を参照する
GK インデックスで使用される列が、変更された列の新しいデータ型と互換性がな
い場合、その GK インデックスは削除されます。
たとえば、10 進数 (NUMERIC) 型の列が文字 (CHARACTER) 型に変更された場合、
その列に関係する GK インデックスで数式を含むものは削除されます。
ADD CONSTRAINT 節
ADD CONSTRAINT 節
ALTER TABLE オプションへ戻る
2-39 ページ
表レベル制約の
定義
2-61 ページ
ADD CONSTRAINT
,
(
表レベルの制約の
定義
2-61 ページ
)
新しいまたは既存の、列あるいは列のセットに制約を指定するには、ALTER
TABLE 文の ADD CONSTRAINT 節を使用します。たとえば、表 customer の列
fname と lname に対して一意性の制約を追加するには、次の文を使用します。
ALTER TABLE customer
ADD CONSTRAINT UNIQUE (lname, fname)
制約に名前を付けるには、前出の文を次の例のように変更します。
ALTER TABLE customer
ADD CONSTRAINT UNIQUE (lname, fname) CONSTRAINT u_cust
制約名を記述しなかった場合は、データベースサーバが名前を付けます。システム
カタログ表 sysconstraints を検索すれば制約名は見つかります。システムカタログ表
『Informix Guide to SQL: Reference』を参照してくだ
sysconstraints についての詳細は、
さい。
2-60
Informix Guide to SQL:Syntax
ALTER TABLE 文
表レベル制約の定義
表レベル制約の定義では、表レベル制約の追加に使用します。
ADD CONSTRAINT 節へ戻る
2-60 ページ
表レベル制約の定義
,
(
UNIQUE
<列>
)
+
+
制約モード
2-45 ページ
DISTINCT
,
PRIMARY KEY
FOREIGN KEY
(
<列>
)
REFERENCES 節
2-47 ページ
CHECK 節
2-52 ページ
要素
<列>
目的
制限
制約が適用される列の名前です。 列の最大数は 16 ですべての列
の合計の長さが 255 バイト以下
でなければなりません。
構文
識別子、
4-138 ページ
表レベル制約は、一つの列または複数の列のセットに対して定義できます。複数の
列に対する制約に含めることのできる列名は 16 までです。列のリストの合計長が
255 バイトを超えることはできません。
制約に名前を割り当て、モードを設定するには、制約モード オプションを使用しま
す。個々の制約モードについての詳細は、2-45 ページの「制約モードオプション」
を参照してください。
制約名は、データベース内で一意でなければなりません。
SQL 文
2-61
ALTER TABLE 文
ANSI
ANSI標準準拠データベースでは、
<所有者>.<名前>の組み合わせ(所有者名と制約名
を組み合わせたもの ) はデータベース内で一意でなければなりません。 ♦
主キーまたは一意性制約の追加
主キー制約または一意性制約を追加した列または列のセットには、一意の値だけを
入れることができます。
列あるいは列のセットに対して主キー制約または一意性制約を設定するとき、その
列あるいは列のセットにすでに一意性インデックスがあると、制約はインデックス
を共有します。既存のインデックスが重複を許容する場合、データベースサーバは
エラーを返します。制約を追加する前に既存のインデックスを削除しなければなり
ません。
列あるいは列のセットに主キーまたは一意性制約を設定する場合で、その列あるい
は列のセットにすでに参照制約が存在するときは、重複を許容するインデックスは
( もし可能なら ) 一意性インデックスにアップグレードされ、インデックスが共有
されます。
参照制約の追加
列あるいは列のセットに参照制約を設定する場合で、その列あるいは列のセットに
すでにインデックスが存在するときは、そのインデックスは ( もし可能なら ) 一意
性インデックスにアップグレードされ、インデックスが共有されます。
制約を追加するときに必要なアクセス権
表を所有しているか、表に対する変更アクセス権を持っている場合、その表に、検
査、主キーまたは一意性制約を作成することができ、自らをその制約の所有者に指
定できます。参照制約を追加するときは、被参照列か被参照表に対する参照アクセ
ス権を持っていなければなりません。データベースアクセス権 DBA を持っている
と、他のユーザのために制約を作成することができます。
2-62
Informix Guide to SQL:Syntax
ALTER TABLE 文
IDS
制約違反からの復元
Dynamic Server では、ADD CONSTRAINT 節を使って有効モードで表レベル制約を
追加し、既存の行が制約に違反しているためエラーメッセージを受け取った場合に
は、ある手順にしたがって制約を追加することができます。その手順については、
2-59 ページの「既存の行が制約に違反するときに制約を追加する方法」を参照して
ください。
DROP CONSTRAINT 節
ALTER TABLE オプションへ戻る
2-39 ページ
DROP CONSTRAINT 節
< 制約 >
DROP CONSTRAINT
,
(
要素
< 制約 >
< 制約 >
目的
制限
削除したい制約の名前です。 制約が存在していなければ
なりません。
)
構文
データベースオブジェクト
名、4-25 ページ
DROP CONSTRAINT 節は、名前の付いた制約を削除するのに使用します。
既存の制約を削除するには、キーワード DROP CONSTRAINT と制約名を指定しま
す。次の文は、制約を削除する文の例です。
ALTER TABLE manufact DROP CONSTRAINT con_name
制約が作成されたときに < 制約 > を指定しなかった場合は、データベースサーバが
名前を生成します。システムカタログ表 sysconstraints に対して制約名とその所有者
を問合せることができます。たとえば、表 items に設定されている制約の名前を検
索するには、次の文を実行します。
SELECT constrname FROM sysconstraints
WHERE tabid = (SELECT tabid FROM systables
WHERE tabname = 'items')
SQL 文
2-63
ALTER TABLE 文
対応する外部キーを持つ主キー制約あるいは一意性制約を削除すると、参照制約も
削除されます。たとえば、表 orders の列 order_num に対する主キー制約を削除した
場合、表 items に外部キーとして order_num が存在すると、その参照制約も削除さ
れます。
MODIFY NEXT SIZE 節
MODIFY NEXT SIZE 節
ALTER TABLE オプションへ戻る
2-39 ページ
MODIFY NEXT SIZE
要素
目的
< キロバイト > 同じ表の次のエクステントに割
り当てたい長さをキロバイトで
指定します。
< キロバイト >
制限
構文
最低長は、ご使用のシステムの
式、4-33 ページ
ディスクページの 4 倍です。たと
えば、2 キロバイトのページシス
テムの場合、最低長は 8 キロバイ
トになります。最大長はチャンク
サイズと同じになります。
次に来るエクステントのサイズを変更するには MODIFY NEXT SIZE 節を使用しま
す。エクステントのサイズを 32 キロバイトに指定したいときは、次の例のような
文を使用してください。
ALTER TABLE customer MODIFY NEXT SIZE 32
既存のエクステントのサイズは変更されません。全てのデータをアンロードしなけ
れば、既存のエクステントのサイズは変更されません。
2-64
Informix Guide to SQL:Syntax
ALTER TABLE 文
既存のエクステントのサイズ変更
既存のエクステントのサイズを変更するには、データをすべてアンロードしてから、
データベーススキーマの CREATE TABLE 文のエクステントと追加エクステントの
サイズを変更し、データベースを再作成してデータを再ロードします。エクステン
トサイズの変更についての詳細は、
『Administrator’s Guide』を参照してください。
LOCKMODE 節
表のロックモードを変更するにはキーワード LOCK MODE を使用します。デフォ
ルトのロックモードは PAGE です。
LOCK MODE 節
ALTER TABLE オプションへ戻る
2-39 ページ
LOCK MODE
(
PAGE
)
ROW
AD/XP
TABLE
行レベルのロックを行うと、最高の同時実行性が実現できます。ただし、数多くの
行を一度に使用する場合はロック管理のためのオーバーヘッドもかなりの量になり
ます。また、オペレーティングシステムの設定によっては、使用できるロックの最
大数を超えてしまうこともあります。
ページロック機能を使用すると、行のページ全体にロックを設定したり解除したり
できます。ページロック機能は、行がページ単位にグループ化され、行の順序が処
理を行う順序と同じである場合に特に便利です。たとえば、表の内容を、そのクラ
スタ インデックスと同じ順序で処理する場合にページロック機能は特に適していま
す。既存の表のロックモードを変更するには、ALTER TABLE 文を使用します。
AD/XP
Dynamic Server with AD and XP Options では、表をロックすると、表全体がロックさ
れます。このようなロックは行ロックやページロックに比べ、更新の同時実行性が
低下します。表をロックしても、複数の読み取り専用トランザクションは表にアク
セスできます。表ロックでは、表のロック管理オーバーヘッドが低減されます。♦
SQL 文
2-65
ALTER TABLE 文
参照
関連する文は、
「CREATE TABLE 文」
、
「DROP TABLE 文」
、
「LOCK TABLE 文」
、お
よび「SET Database Object Mode 文」です。
データの整合性制約と ON DELETE CASCADE についての説明は、『Informix Guide
to SQL: Tutorial』を参照してください。
データベースと表の作成についての説明は、
『Informix Guide to Database Design and
Implementation』を参照してください。
表を変更する場合の最大限のパフォーマンスについての情報は、お手持ちの
『Performance Guide』を参照してください。
2-66
Informix Guide to SQL:Syntax
BEGIN WORK 文
BEGIN WORK 文
+
トランザクション (COMMIT WORK 文あるいは ROLLBACK WORK 文を実行するこ
とによって終了する一連のデータベース操作 ) を開始するには BEGIN WORK 文を
使用します。他のデータベースサーバにレプリケートしないトランザクションを開
始するには BEGIN WORK 文にキーワード WITHOUT REPLICATION を指定します。
構文
BEGIN
WORK
IDS
WORK WITHOUT REPLICATION
説明
UPDATE、DELETE あるいは INSERT 文の実行で影響を受けるそれぞれの行はトランザク
ションの間ロックされたままになります。そのような文を数多く含んでいるか、数多くの
行に影響する文を含んでいるトランザクションは、ユーザのオペレーティングシステムあ
るいはデータベースサーバが課している同時に実行できるロックの最大数に対する制限を
超えてしまうおそれがあります。もし他のユーザが誰もその表をアクセスすることがない
ならば、トランザクションを開始した後で LOCK TABLE 文を使って表全体をロックする
ことによりロック機能のオーバーヘッドを減らし、ロックの上限を上回ることを回避する
ことが可能です。他のロック同様、この表ロックはトランザクションが終了すると解除さ
れます。2-69 ページのトランザクション例に、LOCK TABLE 文があります。
重要 : BEGIN WORK 文を実行できるのは、トランザクションが進行中ではないと
きだけです。もしトランザクションの途中で BEGIN WORK 文を実行すると、デー
タベースサーバはエラーを返します。
E/C
ESQL/C では、BEGIN WORK 文を WHENEVER 文が呼び出したルーチンで使用する
ときは、ROLLBACK WORK 文の前に WHENEVER SQL ERROR CONTINUE 文と
WHENEVER SQL WARNING CONTINUE 文を指定してください。これらの文がある
と、ROLLBACKWORK 文がエラーあるいは警告に遭遇した場合にプログラムが
ループするのを防げます。 ♦
SQL 文
2-67
BEGIN WORK 文
キーワード WORK
BEGIN WORK 文のキーワード WORK は必須ではありません。次の二つの文は同じ
です。
BEGIN;
BEGIN WORK;
ANSI
BEGIN WORK と ANSI 標準準拠データベース
ANSI 標準準拠データベースの場合、トランザクションは暗黙的に実行されるので、
BEGIN WORK 文は必要ありません。次のような文のどれかの直後に BEGIN WORK
文を使用すると警告が生成されます。
■
DATABASE 文
■
COMMIT WORK 文
■
CREATE DATABASE 文
■
ROLLBACK WORK 文
これら以外の文の後で BEGIN WORK 文を使用するとエラーが生成されます。
IDS
BEGIN WORK WITHOUT REPLICATION
Dynamic Server でデータ レプリケーションにエンタプライズ レプリケーションを使
用する場合、BEGIN WORK 文にキーワード WITHOUT REPLICATION を指定して、
別のデータベースサーバにレプリケートしないトランザクションを開始できます。
BEGIN WORK 文にキーワード WITHOUT REPLICATION を指定すると、DECLARE
< カーソル > CURSOR WITH HOLD は使用できません。
データレプリケーションの詳細については、
『Guide to Informix Enterprise
Replication』を参照してください。
2-68
Informix Guide to SQL:Syntax
BEGIN WORK 文
BEGIN WORK の例
次のコードの部分は、トランザクションで文を指定するときの例を示します。トラ
ンザクションは、BEGIN WORK 文と COMMIT WORK 文の間の文から構成されま
す。このトランザクションは stock という表をロックし (LOCK TABLE)、stock の行
を更新し (UPDATE)、stock から行を削除し (DELETE)、manufact という表に行を挿
入します (INSERT)。データベースサーバは、この一連の操作を完全に実行するか、
まったく実行しないかのどちらかです。データベースサーバはすべての文が完全に
ディスクに対して実行されるか、またはデータベースがトランザクションが開始さ
れる前の状態に戻ることを保証します。
BEGIN WORK;
LOCK TABLE stock;
UPDATE stock SET unit_price = unit_price * 1.10
WHERE manu_code = 'KAR';
DELETE FROM stock WHERE description = 'baseball bat';
INSERT INTO manufact (manu_code, manu_name, lead_time)
VALUES ('LYM', 'LYMAN', 14);
COMMIT WORK;
参照
関連する文は、
「COMMIT WORK 文」および「ROLLBACK WORK 文」です。
トランザクションおよびロック機能については、
『Informix Guide to SQL: Tutorial』
を参照してください。
SQL 文
2-69
CLOSE 文
CLOSE 文
E/C
これ以上、SELECT カーソルまたは PROCEDURE カーソルによって生成された行
を参照する必要がなくなったとき、あるいは INSERT カーソルをフラッシュしてク
ローズしたいときに。
CLOSE 文は ESQL/C で使用します。
構文
< カーソル識別子 >
CLOSE
< カーソル識別子変数 >
要素
< カーソル識
別子 >
< カーソル識
別子変数 >
目的
制限
構文
クローズするカーソルの名前です。 DECLARE 文であらかじめカーソ 識別子、
ルを宣言している必要があります。 4-112 ページ
< カーソル識別子 > の値を保持す ホスト変数は文字データ型でなけ 名前は変数名に
ればなりません。カーソルを宣言 対する言語固有
るホスト変数です。
している必要があります。ANSI
の規則に従って
標準準拠のデータベースでカーソ いなければなり
ルをクローズするには、その前に ません。
そのカーソルがオープンされてい
なければなりません。
説明
カーソルをクローズすると、OPEN 文または FREE 文以外の文でそのカーソルが使
えなくなり、データベース サーバがそのカーソルに割り当てていた資源が解放され
ます。CLOSE 文は INSERT 文に関連したカーソルと、SELECT 文または EXECUTE
PROCEDURE 文に関連したカーソルとではその取扱い方が異なります。
オープンされていないカーソルをクローズすること、あるいはすでにクローズされ
ているカーソルをクローズすることができます。これらの場合は何の動作も行われ
ません。
2-70
Informix Guide to SQL:Syntax
CLOSE 文
ANSI
ANSI 標準準拠のデータベースでは、オープンされていないカーソルをクローズし
ようとするとデータベース サーバからエラーが返されます。 ♦
SELECT カーソルあるいは PROCEDURE カーソルを
クローズする
カーソル識別子が SELECT 文または EXECUTE PROCEDURE 文に関連付けられて
いるとき、カーソルをクローズすると、SELECT 文または EXECUTE PROCEDURE
文が終了します。データベース サーバは、行のアクティブ セット、つまり整列さ
れたセットを保持するために使用する一時表などに割り当てられたすべての資源を
解放します。データベース サーバはまた、カーソルにより選択された行にかけられ
ていたすべてのロックを解除します。もしトランザクションが CLOSE 文を含んで
いた場合は、データベース サーバは COMMIT WORK 文または ROLLBACK WORK
文が実行されるまではロックを解除しません。
SELECT カーソルあるいは FUNCTION カーソルをクローズした後では、カーソル
をもう一度オープンするまでは、そのカーソルを指名している FETCH 文は実行で
きません。
INSERT カーソルをクローズする
カーソル識別子が INSERT 文に関連付けられているときは、CLOSE 文はバッファ
内に残ったすべての行をデータベースに書き込みます。データベースに正常に挿入
された行の数が sqlca 構造体の sqlerrd 配列の第 3 要素 (sqlca.sqlerrd[2]) に返されま
す。挿入された行の合計数をカウントするための sqlerrd の使用方法については、2417 ページの「PUT 文」を参照してください。
sqlca 構造体の SQLCODE フィールド (sqlca.sqlcode) は、INSERT カーソルについて
の CLOSE 文の結果を示します。すべてのバッファ内の行が正常に挿入されると、
SQLCODE はゼロに設定されます。もしエラーが発生すると、SQLCODE の
sqlca.sqlcode フィールドは負のエラーメッセージ番号に設定されます。
SQLCODE がゼロのとき、行バッファ領域が解放され、カーソルがクローズされま
す。すなわち、そのカーソルを再度オープンするまでそのカーソルを指名している
PUT 文あるいは FLUSH 文を実行することはできません。
ヒント : SQLCODE エラーが発生したときは、それに対応する SQLSTATE エラー
値も存在しています。メッセージ テキストを獲得する方法については、GET
DIAGNOSTICS 文を確認してください。
SQL 文
2-71
CLOSE 文
挿入が正常に終了しなかった場合、挿入に成功した行の数が sqlerrd に格納されま
す。挿入に成功した最後の行以降の、バッファ内の残りの行はすべて廃棄されま
す。挿入が失敗したため、CLOSE 文も失敗し、カーソルはクローズされません。
たとえば、ディスク領域の不足が原因でいくつかの行が挿入できない場合に、
CLOSE 文は失敗します。この場合、もう一度 CLOSE 文を実行すると、バッファ内
の行が存在しないので成功します。OPEN 文は暗黙的に CLOSE 文を実行するため、
OPEN 文も正常に実行できます。
カーソルをクローズするためにトランザクションの終了を使用
する
COMMIT WORK 文と ROLLBACK WORK 文は、HOLD で宣言されたカーソルを除
き、すべてのカーソルをクローズします。しかし、すべてのカーソルを明示的にク
ローズする方が得策です。SELECT カーソルまたは PROCEDURE カーソルの場合、
これにより、プログラムの意図が明確になります。また、カーソル宣言に後から
WITH HOLD 節が追加された場合に、論理的なエラーが起こるのを回避することが
できます。
INSERT カーソルの場合、エラー コードのテストを可能にするために、CLOSE 文
を明示的に使用することが重要です。COMMIT WORK 文の後では、SQLCODE は
カーソルのクローズの結果ではなく、COMMIT 文の結果を反映します。最初に
CLOSE 文を使用しないで COMMIT WORK 文を使用すると、データベースに最後の
バッファ内の行が書き込まれている間にエラーが発生した場合、トランザクション
はコミットされたままになります。
INSERT カーソルと WITH HOLD 節の使用方法については、2-241 ページの
「DECLARE 文」を参照してください。
ANSI
ANSI 標準準拠のデータベースでは、カーソルを暗黙的にクローズすることはでき
ません。CLOSE 文を実行する必要があります。 ♦
参照
関連する文は、
「DECLARE 文」、
「FETCH 文」、
「FLUSH 文」、
「FREE 文」、
「OPEN
文」
、「PUT 文」、
「SET AUTOFREE 文」です。
カーソルの説明については、
『Informix Guide to SQL: Tutorial』を参照してください。
2-72
Informix Guide to SQL:Syntax
CLOSE DATABASE 文
+
CLOSE DATABASE 文
現行のデータベースをクローズするのに CLOSE DATABASE 文を使用します。
構文
CLOSE DATABASE
説明
CLOSE DATABASE 文の後では、CREATE DATABASE 文、DATABASE 文、および
DROP DATABASE 文だけが使用できます。DISCONNECT 文も CLOSE DATABASE
文に続いて使用できますが、CLOSE DATABASE 文が実行される前に明示的に接続
していた場合に限られます。CONNECT 文は 何らの制限なしに CLOSE DATABASE
文の後に使用することができます。
現行データベースを削除する前に CLOSE DATABASE 文を実行します。
データベースがトランザクション付きで、トランザクションが開始されている場合
は、CLOSE DATABASE 文を使用する前に COMMIT WORK 文を実行しなければな
りません。
次の例は、現行のデータベースを削除するためにどのように CLOSE DATABASE 文
を使用するかを示しています。
DATABASE stores7
.
.
.
CLOSE DATABASE
DROP DATABASE stores7
E/C
ESQL/C では、CLOSE DATABASE 文を複数の PREPARE 文中で使用することはで
きません。
SQL 文
2-73
CLOSE DATABASE 文
WHENEVER 文で呼び出されたルーチン内で CLOSE DATABASE 文を使用するとき
は、ROLLBACK WORK 文の前に WHENEVER SQLERROR CONTINUE 文と
WHENEVER SQLWARNING CONTINUE 文を指定してください。これにより、
ROLLBACK WORK 文がエラーまたは警告に遭遇したときに、プログラムがループ
するのを回避できます。
CLOSE DATABASE 文を実行すると、宣言されているカーソルはもはや有効ではな
くなります。使用したいカーソルがあるときは、再宣言しなければなりません。 ♦
参照
関連する文は、
「CONNECT 文」
、「DATABASE 文」
、「CREATE DATABASE 文」、
「DISCONNECT 文」、
「DROP DATABASE 文」です。
2-74
Informix Guide to SQL:Syntax
COMMIT WORK 文
COMMIT WORK 文
トランザクションを開始してからデータベースに対して行ったすべての変更を確定
するには COMMIT WORK 文を使用します。この文は、一つの単位として成功しな
ければならない一連の文の最後に到達したことをデータベースサーバに通知しま
す。データベースサーバは、トランザクションが正確にディスクに確定されたこと
により、変更モードを確かめるために要求された処理を行います。
構文
COMMIT
WORK
説明
トランザクションを開始して以後データベースに対して行った変更を保存したいと
きに COMMIT WORK 文を使用します。COMMIT WORK 文は複数の文の処理の最
後でのみ使用してください。
COMMIT WORK 文はすべての行と表のロックを解除します。
E/C
ESQL/C では COMMIT WORK 文は、ホールドが宣言されているカーソルを除き、
すべてのオープンされたカーソルをクローズします。 ♦
次の例に、BEGIN WORK 文と COMMIT WORK 文で囲まれたトランザクションを
示します。この例では、ユーザはまず call_type 表から call_code 列の値が 0 になっ
ている行を削除します。次にユーザは call_type 表に call_code 列の値が S になって
いる新しい行を挿入します。データベース サーバはどちらの操作も成功するか、あ
るいはどちらも失敗します。
BEGIN WORK;
DELETE FROM call_type WHERE call_code = 'O';
INSERT INTO call_type VALUES ('S', 'order status');
COMMIT WORK;
SQL 文
2-75
COMMIT WORK 文
ANSI 標準準拠ではないデータベースでの BEGIN WORK 文の発行
ANSI 標準準拠ではないデータベースでは、BEGIN WORK 文を使用してトランザク
ションを初期化する場合、トランザクションの最後で必ず COMMIT WORK 文を発
行しなければなりません。この場合 COMMIT WORK 文の発行に失敗すると、デー
タベースサーバはそのトランザクションで行ったデータベースに対する変更をロー
ルバックします。
ANSI 標準準拠でないデータベースを使用している場合、BEGIN WORK 文を発行す
ると、データベースサーバが、サーバ自身のトランザクション内で各文を実行しま
す。単一文からなるトランザクションの場合、BEGIN WORK 文も COMMIT WORK
文も必要ありません。
ANSI
ANSI 標準準拠のデータベースでの BEGIN WORK 文の発行
ANSI 標準準拠のデータベースでは、トランザクションの開始を記す必要はありま
せん。暗黙的なトランザクションは常に有効です。各トランザクションの終了だけ
を記す必要があります。新しいトランザクションは、各 COMMIT WORK 文または
ROLLBACK WORK 文の後で自動的に始まります。
明示的な COMMIT WORK 文を発行して、各トランザクションの終了を示さなけれ
ばなりません。明示的にトランザクションの終了を示さなかった場合、データベー
スサーバはそのトランザクションで行ったデータベースに対する変更をロールバッ
クします。
キーワード WORK
キーワード WORK は COMMIT WORK 文に指定しても、指定しなくてもかまいま
せん。次の二つの文は同じ意味です。
COMMIT;
COMMIT WORK;
参照
関連する文は、
「BEGIN WORK 文」、
「ROLLBACK WORK 文」、
「DECLARE 文」
です。
トランザクションの説明については、
『Informix Guide to SQL: Tutorial』を参照して
ください。
2-76
Informix Guide to SQL:Syntax
CONNECT 文
+
CONNECT 文
データベース環境を接続するのに CONNECT 文を使用します。
構文
CONNECT TO
データベース
環境
2-82 ページ
E/C
AS
AS
'
E/C
< 接続 >
'
USER 節
2-86
ページ
E/C
< 接続変数 >
DEFAULT
WITH CONCURRENT TRANSACTION
要素
< 接続 >
< 接続変数 >
目的
接続に名前を割り当てる引用符
付き文字列です。
< 接続名 > の値を保持するホス
ト変数です。
制限
接続名は一意でなければなりま
せん。
変数は固定長文字型でなければ
なりません。
構文
引用符付き文字列、
4-156 ページ
変数名は、変数名に
適用される言語仕様
に従っている必要が
あります。
説明
CONNECT 文は < データベース環境 > にアプリケーションを接続します。データ
ベース環境とは、データベース、データベースサーバ、またはデータベースとデー
タベースサーバのことです。アプリケーションが正常に指定されたデータベース環
境に接続されると、その接続がそのアプリケーションの現行接続になります。アプ
リケーションとデータベース間に現行状態の接続がないと、SQL 文は失敗します。
データベース名を指定すると、データベースサーバはそのデータベースをオープン
します。PREPARE 文内で CONNECT 文を使用することはできません。
SQL 文
2-77
CONNECT 文
アプリケーションは同時にいくつものデータベース環境に接続できます。また、そ
れぞれの接続が一意な接続名を持っていれば、同一のデータベース環境に対して複
数の接続を確立することもできます。
UNIX では、同一のデータベース環境に複数の接続を確立することに対する唯一の
制限は、アプリケーションは共有メモリ機構を使用するそれぞれのローカル サーバ
について一つしか接続を確立立できないということです。ローカル サーバが共有メ
モリ接続機構を使用するかローカル ループバック接続機構を使用するかを知るに
は、ファイル $INFORMIXDIR/etc/sqlhosts を調べてください。ファイル sqlhosts の詳
細については、お手持ちの『Administrator’s Guide』を参照してください。 ♦
UNIX
WIN NT
Windows NT では、ローカル接続機構はパイプと呼ばれています。一つのクライア
ントからローカル サーバに対して複数の接続を確立することができます。 ♦
いつの時点でも現行な接続となるのはただ一つだけです。それ以外の接続は待機状
態になります。アプリケーションは待機状態の接続を通じてデータベースと接触す
ることはできません。アプリケーションが新しい接続を確立すると、その接続が現
行となり、前のトランザクションは待機状態になります。SET CONNECTION 文を
使って待機状態の接続を現行状態にできます。2-505 ページの「SET CONNECTION
文」を参照してください。
CONNECT 文を実行するために必要なアクセス権
現行ユーザ、この場合 PUBLIC は、CONNECT 文で指定されるデータベースに対す
るデータベース接続アクセス権を持っていなければなりません。
CONNEC 文を実行するユーザは、データベースに既存のロールと同じユーザ名を
持つことはできません。
CONNECT 文が遠隔ホストにあるデータベースサーバに接続を行う場合に、USER
節により別名を使うことができます。これに関する情報は、2-86 ページの「USER
節」を参照してください。
2-78
Informix Guide to SQL:Syntax
CONNECT 文
接続識別子
< 接続名 > はオプションですが、これは一意な識別子で、アプリケーションが後続
の SET CONNECTION 文あるいは DISCONNECT 文で接続を参照するために使用し
ます。もしアプリケーションに < 接続名 >( またはホスト変数 < 接続名 >) を記述し
なかったときは、アプリケーションはデータベース環境を使用して接続を参照する
ことができます。しかしながら、複数の接続を同じデータベース環境に行った場合
は、それぞれの接続は一意な接続名を持たなければなりません。
ある接続に対して接続名を関連付けると、それ以後はその接続名だけでその接続を
参照できます。
< 接続名 > の値が大文字と小文字を区別することに留意してください。
接続のコンテキスト
それぞれの接続には、< 接続コンテキスト > と呼ばれる情報のセットが包括されて
います。接続コンテキストには、現行ユーザ名、データベース環境がその名前に関
連して持っている情報、および ( アクティブトランザクションが接続に関連付けら
れているかどうかのような ) 接続の状態についての情報が含まれています。接続コ
ンテキストはアプリケーションが待機状態になると保存され、アプリケーションが
再び現行状態に戻ると復元されます ( 待機接続についての詳細は、2-506 ページの
「停止状態の接続を現行接続にする方法」を参照してください )。
DEFAULT オプション
DEFAULT オプションを使用して、デフォルトのデータベースサーバに対して接続
を要求する場合、この接続を < デフォルト接続 > といいます。デフォルトのデータ
ベースサーバはローカルあるいは遠隔のどちらの場合もありえます。デフォルトの
データベースサーバを指定するには、環境変数 INFORMIXSERVER にその名前を設
定します。CONNECT 文をこの方法で使用した場合は、データベースはオープンさ
れません。
CONNECT 文に対して DEFAULT オプションを選択すると、デフォルトのデータ
ベース環境でデータベースをオープンしあるいは新しく作成するには DATABASE
文、CREATE DATABASE 文を使用しなければなりません。
SQL 文
2-79
CONNECT 文
DATABASE 文による暗黙的な接続
CONNECT 文をアプリケーションで実行しなかった場合は、最初の SQL 文は次の
データベース文のうちのどれか一つ ( または次の文のうちの一つに対する単一
PREPARE 文 ) でなければなりません。
✮
DATABASE 文
✮
CREATE DATABASE 文
✮
DROP DATABASE 文
これらの文の一つがアプリケーションの最初の SQL 文であると、その文はサーバ
に接続を確立します。これを暗黙的な接続と呼んでいます。データベース文がデー
タベース名だけを指定した場合は、データベースサーバ名は環境変数 DBPATH か
ら取得されることになります。この状況は 2-84 ページの「データベースの所在」に
記述されています。
暗黙的な接続を行ったアプリケーションは、さらに別の接続を明示的に ( すなわち、
CONNECT 文を使って ) 確立することができます。しかしながら、最初の暗黙的な
接続を切断しない限り別の暗黙的な接続を確立することはできません。アプリケー
ションは DISCONNECT 文を使って暗黙的な接続を終了することができます。
暗黙的な接続が行われると、その接続は環境変数 INFORMIXSERVER で指定されて
いるデフォルトのサーバであるかどうかにかかわらず、デフォルトの接続であると
解釈されます。このデフォルトとしての扱いにより、暗黙的な接続は識別子を持た
ないにもかかわらず、他に明示的な接続が追加されても、アプリケーションはこの
暗黙的な接続を参照することができるのです。たとえば、暗黙的な接続に続いて明
示的な接続を行ったとき、SET CONNECTION DEFAULT 文を実行することにより
暗黙的な接続を現行接続にすることができます。このことはまた、いったん暗黙的
な接続を確立すると、その暗黙的な接続がデフォルトの接続と解釈されるようにな
るので、CONNECT DEFAULT コマンドが使用できなくなることを意味します。
データベース文は常に現行のデータベースサーバ上でデータベースをオープンした
り、新しいデータベースを作成したりするのに用いられます。
2-80
Informix Guide to SQL:Syntax
CONNECT 文
WITH CONCURRENT TRANSACTION オプション
WITH CONCURRENT TRANSACTION 節は、現行の接続上でトランザクションが実
行状態にあるとき、別の接続への切替えを可能にしてくれます。現行接続が WITH
CONCURRENT TRANSACTION 節を使って確立されていない場合は、トランザク
ションが実行状態にあると別の接続へ切り替えることはできません。CONNECT あ
るいは SET CONNECTION 文は失敗し、エラーが返され、現行の接続上のトランザ
クションが引き続き実行状態を保ちます。このケースでは、アプリケーションは別
の接続へ切り替える前に、現行の接続上の実行状態のトランザクションをコミット
するかロールバックしなければなりません。
WITH CONCURRENT TRANSACTION 節は複数の並行トランザクションをサポート
しています。その場合、それぞれの接続は各々自分のトランザクションを持つこと
ができ、COMMIT WORK 文と ROLLBACK WORK 文は現行の接続だけに影響しま
す。WITH CONCURENT TRANSACTION 節は、単一のトランザクションが複数の
接続上でデータベースを包括的に取り扱う広域トランザクションはサポートしてい
ません。COMMIT WORK 文と ROLLBACK WORK 文は、複数の接続をまたいで
データベースに対して作用することはありません。
次の例は WITH CONCURRRENT TRANSACTION 節を使用する方法を解説しています。
main()
{
EXEC SQL connect to 'a@srv1' as 'A';
EXEC SQL connect to 'b@srv2' as 'B' with concurrent transaction;
EXEC SQL connect to 'c@srv3' as 'C' with concurrent transaction;
/*
Execute SQL statements in connection 'C' , starting a
transaction
*/
EXEC SQL set connection 'B'; -- switch to connection 'B'
/*
Execute SQL statements starting a transaction in 'B'.
Now there are two active transactions, one each in 'B'
and 'C'.
*/
EXEC SQL set connection 'A'; -- switch to connection 'A'
/*
Execute SQL statements starting a transaction in 'A'.
Now there are three active transactions, one each in 'A',
'B' and 'C'.
*/
EXEC SQL set connection 'C'; -- ERROR, transaction active in 'A'
SQL 文
2-81
CONNECT 文
/*
SET CONNECTION 'C' fails (current connection is still 'A')
The transaction in 'A' must be committed/rolled back since
connection 'A' was started without the CONCURRENT TRANSACTION
clause.
*/
EXEC SQL commit work;-- commit tx in current connection ('A')
/*
Now, there are two active transactions, in 'B' and in 'C',
which must be committed/rolled back separately
*/
EXEC SQL set connection 'B'; -- switch to connection 'B'
EXEC SQL commit work;
-- commit tx in current connection ('B')
EXEC SQL set connection 'C'; -- go back to connection 'C'
EXEC SQL commit work;
-- commit tx in current connection ('C')
EXEC SQL disconnect all;
}
警告 : アプリケーションが同じデータベース環境へ複数の接続を確立するために
WITH CONCURRENT TRANSACTION を使用すると、デッドロック状態が発生す
る場合があります。
データベース環境
データベース
環境
CONNECT 文へ戻る
2-67 ページ
'< データベース名 >'
'<@DB サーバ >'
サーバ名 >'
'< データベース名 @DB
E/C
2-82
Informix Guide to SQL:Syntax
< データベース環境変数 >
CONNECT 文
要素
< データベース
環境変数 >
目的
制限
構文
データベース環境を表してい 変数は固定長文字データ型でな 変数名は、変数名に
る値を含むホスト変数です。 ければなりません。このホスト 適用される言語仕様
変数に格納されている値は、構 に従っている必要が
文ダイヤグラムにリストされて あります。
いるいずれかのデータベース環
境のフォーマットでなければな
りません。
< データベース 接続を確立するデータベース 指定したデータベースはすでに 識別子、4-112 ページ
の名前です。
存在していなければなりません。
名>
<DB サーバ名 > 接続を確立するデータベース 指定したデータベース サーバ名 識別子、4-112 ページ
サーバの名前です。
は、すでに存在していなければ
なりません。
データベース環境で引用符を使用する
環境変数 DELIMIDENT が設定されている場合には、データベース環境で使用する
引用符は単一引用符でなければなりません。環境変数 DELIMIDENT が設定されて
いない場合には、引用符は単一引用符と二重引用符のどちらでもかまいません。
<DB サーバ名 > パラメータに対する制約
データベース環境の指定に <DB サーバ名 > パラメータが使用されるとき、次の制
約に従わなければなりません。
UNIX
WIN NT
UNIX の場合は、<DB サーバ名 > パラメータに指定するデータベース サーバ名は、
ファイル sqlhosts のサーバ名と一致していなくてはなりません。 ♦
Windows NT の場合は、<DB サーバ名 > に指定するデータベース サーバ名はレジス
トリのサブキー sqlhosts のデータベース サーバ名と一致していなくてはなりませ
ん。レジストリを更新するときは、ユーティリティ setnet32 を使用するようにお薦
めします。 ♦
SQL 文
2-83
CONNECT 文
データベース環境を指定する
構文ダイヤグラムに示されているオプションを使用して、サーバとデータベース、
データベースサーバのみ、あるいはデータベースのみを指定できます。
データベースサーバだけの指定
<@ データベースサーバ名 > オプションは、指名されたデータベースサーバのみに
接続を確立します。データベースのオープンは行いません。このオプションを使用
すると、データベースをオープンするために引き続き DATABASE 文または
CREATE DATABASE 文 ( またはこれらの文の一つに対する PREPARE と EXECUTE
文 ) を使用しなければなりません。
データベースのみを指定
< データベース名 > オプションは、デフォルトのサーバ、あるいは環境変数
DBPATH にある他のデータベースサーバへの接続を確立します。また、データベー
スが所在しているサーバを見出し指名されたデータベースをオープンします。これ
は < データベース環境変数 > オプションでデータベース名だけが指定されたときも
同様です。アプリケーションが、データベースが所在を見出すために別々のデータ
ベースサーバへ接続するときの順序については 2-84 ページの「データベースの所
在」を参照してください。
データベースの所在
どのようにしてデータベースの所在を見出し、オープンするかは、データベース環
境式でデータベースサーバ名を指定したかどうかで決まります。
データベースサーバとデータベースが指定された場合
CONNECT 文でデータベースサーバとデータベースの両方が指定されたときは、ア
プリケーションはそのデータベースサーバに接続しデータベースの所在を見出し
データベースをオープンします。
データベースサーバがオンラインになっていないとエラーになります。
2-84
Informix Guide to SQL:Syntax
CONNECT 文
データベースのみが指定された場合
CONNECT 文でデータベースサーバ名を指定せず、データベースのみを指定した場
合は、アプリケーションは環境変数 DBPATH からデータベースサーバ名を取得し
ます。その場合、環境変数 INFORMIXSERVER のデータベースサーバ名は、ユーザ
により指定された DBPATH の値の必ず前に指定してください。
UNIX
UNIX の場合は、次の例のように環境変数を設定してください。
setenv INFORMIXSERVER srvA
setenv DBPATH //srvB://srvC
♦
WIN NT
Windows NT の場合は、タスク バーから[スタート]➞[プログラム]➞
[Informix]➞[setnet32]を順にクリックし、次の例のように環境変数
INFORMIXSERVER と DBPATH を設定してください。
set INFORMIXSERVER = srvA
set DBPATH = //srvA://srvB://srvC
♦
この結果アプリケーションが使用する DBPATH は次の例に示されるようになります。
//srvA://srvB://srvC
アプリケーションはまず、INFORMIXSERVER で指定されたデータベースサーバに
接続を確立します。データベースサーバは、構成ファイルに指定されているパラ
メータを使用してデータベースの所在を見出します。
データベースがデフォルトのデータベースサーバに格納されていない場合、あるい
はデフォルトのデータベースサーバがオンラインになっていない場合は、アプリ
ケーションは次に DBPATH にあるデータベースサーバに接続します。前出の例で
はこのサーバは srvB です。
SQL 文
2-85
CONNECT 文
USER 節
USER 節は、CONNECT 文がリモート ホストにデータベース サーバを接続する時、
アプリケーションがターゲット コンピュータにアクセスできるかどうかを決定する
ための情報を指定します。CONNECT 文以降は、リモート ホストのすべてのデータ
ベース操作では指定されたユーザ名を使用します。
USER 節
CONNECT 文へ戻る
2-77 ページ
USER
'< ユーザ識別子 >'
USING
< 認証変数 >
< ユーザ識別子変数 >
要素
< 認証変数 >
< ユーザ識別
子>
< ユーザ識別
子変数 >
目的
< ユーザ識別子 >、または <
ユーザ識別子変数 > で指定さ
れているログイン名に対する有
効なパスワードを持つホスト変
数です。
制限
変数は固定長文字データ型でな
ければなりません。
この変数に格納されるパスワー
ドは有効なパスワードでなけれ
ばなりません。
これ以外の制約については、
2-87 ページの「認証変数パラ
メータに対する制約」を参照し
てください。
アプリケーションに有効なログ 指定するログイン名は有効なロ 引用符付き文字列、
イン名の引用符付き文字列です。 グイン名でなければなりません。 4-156 ページ
< ユーザ識別子 > の値を持つ
ESQL/C のホスト変数名です。
これ以外の制約については、
2-87 ページの「ユーザ識別子パ
ラメータに対する制約」を参照
してください。
変数は固定長文字型でなければ 変数名は、変数名に
なりません。
適用される言語仕様
この変数に格納されているログ に従っている必要が
イン名はユーザ識別子変数と同 あります。
じ制限を受けます。
2-86
構文
変数名は、変数名に
適用される言語仕様
に従っている必要が
あります。
Informix Guide to SQL:Syntax
CONNECT 文
認証変数パラメータに対する制約
UNIX
WIN NT
UNIX の場合は、< 認証変数 > に格納されるパスワードは有効なパスワードでなけ
ればならず、/etc/passwd ファイルに存在していなければなりません。アプリケー
ションが遠隔データベース サーバに接続する場合には、パスワードはローカルと遠
隔の両方のデータベース サーバに存在していなければなりません。 ♦
Windows NT の場合は、< 認証変数 > に格納されるパスワードは有効なパスワード
でなければならず、User Manager に入力されたものでなければなりません。アプリ
ケーションが遠隔データベース サーバに接続する場合には、パスワードはクライア
ントとサーバの両方のドメインに存在していなければなりません。 ♦
ユーザ識別子パラメータに対する制約
UNIX
WIN NT
UNIX の場合は、< ユーザ識別子 > に指定するログイン名は有効なログイン名でなけ
ればならず、/etc/passwd ファイルに存在していなければなりません。アプリケーショ
ンが遠隔データベース サーバに接続する場合には、ログイン名はローカルと遠隔の
両方のデータベース サーバのこのファイルに存在していなければなりません。 ♦
Windows NT の場合は、< ユーザ識別子 > に指定するログイン名は有効なログイン
名でなければならず、User Manager に存在していなければなりません。アプリケー
ションが遠隔サーバに接続する場合は、ログイン名はクライアントとサーバの両方
のドメインに存在していなければなりません。♦
接続の拒否
次の状況が発生すると、接続は拒否されます。
■
指定されたユーザがデータベース環境で指名されているデータベースにア
クセスするアクセス権を持っていない。
■
指定されたユーザが遠隔ホストへの接続を許可されていない。
■
USING < 認証変数 > 句を使用しないで USER 節を指定している。
SQL 文
2-87
CONNECT 文
E/C
X/O
CONNECT 文が X/Open 仕様に準拠するようにするため、ESQL/C プリプロセッサ
は、CONNECT 文が USING < 認証変数 > 句を持たない USER 節を使用するのを許
容しています。しかし、< 認証変数 > が存在しないと、実行時にデータベース サー
バは接続を拒否します。 ♦
デフォルトのユーザ ID の使用
USER 節を指定しないと、デフォルトのユーザ ID を使って接続が試みられます。
デフォルトの Informix ユーザ ID は、アプリケーションを実行しているユーザのロ
グイン名です。このケースでは、ネットワークアクセス権は標準的な認証手続で取
得できます。たとえば UNIX の場合、デフォルトのユーザ ID は /etc/hosts.equiv ファ
イルのユーザ ID と一致していなければなりません。Windows NT の場合、ユーザが
ドメインのメンバでなければなりません。あるいは、データベース サーバをローカ
ルにインストールしている場合は、そのインストール先のコンピュータ上で有効な
ユーザになっていなければなりません。
参照
関連する文は、
「DISCONNECT 文」、
「SET CONNECTION 文」
、「DATABASE 文」、
「CREATE DATABASE 文」です。
sqlhosts についての詳細は、お手持ちの『Administrator’s Guide』を参照してください。
2-88
Informix Guide to SQL:Syntax
CREATE DATABASE 文
CREATE DATABASE 文
+
CREATE DATABASE 文は、新しいデータベースの作成に使用します。
構文
CREATE DATABASE
< データ
ベース >
IN<DB 領域 >
WITH
LOG
BUFFERED
LOG MODE ANSI
要素
< データベー
ス>
<DB 領域 >
目的
作成するデータベースの名前
です。
このデータベースのデータを
格納したい DB 領域の名前。
デフォルトはルート DB 領域
です。
制限
データベース名はサーバ上一意
でなければなりません。
DB 領域がすでに存在していな
ければなりません。
構文
データベース名、
4-22 ページ
識別子、4-112 ページ
説明
作成したデータベースが現行データベースになります。
使用するデータベース名は、作業を行っているデータベースサーバ環境で一意のも
のでなければなりません。データベースサーバでは、データベースの構造を記述す
るデータディクショナリを含むシステムカタログ表を作成します。
データベースを作成した時点では、作成者だけがそのデータベースにアクセスする
ことができます。作成者が DBA( データベース管理者 ) としてデータベースアクセ
ス権を与えるまで、他のユーザはそのデータベースにアクセスできません。データ
ベースアクセス権の付与についての詳細は 2-342 ページの「GRANT 文」を参照し
てください。
E/C
ESQL/C では、複数の文を処理する PREPARE 文で CREATE DATABASE 文を使用
することはできません。 ♦
SQL 文
2-89
CREATE DATABASE 文
DB 領域を指定しないと、データベース サーバはシステム カタログ表をルート DB 領
域に作成します。次の文は、ルート DB 領域にデータベース vehicles を作成します。
CREATE DATABASE vehicles
次の文では、データベース vehicles を DB 領域 research に作成します。
CREATE DATABASE vehicles IN research
ログ機能オプション
CREATE DATABASE 文のログ機能オプションはデータベースに対して実行される
ログ機能の種類を決定します。
障害が発生すると、データベース サーバはログを使用して、データベースのすべて
の確定済みトランザクションを再作成します。
WITH LOG オプションを指定しないと、トランザクションや、ログ付きデータベー
スに関連する文 (BEGIN WORK 文、COMMIT WORK 文、ROLLBACK WORK 文、
SET LOG 文、SET ISOLATION 文 ) を使用することができません。
AD/XP
Dynamic Server with AD and XP Options を使用している場合、CREATE DATABASE
文は常にバッファなしのログでデータベースを作成します。データベース サーバは
CREATE DATABASE 文にあるログ機能の指定をすべて無視します。 ♦
バッファ付きログの指定
次の例では、バッファ付きログを使用するデータベースを作成します。
CREATE DATABASE vehicles WITH BUFFERED LOG
バッファ付きログを使用すると、ログのパフォーマンスがわずかに向上しますが、
障害の発生後にいくつかのトランザクションを再作成できないことがあります
(『Informix Guide to SQL: Tutorial』のバッファ付きログの説明を参照してください )。
2-90
Informix Guide to SQL:Syntax
CREATE DATABASE 文
ANSI
ANSI 標準準拠のデータベース
CREATE DATABASE 文で LOGMODE ANSI オプションを使用すると、作成する
データベースは ANSI 標準準拠のデータベースになります。ANSI 標準準拠のデー
タベースは、ANSI 標準に準拠しないデータベースと次の点が異なります。
■
すべての文が自動的にトランザクションの中に含まれます。すべてのデー
タベースがバックアップなしログ機能を使用します。
■
所有者名を指定するよう強制されます。所有者でない場合には、それぞれ
の表、ビュー、シノニム、インデックス、制約を参照するときに所有者名
を指定しなければなりません。
■
データベースでは、デフォルトの排他レベルは繰り返し可能読込みです。
■
オブジェクトに対するデフォルトのアクセス権は、ANSI 標準に準拠してい
ないデータベースの場合とは異なります。デフォルトでは、表およびシノ
ニムに対するアクセス権として PUBLIC は与えられません。
このほかにも、ANSI 標準準拠のデータベースと ANSI 標準に準拠していないデー
タベースの間には細かい相違点があります。これらの相違点については、関連する
SQL 文と合わせて適宜説明していきます。ANSI 標準準拠のデータベースと ANSI
標準に準拠していないデータベースの相違点についての詳細は、
『Informix Guide to
SQL: Reference』を参照してください。
ANSI 標準準拠のデータベースを作成しても、データベースの実行時に ANSI の警
告メッセージが表示されるわけではありません。警告メッセージを表示するには、
-ansi フラグまたは DBANSIWARN 環境を使用しなければなりません。
-ansi および DBANSIWARN についての詳細は、『Informix Guide to SQL: Reference』
を参照してください。
参照
関連する文は、
「CLOSE DATABASE 文」、
「CONNECT 文」
、「DATABASE 文」、
「DROP DATABASE 文」です。
データベースの作成に関する説明については、
『Informix Guide to Database Design and
Implementation』を参照してください。
SQL 文
2-91
CREATE EXTERNAL TABLE 文
CREATE EXTERNAL TABLE 文
+
AD/XP
CREATE EXTERNAL TABLE 文はデータベースの一部になっていない外部ソースを
定義し、その外部ソースを使用して、データベースのデータをロードしたりアン
ロードしたりするために使用します。
この文は、Dynamic Server with AD and XP Options でのみ使用できます。
構文
CREATE EXTERNAL TABLE
<表>
列定義
2-93 ページ
USING
DATAFILES 節
2-97 ページ
(
表の
オプション
2-99 ページ
要素
<表>
目的
外部データを記述する外部表の
名前です。
,
制限
名前は現行のデータベースにす
でに存在する表、ビュー、シノ
ニムの名前のいずれとも異なっ
ていなければなりません。
)
,
表の
オプション
2-99 ページ
構文
データベース オブ
ジェクト名、
4-25 ページ
説明
CREATE EXTERNAL TABLE 文で表を作成した後は、INSERT INTO...SELECT 文を
使用して外部ソースとの間でデータを移動できます。
2-92
Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
列定義
列定義
CREATE EXTERNAL TABLE 文へ戻る 2-92 ページ
< テンプレート >
SAMEAS
,
<列>
データ型
4-27
ページ
デフォルト
の節
2-160
ページ
EXTERNAL
列レベルの制約
2-96 ページ
データ型
4-27
ページ
' PACKED( p,s )'
NULL
'< ナル文字列 >'
' ZONED( p,s )'
' BINARY( n )'
要素
<列>
<p>
<s>
目的
外部表の列ごとに一つの列名
です。
精度 ( 合計桁数 ) です。
制限
< 列 > ごとに、Informix データ型
を指定しなければなりません。
固定フォーマットのファイルに
のみ有効です。
構文
識別子、
4-112 ページ
リテラル数、
4-138 ページ
NULL 値が許容されている場合
は、ナル文字列を含まなければ
なりません。
小数点以下桁数 ( 小数点以下 固定フォーマットのファイルに リテラル数、
の桁数 ) です。
のみ有効です。
4-138 ページ
NULL 値が許容されている場合
は、ナル文字列を含まなければ
なりません。
SQL 文
2-93
CREATE EXTERNAL TABLE 文
要素
<n>
目的
制限
整数を表す 8 ビットのバイト 固定フォーマットの 2 進整数の
数です。
場合、" ビッグ エンディアン "
バイト順になります。
構文
16 ビット整数の場合
は n=2
32 ビット整数の場合
NULL 値が許容されている場合 は n=4
は、ナル文字列を含まなければ
なりません。
< ナル文字列 >
NULL と解釈される値です。 制約については、「NULL 値の 引用文字列、
定義」を参照してください。
4-156 ページ
< テンプレート > 外部表の列名と定義を持つ表 列をスキップすることや、別の データベース オブ
の名前です。
型のデータを列に入れることは ジェクト名、
できません。
4-25 ページ
SAMEAS 節の使用方法
キーワード SAMEAS を使用して表を作成すると、元の表の列名が新しい表でも使
用されます。外部表定義にインデックスは使用できません。
固定フォーマットのファイルにキーワード SAMEAS は使用できません。固定
フォーマットのファイルの場合、列ごとに列名と EXTERNAL 項目を宣言して、名
前と文字数を設定しなければなりません。キーワード NULL を使用すれば、NULL
値と解釈する文字列を指定できます。
キーワード EXTERNAL の使用方法
キーワード EXTERNAL は、内部表とは異なるデータ型の外部表の各列に対して
データ型を指定する場合に使用します。たとえば、内部表の可変長文字
(VARCHAR) 型の列を、外部表の文字 (CHAR) 型の列にマップすることができます。
異なるデータ型は Informix のデータ型か、あるいは次の節「整数の追加表現」で指
定する型のどれかにすることができます。固定フォーマットのファイルの場合、唯
一許容されているデータ型は文字 (CHAR) 型です。
整数の追加表現
有効な Informix の整数データ型のほかに、パック 10 進数、ゾーン 10 進数、IBM
フォーマットの 2 進の整数表現を指定できます。
2-94
Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
パック 10 進数またはゾーン 10 進数の場合は、精度 ( 数字の合計桁数 ) と小数点以
下桁数 ( 小数点の右側の桁数 ) を指定します。パック 10 進数表現は各バイトに二つ
の数字、または一つの数字と一つの符号を格納できます。ゾーン 10 進数の場合、p
桁と符号を格納するには、(p+1) バイトが必要です。
ビッグ エンディアン フォーマット
データベース サーバは、二つの IBM フォーマット、整数の 2 進表現もサポートして
います。16 ビット整数の格納のための BINARY(2) と 32 ビット整数の格納のための
BINARY(4) です。各数字の最上位バイトには、最低のアドレスが入ります。つまり、
2 進数フォーマットの整数を IBM と Motorola のプロセッサ方式で格納すると、上位
の桁から先に記憶されます ( ビッグ エンディアン フォーマット )。Intel プロセッサな
どで 2 進数フォーマットの整数を格納すると、下位の桁から先に記憶されます。これ
はデータベース サーバが外部表に対してサポートしていない格納方法です。
NULL 値の定義
パック 10 進数、ゾーン 10 進数、2 進数のデータ型には、自然の状態では NULL 値が
ないため、データベース サーバが外部ファイルからデータをロードまたはアンロー
ドするときに、NULL として解釈できる値を定義しておかなければなりません。
< ナル文字列 > はデータ ファイルに格納する数字のセットの中で使用されない数字
(-9999.99 など ) として定義できます。NULL として解釈される、0xffff などの 16 進数
パターンとして、このフィールドにビット パターンを定義することもできます。
データベース サーバは、固定フォーマットの外部表の NULL 表現をデータがデータ
ベースにロードされたときに値を解釈する目的と、データが外部表にアンロードされ
たときに NULL 値を適切なデータ型にフォーマットする目的の両方に使用します。
次に、固定フォーマットの外部表に対して NULL 値を持つ列定義の例を示します。
i smallint external “binary (2)” null “-32767”
li integer external “binary (4)” null “-99999”
d decimal (5,2) external “packed (5,2)” null “0xffffff”
z decimal (4,2) external “zoned (4,2)” null “0x0f0f0f0f”
zl decimal (3,2) external “zoned (3,2)” null “-1.00”
パック 10 進数またはゾーン 10 進数が NULL 値を表すために全ビットを 0 にして格
納された場合、< ナル文字列 > は "0x0" として定義できます。次の規則は < ナル文
字列 > に割り当てられる値に適用されます。
■
NULL 表現は外部フィールドの長さに収まらなければならない。
SQL 文
2-95
CREATE EXTERNAL TABLE 文
■
ビット パターンが定義される場合、< ナル文字列 > は大文字小文字を区別し
ない。
■
ビット パターンが定義される場合、< ナル文字列 > は "0x" で始まらなければ
ならない。
■
数値フィールドでは、ビット パターンを格納するとフィールドに空きがで
きる場合、左端のフィールドにはデータベース サーバが 0 を割り当てる。
■
NULL 表現がビット パターンではない場合、NULL 値はそのフィールドに
対して有効な数字でなければならない。
警告 : NULL 値を含む行が外部表にアンロードされたが、NULL 値を受け取った列
が NULL 値を定義していなかった場合、データベース サーバはその列にゼロを挿入
します。
列レベル制約
列レベル制約は、列の中で使用できるデータの型を制限する場合に使用します。列
レベルでの制約は一つの列に制限されます。
列レベル制約
列定義へ戻る 2-93 ページ
NOT NULL
CHECK
(
条件、
4-5 ページ
)
非 NULL 制約の使用
列に対してデフォルト値を指定しなかった場合、その列に非 NULL 制約を課した場
合を除き、デフォルトは NULL になります。非 NULL 制約を課した場合には、その
列に対してデフォルト値は存在しなくなります。
列に非 NULL 制約を課す場合 ( そして、デフォルト値を指定していない場合 )、外
部表を通じてロードするとき、外部表のデータはその列に対して値を設定していな
ければなりません。リジェクト ファイルが存在しておらず、何の値 ( または NULL
値 ) も検出されないと、データベース サーバはエラーを返しロードも中止します。
リジェクト ファイルが存在していて、NULL 値が検出されると、リジェクト ファイ
ルでエラーが通知されロードが続行されます。
2-96
Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
検査制約の使用方法
検査制約を使用すると、INSERT 文または UPDATE 文の実行中に列に値を割り当て
る前に、満足しなければならない条件を指定できます。リジェクト ファイルが存在
しておらず、INSERT 文または UPDATE 文の実行中に、表に定義された検査制約に
対して、行が false と評価されると、データベース サーバはエラーを返します。リ
ジェクト ファイルが存在していて、表に定義された検査制約に対して行が false と評
価されると、リジェクト ファイルでエラーが通知され、文の実行が続行されます。
検査制約は検索条件を使用して定義します。検索条件には、副問合せ、集合、ホス
ト変数、CURRENT 関数、USER 関数、SITENAME 関数、DBSERVERNAME 関数、
TODAY 関数、ストアド プロシジャ呼び出しは含められません。
列レベルで検査制約を定義するとき、検査制約がチェックの対照とできる列はその
列自体にありません。言い換えると、検査制約は表内のほかの列の値に従属するこ
とはできません。
DATAFILES 節
DATAFILES 節は、外部表を使用するときにオープンされる外部ファイルを指名し
ます。
CREATE EXTERNAL TABLE 文へ戻る 2-92 ページ
INTO EXTERNAL 節へ戻る 2-494 ページ
DATAFILES 節
,
DATAFILES
(
'
DISK
PIPE
:
< コサーバ番号 >
< コサーバ グループ >
:
< 固定パス >
'
)
< フォーマット済み
パス >
SQL 文
2-97
CREATE EXTERNAL TABLE 文
要素
< コサーバ番
号>
< コサーバ グ
ループ >
< 固定パス >
目的
外部表を含むコサーバの数値 ID
です。
外部データを含むコサーバ グ
ループの名前です。
外部表定義に入力ファイルまた
は出力ファイルを記述するため
のパス名です。
< フォーマッ
ト済みパス >
パターン照合文字を使用する
フォーマット済みパス名です。
制限
コサーバは存在していなけれ
ばなりません。
コサーバ グループは存在して
いなければなりません。
指定するパスは存在していな
ければなりません。
構文
リテラル番号、
4-138 ページ
識別子、
4-112 ページ
パス名は使用している
オペレーティング シス
テムの規約に従わなけ
ればなりません。
指定するパスは存在していな パス名は使用している
ければなりません。
オペレーティング シス
テムの規約に従わなけ
ればなりません。
外部表定義のために入力ファイルまたは出力ファイルを記述するときは、コグルー
プ名とコサーバ番号を使用できます。DATAFILES はコサーバ番号とコグループ番
号のいずれかで識別できます。コサーバ番号には、数字しか使用できません。コグ
ループ名は先頭文字は英字で、それ以降は英字、数字、下線を自由に組み合わせて
指定できる、有効な識別子です。
ファイルの読み取りまたは書き込みに利用できるコサーバの一部だけを使用する場
合、onutil を使用して、それらのコサーバをコグループとして指定すれば、コサー
バとファイルをそれぞれ別々に明示的に指名する代わりに、コグープ名を使用でき
ます。外部ファイルの管理にコサーバ全部を使用するときはいつでも、事前に定義
した < コサーバ グループ > を使用できます。
DATAFILES 節の例については、2-104 ページの「例」を参照してください。
2-98
Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
フォーマット文字の使用方法
フォーマット済みパス名を使用して、ファイル名を指定できます。フォーマット済
みパス名を使用する場合は、代入文字 %c、%n、%r( 最初 ... 最後 ) を利用できます。
フォーマット文字列
意味
%c
ファイルを管理するコサーバの番号で置換されます。
%n
ファイルを管理するコサーバが常駐しているノードの
名前で置換されます。
%r( 最初 ... 最後 )
単一のコサーバ上の複数のファイルを指名します。
重要 : フォーマット済みパス名のオプションは %0 フォーマット文字列をサポート
しません。
表のオプション
オプションの表パラメータには、表を定義する追加の特徴が含まれます。
SQL 文
2-99
CREATE EXTERNAL TABLE 文
表の
オプション
CREATE EXTERNAL TABLE 文へ戻る 2-92 ページ
,
'
FORMAT
DELIMITED
'
INFORMIX
FIXED
CODESET
'
ASCII
'
EBCDIC
DEFAULT
' < フィールド区切
り記号 > '
' < レコード区切り
記号 > '
DELIMITER
RECORDEND
MAXERRORS
REJECTFILE
< エラーの数 >
' < ファイル名 > '
ESCAPE
EXPRESS
DELUXE
SIZE
要素
目的
ファイル名
<
> 変換エラー メッセージを書き込
むときに、すべてのコサーバに
書き込み先として使用させる完
全ディレクトリパスとファイル
名です。
< フィールド フィールドを区切る文字です。
区切り記号 > デフォルト値はパイプ ( | ) 文字
です。
< 行数 >
制限
REJECTFILE を指定しない場
合、リジェクト ファイルは作成
されず、エラーが発生すると
ロード タスクは失敗します。
区切り記号として印刷不可能文
字を使用する場合は、それを
ASCII 文字の 8 進表現として符
号化しなければなりません。た
とえば、’¥006’ で CTRL-F を表
すことができます。
構文
ファイル名は使用し
ているオペレーティ
ング システムの規約
に従っていなければ
なりません。
引用文字列、
4-156 ページ
(1/2)
2-100 Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
要素
目的
< エラーの数 > データベース サーバがロードを
中止しなくてよい、コサーバ 1
台につき許容されるエラーの数
です。
構文
リテラル番号、
4-138 ページ
< 行数 >
リテラル番号、
4-138 ページ
引用文字列、
4-156 ページ
< レコード区
切り記号 >
制限
MAXERRORS 環境変数が設定
されていないと、データベース
サーバはエラーの数に関係な
く、すべてのデータを処理しま
す。このパラメータはアンロー
ド タスク中は無視されます。
外部表に含まれる行の概数です。 なし
レコードを区切る文字です。
区切り記号として印刷不可能文
RECORDEND 環境変数が設定さ 字を使用する場合は、それを
れていない場合、デフォルト値 ASCII 文字の 8 進表現として符
は復帰改行文字 (¥n) になります。 号化しなければなりません。た
とえば、’¥006’ で CTRL-F を表
すことができます。
(2/2)
表オプションのキーワードは次の表の説明に従って使用してください。二つのモー
ドのどちらか一方だけが指定されている場合を除き、データをロードまたはアン
ロードするときは常に各キーワードを使用できます。
キーワード
目的
CODESET
データのコード セットの種類を指定します。
DEFAULT
( ロードのみ )
データベース サーバが NULL を挿入する代わりに、区切り入力
ファイル内の欠落している値を列のデフォルト ( それが定義され
ている場合 ) で置換するように指定します。
このオプションを使用すると、入力ファイルが分散してロードさ
れます。入力ファイルはデフォルトがロードする値になっている
ファイルの各列に対してエントリを持つ必要はありません。
DELIMITER
区切りテキスト ファイル内のフィールドを区切る文字を指定します。
DELUXE
( ロードのみ )
データベース サーバに精細モードでデータをロードさせるフラグ
を設定します。
STANDARD 表にロードする場合には精細モードが必要です。
(1/2)
SQL 文
2-101
CREATE EXTERNAL TABLE 文
キーワード
目的
ESCAPE
データベース サーバに ASCII テキスト ベースのデータ ファイル
に埋め込まれた ASCII 特殊文字を識別するように指示します。
データをロードするときに ESCAPE が指定されていないと、データ
ベース サーバは埋め込まれた特殊文字の有無についてテキスト デー
タ ファイルの文字フィールドをチェックすることはありません。
データをロードするときに ESCAPE が指定されていないと、デー
タベース サーバはテキスト フィールドに埋め込み 16 進文字を作
成しません。
EXPRESS
データベース サーバに高速モードでデータをロードさせるように
するフラグを設定します。
高速モードを要求したが、表にインデックスまたは一意性制約が
存在しているか、ターゲット表が ROW と OPERATIONAL のい
ずれでもない場合、ロードは中止され、問題を通知するエラー
メッセージが出力されます。
FORMAT
データ ファイルのデータのフォーマットを指定します。
MAXERRORS
データベース サーバがロードを中止しなくてよいコサーバ 1 台に
つき許容されるエラーの数を設定します。
RECORDEND
区切りテキスト ファイル内のレコードを区切る文字を指定します。
REJECTFILE
すべてのコサーバの完全パス名を、データ変換エラーについてリ
ジェクト ファイルを書き込む領域に設定します。
変換エラーが発生し、REJECTFILE が指定されていなかったか、
リジェクト ファイルをオープンできない場合は、ロード ジョブ
は異常終了します。
リジェクト ファイルの命名とフォーマット文字の使用について
は、2-103 ページの「リジェクト ファイル」を参照してください。
SIZE
外部表に含まれる行の概数を指定します。
結合問合せで外部表を使用する場合に、このオプションを指定す
れば、パフォーマンスを向上できます。
(2/2)
2-102 Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
重要 : 外部表の検査制約は、データをロードするときにだけ、評価を受けるように
なっています。データはサーバの制御範囲を越えて自由に変更できるため、データ
ベース サーバは外部表に検査制約を強制することはできません。アンロード時に外
部表に書き込まれる行を制約したい場合は、WHERE 節を使用して、行にフィルタ
をかけます。
リジェクト ファイル
ロード時に変換エラーのある行または外部表に定義される検査制約に違反する行
は、変換を実行するコサーバ上のリジェクト ファイルに書き込まれます。各コサー
バはそれ固有のリジェクト ファイルを管理します。REJECTFILE キーワードは各コ
サーバ上のリジェクト ファイルに割り当てる名前を決定します。
ファイル名フォーマットの中で、フォーマット文字の %c と %n(%r は除く ) を使用
できます。複数のリジェクト ファイルは同一のディスクに書き込まれる場合、それ
らには一意なファイル名が付いていなければなりません。ファイル名を一意にする
には、%c フォーマット文字を使用します。フォーマット文字については、2-99
ページの「フォーマット文字の使用方法」の節を参照してください。
同一のセッション中に同じ表に対して再度ロードを実行する場合、それ以前に存在
していた、同一名のリジェクト ファイルはすべて上書きされます。
リジェクト ファイルのエントリは次のフォーマットになります。
< コサーバ番号 >, < ファイル名 >, < レコード >, < 理由コード >, < フィールド名 >:
< 不正行 >
要素
目的
< コサーバ番号 >
ファイルの読み取り元のコサーバの番号
< ファイル名 >
入力ファイルの名前
< レコード >
エラーが検出された入力ファイルのレコード番号
< 理由コード >
エラーの説明
< フィールド名 >
行で最初のエラーが発生した外部フィールド名、または拒否
が特定の列に固有のものでない場合は ’< なし >’
< 不正行 >
エラーの原因となった行 ( 区切りファイルまたは固定位置文
字ファイルのみ )。80 文字以内。
SQL 文
2-103
CREATE EXTERNAL TABLE 文
リジェクト ファイルは ASCII で < コサーバ番号 >、< ファイル名 >、< レコード >、
< フィールド名 > および < 理由コード > を書き込みます。不正行の情報は入力ファ
イルの種類によって異なります。区切りファイルまたは固定位置文字ファイルの場
合、80 文字までの不正行がリジェクト ファイルに直接コピーされます。Informix 内
部データ ファイルの場合、ファイルの 2 進表現は編集できないため、不良行がリ
ジェクト ファイルに記録されません。ただし、< コサーバ番号 >、< ファイル名 >、
< レコード >、< 理由コード >、< フィールド名 > はリジェクト ファイルに通知され
るため、問題を分離できます。
行が拒否される原因になるエラーの種類は次のとおりです。
エラー テキスト
説明
CONSTRAINT < 制約名 > この制約が違反されました。
CONVERT_ERR
いずれかのフィールドで変換エラーが検出されました。
MISSING_DELIMITER
区切り記号が見つかりませんでした。
MISSING_RECORDEND
レコードエンドが見つかりませんでした。
NOT NULL
< フィールド名 > に NULL がありました。
ROW_TOO_LONG
入力レコードが 32 キロバイトを超えています。
例
この節の例では、DATAFILES フィールドで使用するためのファイルに命名する方
法を示します。
データベース サーバが 4 つのノードで動作していて、それぞれのノードからファイ
ルを一つずつ読み取る場合を想定してみます。すべてのファイルには同じ名前が付
いています。DATAFILES 項目は次のようになります。
DATAFILES ("DISK:cogroup_all:/work2/unload.dir/mytbl")
次に、16 台のコサーバがあり、そのうちの 3 台 ( たとえば、2、5、9 のコサーバ )
だけにテープドライブが接続されているシステムを考えてみます。load コマンドと
unload コマンドを実行する前に、これらのコサーバのコグループを定義しておけ
ば、コマンドの実行時に個々のコサーバの並びの代わりに、コグループ名を使用で
きます。コグループをセットアップするには、onutil を実行します。
% onutil
1> create cogroup tape_group
2> from coserver.2, coserver.5, coserver.9;
Cogroup successfully created.
2-104 Informix Guide to SQL:Syntax
CREATE EXTERNAL TABLE 文
次に、名前付きパイプのファイル位置を定義します。
DATAFILES ("PIPE:tape_group:/usr/local/TAPE.%c")
ファイル名は次のように展開されます。
DATAFILES ("pipe:2:/usr/local/TAPE.2",
"pipe:5:/usr/local/TAPE.5",
"pipe:9:/usr/local/TAPE.9")
代わりに、2 台のコサーバの各々で 3 つのファイルを処理したい場合は、次のよう
にファイルを定義します。
DATAFILES ("DISK:1:/work2/extern.dir/mytbl.%r(1..3)",
"DISK:2:/work2/extern.dir/mytbl.%r(4..6)")
展開後の並びは次のようになります。
DATAFILES ("disk:1:/work2/extern.dir/mytbl.1",
"disk:1:/work2/extern.dir/mytbl.2",
"disk:1:/work2/extern.dir/mytbl.3",
"disk:2:/work2/extern.dir/mytbl.4",
"disk:2:/work2/extern.dir/mytbl.5",
"disk:2:/work2/extern.dir/mytbl.6")
参照
関連する文は、
「INSERT 文」、
「SELECT 文」
、「SET PLOAD FILE 文」です。
外部表の詳細については、お手持ちの『Administrator’s Guide』を参照してください。
SQL 文
2-105
CREATE INDEX 文
CREATE INDEX 文
+
CREATE INDEX 文は、表の中の一つまたは複数の列に対してインデックスを作成
したり、オプション機能によって、インデックスの順序で物理表をクラスタ化すし
たりする場合に使用します。複数の列を並べると、その一連の列の連結がインデッ
クス作成のための単一の複合列として扱われます。インデックスは個別の DB 領域
に断片化することができます。一意性インデックスまたは重複インデックスを作成
できます。
構文
,
CREATE
INDEX
< インデッ
クス >
(
<表>
ON
)
<列>
ASC
< シノニム >
DESC
インデックスタイプ
のオプション
2-108 ページ
格納オプション
2-122 ページ
IDS
インデックスモード
2-129 ページ
AD/XP
USING BITMAP
AD/XP
GK INDEX
< インデックス >
ON
< 静的 >
GK SELECT 節
2-120 ページ
USING BITMAP
2-106 Informix Guide to SQL:Syntax
CREATE INDEX 文
要素
目的
制限
構文
<列>
インデックスを付けたい一つま
たは複数の列の名前です。
列の位置、列の最大数、列の合
計幅、列に対する既存の制約、
同じ列で許容されるインデック
スの個数についての制約に従わ
なければなりません。
識別子、
4-112 ページ
< インデック
ス>
作成するインデックスの名前
です。
< シノニム >
インデックスを作成する表の名
前のシノニムです。
< 静的 >
GK インデックスを作成する表
の名前です。
<表>
インデックスが作成される表の
名前です。
2-110 ページの「CREATE
INDEX 文の列名変数に対する
制約」を参照。
名前はデータベース内で一意で
なければなりません。
名前の先頭バイトに ASCII 空白
(16 進数の 20) は指定できません。
シノニムとそのシノニムが指す
表はすでに存在しているもので
なければなりません。
存在している表でなければなり
ません。表は静的表でなければ
なりません。
存在している表でなければなり
ません。表は通常のデータベー
ス表または一時表になります。
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
説明
CREATE INDEX 文を発行すると、表は排他モードでロックされます。表を他のプ
ロセスが使用していると、データベースサーバは CREATE INDEX 文を実行できず、
エラーを返します。
AD/XP
Dynamic Server with AD and XP Options を使用している場合、圧縮ビットマップのイ
ンデックスの各キーにレコードの並びを格納するには、キーワード USING BITMAP
を使用します。ビットマップ インデックスは表と同様に断片化されなければならな
いため、格納オプションをビットマップ インデックスと同時に使用することはでき
ません。♦
SQL 文
2-107
CREATE INDEX 文
インデックス タイプのオプション
インデックス タイプのオプションを使用すると、インデックスの特性を指定できます。
インデックスタイ
プのオプション
CREATE INDEX 文へ戻る
2-106 ページ
UNIQUE
CLUSTER
DISTINCT
UNIQUE および DISTINCT オプション
次の例では、一意性インデックスを作成します。
CREATE UNIQUE INDEX c_num_ix ON customer (customer_num)
一意性インデックスによって列顧客番号における重複値の使用が防止されます。
一意性インデックスを持つ列に許容される NULL 値は一つだけです。キーワード
DISTINCT はキーワード UNIQUE の同義語であるため、次の文の結果も同じになり
ます。
CREATE DISTINCT INDEX c_num_ix ON customer (customer_num)
いずれの例のインデックスも、デフォルトの順序である昇順で管理されます。
CREATE INDEX 文でキーワード UNIQUE または DISTINCT を指定しないと、重複
インデックスが作成されます。重複インデックスを使用すると、インデックス付き
列で重複値を使用することができます。
2-108 Informix Guide to SQL:Syntax
CREATE INDEX 文
また、CREATE TABLE 文または ALTER TABLE 文を使用して一意性制約を作成す
ることにより、一つの列または一連の列での重複値を防止することもできます。一
意性制約の作成についての詳細は、
「CREATE TABLE 文」または「ALTER TABLE
文」を参照してください。
AD/XP
Dynamic Server with AD and XP Options での連結インデックスに対する制約
表を断片化する場合、その断片化を定義する列に一意性インデックスが定義されな
ければなりません。
一意性制約および参照制約がインデックスに与える影響
内部インデックスは、一意性制約および参照制約を作成します。表の作成後に一意
性制約または参照制約を追加すると、ユーザが作成した適切なインデックスが使用
されます。適切なインデックスとは、参照制約または一意性制約で使用される同じ
列を指し示すインデックスのことです。適切なインデックスがなければ、断片化さ
れていないインデックスがデータベースの DB 領域に作成されます。
CLUSTER オプション
CLUSTER オプションは、インデックスによって指定された順序で物理表をソート
する場合に使用します。CLUSTER インデックスがすでに存在する場合は、
CREATE INDEX 文に CLUSTER オプションを指定することはできません。
CREATE CLUSTER INDEX c_clust_ix ON customer (zipcode)
この文では、表顧客情報を郵便番号の順に物理的にソートするインデックスを作成
します。
インデックスのフラグメントに加えて CLUSTER オプションが指定されている場合
には、データはフラグメントのコンテキスト内でのみクラスタ化され、表全体で広
域的にクラスタ化されることはありません。
AD/XP
Dynamic Server with AD and XP Options を使用している場合、同一の CREATE INDEX
文の中で CLUSTER オプションと格納オプションを使用することはできません
(2-122 ページの「格納オプション」を参照 )。クラスタ化されたインデックスを作
成すると、対応する表の一意性制約または参照制約の constrid がすべて変更されま
す。constrid はシステム カタログ表 sysconstraints に格納されます。♦
SQL 文
2-109
CREATE INDEX 文
CREATE INDEX 文の列名変数に対する制約
列名変数を指定する場合には、次の制限に従ってください。
■
指定するすべての列が存在しており、同じ表に所属していなければなりま
せん。
■
列の最大数とすべての列の合計幅はデータベース サーバによって異なりま
す。2-110 ページの「複合インデックス」を参照してください。
■
すでに一意性制約を持っている列または列の並びには、降順のインデック
スを追加することはできません。2-111 ページの「キーワード ASC および
DESC」を参照してください。
■
主キー制約を持っている列または列の並びには、一意性インデックスを追
加することはできません。この理由は、列または列の並びを主キーとして
定義すると、データベース サーバがその列または列の並びに一意な内部イ
ンデックスを作成するためです。したがって、CREATE INDEX 文でこの列
または列の並びに別の一意性インデックスを作成することはできません。
■
同じ列または同じ一連の列に作成できるインデックスの数には制限がありま
す。2-116 ページの「使用可能なインデックスの数」を参照してください。
複合インデックス
次の例は、表 stock の列 stock_num と manu_code を使用する複合インデックスを作成
します。
CREATE UNIQUE INDEX st_man_ix ON stock (stock_num, manu_code)
インデックスは、sock_num と manu_code の組合せの重複を防ぎます。インデックス
は、デフォルトでは昇順になります。
複合インデックスには、16 列含むことができます。単一の CREATE INDEX 文のイ
ンデックスを付ける列すべての合計幅は 255 バイトを超えてはなりません。
複合インデックスの列は使用頻度の高い方から順に配置してください。
2-110 Informix Guide to SQL:Syntax
CREATE INDEX 文
キーワード ASC および DESC
キーワード ASC と DESC を使用すれば、インデックスを昇順と降順のどちらで格納
するかを指定できます。昇順で管理されるインデックスの使用には、オプション
ASC を使用します。オプション ASC は、デフォルトの順序です。降順で管理され
るインデックスの指定には、オプション DESC を使用します。
CREATE TABLE 文または ALTER TABLE 文で列または列の並びが一意に定義され
ている場合には、データベースサーバは一意の昇順インデックスを作成し、その一
意性制約を実行します。したがって、すでに一意に定義されている列または列の並
びには、CREATE INDEX 文を使用して昇順インデックスを追加することはできま
せん。
そのような列で降順インデックスを作成し、異なる組合せで複合昇順インデックス
に入れることができます。たとえば、次のような一連の文を指定できます。
CREATE TABLE customer (
customer_num
fname
lname
company
address1
address2
city
state
zipcode
phone
)
SERIAL(101) UNIQUE,
CHAR(15),
CHAR(15),
CHAR(20),
CHAR(20),
CHAR(20),
CHAR(15),
CHAR(2),
CHAR(5),
CHAR(18)
CREATE INDEX c_temp1 ON customer (customer_num DESC)
CREATE INDEX c_temp2 ON customer (customer_num, zipcode)
インデックスの双方向移動
キーワード ASC または DESC を指定せずに列にインデックスを作成すると、デー
タベースサーバはデフォルトの昇順でキーの値を格納します。キーワード ASC を
指定すると、データベースサーバは昇順でキーの値を格納します。キーワード
DESC を指定すると、データベースサーバは降順でキーの値を格納します。
SQL 文
2-111
CREATE INDEX 文
昇順では、キーの値は最小のキーから最大のキーへの順序で格納されます。たとえ
ば、表 customer の列 lname に昇順インデックスを作成すると、名前は、Albertson、
Beatty、Currie の順序でインデックスに格納されます。
降順では、キーの値は最大のキーから最小のキーへの順序で格納されます。たとえ
ば、表 customer の列 lname に降順インデックスを作成すると、名前は、Currie、
Beatty、Albertson の順序でインデックスに格納されます。
しかし、データベースサーバの双方向移動機能を使用すると、列に一つだけイン
デックスを作成し、そのインデックスを、昇順か降順のどちらかでソート列をソー
トすることを指定する問合せに使用できます。
インデックスの双方向移動の例
次に、データベースサーバによるインデックスの双方向移動を説明するために役立
つ例を示します。次の二つの問合せを入力したいとします。
SELECT lname, fname FROM customer ORDER BY lname ASC;
SELECT lname, fname FROM customer ORDER BY lname DESC;
このように SELECT 文で ORDER BY 節を指定すると、ORDER BY 列にインデック
スを作成することによって問合せの処理速度を上げることができます。データベー
スサーバの双方向移動機能により、列 lname にインデックスを一つ作成するだけで
済みます。
たとえば、次の文を使って列 lname に昇順インデックスを作成できます。
CREATE INDEX lname_bothways ON customer (lname ASC)
データベースサーバは、昇順インデックス lname_bothways を使用して最初の問合せ
結果を昇順でソートし、その後二番目の問合せ結果を降順でソートします。
2-112 Informix Guide to SQL:Syntax
CREATE INDEX 文
最初の問合せで、結果を昇順でソートしたいとします。そこで、データベースサー
バはインデックス lname_bothways のページを左から右に移動し、キーの値を最小
キーから最大キーへと検索します。問合せ結果は次のようになります。
lname
Albertson
Beatty
Currie
.
.
.
Vector
Wallack
Watson
fname
Frank
Lana
Philip
Raymond
Jason
George
インデックスを左から右に移動することは、データベースサーバがインデックスの
左端のリーフノードから始め、インデックスの右端のリーフノードへと続けること
を意味します。
二番目の問合せで、結果を降順でソートしたいとします。そこで、データベース
サーバはインデックス lname_bothways のページを右から左に移動し、キーの値を最
大キーから最小キーへと検索します。問合せ結果は次のようになります。
lname
Watson
Wallack
Vector
.
.
.
Currie
Beatty
Albertson
fname
George
Jason
Raymond
Philip
Lana
Frank
インデックスを右から左に移動することは、データベースサーバがインデックスの
右端のリーフノードから始め、インデックスの左端のリーフノードへと続けること
を意味します。
インデックスのリーフノードの説明については、
『Administrator’s Guide』を参照し
てください。
SQL 文
2-113
CREATE INDEX 文
昇順または降順インデックスの選択
先程の例では、CREATE INDEX 文でキーワード ASC を指定することによって、表
customer の列 lname に昇順インデックスを作成しました。その後データベースサー
バはこのインデックスを使用して、最初の問合せ結果を lname の値の昇順でソート
し、二番目の問合せ結果を lname の値の降順でソートしました。しかし、降順イン
デックスとしてインデックスを作成した場合でも、まったく同じ結果が得られます。
例えば、次の文は、データベースサーバが両方の問合せを処理するために使用でき
る降順インデックスを作成します。
CREATE INDEX lname_bothways2 ON customer (lname DESC)
この結果、インデックス lname_bothways2 は最大キーから最小キーへ、降順で列
lname のキーの値を格納します。データベースサーバが最初の問合せを処理すると
きは、結果を昇順でソートするためにインデックスを右から左に移動します。デー
タベースサーバが二番目の問合せを処理するときは、結果を降順でソートするため
にインデックスを左から右に移動します。
このため、単一列インデックスを昇順インデックスとして作成しても降順インデッ
クスとして作成してもかまいません。インデックスにどちらの格納順序を選択して
も、データベースサーバが問合せを処理するときにそのインデックスを昇順または
降順に移動できます。
複合インデックスでのキーワード ASC と DESC の使用
データベースサーバがインデックスを昇順または降順に移動できるので、表の単一
列にインデックスを置く場合、キーワード ASC または DESC を指定する必要はあ
りません。データベースサーバはデフォルトでは昇順でインデックスを作成します
が、データベースサーバはこのインデックスを問合せで使用するときに昇順、降順
のどちらにも移動できます。
しかし、表で複合インデックスを作成する場合、キーワード ASC または DESC が
必要となることがあります。たとえば、ORDER BY 節で複数の列を異なる順序で
ソートする SELECT 文を入力し、この問合せにインデックスを使用したい場合、
ORDER BY 節に対応する複合インデックスを作成する必要があります。
2-114 Informix Guide to SQL:Syntax
CREATE INDEX 文
たとえば、次の問合せを入力するとします。
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code ASC, unit_price DESC
この問合せは、最初に列 manu_code の値を昇順でソートし、次に列 unti_price の値
を降順でソートします。この問合せにインデックスを使用するために、ORDER BY
節の要件に対応する CREATE INDEX 文を発行しなければなりません。たとえば、
次の文のどちらかを入力してインデックスを作成できます。
CREATE INDEX stock_idx1 ON stock
(manu_code ASC, unit_price DESC);
CREATE INDEX stock_idx2 ON stock
(manu_code DESC, unit_price ASC);
これで、問合せを実行すると、データベースサーバは、作成したインデックス
(stock_idx1 か stock_idx2 のどちらか ) を使用して問合せ結果を列 manu_code の値を
昇順でソートした後、列 unti_price の値を降順でソートします。インデックス
stock_idx1 を作成した場合、問合せが実行されると、データベースサーバはイン
デックスを左から右に移動します。インデックス stock_idx2 を作成した場合、問合
せが実行されると、データベースサーバはインデックスを右から左に移動します。
どちらのインデックスを作成しても、問合せ結果は次のようになります。
stock_num
8
205
110
304
301
310
201
313
6
9
5
309
302
.
.
.
manu_code
ANZ
ANZ
ANZ
ANZ
ANZ
ANZ
ANZ
ANZ
ANZ
ANZ
ANZ
HRO
HRO
description
バレーボール
ゴルフボール 3 個
ヘルメット
時計
ランニングシューズ
キックボード
ゴルフシューズ
水泳帽
テニスボール
バレーボールネット
テニスラケット
耳栓
氷嚢
unit_price
$840.00
$312.00
$244.00
$170.00
$95.00
$84.00
$75.00
$60.00
$48.00
$20.00
$19.80
$40.00
$4.50
(1/2)
SQL 文
2-115
CREATE INDEX 文
stock_num
113
1
6
5
manu_code
SHM
SMT
SMT
SMT
description
18-spd, assmbld
野球グローブ
テニスボール
テニスラケット
unit_price
$685.90
$450.00
$36.00
$25.00
(2/2)
この問合せに使用する複合インデックス (stock_idx1 と stock_idx2) は、ORDER BY
節の二つの列に同じ方向のソートを指定する問合せには使用できません。たとえ
ば、次の問合せを入力したいとします。
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code ASC, unit_price ASC;
SELECT stock_num, manu_code, description, unit_price
FROM stock
ORDER BY manu_code DESC, unit_price DESC;
これらの問合せの性能を向上させるために複合インデックスを使用したい場合、次
のいずれか一つの CREATE INDEX 文を入力する必要があります。作成したイン
デックス (stock_idx3 または stock_idx4) のどちらか一つを使用して、先程の問合せ
の性能を向上することができます。
CREATE INDEX stock_idx3 ON stock
(manu_code ASC, unit_price ASC);
CREATE INDEX stock_idx4 ON stock
(manu_code DESC, unit_price DESC);
使用可能なインデックスの数
同じ列または同じ一連の列に作成できるインデックスの数には制限があります。
2-116 Informix Guide to SQL:Syntax
CREATE INDEX 文
一列のインデックスの数の制限
一列には、一つの昇順インデックスと一つの降順インデックスだけを作成できま
す。たとえば、表 stock の列 stock_num に可能なインデックスをすべて作成したい
場合、次のインデックスを作成できます。
■
列 stock_num に昇順の stock_num_asc インデックス
■
列 stock_num に降順の stock_num_desc インデックス
データベースサーバの双方向移動機能により、実際に両方のインデックスを作成す
る必要はありません。どちらか一つのインデックスを作成するだけで済みます。ど
ちらのインデックスを作成しても、列 stock_num の昇順と降順のソート結果はまっ
たく同じになります。データベースサーバの双方向移動機能についての詳細は
2-111 ページの「インデックスの双方向移動」を参照してください。
一連の列のインデックスの数の制限
各インデックスが昇順列と降順列について一意の組合せを持っている場合には、一
連の列に複数のインデックスを作成できます。たとえば、表 stock の列取扱品目番
号と列メーカーコードにすべての可能なインデックスを作成したい場合は、次のイ
ンデックスの作成が可能です。
■
両方の列で昇順のインデックス ix1
■
両方の列で降順のインデックス ix2
■
列取扱品目番号に昇順のインデックス、列メーカーコードに降順の
インデックス ix3
■
列取扱品目番号に降順のインデックス、列メーカーコードに昇順の
インデックス ix4
SQL 文
2-117
CREATE INDEX 文
データベースサーバの双方向移動機能により、実際に 4 つのインデックスを作成す
る必要はありません。二つのインデックスを作成するだけで済みます。
■
インデックスix1とix2では、
両方の列に同じソート方向(昇順あるいは降順)
を指定したソート結果はまったく同じになります。このため、この組のど
ちらか一つのインデックスを作成するだけで済みます。
■
インデックス ix3 と ix4 では、
二つの列に異なるソート方向 ( 最初の列に昇順
を指定し二番目の列に降順を指定しているか、その逆 ) を指定したソート
結果はまったく同じになります。このため、この組のどちらか一つのイン
デックスを作成するだけで済みます。
データベースサーバの双方向移動機能についての詳細は 2-111 ページの「インデッ
クスの双方向移動」を参照してください。
連結インデックスおよび分離インデックス
表を断片化し、後でその表のインデックスを作成する場合、FRAGMENT BY
EXPRESSION 節または IN <DB 領域 > 節を使用して指定しない限り、インデックス
は表と同じ断片化ストラテジを使用します。表の断片化を変更すると、インデック
スの断片化もそれに応じて変更されます。連結インデックスは断片化ストラテジを
使用しないで作成されるインデックスです。インデックスが断片化ストラテジを使
用して作成されている場合、または表とは別の DB 領域に格納されている場合、分
離インデックスになります。
2-118 Informix Guide to SQL:Syntax
CREATE INDEX 文
AD/XP
一般化キー インデックス
Dynamic Server with AD and XP Options を使用している場合は、一般化キー (GK) イン
デックスを作成できます。通常のインデックスのキーはインデックスを作成される
表の一つまたは複数の列で構成されます。GK インデックスは問合せの結果に基づ
いて表にレコードに関する情報を格納します。
一般化キー (GK) インデックスは、特にデータ ウェアハウジング環境で、より高速
な問合せ処理を可能にする、事前に計算されたインデックス機能の一つの形式を提
供します。オプティマイザは、GK インデックスを使用して、パフォーマンスを向
上することができます。
表がインデックスを作成する対象になっているとき、GK インデックスがその表に
定義されます。表がインデックスの FROM 節に指定されている場合、GK インデッ
クスはその表に従属します。GK インデックスを作成する前に、次の事柄に注意し
てください。
■
GK インデックスの中で使用される表はすべて静的表でなければなりませ
ん。GK インデックスが表に従属しているとき、その表のタイプを非静的
に変更しようとすると、データベース サーバはエラーを返します。
■
GK インデックスに関係している表はすべて静的タイプでなければならな
いため、従属する GK インデックスが削除され、表のタイプが変更される
まで、その表に対して UPDATE、DELETE、INSERT および LOAD の操作
を実行することはできません。
SQL 文
2-119
CREATE INDEX 文
一般化キー インデックスに対する SELECT 節
AD/XP
Dynamic Server with AD and XP Options を使用している場合、GK SELECT 節のオプ
ションは 2-450 ページの SELECT 文のオプションのサブセットになります。GK
SELECT 節の構文は SELECT 文の構文と同じフォーマットです。
CREATE INDEX 文へ戻る
2-106 ページ
GK SELECT 節
,
式
4-33 ページ
SELECT
GK
FROM 節
2-121 ページ
ALL
*
DISTINCT
+
GK
WHERE 節
2-122
ページ
<表>
UNIQUE
< シノニム >
< 別名 >
要素
目的
制限
< 別名 >
FROM 節で表に割り当てた一時 FROM 節で表に別名を割り当て 識別子、
的な名前です。
る場合を除き、SELECT 節に別 4-112 ページ
名を使用することはできません。
< シノニム >
データを検索したいシノニムの
名前です。
<表>
データを検索したい表の名前
です。
構文
インデックスを作成されている
表に別名を使用することはでき
ません。
シノニムとシノニムが指す表は データベース オブ
存在していなければなりません。 ジェクト名、
4-25 ページ
表は存在していなければなりま データベース オブ
せん。
ジェクト名、
4-25 ページ
GK SELECT 節の式には、次の制限が適用されます。
■
式はストアド プロシジャを参照することはできません。
■
式には、USER 関数、TODAY 関数、CURRENT 関数、DBINFO 関数または
時刻あるいは時間隔を参照する関数を入れることはできません。
2-120 Informix Guide to SQL:Syntax
CREATE INDEX 文
一般化キー インデックスの FROM 節
GK SELECT 節へ戻る
2-120 ページ
GK FROM 節
FROM
< インデックス
付き表 >
< シノニム >
,
<表>
< シノニム >
< 別名 >
AS
要素
< 別名 >
目的
表の一時的な名前です。
< インデック
ス付き表 >
インデックスを作成されている
表の名前です。
< シノニム >
データを検索したいシノニムの
名前です。
<表>
データを検索したい表の名前
です。
制限
構文
< インデックス付き表 > と共に別 識別子、
名を使用することはできません。 4-112 ページ
FROM 節には、インデックス付 データベース オブ
き表を入れなければなりません。 ジェクト名、
4-25 ページ
シノニムとシノニムが指す表は データベース オブ
存在していなければなりません。 ジェクト名、
4-25 ページ
表は存在していなければなりま データベース オブ
せん。
ジェクト名、
4-25 ページ
FROM 節に記述される表はすべてローカルな静的表でなければなりません。つま
り、ビュー、非静的表、遠隔表は許容されていません。
FROM 節に記述される表は、インデックス付き表の中間的な連結キーでなければな
りません。表 A と B が A の一意キー列に等号結合で結合されている場合、表 A は表
B の中間的な結合キーになります。たとえば、表 A、B、C がそれぞれ主キーとして
col1 を持っていると想定します。次の例では、B は A のキーに結合され、C は B の
キーに結合されます。このとき、C は A のキーに中間的に結合されます。
CREATE GK INDEX gki
(SELECT A.col1, A.col2 FROM A, B, C
WHERE A.col1 = B.col1 AND B.col1 = C.col1)
SQL 文
2-121
CREATE INDEX 文
一般化キー インデックスに対する WHERE 節
GK SELECT 節へ戻る
2-120 ページ
GK WHERE 節
AND
条件
4-5 ページ
WHERE
結合
2-478 ページ
GK インデックスに対する WHERE 節には、次の制限があります。
■
節には、USER 関数、TODAY 関数、CURRENT 関数、DBINFO 関数または
時刻あるいは時間隔を参照する関数を入れることはできません。
■
節はストアド プロシジャを参照することはできません。
■
節には、副問合せを入れることはできません。
■
節では、集計関数を使用することはできません。
■
節では、IN 節、LIKE 節、MATCH 節を使用することはできません。
格納オプション
格納オプションを使用すれば、インデックスを格納する方法と場所を指定できます。
格納の
オプション
CREATE INDEX 文へ戻る
2-106 ページ
FILLFACTOR
< パーセント >
IN <DB 領域 >
インデックス用の
FRAGMENT BY 節
2-125 ページ
2-122 Informix Guide to SQL:Syntax
CREATE INDEX 文
要素
目的
インデックスを配置したい DB
領域の名前です。
< パーセント > インデックスの作成時にイン
デックス データで満たされる各
インデックス ページの割合で
す。デフォルト値は 90
<DB 領域 >
AD/XP
制限
構文
DB 領域は文の実行時に存在し
ていなければなりません。
値は 1 から 100 の範囲でなけれ
ばなりません。
識別子、
4-112 ページ
リテラル番号、
4-138 ページ
Dynamic Server with AD and XP Options を使用する場合は、格納オプションを使用す
るクラスタ化されたインデックスを作成することはできません。 ♦
FILLFACTOR 節
FILLFACTOR 節は、後で B ツリーインデックスを拡大したり、圧縮されたイン
デックスを縮小したりする場合に使用します。1 ∼ 100 のパーセント値を指定しま
す。デフォルトのパーセント値は 90 です。
インデックスを作成すると、データベースサーバは、まず FILLFACTOR 値で指定
された割合までノードを満たします。50 などの小さいパーセント値を指定すると、
インデックスに拡大の余地を残しておくことができます。B ツリーインデックスの
ノードは、まず特定の割合まで満たされるため、挿入用の領域を持つことになりま
す。使用可能な領域は、各ページのキーの数とパーセント値によって異なります。
たとえば、FILLFACTOR の値が 50 パーセントの場合にはページは半分だけ満たさ
れるため、その 2 倍まで拡大することができます。パーセント値が小さいと挿入が
高速になるため、拡大が予想されるインデックスに使用することができます。
99 などの大きいパーセント値を指定すると、インデックスは圧縮され、新しいイン
デックスの挿入によってノードが分割されます。100 パーセントを指定すると、最
大の密度が得られます。FILLFACTOR の値が 100 パーセントの場合は、インデック
スをそれ以上拡大する余地がありません。インデックスに追加を行うと、ノードが
分割されます。FILLFACTOR の値が 99 パーセントの場合は、ノード一つあたり少
なくとも一つの挿入が可能な余地が残されます。パーセント値が大きいと選択が高
速になるため、それ以上拡大が予想されないインデックスや、ほとんど読込み専用
のインデックスに使用することができます。
SQL 文
2-123
CREATE INDEX 文
このオプションは、5,000 を超える行を格納し、101 以上の表ページを使用している
表にインデックスを作成する場合、断片化された表にインデックスを作成する場
合、または断片化されていない表に断片化されたインデックスを作成する場合にだ
け有効になります。FILLFACTOR は ONCONFIG ファイルのパラメータとして設定
することもできます。CREATE INDEX 文の FILEFACTOR 節は、ONCONFIG ファイ
ルの設定を無効にします。
ONCONFIG ファイルおよび、ONCONFIG に使用できるパラメータについての詳細
は『Administrator’s Guide』を参照してください。
IN DB 領域節
IN <DB 領域 > 節は、インデックスを格納する DB 領域を指定する場合に使用しま
す。この節を使用すると、インデックスが断片化されていない場合でも切り離され
たインデックスが作成されます。指定する DB 領域は、すでに存在するものでなけ
ればなりません。IN <DB 領域 > 節を指定しないと、インデックスは、表を作成し
た DB 領域に作成されます。
さらに、IN<DB 領域 > を指定せず、基礎となる表が断片化されているとインデック
スは切り離されたインデックスとして作成され、断片化されたインデックスに対す
る制限がすべて適用されます。断片化されたインデックスについての詳細は、2-125
ページの「インデックスに対する FRAGMENT BY 節」を参照してください。
IN <DB 領域 > 節を使用すると、インデックスを分離することができます。たとえ
ば、表顧客情報を DB 領域 custdata に作成したが、インデックスは custind と呼ばれ
る個別の DB 領域に作成したい場合には、次の文を使用します。
CREATE TABLE customer
.
.
.
IN custdata EXTENT SIZE 16
CREATE INDEX idx_cust ON customer (customer_num)
IN custind
2-124 Informix Guide to SQL:Syntax
CREATE INDEX 文
インデックスに対する FRAGMENT BY 節
FRAGMENT BY EXPRESSION 節は、式を使用する分散スキームの定義に使用します。
FRAGMENT BY 節は Dynamic Server、Workgroup Edition と Developer Edition では利
用できません。♦
W/D
格納オプションへ戻る
2-122 ページ
インデックスに対する
FRAGMENT BY 節
,
FRAGMENT BY
,
< 式 > IN <DB 領域 >
EXPRESSION
,
< 式 > IN <DB 領域 >
REMAINDER IN <DB 領域 >
AD/XP
,
(
HASH
,
<列>
)
,
IN <DB 領域 >
<DB 領域 >
IN <DB スライス >
,
HYBRID
(
,
<列>
)
EXPRESSION
< 式 > IN
<DB スライス >
,
< 式 > IN
<DB スライス >
,
(
HASH
(
<列>
)
)
,
REMAINDER IN <DB スライス >
SQL 文
2-125
CREATE INDEX 文
要素
<列>
目的
インデックスを断片化したい列
の名前です。
制限
構文
指定した列はすべて現行の表に 識別子、
存在していなければなりません。 4-112 ページ
シリアル列を指定する場合は、
そのほかの列を指定することは
できません。
インデックス
フラグメントす
スライス
<DB
>
DB スライスは、文の実行時に存 識別子、
べてを含む DB スライスの名前 在していなければなりません。 4-112 ページ
です。
<DB 領域 >
< 式 > が定義するインデックス DB 領域は、文の実行時に存在 識別子、
フラグメントを含む DB 領域の していなければなりません。
4-112 ページ
名前です。
最大 2,048、DB 領域を指定でき
<式>
ます。
インデックス キーが範囲規則、 各式は、現行の表からの列と単
ハッシュ規則、または任意規則 一行からのデータ値のみを含む
を使用して格納されるフラグメ ことができます。
ントを定義する式です。
式に含まれる列は、インデッ
クス付けされた列と同じか、
またはインデックス付けされ
た列のサブセットでなければ
なりません。
副問合せ、ストアド プロシ
ジャ、現行の日付関数や時刻関
数、または集計関数を式で使用
することはできません。
2-126 Informix Guide to SQL:Syntax
式、4-33 ページおよ
び条件、4-5 ページ
CREATE INDEX 文
式に基づく分散スキームでは、各式が規則に従って DB 領域を指定します。各式は
規則に従ってデータを分離し、データベースサーバによるインデックスキーの探索
に役立ちます。次の規則から一つを指定することができます。
■
範囲規則
範囲規則では、範囲を使用する式を指定して、次の例に示すように、フラ
グメントに置くインデックスキーを指定します。
.
.
.
FRAGMENT BY EXPRESSION
c1 < 100 IN dbsp1,
c1 >= 100 and c1 < 200 IN dbsp2,
c1 >= 200 IN dbsp3;
■
任意の規則
任意の規則では、グループデータに対する OR 節の使用が通常含まれるあ
らかじめ定義された SQL 式に基づいて、次の例に示すように式を指定し
ます。
.
.
.
FRAGMENT BY EXPRESSION
zip_num = 95228 OR zip_num = 95443 IN dbsp2,
zip_num = 91120 OR zip_num = 92310 IN dbsp4,
REMAINDER IN dbsp5;
警告 : 式で日付型の値を指定する場合には、必ず 2 桁ではなく 4 桁の年を指定して
ください。4 桁の年を指定すると、環境変数 DBCENTURY は分散スキームにまっ
たく影響を与えません。2 桁の年を指定すると、環境変数 DBCENTURY が分散ス
キームに影響を与えるため、予測できない結果が得られることがあります。環境変
数 DBCENTURY についての詳細は、『Informix Guide to SQL: Reference』を参照し
てください。
SQL 文
2-127
CREATE INDEX 文
インデックスフラグメントの作成
表を断片化すると、別の断片化ストラテジを指定しない限り、その表のすべてのイ
ンデックスが表と同様に断片化されます。
システムインデックスの断片化
システムインデックス ( 参照制約および一意性制約で使用されるもの)は、ユーザ
インデックスがある場合にはそれを使用します。ユーザインデックスを使用できな
い場合は、システムインデックスは断片化されず、データベースが作成された DB
領域に移されます。システムインデックスを断片化するには、制約付き列で断片化
されたインデックスを作成し、次に ALTER TABLE 文を使用して制約を追加します。
IDS
Dynamic Server の一意性インデックスの断片化
一意性インデックスは、式に基づく分散スキームを使用している表を用いた場合に
限り断片化できます。式で参照される列は、インデックス付き列の一部でなければ
なりません。CREATE INDEX 文がこれらの制限のいずれかを満たしていない場合
は、CREATE INDEX 文は失敗し、作業はロールバックされます。
一時表のインデックスの断片化
CREATE TABLE 文の TEMP TABLE 節または SELECT 文の INTO TEMP 節を使用し
て、明示的に一時表を作成できます。環境変数 DBSPACETEMP に一つ以上の DB
領域を指定しているが、明示的に断片化ストラテジを指定しなかった場合、データ
ベースサーバは環境変数 DBSPACETEMP に指定された DB 領域にまたがって一時
表をラウンドロビンに断片化します。
一時表に一意性インデックスを作成しようとしているが、インデックスの断片化ス
トラテジを指定していない場合、インデックスは表と同じ方法では断片化されませ
ん。基礎となる表が式ベースの分散スキームを使用している場合にのみ、一意性イ
ンデックスを断片化できます。ただし、一時表はラウンドロビン分散スキームに
従って断片化されます。
2-128 Informix Guide to SQL:Syntax
CREATE INDEX 文
一時表の一意性インデックスを断片化する代わりに、データベースサーバは環境変
数 DBSPACETEMP に指定された最初の DB 領域にインデックスを作成します。こ
れを避けるには、FRAGMENT BY EXPRESSION 節を使用してインデックスの断片
化ストラテジを指定します。
環境変数 DBSPACETEMP についての詳細は、『Informix Guide to SQL: Reference』を
参照してください。
IDS
Dynamic Server のインデックスモードオプション
インデックス モードのオプションを使用すると、挿入、削除、更新の操作中のイン
デックスの動作を制御できます。
インデックス
モードオプション
CREATE INDEX 文へ戻る
2-106 ページ
DISABLED
ENABLED
FILTERING
WITHOUT ERROR
WITH ERROR
SQL 文
2-129
CREATE INDEX 文
次の表でインデックスモードについて説明します。
オブジェクト
モード
作用
オフ
オフモードで作成された一意性インデックスは、基本表を変更す
る挿入、削除、更新の操作の後で更新されません。オフインデッ
クスの内容は最新のものではないため、オプティマイザは問合せ
の実行中にこのインデックスを使用しません。
オン
オンモードで作成された一意のインデックスは、基本表を変更す
る挿入、削除、更新の操作の後で更新されます。オンインデック
スの内容は最新のものであるため、オプティマイザは問合せの実
行中にこのインデックスを使用します。挿入または更新操作によ
り重複キー値が一意のオンインデックスに追加されると、文は失
敗します。
フィルタ
フィルタモードで作成された一意のインデックスは、基本表を変
更する挿入、削除、更新の操作の後で更新されます。フィルタ
モードのインデックスの内容は最新のものであるため、オプティ
マイザは問合せの実行中にこのインデックスを使用します。挿入
または更新操作により重複キー値がフィルタモードでの一意のイ
ンデックスに追加されると、文の処理は続行されますが、不正な
行が基本表に関連付けられた違反表に書き込まれます。一意性イ
ンデックス違反に関する診断情報が、基本表に関連付けられた診
断表に書き込まれます。
フィルタを指定すると、次のいずれかのエラーオプションも指定できます。
エラー
オプション
作用
WITHOUT
ERROR
一意性インデックス違反が挿入または更新操作中に発生すると、
ユーザに整合性違反エラーは返されません。
WITH
ERROR
一意性インデックス違反が挿入または更新操作中に発生すると、
ユーザに整合性違反エラーが返されます。
2-130 Informix Guide to SQL:Syntax
CREATE INDEX 文
一意性インデックスのオブジェクトモードの指定
CREATE INDEX 文で一意性インデックスモードを指定する場合には、次のルール
に従わなければなりません。
■
一意性インデックスは、オン、オフ、またはフィルタに設定することが
できます。
■
モードを指定しないと、デフォルトとしてインデックスが有効になります。
■
WITH ERROR または WITHOUT ERROR オプションを指定しないと、デフォ
ルトの WITHOUT ERROR になります。
■
既存のデータベース表に新しい一意性インデックスを追加し、そのイン
デックスのオブジェクトモードとしてオフを指定すると、インデックス付
き列の重複値によって一意性インデックスの違反が発生する場合でも
CREATE INDEX 文は正しく実行されます。
■
既存のデータベース表に新しい一意性インデックスを追加し、そのイン
デックスのオブジェクトモードとしてオンまたはフィルタを指定すると、
一意性インデックスの違反を引き起こす重複値がインデックス付き列にな
い場合に限り CREATE INDEX 文は正しく実行されます。ただし、イン
デックス付き列に重複値がある場合には、CREATE INDEX 文は失敗し、
エラーが返されます。
■
オンまたはフィルタモードで既存のデータベース表に新しい一意性イン
デックスを追加した場合に、インデックス付き列に重複値があると、デー
タベース表のエラーが発生した行は違反表にフィルタされません。した
がって、違反表を使用してデータベース表のエラーが発生した行を検出す
ることはできません。
列に重複値が存在する場合の一意性インデックスの追加
オンモードで一意性インデックスを追加しようとしたときに、インデックス付き列
に重複値があるためエラーメッセージが表示された場合は、次の手順を実行してイ
ンデックスを正しく追加してください。
1.
オフモードでインデックスを追加します。CREATE INDEX 文を再び発行
しますが、今回はキーワード DISABLED を指定します。
2.
START VIOLATIONS TABLE 文を使用して、目的表の違反および診断表を
開始します。
SQL 文
2-131
CREATE INDEX 文
3.
SET DATABASE OBJECT MODE 文を発行し、インデックスのモードをオ
ンモードに切り替えます。この文を発行すると、一意性インデックスの条
件に違反する目的表の既存の行が違反表にも複製されます。ただし、整合
性違反を示すエラーメッセージが表示されると、インデックスはオフのま
まになります。
4.
違反表で SELECT 文を発行し、目的表から複製された条件に従わない行を
抽出します。場合によっては、違反表と診断表を結合し、必要なすべての
情報を入手する必要があります。
5.
一意性インデックスの条件に違反する目的表の行については、適切な訂正
処置を実行してください。
6.
目的表の条件に従わない行をすべて修正したら、SET 文を再び発行して、
オフモードのインデックスをオンモードに切り替えます。今回は、イン
デックスはオンになり、整合性違反についてのエラーメッセージは返され
ません。これは、目的表のすべての行が新しい一意性インデックスの条件
を満たすようになったためです。
重複インデックスのモードの指定
CREATE INDEX 文で重複インデックスのモードを指定する場合には、次のルール
に従わなければなりません。
IDS
■
重複インデックスをフィルタ モードに設定することはできません。
■
重複インデックスのモードを指定しないと、デフォルトとして、インデッ
クスが有効になります。
データベースサーバによるオフモードのインデックスの処理
Dynamic Server ではそのインデックスが一意性であるか重複であるかにかかわらず、
データベースサーバは、データの操作中はオフモードのインデックスを実際上は無
視します。
インデックスがオフになっていると、データベースサーバはそのインデックスの更
新を停止し、問合せ中にそのインデックスの使用を停止しますが、オフモードのイ
ンデックスのカタログ情報は維持されます。したがって、列または一連の列にすで
にオフモードのインデックスが存在する場合には、その列または一連の列に新しい
インデックスを作成することはできません。
2-132 Informix Guide to SQL:Syntax
CREATE INDEX 文
同様に、実効状態になっている制約が必要とするインデックスがすでに存在し、オ
フになっている場合は、実効状態の ( オフになっていない ) 一意の外部キーまたは
主キー制約を列または一連の列に作成することはできません。
参照
関連する文は、
「ALTER INDEX 文」、
「DROP INDEX 文」、
「CREATE TABLE 文」、
「SET Database Object Mode 文」です。
インデックスの構造の説明については、お手持ちの『Administrator’s Guide』を参照
してください。
インデックスに関するパフォーマンスの問題については、お手持ちの『Performance
Guide』を参照してください。
GLS
CREATE INDEX 文の GLS の問題については、『Informix Guide to GLS Functionality』
を参照してください。♦
SQL 文
2-133
CREATE PROCEDURE 文
CREATE PROCEDURE 文
+
CREATE PROCEDURE 文は、ストアド プロシジャの命名と定義に使用します。
構文
CREATE
PROCEDURE
< プロシジャ >
(
,
DBA
パラメータ 2-136 ページ
文ブロック
2-140
ページ
END PROCEDURE
RETURNING 節
2-138 ページ
;
,
DOCUMENT
要素
< ファイル >
)
引用文字列 4-156 ページ
WITH
LISTING IN 2-140 ページ
'< ファイル >'
目的
プロシジャのコンパイル時に生
成される警告を記録するリスト
ファイルです。
制限
構文
指定するファイルは、データ
パス名とファイル名
ベースが常駐するコンピュータ は、使用しているオ
上に存在しなければなりません。 ペレーティング シス
テムの規約に従わな
ければなりません。
< プロシジャ > 作成するプロシジャの名前です。 名前はデータベースの中で一意 データベース オブ
でなければなりません。
ジェクト名 4-25
ページ
説明
プロシジャを作成するには、データベースに対する Resource アクセス権が必要です。
CREATE PROCEDURE 文の全体の長さは、64 キロバイト未満でなければなりませ
ん。この長さは、空白やタブを含む、CREATE PROCEDURE 文の文字列の長さです。
2-134 Informix Guide to SQL:Syntax
CREATE PROCEDURE 文
CREATE PROCEDURE 文の文ブロック部が空の場合、プロシジャを呼び出したとき
に操作は行われません。プロシジャの存在を確立したいが、まだコード化していな
い開発段階では、このようなプロシジャを使用することがあります。
E/C
ESQL/C では、PREPARE 文の中でのみ CREATE PROCEDURE 文を使用できます。
コンパイル時にテキストがわかっているプロシジャを作成したい場合は、CREATE
PROCEDURE FROM 文を使用しなければなりません。♦
DBA オプション
DBA オプションを使用してプロシジャを作成すると、そのプロシジャは DBA アク
セス権付きプロシジャといいます。DBA オプションを使用しないと、そのプロシ
ジャは所有者アクセス権付きプロシジャといいます。プロシジャの実行に関連する
アクセス権は、そのプロシジャがキーワード DBA で作成されたかどうかによって
決まります。詳細は、
『Informix Guide to SQL: Tutorial』を参照してください。
ANSI 標準に準拠していないデータベースで所有者アクセス権付きプロシジャを作
成すると、PUBLIC に対するそのプロシジャのアクセス権の付与が環境変数
NODEFDAC によって防止されます。環境変数 NODEFDAC についての詳細は、
『Informix Guide to SQL: Reference』を参照してください。
SQL 文
2-135
CREATE PROCEDURE 文
パラメータの構文と使用
パラメータ
CREATE PROCEDURE 文へ戻る
2-134 ページ
SQL データ型
( サブセット )
2-137 ページ
< パラメータ変数 >
DEFAULT
LIKE
<表>
.
REFERENCES
BYTE
TEXT
要素
<列>
< デフォルト
値>
< パラメータ
変数 >
<表>
目的
< 変数 > に割り当てるデータ型
を持つ列の名前です。
プロシジャの呼び出し時に < 変
数名 > の値が指定されなかった
場合に、プロシジャが使用する
デフォルト値です。
プロシジャの呼び出し時に値を
入力する対象となるパラメータ
の名前です。
< デフォルト値 >
<列>
DEFAULT NULL
制限
構文
列は指定の表に存在していなけ 識別子、4-112 ページ
ればなりません。
デフォルト値は < 変数 > のデー 式、4-33 ページ
タ型に従わなければなりません。
CREATE PROCEDURE 文には、 識別子、4-112 ページ
パラメータをまったく指定しな
いか、あるいは一つまたは複数
指定することができます。
< 列 > が含まれる表の名前です。 表はデータベースに存在してい データベース オブ
なければなりません。
ジェクト名、4-25
ページ
CREATE PROCEDURE 文の中にパラメータを定義するには、その名前を指定しなけ
ればなりません。また、そのデータ型も指定しなければなりません。データ型を直
接指定するか、LIKE 節または REFERENCES 節を使用して、データ型を識別するこ
とができます。
パラメータに関する制限
ストアド プロシジャに対して定義できるパラメータの個数に制限はありません。し
かし、ストアド プロシジャに渡されるすべてのパラメータの合計長は 32 キロバイ
ト未満でなければなりません。
2-136 Informix Guide to SQL:Syntax
CREATE PROCEDURE 文
パラメータのデフォルト値の指定
キーワード DEFAULT に続けて、式を使用すれば、パラメータに対するデフォルト
値を指定できます。パラメータに対するデフォルト値を指定し、そのプロシジャが
定義されていた引数のいくつかを省いて呼び出された場合、デフォルト値が使用さ
れます。パラメータに対するデフォルト値を指定せず、そのプロシジャが定義され
ていた引数のいくつかを省いて呼び出された場合、呼び出し元のアプリケーション
はエラーを受け取ります。
次の例に、パラメータに対するデフォルト値を指定する CREATE PROEDURE 文を
示します。このプロシジャはパラメータ i の平方を見つけます。このプロシジャが
パラメータ i に対する引数を指定しないで呼び出されると、データベース サーバは
パラメータ i に対してデフォルト値 0 を使用します。
CREATE PROCEDURE square_w_default
(i INT DEFAULT 0) {Specifies default value of i}
RETURNING INT; {Specifies return of INT value}
DEFINE j INT; {Defines procedure variable j}
LET j = i * i; {Finds square of i and assigns it to j}
RETURN j; {Returns value of j to calling module}
END PROCEDURE;
パラメータ リストで使用できる SQL データ型のサブセット
SQL データ型のサブセットには、バイト (BYTE) 型、テキスト (TEXT) 型、シリア
ル (SERIAL) 型以外のすべての SQL データ型が含まれます。すべての SQL データ型
の構文については、4-27 ページを参照してください。
IDS
バイト (BYTE) 型またはテキスト (TEXT) 型の値の参照
Dynamic Server では、バイト (BYTE) 型またはテキスト (TEXT) 型のデータを含むパ
ラメータを指定するには REFERENCES 節を使用します。REFERENCES 節でオプ
ション DEFAULT NULL を使用し、パラメータを指定しないでプロシジャを呼び出
すと、NULL 値が使用されます。
SQL 文
2-137
CREATE PROCEDURE 文
RETURNING 節
RETURNING 節は各戻り値のデータ型を指定します。
RETURNING 節
CREATE PROCEDURE 文へ戻る
2-134 ページ
,
SQL データ型
( サブセット ) 2-137 ページ
RETURNING
REFERENCES
;
BYTE
TEXT
RETURNING 節を使用して、戻り値の型を指定した後は、いつでも文ブロックの中
で RETURN 文を使用することで、RETURNING 節の値に相当するプロシジャ変数を
返すことができます。
プロシジャは値のセットを一つ以上返すことができます。値のセットを複数 ( 表の
複数の行からの一つ以上の列など ) 返すプロシジャはカーソル プロシジャです。値
のセットを一つだけ ( 表の単一行からの一つ以上の列など ) を返すプロシジャは非
カーソル プロシジャです。
RETURNING 節はカーソル プロシジャまたは非カーソル プロシジャで実行すること
ができます。次の例では、RETURNING 節は非カーソル プロシジャで実行される場
合、値をまったく返さないか、あるいは一つ返すことができます。しかし、カーソ
ル プロシジャと関連付けられている場合、この節は表から複数の行を返し、返す各
行に含まれる値は 0 個または 1 個になります。
RETURNING INT;
次の例では、RETURNING 節は非カーソル プロシジャで実行される場合、値をまっ
たく返さないか、あるいは二つ返すことができます。しかし、カーソル プロシジャ
と関連付けられている場合、この節は表から複数の行を返し、返す各行に含まれる
値は 0 個または 2 個になります。
RETURNING INT, INT;
2-138 Informix Guide to SQL:Syntax
CREATE PROCEDURE 文
上記のどちらの例でも、受け取り側のプロシジャまたはプログラムは呼び出し先の
プロシジャによって返される情報を受け取るように適切に記述されていなければな
りません。
戻り値に関する制限
ストアド プロシジャに対して定義できる戻り値の個数に制限はありません。ただ
し、ストアド プロシジャによって返されるすべての値の合計長は 32 キロバイト未
満でなければなりません。
プロシジャへのコメントの追加
プロシジャの行にコメントを追加するには、コメントの前に二重ハイフン (--) を付
けるか、中かっこ ({}) でコメントを囲んでください。二重ハイフンは ANSI 標準に
準拠しています。中かっこは ANSI 標準に対する Informix の拡張版です。
プロシジャでのコメントの例については、2-137 ページの「パラメータのデフォル
ト値の指定」を参照してください。二重ハイフン (--) と中かっこ ({}) の記号の詳細
については、1-6 ページの「SQL コメントの入力方法」を参照してください。
DOCUMENT 節でのプロシジャの記述
DOCUMENT 節の文字列や引用符付き文字列は、そのプロシジャの概要と記述を示
します。DOCUMENT テキストはプロシジャのユーザが使用するためのものです。
データベースへのアクセス権を持つ者はだれでもシステム カタログ表 sysprocbody
に問合せをし、そのデータベースに格納されているプロシジャの一つまたは全部の
説明を手に入れることができます。
たとえば、プロシジャ do_something の記述を探すには、次の問合せを実行します。
SELECT data FROM sysprocbody b, sysprocedures p
WHERE b.procid = p.procid
{join between the two tables}
AND
p.procname = 'do_something'
{look for procedure do_something}
{ want user document }
AND b.datakey = 'D'
SQL 文
2-139
CREATE PROCEDURE 文
WITH LISTING IN オプション
オプション WITH LISTING IN は、コンパイル時の警告の出力先ファイルを指定しま
す。このリスト ファイルは、データベースが常駐するコンピュータ上に作成されま
す。プロシジャをコンパイルすると、このファイルには、一つ以上の警告メッセー
ジが保持されます。
UNIX では、変数 < ファイル > にファイル名を指定したが、ディレクトリを指定し
なかった場合、データベースが常駐しているコンピュータ上のホーム ディレクトリ
がデフォルト ディレクトリとして使用されます。このコンピュータ上にホーム
ディレクトリがない場合は、ルート ディレクトリにファイルが作成されます。♦
UNIX
WIN NT
Windows NT では、変数 < ファイル > にファイル名を指定したが、ディレクトリを
指定しなかった場合、データベースがローカル マシン上にあると、現行の作業ディ
レクトリがデフォルト ディレクトリとして使用されます。そうでないと、デフォル
ト ディレクトリは %INFORMIXDIR%¥bin になります。♦
WITH LISTING IN オプションを使用しなかった場合、コンパイラは警告のリストを
生成しません。
文ブロック
文ブロック
CREATE PROCEDURE 文へ戻る
2-134 ページ
EXECUTE PROCEDURE 文 2-297 ページ
DEFINE 文 3-8 ページ
ON EXCEPTION 文 3-34 ページ
SPL 文 ( サブセット )
2-143 ページ
SQL 文 ( サブセット )
2-141 ページ
BEGIN
2-140 Informix Guide to SQL:Syntax
文ブロック
;
END
CREATE PROCEDURE 文
文ブロックは空にすることができます。そうすると、何も実行しないプロシジャに
なります。現行のデータベースをクローズしたり、プロシジャ内で新しいデータ
ベースを選択したりはできません。また、プロシジャ内で現行のプロシジャを削除
することはできません。ただし、別のプロシジャならば削除できます。
文ブロックで使用できる SQL 文のサブセット
文ブロックの中では、次に挙げるもの以外の SQL 文を使用できます。
CLOSE
CLOSE DATABASE
CONNECT
CREATE DATABASE
CREATE PROCEDURE
CREATE PROCEDURE FROM
DATABASE
DECLARE
DESCRIBE
EXECUTE
EXECUTE IMMEDIATE
FETCH
FLUSH
FREE
GET DESCRIPTOR
INFO
LOAD
OPEN
OUTPUT
PREPARE
PUT
SET DESCRIPTOR
WHENEVER
SELECT 文に関する制限
次の二つの場合に限り、SELECT 文を使用できます。
■
SELECT 文の結果を一時表に入れる場合に、INTO TEMP 節を使用できます。
■
結果の値をプロシジャ変数に入れる場合に、SELET 文の SELECT...INTO
形式を使用できます。
ロールとユーザ識別に対するサポート
ストアド プロシジャでロールを使用できます。ストアド プロシジャの内で、ロー
ルに関連する文 (CREATE ROLE、DROP ROLE、SET ROLE) および SET SESSION
AUTHORIZATION 文を実行できます。プロシジャ内で、GRANT 文を使用してロー
ルにアクセス権を付与することもできます。ロールを有効にするか、または SET
SESSION AUTHORIZATION 文を使用してユーザが獲得したアクセス権は、プロシ
ジャの実行時には解放されません。
SQL 文
2-141
CREATE PROCEDURE 文
ロールについての詳細は、本書の「CREATE ROLE 文」、
「DROP ROLE 文」
、
「GRANT 文」
、「REVOKE 文」、
「SET ROLE 文」を参照してください。
データ操作文で呼び出されるプロシジャに関する制限
ストアド プロシジャが INSERT 文、UPDATE 文、DELETE 文または SELECT 文の一
部として呼び出される場合、呼び出されたプロシジャは下記の文のどれも実行する
ことはできません。この制限があるため、ストアド プロシジャはプロシジャ呼出し
に含まれている SQL 文に影響を及ぼす変更を加えることはできなくなっています。
ALTER FRAGMENT
ALTER INDEX
ALTER TABLE
BEGIN WORK
COMMIT WORK
CREATE TRIGGER
DELETE
DROP DATABASE
DROP INDEX
DROP SYNONYM
DROP TABLE
DROP TRIGGER
DROP VIEW
INSERT
RENAME COLUMN
RENAME TABLE
ROLLBACK WORK
UPDATE
たとえば、次の INSERT 文を使用すると、呼び出されたプロシジャ dup_name の実
行は制限されます。
CREATE PROCEDURE sp_insert ()
.
.
.
INSERT INTO q_customer
VALUES (SELECT * FROM customer
WHERE dup_name ('lname') = 2)
.
.
.
END PROCEDURE;
この例では、dup_name は表にリストされている文を実行できません。しかし、
INSERT 文、UPDATE 文、SELECT 文、DELETE 文 ( つまり、EXECUTE
PROCEDURE) 以外の文の中で dup_name を呼び出した場合、dup_name は表にリス
トされている文を実行できます。
2-142 Informix Guide to SQL:Syntax
CREATE PROCEDURE 文
プロシジャでのトランザクションの使用
ストアド プロシジャでは、BEGIN WORK 文と COMMIT WORK 文を使用できます。
ストアド プロシジャでは、トランザクションの開始、トランザクションの終了また
はトランザクションの開始と終了を実行できます。遠隔実行されているストアド プ
ロシジャでトランザクションを開始する場合は、プロシジャが終了する前に、トラ
ンザクションを終了しなければなりません。
文ブロックで使用できる SPL 文のサブセット
文ブロックでは、次の SPL 文をどれでも使用できます。
CALL
CONTINUE
EXIT
FOR
FOREACH
IF
LET
RAISE EXCEPTION
RETURN
SYSTEM
TRACE
WHILE
BEGIN-END ブロック
キーワード BEGIN は、BEGIN-END ブロックの開始区切り記号として、キーワード
END は、終了区切り記号として使用できます。2-140 ページの「文ブロック」の構
文の図に示すように、BEGIN-END ブロックは、SPL 文または SQL 文を記述できる
文ブロックであれば、どこにでも配置できます。
プロシジャ変数と例外ハンドラの範囲を定義するには、BEGIN-END ブロックを使
用します。BEGIN-END ブロックの内で定義される変数宣言と例外ハンドラはその
ブロックにローカルなものであり、そのブロックの外部からアクセスすることはで
きません。
参照
関連する文は「CREATE PROCEDURE FROM 文」、「DROP PROCEDURE 文」、
「GRANT 文」、「EXECUTE PROCEDURE 文」、「PREPARE 文」、「UPDATE
STATISTICS 文」、「REVOKE 文」です。
ストアド プロシジャの作成方法と使用方法については、
『Informix Guide to SQL:
Tutorial』を参照してください。
SQL 文
2-143
CREATE PROCEDURE FROM 文
CREATE PROCEDURE FROM 文
+
E/C
CREATE PROCEDURE FROM 文は、プロシジャの作成に使用します。プロシジャの
実際のテキストは、別のファイルにあります。
この文は ESQL/C で使用します。
構文
CREATE PROCEDURE FROM
'< ファイル >'
< ファイル変数 >
要素
< ファイル >
< ファイル変
数>
目的
CREATE PROCEDURE 文の完全
なテキストを含んでいるファイ
ルの名前です。
デフォルトのパス名は現行ディ
レクトリです。
< ファイル > の値を保持してい
るプログラム変数の名前です。
制限
指定したファイルは存在してい
なければなりません。ファイル
には、CREATE PROCEDURE 文
が一つだけ含まれていなければ
なりません。
構文
パス名とファイル名
は、使用しているオ
ペレーティング シス
テムの規約に従わな
ければなりません。
プログラム変数で指定される
名前は変数名の言語
ファイルは存在していなければ 特有の規則に従わな
なりません。このファイルに
ければなりません。
は、CREATE PROCEDURE 文が
一つだけ含まれていなければな
りません。
説明
UNIX
UNIX では、パラメータ < ファイル > にフルパス名ではなく、単純なファイル名を
指定すると、データベースが常駐しているコンピュータ上のユーザのホーム ディレ
クトリがデフォルト ディレクトリとして使用されます。このコンピュータ上にホー
ム ディレクトリがない場合は、ルート ディレクトリがデフォルト ディレクトリに
なります。♦
2-144 Informix Guide to SQL:Syntax
CREATE PROCEDURE FROM 文
WIN NT
Windows NT では、パラメータ < ファイル > にファイル名を指定したが、ディレク
トリを指定しなかった場合、データベースがローカル マシン上にあると、現行の作
業ディレクトリがデフォルト ディレクトリとして使用されます。それ以外では、デ
フォルト ディレクトリは %INFORMIXDIR%¥bin になります。♦
パラメータ < ファイル > に指定したファイルには、CREATE PROCEDURE 文を一つ
だけ入れることができます。
参照
関連する文は、
「CREATE PROCEDURE 文」です。
ストアド プロシジャの作成方法と使用方法については、
『Informix Guide to SQL:
Tutorial』を参照してください。
SQL 文
2-145
CREATE ROLE 文
CREATE ROLE 文
+
IDS
CREATE ROLE 文は、新しいロールの作成に使用します。
この文は Dynamic Server でのみ使用できます。
構文
CREATE ROLE
要素
< ロール >
< ロール >
目的
制限
構文
識別子、4-112 ページ
DBA によって作成されたロール 最大文字数は 8 文字です。
に割り当てられた名前です。
ロール名は、データベース サー
バまたはこのデータベース サー
バのオペレーティング システム
が認識しているユーザ名であっ
てはなりません。ロール名はシ
ステム カタログ表 sysusers の列
username もしくはシステム カタ
ログ表 systabauth、syscolauth、
sysprocauth、sysfragauth、
sysroleauth の列 grantor または
grantee の中にあるものであって
はなりません。
説明
データベース管理者 ( DBA ) は、CREATE ROLE 文を使用して新しいロールを作成
します。ロールは、データベース オブジェクトへのアクセス権が付与される一つの
クラスとして考えることができます。DBA は、engineer など関連する作業タスクの
アクセス権をロールに割り当て、そのロールをユーザに付与できます。そうするこ
とにより、同じアクセス権のセットをすべてのユーザーに付与しなくてすみます。
2-146 Informix Guide to SQL:Syntax
CREATE ROLE 文
ロールを作成した後、DBA は GRANT 文を使用して、そのロールをユーザまたはそ
の他のロールに付与することができます。ロールを付与されたユーザは、SET
ROLE 文を使用して、ロールを有効にしなければなりません。そうすることにより、
ユーザはロールのアクセス権を使用できます。
CREATE ROLE 文を GRANT 文および SET ROLE 文と合わせて使用すると、DBA は
ロールについて 1 セットのアクセス権を作成し、多くのユーザに同じアクセス権の
セットを付与する代わりにそのロールを付与することができます。
ロールは、DBA または WITH GRANT OPTION 文によって付与されたユーザが削除
するまで有効です。DROP ROLE 文は、ロールの削除に使用します。
ロール engineer を作成するには、次の文を入力します。
CREATE ROLE engineer
参照
関連する文は、
「DROP ROLE 文」、
「GRANT 文」
、「REVOKE 文」、
「SET ROLE 文」
です。
ロールの使用方法については、
『Informix Guide to Database Design and Implementation』
を参照してください。
SQL 文
2-147
CREATE SCHEMA 文
DB
SQLE
CREATE SCHEMA 文
CREATE SCHEMA 文を使用して、CREATE 文および GRANT 文を一つの単位とし
て発行します。CREATE SCHEMA 文により、この文が作成するすべてのデータ
ベース オブジェクトに希望の所有者を指定することができます。
この文は、DB-Access および SQL エディタと一緒に使用します。
構文
CREATE SCHEMA AUTHORIZATION
CREATE TABLE 文
2-155 ページ
< ユーザ >
+
CREATE INDEX 文
2-106 ページ
CREATE VIEW 文
2-230 ページ
+
CREATE SYNONYM 文
2-151 ページ
GRANT 文
2-342 ページ
2-148 Informix Guide to SQL:Syntax
+
CREATE TRIGGER 文
2-198 ページ
OP
CREATE OPTICAL
CLUSTER 文
『Guide to the Optical
Subsystem』を参照
CREATE SCHEMA 文
要素
< ユーザ >
目的
CREATE SCHEMA 文で作成さ
れたオブジェクトを所有する
ユーザの名前です。
制限
構文
識別子、4-112 ページ
CREATE SCHEMA 文を発行す
るユーザがリソースアクセス権
を持っている場合、< ユーザ名 >
はこのユーザの名前でなければ
なりません。DBA としてのアク
セス権を持っている場合、ユー
ザ名はこのユーザまたは他の
ユーザの名前でもかまいません。
説明
CREATE SCHEMA 文は、この文によって影響を受けるデータベースを作成するま
では発行できません。
リソースアクセス権を持ったユーザは、独自のスキーマを作成することができま
す。この場合の < ユーザ名 > は、リソースアクセス権を持った CREATE SCHEMA
文を実行しているユーザの名前になります。DBA としてのアクセス権を持つユー
ザは、他のユーザのスキーマを作成することもできます。この場合は、CREATE
SCHEMA 文を実行しているユーザ以外のユーザの名前を指定することができます。
この文では、次の例に示すように、CREATE 文と GRANT 文を任意の論理順序で記
述することができます。セミコロンまたはファイルの終わりのシンボルが見つかる
まで、文は CREATE SCHEMA 文の一部と見なされます。
CREATE SCHEMA AUTHORIZATION sarah
CREATE TABLE mytable (mytime DATE, mytext TEXT)
GRANT SELECT, UPDATE, DELETE ON mytable TO rick
CREATE VIEW myview AS
SELECT * FROM mytable WHERE mytime > '12/31/1997'
CREATE INDEX idxtime ON mytable (mytime);
CREATE SCHEMA 文の内部におけるオブジェクトの作成
CREATE SCHEMA 文によって作成されるすべてのオブジェクトは、個々のオブ
ジェクトを明示的に指定しない場合でも、< ユーザ名 > のユーザによって所有され
ます。DBA であれば、他のユーザ用にオブジェクトを作成することができます。
DBA 以外のユーザがユーザ名以外の所有者用にオブジェクトを作成しようとする
と、エラーが返されます。
SQL 文
2-149
CREATE SCHEMA 文
CREATE SCHEMA 文の内部におけるアクセス権の付与
アクセス権は、CREATE SCHEMA 文を使用しないと付与できません。アクセス権
の取り消しまたは削除はできません。
CREATE SCHEMA 文の外部におけるオブジェクトの作成とア
クセス権の付与
CREATE SCHEMA 文の外部でのオブジェクトの作成または GRANT 文の使用の際
に、-ansi フラグを使用したり、環境変数 DBANSIWARN を設定したりすると、警
告が返されます。
参照
関連する文は、
「CREATE INDEX 文」、
「CREATE SYNONYM 文」、
「CREATE
、「CREATE VIEW 文」、
「GRANT 文」です。
TABLE 文」
データベースの作成の説明については、
『Informix Guide to Database Design and
Implementation』を参照してください。
2-150 Informix Guide to SQL:Syntax
CREATE SYNONYM 文
+
CREATE SYNONYM 文
CREATE SYNONYM 文は、表またはビューにシノニムと呼ばれる別の名前を指定
する場合に使用します。
構文
CREATE
SYNONYM
< シノニム >
FOR
PUBLIC
<表>
< ビュー >
PRIVATE
要素
< シノニム >
目的
制限
作成されるシノニムの名前です。 シノニム名はデータベースの中
で一意でなければなりません。
構文
データベース オブ
ジェクト名、4-25
ページ
表が存在しなければなりません。 データベース オブ
ジェクト名、4-25
ページ
ビューが存在しなければなりま データベース オブ
せん。
ジェクト名、4-25
ページ
<表>
シノニムが作成される表の名前
です。
< ビュー >
シノニムが作成されるビューの
名前です。
説明
ユーザがシノニムに対して持つアクセス権は、シノニムが適用される表に対するア
クセス権と同じです。
シノニム名は一意でなければなりません。つまり、シノニム名は、表、ビュー、また
は一時表など、別のデータベースオブジェクトと同じ名前にすることはできません。
作成されたシノニムは、その所有者が DROP SYNONYM 文を実行するまで有効で
す。これが、SELECT 文の FROM 節で使用できる別名とは異なる点です。別名は、
SELECT 文の実行時に限り有効です。シノニムが同じデータベースの表または
ビューを参照している場合は、参照されている表またはビューを削除すると、シノ
ニムも自動的に削除されます。
SQL 文
2-151
CREATE SYNONYM 文
同じデータベースでシノニムに対するシノニムは作成できません。
ANSI
ANSI 標準準拠のデータベースではシノニムの所有者 (owner.synonym) は、シノニム
の名前を修飾します。識別子 owner.synonym は、データベースのすべてのシノニ
ム、表、一時表、ビューの中で一意でなければなりません。他のユーザが所有して
いるシノニムを参照する場合には、所有者を指定しなければなりません。次の例に
この規約を示します。
CREATE SYNONYM emp FOR accting.employee
♦
データベースサーバ上のすべてのデータベースの表またはビューについてシノニム
を作成することができます。表が ANSI 標準準拠のデータベースの一部である場合
には、所有者の規約を使用してください。次の例に、現行データベース以外の表の
シノニムを示します。ここでは、データベース payables が含まれる同じデータベー
スサーバで作業しているものと見なします。
CREATE SYNONYM mysum FOR payables:jean.summary
現行データベースが含まれるデータベースサーバだけでなく、ネットワーク上に存
在するすべてのデータベースサーバ上の表やビューに対してシノニムを作成するこ
とができます。シノニムを作成するときには、表を保持しているデータベースサー
バをオンラインにしなければなりません。ネットワークでは、データベースサーバ
が、シノニムを作成するときにシノニムのオブジェクトが存在するかどうかを確認
します。
次の例に、現行データベースに含まれていないオブジェクトのシノニムを作成する
方法を示します。
CREATE SYNONYM mysum FOR payables@phoenix:jean.summary
mysum という識別子は、表 jean.summary を参照しており、この表は、データベース
サーバ phoenix 上のデータベース payables にあります。データベース payables から
表 summary を削除すると、シノニム mysum はそのままの状態で残ります。それ以
降 mysum を使用しようとすると、エラー Table not found が返されます。
シノニム PUBLIC および PRIVATE
キーワード PUBLIC を使用すると ( またはキーワードをまったく使用しないと )、
そのデータベースにアクセスするすべてのユーザがそのシノニムを使用できます。
シノニムがパブリックである場合、ユーザは、そのシノニムの所有者の名前を知っ
ている必要はありません。ANSI 標準に準拠していないデータベースに含まれ、
Informix のデータベースサーバのバージョン 5.0 以前に作成されたシノニムは、す
べてパブリックシノニムです。
2-152 Informix Guide to SQL:Syntax
CREATE SYNONYM 文
ANSI
ANSI 標準準拠のデータベースではシノニムは常にプライベートです。キーワード
PUBLIC または PRIVATE を使用すると、構文エラーが返されます。♦
キーワード PRIVATE を指定した場合には、所有者と、シノニムに所有者名を明示
的に指定したユーザ以外はそのシノニムを使用することはできません。同じデータ
ベースに、同じ名前を持つ複数のプライベートシノニムがあってもかまいません。
ただし、その名前を持つシノニムの所有者は、それぞれ個別のユーザでなければな
りません。
ユーザは、特定の名前を持つ一つのシノニムだけを所有することができます。同じ
名前を持つプライベートとパブリックの両方のシノニムを作成することはできませ
ん。たとえば、次のコードはエラーになります。
CREATE SYNONYM our_custs FOR customer;
CREATE PRIVATE SYNONYM our_custs FOR cust_calls;-- ERROR!!!
同名のシノニム
プライベートシノニムを所有しており、それと同じ名前のパブリックシノニムが存
在する場合には、修飾子のない名前でシノニムを指定すると、パブリックシノニム
が使用されます。
シノニムに DROP SYNONYM 文を使用した場合に、同じ名前を持つシノニムが複
数あると、プライベートシノニムが削除されます。再び DROP SYNONYM 文を発
行すると、パブリックシノニムが削除されます。
シノニムの連鎖
現行データベース以外のデータベース上の表に対してシノニムを作成した場合は、
その表を削除してもシノニムは残ります。削除された表の名前をシノニム名として
使用し、他の外部表や遠隔表をポイントする新しいシノニムを削除された表につい
て作成することができます。このようにして、表を新しい場所に移し、シノニムを
連鎖して元のシノニムを有効にしておくことができます ( この方法で、最大 16 個の
シノニムを連鎖することができます )。
SQL 文
2-153
CREATE SYNONYM 文
次の手順では、表 customer に対する二つのシノニムを連鎖します。この表は、最終
的にデータベースサーバ zoo 上に存在することになります ( この CREATE TABLE
文は不完全です )。
1.
training と呼ばれるデータベースサーバ上のデータベース stores7 で、次の
文を発行します。
2.
accntg と呼ばれるデータベースサーバ上で、次の文を発行します。
3.
zoo と呼ばれるデータベースサーバ上で、次の文を発行します。
CREATE TABLE customer (lname CHAR(15)...)
CREATE SYNONYM cust FOR stores7@training:customer
CREATE TABLE customer (lname CHAR(15)...)
4.
training と呼ばれるデータベースサーバ上で、次の文を発行します。
DROP TABLE customer
CREATE SYNONYM customer FOR stores7@zoo:customer
データベースサーバ accntg 上のシノニム cust は、データベースサーバ zoo 上の表
customer をポイントするようになりました。
次の手順で、二つのシノニムを連鎖して、シノニムがポイントしている表を変更す
る例を示します。
1.
training と呼ばれるデータベースサーバ上で、次の文を発行します。
CREATE TABLE customer (lname CHAR(15)...)
2.
accntg と呼ばれるデータベースサーバ上で、次の文を発行します。
3.
training と呼ばれるデータベースサーバ上で、次の文を発行します。
CREATE SYNONYM cust FOR stores7@training:customer
DROP TABLE customer
CREATE TABLE customer (lastname CHAR(20)...)
データベースサーバ accntg 上のシノニム cust は、データベースサーバ training 上の
新しい表 customer をポイントするようになりました。
参照
関連する文は、
「DROP SYNONYM 文」です。
シノニムに関する説明については、
『Informix Guide to Database Design and
Implementation』を参照してください。
2-154 Informix Guide to SQL:Syntax
CREATE TABLE 文
CREATE TABLE 文
CREATE TABLE 文を使用して、現行データベース内の新しい表の作成、表に対す
るデータ整合性制約の設定、表の初期エクステント サイズおよび追加エクステント
サイズの指定、表の分割、ロック方法の指定を行います。永続表または一時表を作
成できます。
構文
,
CREATE
TABLE
<表>
(
列定義
2-159
ページ
,
+
AD/XP
表レベル制約
2-175 ページ
型オプション
2-177 ページ
IDS
+
WITH CRCOLS
TEMP TABLE 節
2-190 ページ
格納オプ
ション
2-179
ページ
要素
<表>
)
,
目的
表に割り当てられた名前です。
LOCK MODE 節
2-188 ページ
制限
名前は、現在のデータベース内
の他の表や、ビューまたは構文
とは別の名前でなければなりま
せん。
エクステント
オプション
2-189 ページ
構文
データベース
オブジェクト名、
4-25 ページ
SQL 文
2-155
CREATE TABLE 文
説明
名前はデータベース内で一意でなければなりません。また、一時表の名前は、現行
データベース内の既存の表、ビュー、シノニムの名前と異なるものでなければなり
ません。ただし、他のユーザが使用している一時表と同じ名前であってもかまいま
せん。
DB
DB-Access の際、環境変数 DBANSIWARN を設定しているときに、CREATE
SCHEMA 文の外で CREATE TABLE 文を使用すると、警告メッセージが生成されま
す。♦
E/C
フラグ -ansi を使用しているか、環境変数 DBANSIWARN を設定しているときに、
CREATE TABLE を使用すると、警告メッセージが生成されます。♦
表に対するアクセス権
デフォルトの設定では、データベースに対する接続アクセス権を与えられているす
べてのユーザには、新しい表に対するすべてのアクセス権 ( 変更および参照を除く )
が与えられます。アクセス権をさらに制限するには、REVOKE 文を使用して
PUBLIC( システム上のすべてのユーザ ) からすべてのアクセス権を取り上げます。
次に GRANT 文を使用して、アクセス権を付与する特定のユーザにアクセス権を割
り当てます。
環境変数 NODEFDAC を yes に設定すると、ANSI 標準準拠でないデータベース内
の新しく作成された表に対するデフォルトのアクセス権を、PUBLIC に与えないよ
うにすることができます。PUBLIC にアクセス権を与えない方法についての詳細は
『Informix Guide to SQL: Reference』の環境変数 NODEFDAC を参照してください。
ANSI
ANSI 標準準拠データベースでは、表レベルのデフォルトのアクセス権はありませ
ん。これらのアクセス権は明示的に付与しなければなりません。♦
制約の定義
表を作成するときは、いくつかの要素を定義しなければなりません。たとえば、表
およびその表の中の列は、一意の名前をもっていなければなりません。また、表の
すべての列は、少なくともそれに関連するデータ型をもっていなければなりませ
ん。またオプションで、特定の列にいくつかの制約を設定することもできます。た
とえば、列が特定のデフォルト値を持たせたり、列に入力されるデータが特定の
データ条件を満たすかどうかをチェックするように指定することができます。
2-156 Informix Guide to SQL:Syntax
CREATE TABLE 文
列に制約を課すことは、(CREATE INDEX 文を使用して ) 列にインデックスを付け
ることに似ています。しかし、インデックスの代わりに制約を使用すると、データ
整合性制約を実装し、実効確認のオンとオフを切り換えることもできます。データ
整合性制約についての詳細は、
『Informix Guide to Database Design and Implementation』
を参照してください。実効確認についての詳細は、2-512 ページの「SET Database
Object Mode 文」を参照してください。
重要 : ログなしのデータベースにおいては、利用できる制約確認の種類は、切り離
された確認だけです。切り離された確認とは、制約確認が行ごとに実行されること
を意味します。
制約は、列レベルまたは表レベルのどちらかで定義できます。列レベルの制約定義
を行う場合は、複数列制約は設定できません。つまり、列レベルで作成された制約
は、単一列だけに適用できます。表レベルで制約定義を行う場合は、制約を単一列
または複数列に適用できます。どちらのレベルの場合も、単一列制約は同じように
処理されます。
列に対してデータ制限を課すと、常に自動的に制約が作成されます。この制約に名
前を指定するオプションが与えられます。制約の名前を指定しない場合、データ
ベース サーバがデフォルトの制約名を自動的に作成します。
どのような型の制約を作成しても、制約の名前はデータベース内で一意でなければ
なりません。
ANSI
ANSI 準拠のデータベースの中では、どのような型の制約を作成しても、
< 所有者 >.< 名前 > コンビネーション ( 所有者名と制約名の組合わせ ) はデータ
ベース内で一意でなければなりません。♦
制約定義の限界
一意の主キー制約または参照制約について、列リストに 16 列が組み込めます。す
べての列の合計の長さは、255 バイトを超えることはできません。
違反表および診断表には、制約を設定することはできません。違反表および診断表
についての詳細は、2-594 ページの「START VIOLATIONS TABLLE 文」を参照して
ください。
SQL 文
2-157
CREATE TABLE 文
制約の追加または削除
CREATE TABLE 文を使用して列または列のセットに制約を設定した後では、列ま
たは複合列リストに制約を追加および削除するには、ALTER TABLE 文を使用しな
ければなりません。
主キー制約、一意性制約、および参照制約の実行
主キー制約、一意性制約、および参照制約は、一意の入力しか認めない昇順イン
デックス、または重複を認める昇順インデックスとして実施されます。これらの制
約の一つが列に設定されると、データベース サーバは次の機能を実行します。
■
一意制制約または主キー制約に対する一意性インデックスの作成
■
参照制約で指定されている列に対する非一意性インデックスの作成
しかし、同じ列または列のセットに制約がすでに作成されている場合には、その制
約に対して別のインデックスは作成されません。その代わりに、既存のインデック
スが複数の制約によって共有されます。既存のインデックスが一意でない場合、列
に一意性制約または主キー制約が設定されていれば、そのインデックスはアップグ
レードされます。
これらの制約はインデックスを通して実行されるので、列に設定された制約と同じ
データ型のインデックスをその列に (CREATE INDEX 文を使用して ) 作成すること
はできません。たとえば、ある列に一意性制約がある場合、その列に対して昇順一
意性インデックスや重複する昇順インデックスを作成することはできません。
制約名
既存の制約とインデックスを共有しない、新しい主キー制約、一意性制約、または
参照制約ごとに、システム カタログ表 sysindexes に 1 行が追加されます。システム
カタログ表 sysindexes のインデックス名は、次の形式で作成されます。
[ 空白 ]< 表識別子 >_< 制約識別子 >
この形式では、tabid と constraint id はそれぞれシステム カタログ表 systables と
sysconstraints から取られます。たとえばインデックス名は、"121_13"( 引用符は空白
を表すのに使用 ) のようになります。
制約名は、データベースの中で一意でなければなりません。< 制約名 > を指定しな
い場合、データベース サーバは次のテンプレートを使用して、システム カタログ
表 sysconstraints のために制約名を一つ生成します。
< 制約タイプ >< 表識別子 >_< 制約識別子 >
2-158 Informix Guide to SQL:Syntax
CREATE TABLE 文
このテンプレートでは、constraint type は一意性制約または主キー制約の場合は文字
u、参照制約の場合は r、検査制約の場合は c、NULL 値付加制約の場合は n となり
ます。たとえば、一意性制約の制約名は、u111_14 のようになります。名前が既存
の識別子と競合する場合には、データベース サーバがエラーを返すので、その場合
は制約名を指定しなければなりません。
列定義
列定義
CREATE TABLE 文へ戻る
2-155 ページ
column
データ型
4-27 ページ
DEFAULT 節
2-160 ページ
要素
<列>
目的
表内の列名です。
列レベルの制約
2-163 ページ
制限
一つの表内では一意の名前でな
ければなりませんが、同じデー
タベース内の違う表で使われて
いる名前は使えます。
構文
識別子、4-112 ページ
CREATE TABLE 文の列定義部を使用して、< 単一列 > についてその名前、データ
型、デフォルト値、および制約のリストを作成し、またその列で重複値を使用でき
るかどうかを指定します。
SQL 文
2-159
CREATE TABLE 文
DEFAULT 節
明示的な値が指定されないときに、デフォルト値が列に挿入されます。
列定義へ戻る
2-159 ページ
DEFAULT 節
<定数>
DEFAULT
NULL
USER
+
CURRENT
DATETIME フィールド記述子
4-31 ページ
TODAY
SITENAME
DBSERVERNAME
要素
< 定数 >
目的
制限
構文
列のデフォルト値として使われ その列に適切なものでなければ 式、4-33 ページ
る、英字の定数文字を定義する なりません。2-161 ページの
定数項です。
「デフォルト値としての定数項」
を参照してください。
デフォルト値としての NULL の使用
デフォルト値が指定されないときに、その列で NULL が使用できる場合、デフォル
トは NULL になります。列に対してデフォルト値として NULL を指定する場合、列
定義の一部として NULL 値付加制約を指定することはできません。
シリアル列に対してデフォルト値を指定することはできません。列がバイト
(BYTE) データ型またはテキスト (TEXT) データ型の場合、デフォルト値として指定
できるのは NULL だけです。
2-160 Informix Guide to SQL:Syntax
CREATE TABLE 文
デフォルト値としての定数項
デフォルト値として < 定数項 > を指定することができます。定数項とは、ユーザが
定義する文字列または定数の文字列です。定数項をデフォルト値として使用する際
には次の規則に従ってください。
使用する定数
列のデータ型
整数
整数 (INTEGER) 型、小桁整数 (SMALLINT) 型、10 進数
(DECIMAL) 型、金額 (MONEY) 型、実数 (FLOAT) 型、小
桁実数 (SMALLFLOAT) 型、INT8 型
10 進数
10 進数 (DECIMAL) 型、金額 (MONEY) 型、実数 (FLOAT)
型、小桁実数 (SMALLFLOAT) 型
文字
文字 (CHAR) 型、可変長文字 (VARCHAR) 型、各国語文字
(NCHAR) 型、各国語可変長文字 (NVARCHAR) 型、可変
長文字 (CHARACTER VARYING) 型、日付 (DATE) 型
時間隔
時間隔 (INTERVAL) 型
日時
日時 (DATETIME) 型
文字は単一引用符で囲まなければなりません。日付 (DATE) 型定数は、環境変数
DBDATE で指定したフォーマットでなければなりません。環境変数 DBDATE が設
定されていない場合は、mm/dd/yyyy のフォーマットが使用されます。
時間隔 (INTERVAL) 型定数の使用方法については、4-135 ページの「リテラル時間
隔 (INTERVAL) 型セグメント」を参照してください。日時 (DATETIME) 型定数の
使用方法については 4-132 ページの「リテラル日時 (DATETIME) 型セグメント」を
参照してください。
主キーの一部である列には、デフォルト値として NULL を指定することはできません。
SQL 文
2-161
CREATE TABLE 文
特定の列に対するデータ型の必要条件
次の表に、デフォルト値として CURRENT、DBSERVERNAME、SITENAME、
TODAY、USER 関数を指定する列に対するデータ型の必要条件を示します。
関数名
データ型の必要条件
CURRENT
対応する修飾子の付いた日時 (DATETIME) 型列
DBSERVERNAME
少なくとも 18 文字以上の長さの、文字 (CHAR) 型列、各
国語文字 (NCHAR) 型列、各国語可変長文字
(NVARCHAR) 型列、または可変長文字 (VARCHAR) 型列
SITENAME
文字 (CHAR) 型列、各国語文字 (NCHAR) 型列、各国語
可変長文字 (NVARCHAR) 型列、または可変長文字
(VARCHAR) 型列
TODAY
日時 (DATE) 型列
USER
少なくとも 8 文字以上の長さの、文字 (CHAR) 型列、可変
長文字 (VARCHAR) 型列
使用できるオプションについての詳細は、4-47 ページの「定数式」を参照して下さ
い。
列定義におけるデフォルト値の例
次の例では、accounts という名前の表を作成します。表 accounts の列 acc_num、列
acc_type、列 acc_descr は、デフォルトの定数値を持っています。列 acc_id のデフォ
ルトは、ユーザのログイン名です。
CREATE TABLE accounts (
acc_num INTEGER DEFAULT 0001,
acc_type CHAR(1) DEFAULT 'A',
acc_descr CHAR(20) DEFAULT 'New Account',
acc_id CHAR(8) DEFAULT USER)
2-162 Informix Guide to SQL:Syntax
CREATE TABLE 文
列レベルの制約
列レベルの制約は、単一列に制限されます。つまり、複数の列を含む制約を使用す
ることはできません。複数列制約についての詳細は、2-175 ページの「表レベルの
制約」を参照してください。
列レベルの制約
列定義へ戻る
2-159 ページ
UNIQUE
+
NOT NULL
DISTINCT
+
IDS
PRIMARY KEY
制約モード
オプション
2-172 ページ
+
制約モード
オプション
2-172 ページ
REFERENCES 節
2-164 ページ
CHECK 節
2-171 ページ
次の例では、列 acc_num に num という名前の主キー制約を、列 acc_code に code と
いう名前の一意性制約を設定した、簡単な表を作成します。
CREATE TABLE accounts (
acc_num INTEGER PRIMARY KEY CONSTRAINT num,
acc_code INTEGER UNIQUE CONSTRAINT code,
acc_descr CHAR(30))
SQL 文
2-163
CREATE TABLE 文
NULL 値付加制約の使用
列に対してデフォルト値を指定しない場合、その列に NULL 値付加制約が設定され
ない限り、デフォルトは NULL になります。NULL 値付加制約が設定されている場
合は、その列のデフォルト値は存在しません。次の例では、表 newitems を作成しま
す。newitems では、列 manucode にはデフォルト値が指定されず、またこの列は
NULL を認めません。
CREATE TABLE newitems (
newitem_num INTEGER,
manucode CHAR(3) NOT NULL,
promotype INTEGER,
descrip CHAR(20))
ある列に NULL 値付加制約を設定し、さらにここにデフォルト値を指定しない場
合、行を挿入するとき、または行の中のこの列を更新するときは、この列に値を入
力しなければなりません。値を入力しないと、データベース サーバはエラーを返し
ます。
制約でのバイト (BYTE) データ型およびテキスト (TEXT) データ型の使用
バイト (BYTE) 型列またはテキスト (TEXT) 型列には、一意性制約、主キー制約、
または参照制約を設定できません。しかし、バイト (BYTE) 型列またはテキスト
(TEXT) 型列に検査制約を設定した場合は、NULL 値または非 NULL 値かどうかを
確認できます。
REFERENCES 節
REFERENCES 節を使用して、列に対して外部キー参照を設定できます。二つの表
の間、または同じ表の内部に参照関係を設定できます。
列レベルの制約へ戻る、2-163 ページ
表レベルの制約へ戻る、2-175 ページ
REFERENCES 節
REFERENCES
<表>
,
(
2-164 Informix Guide to SQL:Syntax
<列>
+
)
ON DELETE CASCADE
CREATE TABLE 文
要素
<列>
目的
被参照表の被参照列です。
<表>
被参照表名です。
制限
2-165 ページの「REFERENCES
節の列名変数の制限」を参照し
てください。
被参照表は、参照表と同じデー
タベース内になければなりま
せん。
構文
識別子、4-112
ページ
データベース オブ
ジェクト名、4-25
ページ
被参照列 (< 列 > 変数で指定する列 ) は、参照列と同じ表内にある列か、または同じ
データベース内の別の表の列にすることができます。
被参照表が参照表とは異なる場合、デフォルト列 ( 一つまたは複数 ) は被参照表の
主キー列 ( 一つまたは複数 ) です。被参照表が参照表と同じ場合、デフォルトはあ
りません。
REFERENCES 節の列名変数の制限
REFERENCES 節の < 列名 > 変数に関しては次の制限を守らなければなりません。
■
被参照列は、一意列か主キー列でなければなりません。
すなわち、被参照列にはすでに一意性制約または主キー制約が組み込まれ
ていなければなりません。
■
参照列および被参照列のデータ型は同じでなければなりません。例外は、
被参照列がシリアル (SERIAL) のときに参照列が整数 (INTEGER) でなけれ
ばならない場合だけです。
■
列レベルで REFERENCES 節を使用しているとき ( つまり、列定義オプショ
ンの中で REFERENCES 節を使用しているとき ) は、列を一つだけ指定で
きます。
表レベルで REFERENCES 節を使用しているとき ( つまり、制約定義オプ
ションの中で REFERENCES 節を使用しているとき ) は、複数の列を指定
できます。最大 16 個の列名を指定できます。すべての列の合計の長さは、
255 バイトを超えることはできません。
SQL 文
2-165
CREATE TABLE 文
被参照列および参照列の条件
参照関係において被参照列とは、表内にあって表内の各行を一意に識別する列また
は列のセットです。言い換えると、被参照列または被参照列のセットは、一意性制
約または主キー制約を持たなければなりません。被参照列がこの条件を満たさない
場合、データベース サーバはエラーを返します。
被参照列と異なり、参照列または参照列のセットには NULL 値および重複値を含む
ことができます。ただし、参照列の NULL ではない値は、それぞれの被参照列の値
と一致していなければなりません。参照列がこの条件を満たす場合、これを外部
キーと呼びます。
被参照列と参照列との間の関係は親子関係と呼ばれ、被参照列が親 ( 主キー )、参
照列が子 ( 外部キー ) となります。この親子関係は参照制約によって確立されます。
参照制約は、二つの表の間または同じ表の内部で確立できます。たとえば、表
employee で、列 emp_no の従業員番号によって各従業員を一意に識別する場合を想
定します。この表の列 mgr_no に、この従業員を管理する管理者の従業員番号が
入っているとすると、列 mgr_no が、主キー ( 親 ) である列 emp_no を参照する外部
キー ( 子 ) となります。
参照制約には、参照列と被参照列との間に 1 対 1 の関係がなければなりません。つ
まり、主キーが複数列からなるセットの場合、外部キーもその主キーに対応する複
数列のセットであることが必要です。次の例では、2 つの表を作成します。最初の
表には複数列の主キーがあり、2 番目の表にはその主キーを参照する参照制約があ
ります。
CREATE TABLE accounts (
acc_num INTEGER,
acc_type INTEGER,
acc_descr CHAR(20),
PRIMARY KEY (acc_num, acc_type))
CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER NOT NULL,
ref_type INTEGER NOT NULL,
sub_descr CHAR(20),
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
(acc_num, acc_type))
2-166 Informix Guide to SQL:Syntax
CREATE TABLE 文
この例では、表 sub_accounts の外部キーである ref_num と ref_type が、表 accounts
の主キーである acc_num と acc_type を参照します。表 accounts の既存の行の列
acc_num と列 acc_type の値に正確に対応していない値を、列 ref_num と列 ref_type
に設定して、表 sub_accounts に行を挿入しようとするとエラーになります。同様
に、列 ref_num と列 ref_type に、表 accounts の列 acc_num と列 acc_type に一致して
いない値を設定して、表 sub_accounts を更新しようとするとエラーになります。
別の表の主キーを参照している場合は、その表の主キーを明示的に指定する必要は
ありません。被参照表で被参照列が指定されていない場合は、デフォルトでその主
キー列が参照されます。先の例の参照部分は次のように書き直すことができます。
.
.
.
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
.
.
.
列 acc_num と列 acc_type が表 accounts の主キーであり、他の列が指定されていない
ため、外部キーである ref_num と ref_type はこれらの列を参照します。
データ型の制限
参照列および被参照列のデータ型は、列がシリアル (SERIAL) データ型ではない限
り、同一でなければなりません。親表の主キーにシリアル (SERIAL) 型を、また外
部キーに整数 (INTEGER) 型を指定できます。前記の例では、主キーと外部キーの
データ型の間に、1 対 1 対応の関係が存在します。主キー列がシリアル (SERIAL)
型として定義されているなら、この文は正常に実行されます。
バイト (BYTE) 型列またはテキスト (TEXT) 型列に参照制約を設定することはでき
ません。
SQL 文
2-167
CREATE TABLE 文
暗黙のロック
参照制約を作成すると、被参照表に排他ロックがかけられます。このロックは、
CREATE TABLE 文が完了すると解除されます。トランザクション付きデータベー
ス内に表を作成中であり、トランザクションを使用している場合は、トランザク
ションが終了するとロックが解除されます。
列定義での REFERENCES 節の使用
列定義レベルで REFERENCES 節を使用するときは、単一列を参照できます。次の
例では、二つの表 accounts と表 sub_accounts が作成されます。表 sub_accounts 内の
外部キー ref_num と、表 accounts 内の主キー acc_num との間に参照制約が作成され
ます。
CREATE TABLE accounts (
acc_num INTEGER PRIMARY KEY,
acc_type INTEGER,
acc_descr CHAR(20))
CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER REFERENCES accounts (acc_num),
sub_descr CHAR(20))
列定義構文の中で、ref_num が明示的に外部キーと呼ばれていません。列レベルで
は、外部キー指定は自動的に行われます。
別の表の主キーを参照している場合、被参照表の列を指定する必要はありません。
前記の例では、列を指定しなくても表 accounts を参照できます。acc_num は表
accounts の主キーであるため、この列はデフォルトで被参照列になります。
2-168 Informix Guide to SQL:Syntax
CREATE TABLE 文
ON DELETE CASCADE の使用方法
カスケード削除機能を使用して、親表の行を削除したときに子表の行も削除するか
どうかを指定することができます。カスケード削除を指定しないと、子表が親表に
関連付けられている場合、デフォルトでは親表からデータを削除することができま
せん。ON DELETE CASCADE 節を使用することにより、親表の行を削除したとき
に、外部キーでその行に関連付けられた子表の行も削除されます。カスケード削除
機能の重要な利点は、削除動作を行うために必要な SQL 文の数を少なくできると
いうことです。
たとえば、表 all_candy には主キーとして列 candy_num があります。表 hard_candy
は、candy_num を外部キーとして参照しています。次の CREATE TABLE 文は、外
部キーにカスケード削除節を指定して表 hard_candy を作成しています。
CREATE TABLE hard_candy (candy_num INT, candy_flavor CHAR(20),
FOREIGN KEY (candy_num) REFERENCES all_candy ON DELETE CASCADE);
子表にカスケード削除を指定すると、表 all_candy からある項目を削除したときに、
外部キー candy_num に関連付けられている表 hard_candy に対してカスケード削除が
実行されます。カスケード削除を指定する場合、親表から行を削除すると、データ
ベースサーバは子表に関連付けられ対応している行も削除します。
カスケード削除は、列レベル制約または表レベル制約の REFERENCES 節で指定し
てください。カスケード削除を指定するのに必要なのは、アクセス権
REFERENCES だけです。カスケード削除を実行するのにアクセス権 DELETE は必
要ありません。ただし、DELETE で参照されている表に対してはアクセス権
DELETE が必要です。
複数の子表が存在する場合
親表に、カスケード削除を指定した子表とカスケード削除を指定していない子表の
二つの子側の制約がある場合、この二つの子表に関連付けられた親表から行を削除
しようとしても、削除文は失敗し、親表の行も子表の行も削除されません。
SQL 文
2-169
CREATE TABLE 文
ロックとログ
削除の実行中、データベースサーバは被参照表と参照表内の有効な行すべてにロッ
クをかけます。削除を行う場合はログをオンにしなければなりません。たとえ一時
的にでもデータベースのログがオフになっていると、削除が段階的に行われませ
ん。ログがオフになっているといずれの動作もロールバックできないため、このよ
うな制限が用意されています。たとえば、親表の行を削除したとき、子表の行を削
除する前にシステムがクラッシュすると、データベースは参照整合性に合わない余
分な子表レコードを持つことになります。ただし、ログをオンに戻せば、その後の
削除は段階的に行われるようになります。
カスケード削除の制限
カスケード削除機能は、相関副問合せを唯一の例外として、ほとんどの削除に対し
て使用することができます。相関副問合せでは、副問合せや副問合せ内の SELECT
文が生成する値が、それらの副問合せを包含する外側の SELECT 文によって生成さ
れる値に依存する場合、副問合せが相互に関連を持つようになります。カスケード
削除を実施している場合、相関副問合せで使用する子表に対して削除を行うことは
できません。このような相関副問合せを含む問合せで削除を行おうとすると、エ
ラーが返されます。
さらに、表に DELETE トリガ イベント付きトリガがある場合、この表にカスケー
ド削除の参照制約を定義することはできません。削除トリガをもつ表に対して
ON DELETE CASCADE を指定する参照制約を追加しようとすると、エラーが返
されます。
カスケード削除についての詳細は、
『Informix Guide to SQL: Tutorial』を参照してく
ださい。
2-170 Informix Guide to SQL:Syntax
CREATE TABLE 文
CHECK 節
CHECK 節を使用して、INSERT 文または UPDATE 文の実行中に、列にデータを割
り当てる前に満足しなければならない条件を指定します。挿入または更新中に、表
で定義された検査制約に対して行が誤りであると評価された場合、データベース
サーバはエラーを返します。
列レベルの制約へ戻る、2-163 ページ
表レベルの制約へ戻る、2-175 ページ
CHECK 節
CHECK
(
条件、
4-5 ページ
)
検索条件を使用して、検査制約を定義します。検索条件には、副問合せ、集約、ホ
スト変数、行 ID、CURRENT、USER、SITENAME、DBSERVERNAME、または
TODAY の各関数、もしくはストアド プロシジャ呼出しを含めることはできませ
ん。
列レベルでの検査制約の定義
列レベルで検査制約を定義する場合、検査制約がチェックできる列はその列だけで
す。つまり検査制約は、表の他の列の値には影響されません。たとえば次の文で
は、表 acct_chk に検査制約の付いた列が二つあります。
CREATE TABLE acct_chk (
chk_id SERIAL PRIMARY KEY,
debit INTEGER REFERENCES accounts (acc_num),
debit_amt MONEY CHECK (debit_amt BETWEEN 0 AND 99999),
credit INTEGER REFERENCES accounts (acc_num),
credit_amt MONEY CHECK (credit_amt BETWEEN 0 AND 99999))
列 debit_amt と列 credit_amt は、どちらも値が 0 から 99999 の間である金額
(MONEY) データ型の列です。しかし、両方の列に同じ値が入っているかを確認す
る場合は、列レベルで検査制約を作成することはできません。複数の列の値を
チェックする制約を作成するには、表レベルで制約を定義しなければなりません。
SQL 文
2-171
CREATE TABLE 文
表レベルでの検査制約の定義
表レベルで検査制約を定義するときは、検索条件の各列がその表の中の列でなけれ
ばなりません。複数の表の列に対して検査制約を作成することはできません。次の
例では、前記の例と同じ表と列を作成します。ただしこの例では、検査制約が表内
の二つの列に関して定義されています。
CREATE TABLE acct_chk (
chk_id SERIAL PRIMARY KEY,
debit INTEGER REFERENCES accounts (acc_num),
debit_amt MONEY,
credit INTEGER REFERENCES accounts (acc_num),
credit_amt MONEY,
CHECK (debit_amt = credit_amt))
この例では、列 debit_amt と列 credit_amt が互いに等しくなければなりません。等し
くない場合は、挿入または更新処理がエラーになります。
制約モード オプション
制約モード オプションは、次の用途に使用できます。
IDS
■
制約への名前の割当て
■
Dynamic Server での制約の無効、有効、またはフィルタリング モードの
設定 ♦
制約モード
オプション
列レベルの制約へ戻る、2-163 ページ
表レベルの制約へ戻る、2-175 ページ
CONSTRAINT
< 制約 >
IDS
DISABLED
ENABLED
FILTERING
WITHOUT ERROR
WITH ERROR
2-172 Informix Guide to SQL:Syntax
CREATE TABLE 文
要素
< 制約 >
目的
制約名です。
制限
制約名はデータベース内で一意
でなければなりません。
構文
データベース オブ
ジェクト名、4-25
ページ
CONSTRAINT 節の使用
CONSTRAINT 節を使用して、制約にわかりやすい名前を指定できます。制約に名
前を指定しない場合、データベース サーバは u143_2 のような識別子を割り当てま
す。制約名は制約違反に関連するエラー メッセージの中に表示されます。また、制
約名は ALTER TABLE 文の DROP CONSTRAINT 節で指定されます。
IDS
制約モード オプションの説明
Dynamic Server では、制約モード オプションを使用して、挿入、削除、および更新
の実行中に制約の動作を制御します。次にこれらのオプションについて説明します。
制約モード
効果
無効
無効モードで作成された制約は、挿入、削除、更新作業中は実施
されません。
有効
有効モードで作成された制約は、挿入、削除、更新作業中に実
施されます。ターゲット行で制約違反が起きると、エラーにな
ります。
フィルタ
リング
フィルタリング モードで作成された制約は、挿入、削除、更新作
業中に実施されます。ターゲット行で制約の違反が起きても処理
は続けられますが、ターゲット表と関連する違反表に不良行が書
き込まれます。ターゲット表と関連する診断表に、制約違反につ
いての診断情報が書き込まれます。
SQL 文
2-173
CREATE TABLE 文
フィルタリング モードを選択すると、オプション WITHOUT ERROR またはオプ
ション WITH ERROR を指定できます。次に、これらのオプションについて説明し
ます。
エラー
オプション
効果
WITHOUT
ERROR
挿入、削除、または更新作業中に、フィルタリング モード制約の
違反があっても、整合性違反のエラーは返されません。
WITH
ERROR
挿入、削除、または更新作業中に、フィルタリング モード制約の
違反があると、整合性違反のエラーが返されます。
制約モードの指定
制約モードを定義する際は、次の規則に従ってください。
■
モードを指定しない場合は、デフォルトで列レベルの制約または表レベル
の制約が有効モードになります。
■
フィルタリング モード制約にオプション WITH ERROR または WITHOUT
ERROR を指定しないと、デフォルトで WITHOUT ERROR になります。
■
一時表で定義される制約は、必ず有効モードになります。一時表では、制約
を無効モードまたはフィルタリング モードで作成することはできません。
また、SET Database Object Mode 文を使用して、一時表の制約のモードを無効
モードまたはフィルタリング モードに切り換えることもできません。
■
一時表の NULL 値不可制約に名前を割り当てることはできません。
■
別の表の違反表または診断表として機能している表に、制約を作成するこ
とはできません。
2-174 Informix Guide to SQL:Syntax
CREATE TABLE 文
表レベルの制約
表レベルの制約定義を使用して、単一列または列のセットに対する制約を作成でき
ます。
表レベルの制約
CREATE TABLE 文へ戻る、
2-155 ページ
,
(
UNIQUE
<列>
)
+
+
DISTINCT
制約定義、
2-172 ページ
PRIMARY KEY
,
FOREIGN KEY
(
<列>
)
REFERENCES 節、
2-164 ページ
CHECK 節、
2-171 ページ
要素
<列>
目的
制限
制約が設定される列の名前です。 列はバイト (BYTE) 型列または
テキスト (TEXT) 型列にはでき
ません。
構文
識別子、4-112
ページ
< 列 > は、表の中の列でなければなりません。列のリストには、最大 16 列を入れ
ることができます。列のリストの合計の長さは、255 バイトを超えることはできま
せん。
一意な列としての定義
キーワード UNIQUE を使用して、単一列または列のセットが一意のデータだけを受
け入れるように指定できます。一意性制約が設定された列には、重複値を挿入する
ことはできません。
SQL 文
2-175
CREATE TABLE 文
一意性制約に名前が指定される各列は、表の中の列であり、制約リストには 1 回し
か載せられません。次の例では、列の一つに一意性制約が設定された簡単な表を作
成します。
CREATE TABLE accounts (a_name CHAR(12), a_code SERIAL,
UNIQUE (a_name) CONSTRAINT acc_name)
上記の例の代わりに列レベルで制約を定義する場合は、次の例に示すように、キー
ワード UNIQUE と CONSTRAINT を列定義の中に入れるだけです。
CREATE TABLE accounts
(a_name CHAR(12) UNIQUE CONSTRAINT acc_name, a_code SERIAL)
一意性制約の制限
一意性制約を定義するときは ( キーワード UNIQUE またはキーワード DISTINCT)、
列は制約リストに 1 回しか載せられません。
すでに主キー制約を設定してある列に対して、一意性制約を設定することはできま
せん。
主キー列としての定義
主キーとは、NULL ではない一意の値が表の各行に入っている列または列のセット
です。一つの表に主キーは一つだけです。また主キーとして定義された列は、さら
に一意な列として定義することはできません。前記の二つの例では、一意性制約が
列 a_name に設定されました。次の例では、この列は表 accounts の主キーとして作
成されます。
CREATE TABLE accounts
(a_name CHAR(12), a_code SERIAL, PRIMARY KEY (a_name))
主キー制約の制限
主キー制約 ( キーワード PRIMARY KEY) は、表の一つの列または列のセットの一つ
に対してだけ定義できます。すでにある列または列のセットを主キーとして定義し
ている場合は、別の列または列のセットを主キーとして定義することはできません。
2-176 Informix Guide to SQL:Syntax
CREATE TABLE 文
外部キー列としての定義
外部キーすなわち参照制約は、表の間の依存性を確立します。外部キーは、表の中
の一意な列または主キー列を参照します。すべての外部キー列に NULL ではない値
が入っている場合は、外部キー列のすべてのエントリについて、一意性の列または
主キー列に一致するエントリが存在しなければなりません。
参照制約の制限
参照制約を指定するときは、参照列 ( キーワード FOREIGN KEY の後に指定する列 )
のデータ型が被参照列 (REFERENCES 節の中で指定する列 ) のデータ型と一致しな
ければなりません。例外は、被参照列がシリアル (SERIAL) 型の場合に参照列が整
数 (INTEGER) 型でなければならない場合だけです。
型オプション
AD/XP
Dynamic Server with AD and XP Options では、型オプションにより表のログ機能の特
性を指定できます。
型オプション
CREATE TABLE 文へ戻る、
2-155 ページ
AD/XP
RAW
STATIC
OPERATIONAL
STANDARD
Dynamic Server with AD and XP Options を使用するとき、永続表は次の4つの型の一
つにすることができます。
■
RAW は、簡単な追加をするログなし表
■
STATIC は、インデックス制約および参照制約を含むことができるログな
し表
SQL 文
2-177
CREATE TABLE 文
■
OPERATIONAL は、簡単な追加を使用し、アーカイブからの復元が不可能
なログ付き表
■
STANDARD( 永続表のデフォルトの型 ) は、ロールバック、復旧、および
アーカイブからの復元が可能なログ付き表
これらの表型についての詳細は、
『Informix Guide to Database Design and
Implementation』を参照してください。
IDS
キーワード WITH CRCOLS
Dynamic Server では、キーワード WITH CRCOLS を使用して、エンタプライズ レプ
リケーションが競合分析に使用するシャドウ列を二つ作成します。最初の列
cdrserver には、最後に変更処理が行われたデータベース サーバの識別子が入りま
す。2 番目の列 cdrtime には、最後の変更が実行されたときのタイム スタンプが入
ります。タイム スタンプまたはストアド プロシジャ競合分析を使用する前に、こ
れらの列を追加しておかなければなりません。
ほとんどのデータベース操作では、列 cdrserver および列 cdrtime は隠されています。
たとえば、表の作成時にキーワード WITH CRCOLS を使用すると、列 cdrserver と
列 cdrtime は次のようになります。
■
文を発行しても表示されません。
■
表の列に関する情報を問い合わせたときに、DB-Access に表示されません。
■
< 表名 > についてのシステム カタログ表 systablesのエントリの列の数 (ncols)
の中に数えられません。
SELECT * from < 表名 >
列 cdrserver と列 cdrtime の内容を表示するには、SELECT 文の中でこれらの列の名
前を明示的に指定します。
SELECT cdrserver, cdrtime from < 表名 >
WITH CRCOLS の使用方法についての詳細は、『Guide to Informix Enterprise
Replication』を参照してください。
2-178 Informix Guide to SQL:Syntax
CREATE TABLE 文
格納オプション
格納オプションを使用して、表の格納場所と表のフラグメンテーション ストラテジ
を指定することができます。
CREATE TABLE 文へ戻る、
2-155 ページ
格納
オプション
IN<DB 領域 >
AD/XP
IN<DB スライス >
FRAGMENT BY 節、
2-181 ページ
要素
<DB
スライス >
目的
表が格納される DB スライスの
名前です。
<DB 領域 >
表が格納される DB 領域の名前
です。
制限
指定された DB スライスがすで
に存在していなければなりま
せん。
指定された DB 領域がすでに存
在していなければなりません。
構文
識別子、4-112
ページ
識別子、4-112
ページ
IN<DB 領域 > 節
IN<DB 領域 > 節を使用して、表を分離することができます。この場合、指定する
DB 領域がすでに存在していなければなりません。IN<DB 領域 > 節または断片化ス
キームのどちらかで位置を指定しない場合、データベース サーバは現行のデータ
ベースが置かれている DB 領域に表を格納します。
SQL 文
2-179
CREATE TABLE 文
AD/XP
IN<DB スライス > 節
Dynamic Server with AD and XP Options を使用している場合、IN<DB スライス > 節に
より、DB スライスとして定義されている複数の DB 領域全体に表を断片化できま
す。データベース サーバは、表の作成時に DB スライスを構成する DB 領域で、ラ
ウンド ロビンにより表を断片化します。
IDS
バイト (BYTE) 型列およびテキスト (TEXT) 型列の格納
Dynamic Server では、バイト (BYTE) 型列およびテキスト (TEXT) 型列のデータを表
と一緒に、または別の BLOB 領域内に格納できます。次の例は、BLOB 領域および
DB 領域の指定方法を示します。ユーザは表 resume を作成します。この表のデータ
は DB 領域 employ に格納されます。列 vita のデータは表と一緒に格納されますが、
列 photo に関連するデータは photo_space という名前の BLOB 領域に格納されます。
CREATE TABLE resume
(
fname
lname
phone
recd_date
contact_date
comments
vita
photo
)
IN employ
CHAR(15),
CHAR(15),
CHAR(18),
DATETIME YEAR TO HOUR,
DATETIME YEAR TO HOUR,
VARCHAR(250, 100),
TEXT IN TABLE,
BYTE IN photo_space
バイト (BYTE) データ型またはテキスト (TEXT) データ型の構文については、4-27
ページの「データ型」を参照してください。
2-180 Informix Guide to SQL:Syntax
CREATE TABLE 文
FRAGMENT BY 節
FRAGMENT BY 節を使用して、断片化された表を作成し、分散スキームを指定でき
ます。断片化とは、一つの表の中の複数の行グループを同じ DB 領域に一緒に格納
することを意味します。
この節は、Dynamic Server、Workgroup Edition と Developer Edition では使用でき
ません。 ♦
W/D
FRAGMENT BY 節
格納オプションへ戻る、
2-179 ページ
,
FRAGMENT BY
IN<DB 領域 >
ROUND ROBIN
,
<DB 領域 >
AD/XP
IDS
IN<DB スライス >
WITH ROWIDS
,
< 式 >IN<DB 領域 >
EXPRESSION
AD/XP
,
< 式 >IN<DB 領域 >
,
REMAINDER IN<DB 領域
領域 >
,
,
HASH
(
<列>
)
IN<DB 領域 >
,
DB 領域
IN<DB スライス >
HYBRID 節、
2-186 ページ
SQL 文
2-181
CREATE TABLE 文
要素
<列>
目的
その列に関して表を断片化した
い列の名前または列です。
制限
すべての指定された列は現行表
の中に存在しなければなりませ
ん。シリアル列を指定する場
合、他の列は指定できません。
<DB
スライス >
表フラグメントが置かれる ( 別
のコサーバで管理される )DB
領域が含まれた DB スライスの
名前です。
表フラグメントを含む DB 領域
の名前です。
文を実行するときに DB スラ 識別子、4-112
ページ
イスが存在しなければなり
ません。
<DB 領域 >
<式>
IDS
要素
識別子、4-112
ページ
文を実行するときに DB 領域が 識別子、4-112
存在しなければなりません。最 ページ
IN<DB 領域 > 節または断片化ス 大 2,048 個の DB 領域を指定で
キームのどちらかで位置を指定 きます。
しない場合、新しい表は現行表
が置かれた DB 領域に格納され
ます。
行が格納されるフラグメントを 各 < 式 > は、現行表の列のみお 式、4-33 ページ
定義する式です。
よび単一行のデータ値のみを含
みます。< 式 > には、副問合せ、
ストアド プロシジャ、シリアル
列、現行の日付 / 時刻関数、も
しくは集計を使用できません。
キーワード WITH ROWIDS の使用
Dynamic Server では、断片化されていない表に、列 rowid と呼ばれる隠れた列が含
まれます。しかし、断片化された表にはこの列はありません。表が断片化されてい
る場合、キーワード WITH ROWIDS を使用してこの表に列 rowid を追加できます。
データベース サーバは列 rowid の各行に、その行が存在する間は変更されない一意
の番号を割り当てます。データベース サーバはインデックスを使用して、行の物理
的な位置を検索します。列 rowid を追加すると、この列を格納するために 4 バイト
が各行に追加されます。
重要 : 列 rowid を活用するよりも、主キーをアクセス方法として利用するようお勧
めします。
2-182 Informix Guide to SQL:Syntax
CREATE TABLE 文
ROUND ROBIN 節の使用
ラウンド ロビン方式分散スキームでは、フラグメントが常にだいたい同じ数の行を
維持するように、データベース サーバが指定された DB 領域の中で行を分散させま
す。この分散スキームでは、データベース サーバは一つの行を検索するときに、す
べてのフラグメントを走査しなければなりません。
AD/XP
IN<DB スライス > 節の使用
Dynamic Server with AD and XP Options では、IN<DB スライス > 節を使用して、異な
るコサーバが管理する複数の DB 領域全体に表を断片化できます。既知の DB スラ
イスを指定すると、データベース サーバはその DB スライスを構成する DB 領域に
フラグメント化式を適用します。
IN<DB 領域 > 節の使用
IN<DB 領域 > 節を使用して、表を分離することができます。この場合、指定する
DB 領域がすでに存在していなければなりません。IN<DB 領域 > 節または断片化ス
キームのどちらかで位置を指定しない場合は、新しい表は現行データベースが置か
れている DB 領域に格納されます。
一時表はデフォルトの DB 領域をもちません。一時表の格納についての詳細は、
2-190 ページの「TEMP TABLE 節」を参照してください。
たとえば、データベース history が DB 領域 dbs1 にあるとき、データ family を
famdata と呼ばれる別の DB 領域に配置したい場合は、次のように指定します。
CREATE DATABASE history IN dbs1
CREATE TABLE family
(
id_num
name
nickname
mother
father
)
IN famdata
SERIAL(101),
CHAR(40),
CHAR(20),
CHAR(40),
CHAR(40)
表を別の DB 領域に格納する方法についての詳細は、お手持ちの『Administrator’s
Guide』を参照してください。
SQL 文
2-183
CREATE TABLE 文
EXPRESSION 節の使用
式方式の分散スキームでは、各フラグメント化式が規則に従って DB 領域を一つ指
定します。各フラグメント化式は、規則に従ってデータを分離し、データベース
サーバによる行検索を支援します。次の規則のどちらか一つを指定してください。
■
範囲規則
次の例に示すように、範囲規則を使用するフラグメント化式では、フラグ
メントに格納される行が範囲で指定されます。
...
FRAGMENT BY EXPRESSION
c1 < 100 IN dbsp1,
c1 >= 100 and c1 < 200 IN dbsp2,
c1 >= 200 IN dbsp3
■
任意の規則
次の図に示すように、任意の規則では、定義済みの SQL 式に基づいてフ
ラグメント化式が指定されます。この場合は通常、OR 節を使用してデー
タがグループ化されます。
...
FRAGMENT BY EXPRESSION
zip_num = 95228 OR zip_num = 95443 IN dbsp2,
zip_num = 91120 OR zip_num = 92310 IN dbsp4,
REMAINDER IN dbsp5
警告 : フラグメント化式に日付 (DATE) 型の値を指定する場合、年は 2 桁ではなく
4 桁で指定しなければなりません。4 桁の年を指定すると、環境変数 DBCENTURY
は分散スキームに影響しません。2 桁の年を指定すると、環境変数 DBCENTURY
が分散スキームに影響を及ぼして、予期しない結果を引き起こす場合があります。
環境変数 DBCENTURY についての詳細は、『Informix Guide to SQL: Reference』を
参照してください。
AD/XP
HASH 節の使用
Dynamic Server with AD and XP Options では、ハッシュ分散スキームを使用する場合、
データベース サーバはユーザが行を挿入するとその行を分散させ、フラグメントが
だいたい同じ数の行を維持するようにします。この分散スキームでは、ハッシュが
内部的に分かっているので、データベース サーバは行の検索時にフラグメントを削
除することができます。
2-184 Informix Guide to SQL:Syntax
CREATE TABLE 文
たとえば、データウェアハウ環境内など、非常に大きなデータベースを使用する場
合、異なるコサーバに属する複数のディスク全体に表を断片化することができま
す。ほとんどのデータをスキャンする問合せを多数実行する場合、次に示すように
システム定義のハッシュ分散スキームを使用して、入出力処理のバランスをとるこ
とができます。
CREATE TABLE customer
(
cust_id integer,
descr char(45),
level char(15),
sale_type char(10),
channel char(30),
corp char(45),
cust char(45),
vert_mkt char(30),
state_prov char(20),
country char(15),
org_cust_id char(20)
)
FRAGMENT BY HASH (cust_id) IN
customer1_spc,
customer2_spc,
customer3_spc,
customer4_spc,
customer5_spc,
customer6_spc,
customer7_spc,
customer8_spc
EXTENT SIZE 16 NEXT SIZE 16
.
.
.
この例では 8 個のコサーバを使用し、各コサーバには DB 領域が一つ定義されてい
ます。
SQL 文
2-185
CREATE TABLE 文
フラグメンテーション ストラテジの分散スキームのシリアル列
Dynamic Server with AD and XP Options では、断片化された表のハッシュ分散スキー
ムで、シリアル列を指定できます。次に、SQL CREATE TABLE 文の例を一部示し
ます。
CREATE TABLE customer
(
cust_id serial,
.
.
.
)
FRAGMENT BY HASH (cust_id) IN
customer1_spc,
customer2_spc
.
.
.
断片化された表と断片化されていない表のシリアル列の値の違いに気が付くかもし
れません。データベース サーバはフラグメント内でシリアル値を順番に割り当てま
すが、フラグメント間では連続しない範囲からの値が含まれる場合があります。こ
れらの範囲を何にするかは指定できません。データベース サーバはこれらの範囲を
制御し、範囲がオーバラップしないことだけは保証します。
AD/XP
HYBRID 節の使用
Dynamic Server with AD and XP Options では、HYBRID 節を使用して同じ表に二つの
分散スキームを適用することができます。
2-186 Informix Guide to SQL:Syntax
CREATE TABLE 文
FRAGMENT BY 節へ戻る、
2-181 ページ
HYBRID 節
,
(
HYBRID
)
<列>
Hybrid
EXPRESSION 節
,
(
HASH
(
<列>
)
)
Hybrid
EXPRESSION 節
,
EXPRESSION
< 式 >IN<DB スライス >
要素
<列>
目的
その列に関して表を断片化した
い列の名前または列です。
<DB
スライス >
<式>
すべての表フラグメントが入っ
た DB スライスの名前です。
行が格納されるフラグメントを
定義する式です。
,
< 式 >IN<DB スライス >
,
REMAINDER IN<DB スライス >
制限
構文
すべての指定された列は現行表 識別子、4-112
の中になければなりません。シ ページ
リアル列を指定する場合、他の
列は指定できません。
文を実行するときに DB スライ 識別子、4-112
スが存在しなければなりません。 ページ
各 < 式 > は、現行表の列だけ、 式、4-33 ページ
および単一行のデータ値だけを
含みます。< 式 > には、副問合
せ、ストアド プロシジャ、シリ
アル列、現行の日付/時刻関
数、もしくは集計を使用できま
せん。
SQL 文
2-187
CREATE TABLE 文
ハイブリッドな断片化は、ハッシュ分散スキームと式分散スキームの組み合わせに
ついてだけ有効です。ハッシュ分散スキームは、デフォルトのハイブリッド分散ス
キームなので、HASH 節を明示的に指定するかどうかは任意です。
ハイブリッドな断片化を指定する場合、ハイブリッドな EXPRESSION 節はデータ
が格納される DB スライスを決定し、HYBRID 節のハッシュ列は DB スライス内の
DB 領域を決定します。
LOCK MODE 節
LOCK MODE 節
CREATE TABLE 文へ戻る、
2-155 ページ
PAGE
LOCK MODE
ROW
AD/XP
TABLE
デフォルトのロック範囲はページです。
行レベルのロックを使用すると、同時実行性のレベルを最大にすることができま
す。しかし、多くの行を同時に使用すると、ロック管理のオーバヘッドがきわめて
大きくなる場合があります。オペレーティング システムの構成によっては、使用で
きるロックの最大数を超えることもあります。
ページ ロックを使用すると、1 ページ全体の行に対して一つのロックをかけたり解
除したりすることができます。ページ ロックは、すべての行が処理順序と同じ順序
でページにグループ化されていると分かっている場合には特に有効です。たとえ
ば、表の内容をクラスタ化インデックスと同じ順序で処理している場合、ページ
ロックは特に適しています。既存の表のロック モードは、ALTER TABLE 文を使用
して変更できます。
AD/XP
Dynamic Server with AD and XP Options では、表のロックにより表全体がロックされ
ます。この種類のロックでは、行ロックおよびページ ロックと比較して、更新の同
時実行性が減少します。複数の読込み専用トランザクションでは、表をアクセスで
きます。表ロックは、表に対するロック管理のオーバヘッドを小さくします。♦
2-188 Informix Guide to SQL:Syntax
CREATE TABLE 文
エクステント オプション
エクステント オプションは、表に割り当てられるエクステントのサイズを定義しま
す。エクステント サイズを指定しない場合、すべてのエクステントのデフォルト
サイズは 16 キロバイトです。
エクステント オプション
CREATE TABLE 文へ戻る、
2-155 ページ
EXTENT SIZE
< 初期のキロバイト >
要素
< 初期のキロ
バイト >
目的
キロバイトで表した表の初期の
エクステント サイズです。
< 追加のキロ
バイト >
キロバイトで表した追加のエク
ステントのサイズです。
NEXT SIZE
< 追加のキロバイト >
制限
構文
最小サイズは、使用しているシ 式、4-33 ページ
ステムのディスク ページ サイ
ズの 4 倍です。たとえば、2 キ
ロバイトのページ システムの場
合は最小サイズは 8 キロバイト
です。最大サイズはチャンク サ
イズと同じです。
最小サイズは、使用しているシ 式、4-33 ページ
ステムのディスク ページ サイ
ズの 4 倍です。たとえば、2 キ
ロバイトのページ システムの場
合は最小サイズは 8 キロバイト
です。最大サイズはチャンク サ
イズと同じです。
次の例では、初期エクステントとして 20 キロバイト、追加エクステントとしてデ
フォルト サイズを指定しています。
CREATE TABLE emp_info
(
f_name CHAR(20),
l_name CHAR(20),
position CHAR(20),
start_date DATETIME YEAR TO DAY,
comments VARCHAR(255)
)
EXTENT SIZE 20
SQL 文
2-189
CREATE TABLE 文
エクステント サイズの計算方法については、
『Performance Guide』を参照してくだ
さい。
TEMP TABLE 節
TEMP TABLE 節を使用して、一時表を作成します。一時表は永続表と同じ特性を多
数もっていますが、データベースの終了時に一時表は保存されません。一時表は、
永続表を変更するときと同じ方法では変更できません。
TEMP TABLE 節
CREATE TABLE 文へ戻る、
2-155 ページ
,
TEMP
TABLE
<表>
(
一時表の列定義、
2-194 ページ
,
)
+
AD/XP
,
一時表の表
レベルの制約、
2-196 ページ
SCRATCH
要素
<表>
WITH NO LOG
目的
制限
一時表に割り当てたい名前です。 名前は、現行データベース内の
他の既存の表、ビュー、または
シノニム名のいずれとも異なる
ものでなければなりません。し
かし、他のユーザが使用する他
の一時表の名前とは異なる必要
はありません。
構文
データベース オブ
ジェクト名、4-25
ページ
一時表は、これらの表を作成するセッションでは表示できますが、他のユーザまた
はセッションでは見えません。一時表は、システム カタログには表示されません。
一時表は、データベースではなくセッションに関連付けられています。したがっ
て、一時表を作成するときは、最初の一時表を削除するかまたはセッションを終了
するまでは、( 他のデータベース用であっても ) 同じ名前で別の一時表を作成する
ことはできません。
2-190 Informix Guide to SQL:Syntax
CREATE TABLE 文
AD/XP
キーワード SCRATCH の使用
Dynamic Server with AD and XP Options では、SCRATCH 一時表は、インデックス制
約または参照制約を入れることができないログなしの一時表です。表 SCRATCH
は、オプション WITH NO LOG を付けて作成された表 TEMP と同一です。
キーワード WITH NO LOG の使用
ログ機能付きで開始されたデータベースにおいて、キーワード WITH NO LOG を使
用して一時表のログをとるのを防ぐことができます。一時 DB 領域に作成された一
時表に対しては、キーワード WITH NO LOG を使用しなければなりません。
IDS
Dynamic Server で、ログ機能を使用していないデータベースにおいてキーワード
WITH NO LOG を使用した場合、オプション WITH NO LOG は無視されます。♦
一時表でログ機能をいったんオフにすると、これをオンに戻すことはできません。
したがって、一時表は常にログされるか、まったくログされないかのいずれかです。
次の例は、ログ機能を使用するデータベース内の一時表について、ログをとるのを
防ぐ方法を示しています。
CREATE TEMP TABLE tab2 (fname CHAR(15), lname CHAR(15))
WITH NO LOG
明示的な一時表
作成された一時表は、明示的な一時表と呼ばれます。明示的な一時表は、次の方法
で作成できます。
■
CREATE TEMP TABLE 文を使用
■
SELECT...INTO TEMP 文を使用
データベースに対して接続アクセス権をもっている場合、明示的な一時表を作成で
きます。いったん一時表が作成されると、その表でインデックスを作成できます。
ただし、この一時表を見ることができるユーザは、表の作成者だけです。
AD/XP
Dynamic Server with AD and XP Options を使用している場合、別のコサーバに属する
ディスクを使用して、明示的な一時表を断片化できます。♦
SQL 文
2-191
CREATE TABLE 文
一時表の存在期間
アプリケーションで明示的な一時表が作成されると、この表は次の状態の一つが発
生するまで存在します。
■
アプリケーションが終了する。
■
DROP TABLE 文が発行される。
■
アプリケーションで、表が作成されたデータベースがクローズされ、別の
データベース サーバのデータベースがオープンされる。
これらのイベントの一つが発生すると、一時表は削除されます。
DB
一時表と DB-Access
DB-Access の中で、INFO 文および Info Menu オプションを一時表と一緒に使用する
ことはできません。♦
一時表の名前
一時表の名前は、現行データベース内の他の既存の表、ビュー、またはシノニム名
のどれとも異なるものでなければなりません。しかし、他のユーザが使用する他の
一時表の名前とは異なる必要はありません。
一時表の位置
CREATE TEMP TABLE 文、環境変数、およびパラメータ ONCONFIG を使用して、
一時表を作成する場所を指定できます。データベース サーバは、一時表を格納する
場所を見つけるために次の情報を使用します。
1.
IN<DB 領域 > 節
CREATE TABLE 文の IN<DB 領域 > 節を使用して、一時表を格納したい
DB 領域を指定できます。
2.
一時表を断片化するときに指定する DB 領域
CREATE TABLE 文の FRAGMENT BY 節を使用して、通常の表と一時表を
断片化します。
2-192 Informix Guide to SQL:Syntax
CREATE TABLE 文
3.
環境変数 DBSPACETEMP
IN<DB 領域 > 節、または表を断片化する FRAGMENT BY 節を使用しない
場合、データベース サーバは環境変数 DBSPACETEMP が設定されている
かどうかをチェックします。環境変数 DBSPACETEMP は、一時表を格納
できる場所を指定します。この環境変数が設定されている場合、データ
ベース サーバはそのリストで指定された格納領域の一つに一時表を格納し
ます。
4.
ONCONFIG パラメータ DBSPACETEMP
ONCONFIG パラメータ DBSPACETEMP を使用して、一時表の位置を指定
できます。
IN<DB 領域 > 節、表を断片化する FRAGMENT BY 節、環境変数 DBSPACETEMP、
または ONCONFIG パラメータ DBSPACETEMP を使用しない場合、一時表は使用し
ているデータベース サーバと同じ DB 領域に作成されます。 ♦
一時表のための複数の DB 領域の指定
環境変数 DBSPACETEMP 用に複数の DB 領域を指定できます。次の例では、環境
変数 DBSPACETEMP 用に DB 領域定義を指定する方法を示します。
setenv DBSPACETEMP tempspc1:tempspc2:tempspc3
UNIX
♦
set DBSPACETEMP=tempspc1:tempspc2:tempspc3
WIN NT
♦
作成された各一時表は、DB 領域にラウンド ロビンされます。たとえば、3 つの一
時表を作成した場合、最初の表は tempspc1 と呼ばれる DB 領域に配置され、2 番目
は tempspc2 に、3 番目は tempspc3 に配置されます。
環境変数 DBSPACETEMP についての詳細は、『Informix Guide to SQL: Reference』を
参照してください。ONCONFIG パラメータ DBSPACETEMP についての詳細は、
『Administrator’s Guide』を参照してください。
SQL 文
2-193
CREATE TABLE 文
一時表の列定義
一時表の列定義
<列>
TEMP TABLE 節へ戻る、
2-190 ページ
データ型、
4-27 ページ
DEFAULT 節、
2-160 ページ
NOT NULL
一時表列の制約定義、
2-195 ページ
要素
<列>
目的
表の中の列名です。
制限
名前は表の中で一意でなければ
なりませんが、同じデータベー
スの別の表の中の名前と同じも
のは使用できます。
構文
識別子、4-112
ページ
一時表の列は、通常のデータベース表の列定義と同じ方法で定義します。列制約の
定義のためのオプションだけが異なります。これについては、次に説明します。
一時表の単一列の定義方法についての詳細は、2-159 ページの「列定義」を参照し
てください。
2-194 Informix Guide to SQL:Syntax
CREATE TABLE 文
一時表の列制約の定義
一時表の列定義へ戻る、2-194 ページ
一時表の列制約の定義
UNIQUE
+
DISTINCT
PRIMARY KEY
CHECK 節、
2-171 ページ
一時表の列制約は、次に示す例外を除き、通常表の列制約と同じです。
■
一時表の列に参照制約を設定することはできません。
■
一時表の列制約に名前を割り当てることはできません。
■
一時表の列制約にデータベース オブジェクト モードを設定することはで
きません。
通常表の列制約についての詳細は、2-163 ページの「列レベルの制約」を参照して
ください。
SQL 文
2-195
CREATE TABLE 文
一時表の表レベルの制約
一時表の表レベルの制約
TEMP TABLE 節へ戻る、
2-190 ページ
,
UNIQUE
(
<列>
)
+
DISTINCT
PRIMARY KEY
CHECK 節、
2-171 ページ
要素
<列>
目的
制限
制約が設定される列の名前です。 2-196 ページの「一時表の表レ
ベル制約の制限」を参照してく
ださい。
構文
識別子、4-112
ページ
一時表の一つまたは複数の列に、表レベルの制約を設定することができます。
一時表の表レベル制約の制限
一時表に対する表レベル制約は、次に示す例外を除き、通常のデータベース表と同
じ方法で定義されます。
■
一時表の列に参照制約を設定することはできません。
■
一時表の列制約に名前を割り当てることはできません。
■
一時表の列制約にデータベース オブジェクト モードを設定することはで
きません。
通常表の表レベル制約についての詳細は、2-175 ページの「表レベルの制約」を参
照してください。
2-196 Informix Guide to SQL:Syntax
CREATE TABLE 文
参照
関連する文は、
「ALTER TABLE 文」、
「CREATE INDEX 文」
、
「CREATE DATABASE
文」
、「DROP TABLE 文」、および「SET Database Object Mode 文」です。
データの整合性制約およびデータベースと表の作成については、
『Informix Guide to
Database Design and Implementation』を参照してください。
『Informix Guide to SQL: Tutorial』を参照して
ON DELETE CASCADE 節については、
ください。
エクステント サイズについては、
『Performance Guide』を参照してください。
SQL 文
2-197
CREATE TRIGGER 文
+
IDS
CREATE TRIGGER 文
CREATE TRIGGER 文を使用して、データベース内の表にトリガを作成することが
できます。トリガとは、特定のイベントが発生したときに、あらかじめ指定された
一連の SQL 文を自動的に実行するデータベースのオブジェクトです。
CREATE TRIGGER 文は、Dynamic Server でのみ使用できます。
構文
CREATE TRIGGER
< トリガ >
INSERT ON
<表>
アクション節
2-204 ページ
REFERENCING
節の挿入
2-207 ページ
DELETE ON
<表>
アクション節
2-204 ページ
REFERENCING
節の削除
2-208 ページ
節の更新
2-202 ページ
ON
<表>
アクション節
の参照
2-210 ページ
アクション節
2-204 ページ
REFERENCING
節の更新
2-209 ページ
2-198 Informix Guide to SQL:Syntax
アクション節
の参照
2-210 ページ
アクション節
の参照
2-210 ページ
トリガ
モード
オプション
2-228 ページ
CREATE TRIGGER 文
要素
<表>
目的
トリガの影響を受ける表の名前
です。
< トリガ >
トリガの名前です。
制限
名前は、現行データベース内に
ある既存の表、ビュー、または
シノニム名とは異なるものでな
ければなりません。
トリガを指定できるのは、現行
データベースに対してだけで
す。トリガの名前は一意でなけ
ればなりません。
構文
データベース
オブジェクト名、
4-25 ページ
データベース
オブジェクト名、
4-25 ページ
説明
表に対してトリガを作成するには、表の所有者であるか、表が含まれるデータベース
に対して DBA( データベース管理者 ) のアクセス権を持っていなければなりません。
トリガではロールを使用できます。CREATE ROLE、DROP ROLE、SET ROLE など
のロール関連の文と、SET SESSION AUTHORIZATION 文をトリガ内で実行できま
す。ロールの有効化や SET SESSION AUTHORIZATION 文の使用によりユーザが獲
得するアクセス権は、トリガが実行されても放棄されません。
CREATE TRIGGER 文を単独で記述してトリガを定義できます。
DB
DB-Access では CREATE SCHEMA 文内に CREATE TRIGGER 文を記述することに
より、トリガをスキーマの一部として定義できます。♦
トリガは現行データベース内の表に対してだけ作成できます。一時表、ビュー、シ
ステムカタログ表に対してはトリガを作成できません。
データ操作文の中で呼び出されるストアドプロシジャ内でトリガは作成できませ
ん。たとえば、次の INSERT 文の中のストアドプロシジャ sp_items 内にトリガは作
成できません。
INSERT INTO items EXECUTE PROCEDURE sp_items
データ操作文の種類については、1-10 ページの「データ操作文」を参照してください。
CREATE TRIGGER 文でストアドプロシジャ変数は使用できません。
E/C
ESQL/C のプログラムに CREATE TRIGGER 文を埋め込んでいる場合は、トリガを
指定するときにホスト変数を使用できません。♦
SQL 文
2-199
CREATE TRIGGER 文
トリガイベント
トリガイベントには、トリガを起動する各種の文が指定されます。トリガイベント
として指定できる文は、INSERT 文、DELETE 文、UPDATE 文です。各トリガに
は、トリガイベントを一つだけ指定することができます。トリガイベントは、< ト
リガ文 > によって発生します。
各表に対して、INSERT 文と DELETE 文によって起動されるトリガを、それぞれ一
つだけ指定できます。また、各表に対して、UPDATE 文によって起動される複数の
トリガを定義できます。同一の表に対する複数のトリガについての詳細は 2-202
ページの「UPDATE 節」を参照してください。
ON DELETE CASCADE を指定している参照制約が設定された表に対して、DELETE
文によるトリガイベントを定義することはできません。
トリガアクションの有無にかかわらず、トリガ文が同じ結果を返すようにしなけれ
ばなりません。トリガアクションの動作についての詳細は 2-204 ページの「アク
ション節」と 2-211 ページの「トリガアクションの並び」を参照してください。
外部のデータベースサーバのトリガ文によってトリガを起動できます。次の例で
は、データベースサーバ dbserver1 によって管理されている表 newtab に対する挿入
トリガは、データベースサーバ dbserver2 の INSERT 文によって起動されます。ト
リガは、dbserver1 の INSERT 文で起動された場合と同じように実行されます。
-- Trigger on stores7@dbserver1:newtab
CREATE TRIGGER ins_tr INSERT ON newtab
REFERENCING new AS post_ins
FOR EACH ROW(EXECUTE PROCEDURE nt_pct (post_ins.mc));
-- Triggering statement from dbserver2
INSERT INTO stores7@dbserver1:newtab
SELECT item_num, order_num, quantity, stock_num, manu_code,
total_price FROM items;
2-200 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
カーソルによるトリガイベント
トリガ文にカーソルを使用すると、文が実行されるたびにすべてのトリガが起動さ
れます。たとえば、トリガ文である INSERT 文に対してカーソルを宣言すると、各
PUT 文が毎回トリガを実行します。同様に、トリガ文である UPDATE 文または
DELETE 文に WHERE CURRENT OF 節が指定されていると、それぞれの更新また
は削除の処理によって毎回トリガが起動されます。ただし、トリガ文にカーソルを
使用していない場合や、複数の行を更新する場合は、異なった動作をします。これ
らの場合は一連のトリガアクションが一度だけ実行されます。トリガアクションの
実行についての詳細は 2-204 ページの「アクション節」を参照してください。
トリガイベントのアクセス権
トリガイベントである INSERT 文、DELETE 文、UPDATE 文を実行するには、トリ
ガの対象となる表に対して挿入、削除、更新などの適切なアクセス権を持っていな
ければなりません。しかし、トリガのアクション節で指定される SQL 文の実行に必
要なアクセス権が一つでも欠けていると、トリガ文の実行は失敗することがありま
す。トリガアクションが実行されると、トリガの定義の中に指定されている SQL 文
がトリガとは無関係に実行されているかのように、データベースサーバが各 SQL 文
に対するユーザのアクセス権を検査します。トリガの実行に必要なアクセス権につ
いては、2-222 ページの「トリガアクションの実行に必要なアクセス権」を参照して
ください。
トリガの影響
トリガを開始する INSERT 文、DELETE 文、UPDATE 文は、実行に多少時間がかか
るように感じられます。これは、これらの文がさらに他の SQL 文を起動していて
も、ユーザ側からは自分が実行した SQL 文以外の動作が発生していることがわか
らないからです。
トリガ文であるデータ操作文の実行時間は、トリガアクションの複雑さと、それが
他のトリガを開始しているかどうかによって異なります。トリガ文であるデータ操
作文の実行経過時間が、カスケードトリガ数の増加につれて増えることは確かで
す。他のトリガを開始するトリガについての詳細は 2-224 ページの「カスケードト
リガ」を参照してください。
SQL 文
2-201
CREATE TRIGGER 文
UPDATE 節
UPDATE 節
CREATE TRIGGER 文へ戻る
2-198 ページ
UPDATE
,
OF
要素
<列>
<列>
目的
制限
トリガを起動する列の名前です。 指定する列はトリガを作成する
表に属していなければなりませ
デフォルトはトリガを作成する
ん。表に複数の更新トリガを定
表のすべての列です。
義する場合は、トリガ文の列の
並びは互いに排他的でなければ
なりません。
構文
識別子、
4-112 ページ
トリガイベントが UPDATE 文である場合は、トリガ列の並びの中のどれかの列が
更新されたときにトリガが実行されます。
トリガ イベントが UPDATE 文であるときにトリガ イベントの定義でオプション
OF< 列 > を指定しないと、トリガはトリガ表の列が更新されたとき実行されます。
トリガである UPDATE 文が同時に複数のトリガ列を更新する場合、トリガは一度
だけ実行されます。
2-202 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
複数の更新トリガの定義
一つの表に対して複数の更新トリガイベントを定義する場合、トリガ列の並びは互
いに排他的でなければなりません。次の例では、表 items に対するトリガのうち
trig3 はエラーになります。これは、trig3 の列の並びに trig1 のトリガ列である列
stock_num が含まれているからです。一つの表に対する複数の更新トリガの中に、
同じ列を重複して指定することはできません。
CREATE TRIGGER trig1 UPDATE OF item_num, stock_num ON items
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW(EXECUTE PROCEDURE proc1());
CREATE TRIGGER trig2 UPDATE OF manu_code ON items
BEFORE(EXECUTE PROCEDURE proc2());
-- Illegal trigger: stock_num occurs in trig1
CREATE TRIGGER trig3 UPDATE OF order_num, stock_num ON items
BEFORE(EXECUTE PROCEDURE proc3());
UPDATE 文による複数トリガの起動
UPDATE 文が異なるトリガを持つ複数の列を更新する場合、トリガの実行順序はト
リガ列の列番号で決定されます。トリガの実行は最小番号のトリガ列から開始さ
れ、最大番号のトリガ列へと順番に移っていきます。次の例では、表 taba に a、b、
c、d の 4 つの列が指定されています。
CREATE TABLE taba (a int, b int, c int, d int)
ここで、次の例に示すように、列 a と列 c に更新トリガ trig1 を、列 b と列 d に更新
トリガ trig2 を定義します。
CREATE TRIGGER trig1 UPDATE OF a, c ON taba
AFTER (UPDATE tabb SET y = y + 1);
CREATE TRIGGER trig2 UPDATE OF b, d ON taba
AFTER (UPDATE tabb SET z = z + 1);
このとき、次の例のようなトリガ文を実行します。
UPDATE taba SET (b, c) = (b + 1, c + 1)
最初に列 a と列 c に対するトリガ trig1 が実行され、次に列 b と列 d に対するトリガ
trig2 が実行されます。この場合は、二つのトリガのうち、最小の列番号は列 a の 1
番、次が列 b の 2 番となります。
SQL 文
2-203
CREATE TRIGGER 文
アクション節
CREATE TRIGGER 文へ戻る
2-198 ページ
アクション節
BEFORE
トリガアク
ションの並び
2-211 ページ
FOR EACH ROW
FOR EACH ROW
トリガアク
ションの並び
2-211 ページ
AFTER
トリガアク
ションの並び
2-211 ページ
トリガアク
ションの並び
2-211 ページ
AFTER
トリガアク
ションの並び
2-211 ページ
AFTER
トリガアク
ションの並び
2-211 ページ
アクション節では、トリガアクションの内容と、それらのアクションが発生する時
期を定義します。トリガ文に関連付けられたアクションが発生する時期を示すキー
ワード BEFORE、FOR EACH ROW、AFTER を使用して、少なくとも一つのトリガ
アクションを定義しなければなりません。一つのトリガの中でこれら三つのオプ
ションすべてを使用してトリガアクションを指定することができますが、BEFORE、
FOR EACH ROW、AFTER の順序で指定しなければなりません。たとえば、FOR
EACH ROW トリガアクションの並びの後に BEFORE トリガアクションの並びを指
定することはできません。最初のトリガアクションの並びが FOR EACH ROW の場
合、その後に指定できるオプションは AFTER トリガアクションの並びだけです。
REFERENCING 節が指定されている場合のアクション節についての詳細は 2-210
ページの「アクション節の参照」を参照してください。
BEFORE アクション
トリガ文の実行前に BEFORE トリガアクションが一度だけ実行されます。この時点
では行が処理されるかどうかはまだわからないため、トリガ文が行を処理しない場
合でも、BEFORE トリガアクションは実行されます。
2-204 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
FOR EACH ROW アクション
トリガ文によって影響を受ける各行に対して、FOR EACH ROW トリガアクション
が一度だけ実行されます。トリガアクションとして指定された SQL 文は、トリガ
文が各行を処理した後に実行されます。
トリガ文が行の挿入、削除、更新を行わない場合は、FOR EACH ROW トリガアク
ションは実行されません。
AFTER アクション
トリガ文の動作が完了した後、AFTER トリガアクションが一度だけ実行されます。
トリガ文が行の処理を行わない場合でも、AFTER トリガアクションは実行されます。
複数トリガの起動
UPDATE 文が複数トリガを起動すると、トリガアクションは一つにマージされま
す。次の例に示すように、まず表 taba に列 a、b、c、d を作成します。
CREATE TABLE taba (a int, b int, c int, d int)
次に、列 a と列 c にトリガ trig1 を、列 b と列 d にトリガ trig2 を定義します。両方
のトリガに BEFORE、FOR EACH ROW、AFTER の 3 つのトリガアクションが指定
されていた場合、トリガアクションは次の順序で実行されます。
1.
列 a と列 c に対するトリガ trig1 の BEFORE トリガアクションの並び
2.
列 b と列 d に対するトリガ trig2 の BEFORE トリガアクションの並び
3.
列 a と列 c に対するトリガ trig1 の FOR EACH ROW トリガアクションの並び
4.
列 b と列 d に対するトリガ trig2 の FOR EACH ROW トリガアクションの並び
5.
列 a と列 c に対するトリガ trig1 の AFTER トリガアクションの並び
6.
列 b と列 d に対するトリガ trig2 の AFTER トリガアクションの並び
データベースサーバは複数のトリガを単一のトリガとして処理し、トリガアクショ
ンはマージされて一つの並びになります。トリガアクションを管理するすべての規
則は、マージされた並びを単一の並びとみなして適用されます。この例の場合、元
の二つのトリガは区別されません。
SQL 文
2-205
CREATE TRIGGER 文
行の順序の独立性の保証
FOR EACH ROW トリガアクションの並びの処理結果が行の処理順序に依存する場
合があります。次のような処理を行うことにより、処理結果と行の順序を切り離す
ことができます。
■
FOR EACH ROW セクションでトリガ表を選択しない。トリガ文がトリガ
表内の複数行に影響を及ぼすと、FOR EACH ROW セクション内の
SELECT 文の結果が、各行が処理されるに従って変化します。このこと
は、カスケードトリガを実行する場合にも当てはまります。2-224 ページ
の「カスケードトリガ」を参照してください。
■
FOR EACH ROW セクションで、トリガ表の現行行から導かれた値で表を
更新しない。トリガアクションが表内の行を複数回更新すると、その行の
最後の結果は、トリガ表から行が処理された順序に依存してしまいます。
■
同じ FOR EACH ROW セクション内のカスケードトリガアクションを含む他
のトリガ文で選択されている FOR EACH ROW セクション内の表を修正し
ない。この FOR EACH ROW セクション内の表を修正した後にその表を参
照する場合、参照時に表の修正が完了していないことがあります。このた
め、行が処理される順序によって結果が異なってしまうことがあります。
上記のような事態を避けるための規則がデータベースサーバによって強制されるこ
とはありません。規則を強制すると、トリガアクションが選択できる表が制限され
るからです。さらに、ほとんどのトリガアクションの結果は行の処理順序に依存し
ません。したがって、トリガアクションの結果が確実に行の処理順序に依存しない
ようにするのは、ユーザ側の責任です。
2-206 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
REFERENCING 節の挿入
CREATE TRIGGER 文へ戻る
2-198 ページ
REFERENCING
節の挿入
REFERENCING
< 関連 >
NEW
AS
要素
< 関連 >
目的
新列の値に割り当てる名前で、
トリガアクション内で参照でき
ます。
制限
CREATE TRIGGER 文内で一意
でなければなりません。
構文
識別子、
4-112 ページ
トリガ表の新列の値は、トリガ
文の実行後の列の値です。
いったん関連名を割り当てると、FOR EACH ROW トリガアクション内にかぎり、
それを使用することができます。2-210 ページの「アクション節の参照」を参照し
てください。
関連名を使用する場合は、列名の前に関連名とピリオド (.) を付加して指定します。
たとえば、新関連名が post であるとき、列 fname の新しい値は post.fname で参照さ
れます。
トリガイベントが INSERT 文のとき、修飾子として旧関連名を使用するとエラーと
なります。これは、行を挿入する前には値が存在しないからです。関連名の使用を
管理する規則についての詳細は 2-214 ページの「トリガアクションでの関連名の使
用」を参照してください。
INSERT REFERENCING 節を使用できるのは、FOR EACH ROW トリガアクション
を定義している場合だけです。
SQL 文
2-207
CREATE TRIGGER 文
次の例は、INSERT REFERENCING 節の使用法を説明したものです。この例では、
table1 に挿入されたすべての行を backup_table1 に挿入します。backup_table1 の col1
と col2 に挿入される値は、table1 に挿入された値とまったく同じ値です。
CREATE TABLE table1 (col1 INT, col2 INT);
CREATE TABLE backup_table1 (col1 INT, col2 INT);
CREATE TRIGGER before_trig
INSERT ON table1
REFERENCING NEW as new
FOR EACH ROW
(
INSERT INTO backup_table1 (col1, col2)
VALUES (new.col1, new.col2)
);
先程の例に示したとおり、INSERT REFERENCING 節の利点は、トリガアクション
のトリガイベントが生成するデータ値を参照できるということです。
REFERENCING 節の削除
REFERENCING
節の削除
CREATE TRIGGER 文へ戻る
2-198 ページ
REFERENCING
< 関連 >
OLD
AS
要素
< 関連 >
目的
制限
旧列に割り当てる名前で、トリ CREATE TRIGGER 文内で一意
ガアクション内で参照できます。 でなければなりません。
構文
識別子、
4-112 ページ
トリガ表の旧列の値は、トリガ
文の実行前の列の値です。
いったん関連名を割り当てると、FOR EACH ROW トリガアクション内にかぎり、
それを使用することができます。2-210 ページの「アクション節の参照」を参照し
てください。
2-208 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
列名の前に関連名とピリオド (.) を付加することにより、関連名を使用して旧列の
値を参照することができます。たとえば、旧関連名が pre であるとき、列 fname の
古い値は pre.fname で参照されます。
トリガイベントが DELETE 文のとき、修飾子として新関連名を使用するとエラーと
なります。これは、行を削除した後には列の値は存在しないからです。関連名の使
用を管理する規則についての詳細は 2-214 ページの「トリガアクションでの関連名
の使用」を参照してください。
DELETE REFERENCING 節を使用できるのは、FOR EACH ROW トリガアクション
を定義している場合だけです。
REFERENCING 節の更新
CREATE TRIGGER 文へ戻る
2-198 ページ
REFERENCING
節の更新
REFERENCING
1
< 関連 >
OLD
AS
1
< 関連 >
NEW
AS
要素
< 関連 >
目的
旧列または新列に割り当てる名
前で、トリガアクション内で参
照できます。
トリガ表の旧列の値は、トリガ
文の実行前の列の値です。トリ
ガ表の新列の値は、文の実行後
の列の値です。
制限
構文
関連名は、旧列値だけ (OLD オ 識別子、
プション ) か新列値だけ (NEW
4-112 ページ
オプション )、または新旧両方の
値に指定できます。指定する関
連名は CREATE TRIGGER 文内
で一意でなければなりません。
SQL 文
2-209
CREATE TRIGGER 文
関連名を割り当てると、FOR EACH ROW トリガアクション内にかぎり、それを使用
することができます。2-210 ページの「アクション節の参照」を参照してください。
列名の前に関連名とピリオド (.) を付加することにより、関連名を使用して旧列や
新列の値を参照することができます。たとえば、新関連名が post であるとき、列
fname の新しい値は post.fname で参照されます。
トリガイベントが UPDATE 文のとき、旧関連名と新関連名の両方を定義して、ト
リガによる更新前や更新後の列の値を参照することができます。関連名の使用を管
理する規則についての詳細は 2-214 ページの「トリガアクションでの関連名の使用」
を参照してください。
UPDATE REFERENCING 節を使用できるのは、FOR EACH ROW トリガアクション
を定義している場合だけです。
アクション節の参照
アクション
節の参照
CREATE TRIGGER 文へ戻る
2-198 ページ
FOR EACH ROW
BEFORE
トリガアク
ションの並び
2-211 ページ
トリガアク
ションの並び
2-211 ページ
AFTER
トリガアク
ションの並び
2-211 ページ
CREATE TRIGGER 文に INSERT REFERENCING 節、DELETE REFERENCING 節、
UPDATE REFERENCING 節が含まれている場合は、アクション節に FOR EACH
ROW トリガアクションの並びを指定しなければなりません。BEFORE トリガアク
ションおよび AFTER トリガアクションの並びを指定することもできます。
BEFORE、FOR EACH ROW、AFTER の各トリガアクションの並びについての詳細
は 2-204 ページの「アクション節」を参照してください。
2-210 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
トリガアクションの並び
トリガアクション
の並び
アクション節へ戻る 2-204 ページ
アクション節の参照へ戻る 2-210 ページ
,
(
WHEN
(
条件
4-5 ページ
)
,
INSERT 文
2-372 ページ
)
DELETE 文
2-258 ページ
UPDATE 文
2-622 ページ
EXECUTE
PROCEDURE 文
2-297 ページ
トリガアクションは、オプションの WHEN 条件とアクション文から構成されます。
トリガアクション内で参照される表、列、ストアドプロシジャのようなデータベー
スオブジェクトは、CREATE TRIGGER 文が実行されるときにはすでに存在してい
なくてはなりません。この規則が適用されるのは、トリガ定義の中で直接参照され
ているデータベースオブジェクトに対してだけです。
WHEN 条件
WHEN 条件によって、トリガアクションの処理をテストの結果に依存させることが
できます。トリガアクション内に WHEN 条件を入れると、そのトリガアクション
が < 真 > と評価された場合にトリガアクションの並びの中のアクションが所定の順
序で実行されます。トリガアクションが < 偽 > または < 未知 > と評価された場合、
トリガアクションの並びの中のアクションは実行されません。トリガアクションが
FOR EACH ROW セクションで指定されている場合は、その検索条件は各行に対し
て評価されます。
SQL 文
2-211
CREATE TRIGGER 文
たとえば、次のトリガのトリガアクションは、WHEN 節の条件が真の場合にだけ
実行されます。
CREATE TRIGGER up_price
UPDATE OF unit_price ON stock
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW WHEN(post.unit_price > pre.unit_price * 2)
(INSERT INTO warn_tab VALUES(pre.stock_num,
pre.order_num, pre.unit_price, post.unit_price,
CURRENT))
WHEN 条件の中で実行されるストアドプロシジャは、データ操作文の中で呼び出さ
れるストアドプロシジャと同じ制限を受けます。データ操作文の中で呼び出される
ストアドプロシジャについての詳細は、2-134 ページの「CREATE PROCEDURE 文」
を参照してください。
アクション文
トリガアクション文として、INSERT 文、DELETE 文、UPDATE 文、EXECUTE
PROCEDURE 文を指定することができます。トリガアクションの並びに複数の文が
含まれている場合、それらの文は記述されている順に実行されます。
矛盾のない結果を得るために
トリガアクションの有無にかかわらずトリガ文が確実に同じ結果を返すようにする
には、BEFORE セクションおよび FOR EACH ROW セクション内のトリガアクショ
ンが、次に示す節で参照されている表を修正しないようにする必要があります。
■
WHERE 節
■
UPDATE 文の SET 節
■
SELECT 節
■
複数行を追加する INSERT 文の EXECUTE PROCEDURE 節
2-212 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
キーワードの使用方法
トリガアクションの並びの中の次のいずれかの節内で識別子としてキーワード
INSERT、DELETE、UPDATE、EXECUTE を使用する場合は、所有者名か表名、ま
たはその両方でそれらのキーワードを修飾しなければなりません。
■
SELECT 文の FROM 節
■
EXECUTE PROCEDURE 文の INTO 節
■
GROUP BY 節
■
UPDATE 文の SET 節
トリガアクションの中で上記の節を使用する場合、キーワードが修飾されていない
と構文エラーになります。
キーワードを列名として使用する場合は、table.update のように表名で修飾しなけれ
ばなりません。表名と列名の両方がキーワードである場合は、owner.insert.update の
ように所有者名で修飾しなければなりません。所有者名、表名、列名がすべてキー
ワードである場合は、’delete’.insert.update のように所有者名を引用符で囲まなけれ
ばなりません。ただし、これらのキーワードが表名や列名の並びの最初の名前であ
る場合は例外となり、修飾はすべて不要になります。たとえば、次の文のキーワー
ド delete は修飾する必要はありません。これは、キーワード delete が INTO 節で列
名として最初に指定されているからです。
CREATE TRIGGER t1 UPDATE OF b ON tab1
FOR EACH ROW (EXECUTE PROCEDURE p2()
INTO delete, d)
以降に、列名や表名を修飾しなければならない例をいくつか示します。
SELECT 文の FROM 節
CREATE TRIGGER t1 INSERT ON tab1
BEFORE (INSERT INTO tab2 SELECT * FROM tab3,
'owner1'.update)
EXECUTE PROCEDURE 文の INTO 節
CREATE TRIGGER t3 UPDATE OF b ON tab1
FOR EACH ROW (EXECUTE PROCEDURE p2() INTO
d, tab1.delete)
SQL 文
2-213
CREATE TRIGGER 文
SELECT 文の GROUP BY 節
CREATE TRIGGER t4 DELETE ON tab1
BEFORE (INSERT INTO tab3 SELECT deptno, SUM(exp)
FROM budget GROUP BY deptno, budget.update)
UPDATE 文の SET 節
CREATE TRIGGER t2 UPDATE OF a ON tab1
BEFORE (UPDATE tab2 SET a = 10, tab2.insert = 5)
トリガアクションでの関連名の使用
トリガアクションで関連名を使用する場合は、次の規則に従ってください。
■
新列と旧列の値に対する関連名は、FOR EACH ROW トリガアクションの
並びの中の文でのみ使用できます。旧関連名と新関連名は、WHEN 条件ま
たはトリガ SQL 文のいずれかのトリガ表の列を修飾するために使用する
ことができます。
■
旧関連名と新関連名は、トリガ文の影響を受けるすべての行を参照するこ
とができます。
■
関連名を使用して、GROUP BY 節、SET 節、COUNT DISTINCT 節の列名を
修飾することはできません。
■
関連名の影響範囲はトリガ定義全体に渡ります。この範囲は静的に決定さ
れます。つまり、範囲はトリガ定義に限定され、カスケードトリガや、ト
リガアクションであるストアドプロシジャ内の表で修飾されている列は含
まれません。
関連名の使用
IFOR EACH ROW トリガアクション内の SQL 文では、その文がトリガアクション
に依存している場合、トリガ表内の列に対するすべての参照を旧関連名か新関連名
で修飾しなければなりません。
2-214 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
つまり、FOR EACH ROW トリガアクションの並びの中の列名がトリガ表の表名で
修飾されていても、関連名で修飾されていない場合は、指定されている SQL 文は
トリガアクションから独立していると解釈されます。関連名で修飾されていない列
名に対するトリガ表の定義は、検索の対象にはなりません。
たとえば、次の DELETE 文はトリガの FOR EACH ROW セクション内のトリガアク
ションであるとします。
DELETE FROM tab1 WHERE col_c = col_c2
この DELETE 文を正しく実行するには、col_c と col_c2 が両方とも表 tab1 の列でな
ければなりません。col_c2 がトリガ表の列に対する関連参照であるならば、旧関連
名または新関連名のいずれかで修飾されなければなりません。col_c2 が表 tab1 の列
でなくかつ、旧関連名または新関連名で修飾されていない場合はエラーとなります。
列が関連名で修飾されず、かつ、指定されている文がトリガアクションから独立し
て有効である場合、列名はデータベース内の現行値を参照します。次の例のトリガ
t1 のトリガアクションでは、相関副問合せの WHERE 節の列 mgr はトリガ表の修飾
のない列です。この場合、列 mgr は表 empsal の現行列の値を参照します。これは、
INSERT 文がトリガアクションから独立して有効であるためです。
CREATE
CREATE
CREATE
CREATE
DATABASE db1;
TABLE empsal (empno INT, salary INT, mgr INT);
TABLE mgr (eno INT, bonus INT);
TABLE biggap (empno INT, salary INT, mgr INT);
CREATE TRIGGER t1 UPDATE OF salary ON empsal
AFTER (INSERT INTO biggap SELECT * FROM empsal WHERE salary <
(SELECT bonus FROM mgr WHERE eno = mgr));
トリガアクションでは、トリガ表の修飾のない列名が現行の列の値を参照します。
ただし、トリガ文がトリガアクションから独立して有効である場合に限られます。
SQL 文
2-215
CREATE TRIGGER 文
修飾のある値と修飾のない値
次の表に、旧関連名で修飾されている列名と新関連名で修飾されている列名を使用
した場合に返される値を示します。
トリガイベント
旧関連名
新関連名
INSERT
値なし ( エラー )
挿入値
UPDATE
元の値
現行値 (N)
元の値
現行値 (U)
元の値
値なし ( エラー )
( 列更新 )
UPDATE
( 列無更新 )
DELETE
この表の各語の説明は、次のとおりです。
用語
意味
元の値
トリガ文を実行する前の値です。
現行値
トリガ文を実行した後の値です。
(N)
トリガアクションでは変更できません。
(U)
トリガ文で更新することができます。先行するトリガアク
ションによって、元の値とは異なる場合があります。
FOR EACH ROW トリガアクションの並び以外の箇所では、旧関連名または新関連
名でトリガ表の列を修飾することはできません。したがって、つねにデータベース
の現行値を参照します。
2-216 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
トリガのリエントラント性
トリガはリエントラントな場合があります。その場合、トリガ アクションがトリガ
表を参照できます。言い換えると、トリガ イベントとトリガ アクションの両方が
同じ表を対象にして動作できます。次に、トリガがリエントラントになれる状況
と、トリガがリエントラントになれない状況をまとめて示します。
■
トリガ イベントが UPDATE 文の場合、トリガ アクションは、トリガ イベ
ントで更新された表を参照する INSERT 文または DELETE 文であってはな
りません。
■
トリガ イベントが UPDATE 文の場合、トリガ アクションは、トリガ イベ
ントで更新された列を参照する UPDATE 文であってはなりません。
しかし、トリガ イベントが UPDATE 文の場合にトリガ アクションも
UPDATE 文であると、トリガ アクションは、トリガ イベントで更新され
なかった列を更新することができます。
たとえば、次の例の UPDATE 文は、tab1 の列 a、列 b を更新するトリガ文
です。
UPDATE tab1 SET (a, b) = (a + 1, b + 1)
ここで次の例のトリガ アクションを考えます。最初の UPDATE 文は有効な
トリガ アクションですが、2 番目は、列 b を再度更新するので無効です。
UPDATE tab1 SET c = c + 1; -- OK
UPDATE tab1 SET b = b + 1; -- ILLEGAL
SQL 文
2-217
CREATE TRIGGER 文
■
トリガ イベントが UPDATE 文の場合、トリガ アクションは、トリガ イベ
ントで更新された列、またはトリガ表の中の別な列を参照する INTO 節を
設定した EXECUTE PROCEDURE 文であることが可能です。
EXECUTE PROCEDURE 文がトリガ アクションの場合、UPDATE トリガの
ために INTO 節を指定できるのは、トリガ アクションが FOR EACH ROW
セクションで発生するときだけです。この場合 INTO 節に含めてよいの
は、トリガ表の中の列名だけです。次の文に、INTO 節の適切な使い方を
示します。
CREATE TRIGGER upd_totpr UPDATE OF quantity ON items
REFERENCING OLD AS pre_upd NEW AS post_upd
FOR EACH ROW(EXECUTE PROCEDURE
calc_totpr(pre_upd.quantity,
post_upd.quantity, pre_upd.total_price)
INTO total_price)
キーワード INTO に続く列は、トリガ イベントで更新されたトリガ表の中
の列であってもよいし、トリガ イベントで更新されなかったトリガ表の中
の列であってもかまいません。
INTO 節が EXECUTE PROCEDURE 文に出てくると、データベース サーバ
は、ストアド プロシジャからの戻り値により、そこに指定されている列を
更新します。データベース サーバは、この更新をストアド プロシジャか
らの復帰後すぐ実行します。
■
トリガ イベントが INSERT 文の場合、トリガ アクションは、トリガ表を参
照する INSERT 文または DELETE 文であってはなりません。
2-218 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
■
トリガ イベントが INSERT 文の場合、トリガ アクションは、トリガ表の中
の列を参照する UPDATE 文であることが可能です。ただしその列は、ト
リガ イベントによって値を提供された列であってはなりません。
トリガ イベントが INSERT 文でトリガ アクションがトリガ表を対象とす
る UPDATE 文の場合、それら二つの文の中の列は互いに排他的でなけれ
ばなりません。たとえば次のように、トリガ イベントが表 tab1 の列 cola、
列 colb の値を挿入する INSERT 文であるとします。
INSERT INTO tab1 (cola, colb) VALUES (1,10)
ここでトリガ アクションを考えます。最初の UPDATE 文は有効ですが、2
番目は、トリガ イベントによって列 colb の値が提供された後に列 colb を
更新するので無効です。
UPDATE tab1 SET colc=100; --OK
UPDATE tab1 SET colb=100; --ILLEGAL
■
トリガ イベントが INSERT 文の場合、トリガ アクションは、トリガ イベン
トで提供された列、またはトリガ イベントで提供されなかった列を参照す
る INTO 節を設定した EXECUTE PROCEDURE 文であることが可能です。
EXECUTE PROCEDURE 文がトリガ アクションの場合、INSERT トリガの
ために INTO 節を指定できるのは、トリガ アクションが FOR EACH ROW
セクションで発生するときだけです。この場合 INTO 節に含めてよいの
は、トリガ表の中の列名だけです。次の文に、INTO 節の適切な使い方を
示します。
CREATE TRIGGER ins_totpr INSERT ON items
REFERENCING NEW as new_ins
FOR EACH ROW (EXECUTE PROCEDURE
calc_totpr(0, new_ins.quantity, 0)
INTO total_price).
キーワード INTO に続く列は、トリガ イベントで提供されたトリガ表の中
の列であってもよいし、トリガ イベントで提供されなかったトリガ表の中
の列であってもかまいません。
INTO 節が EXECUTE PROCEDURE 文に出てくると、データベース サーバ
は、ストアド プロシジャからの戻り値により、そこに指定されている列を
更新します。データベース サーバは、この更新をストアド プロシジャか
らの復帰後すぐ実行します。
SQL 文
2-219
CREATE TRIGGER 文
■
トリガアクションが SELECT 文である場合、SELECT 文はトリガ表を参照す
ることができます。次のような場合は SELECT 文がトリガ文となります。
❑
SELECT 文が WHEN 節の副問合せまたはトリガアクション文の中で指
定されている。
❑
トリガアクションはストアドプロシジャで、SELECT 文がそのストア
ドプロシジャ内で指定されている。
リエントラント性とカスケード トリガ
トリガがリエントラントになれないケースは、すべてのカスケード トリガ ( これは
初期トリガの一部とみなされます ) にも再帰的に当てはまります。この規則は特に、
元のトリガ文が更新したトリガ表の中の列は、カスケード トリガで更新できないこ
とを意味します ( 更新できない列には、元のトリガ文の影響が及んだすべての非ト
リガ列が含まれます )。たとえば、次の UPDATE 文がトリガ文であるとします。
UPDATE tab1 SET (a, b) = (a + 1, b + 1)
次に示すカスケードトリガの例では、トリガ trig2 が実行時エラーとなります。こ
れは、トリガ文である UPDATE 文で更新される列 b を参照するからです。
CREATE TRIGGER trig1 UPDATE OF a ON tab1 -- Valid
AFTER (UPDATE tab2 set e = e + 1);
CREATE TRIGGER trig2 UPDATE of e ON tab2 -- Invalid
AFTER (UPDATE tab1 set b = b + 1);
2-220 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
ここで次の SQL 文を考えます。最後の UPDATE 文が実行されると、列 a が更新さ
れトリガ trig1 が起動されます。トリガ アクションは、INTO を設定した EXECUTE
PROCEDURE 文により列 a を再度更新します。
create table temp (a int, b int, e int);
insert into temp values (10, 20, 30);
create procedure proc(val int)
returning int,int;
return val+10, val+20;
end procedure;
create trigger trig1 update of a on temp
for each row (execute procedure proc(50) into a, e);
create trigger trig2 update of e on temp
for each row (execute procedure proc(100) into a, e);
update temp set (a,b) = (40,50);
このカスケード トリガ例からいくつかの疑問が生じます。最初の疑問は、列 a の更
新がトリガ trig1 を再度起動するかということです。再起動しないというのが答えで
す。このトリガはすでに起動済みなので、2 回目の起動は止められます。トリガ ア
クションが INTO を設定した EXECUTE PROCEDURE 文であるとき、起動されるト
リガは、その時点までに ( 複数のトリガのカスケードで ) 更新された表の中の列とは
互いに排他的な列を対象に定義したトリガだけです。他のトリガは無視されます。
前例から生じるもう一つの疑問は、トリガ trig2 は起動されるかということです。
答はイエスです。トリガ trig2 は、列 e を対象に定義されています。これまで表
temp の列 e は変更されていません。トリガ trig2 は起動されます。
前例から生じる最後の疑問は、トリガ trig2 のトリガ アクションが実行された後トリ
ガ trig1 と trig2 は起動されるかということです。起動されないというのが答えです。
どちらのトリガも起動されません。これまで列 a と e は 1 回更新され、トリガ trig1
と trig2 は 1 回実行されています。データベース サーバは、これらのトリガを除去せ
ずに無視します。
カスケード トリガについての詳細は、2-224 ページの「カスケードトリガ」を参照
してください。
SQL 文
2-221
CREATE TRIGGER 文
ストアドプロシジャでの規則
トリガ アクションとして使用するストアド プロシジャには、2-217 ページの「トリ
ガのリエントラント性」で記述した規則のほかに次の規則が適用されます。
■
ストアドプロシジャは、1 行だけ返されることが予想されるところで、複
数行が返されるカーソル的な手続きを実行することができません。
■
ストアドプロシジャ内で旧関連名または新関連名を使用することはできま
せん。手続きの過程で対応する値が必要な場合は、それらの値をパラメー
タとして渡さなければなりません。ストアドプロシジャはトリガから独立
していなければならず、旧関連名または新関連名はトリガの外では意味を
持ちません。
■
次の SQL 文は、ストアドプロシジャ内では使用できません。ALTER
FRAGMENT 文、ALTER INDEX 文、ALTER OPTICAL 文、ALTER TABLE
文、BEGIN WORK 文、COMMIT WORK 文、CREATE TRIGGER 文、
DELETE 文、DROP INDEX 文、DROP OPTICAL 文、DROP SYNONYM 文、
DROP TABLE 文、DROP TRIGGER 文、DROP VIEW 文、INSERT 文、
RENAME COLUMN 文、RENAME TABLE 文、ROLLBACK WORK 文、
SET CONSTRAINTS 文、UPDATE 文
ストアドプロシジャをトリガアクションとして使用する場合、手続きが実行される
まで、トリガアクションが参照するデータベースオブジェクトは検査されません。
トリガアクションの実行に必要なアクセス権
トリガの所有者のアクセス権に WITH GRANT OPTION アクセス権が含まれている
場合は、トリガの所有者でなくても、トリガ SQL 文に対する WITH GRANT
OPTION アクセス権と同様、所有者のアクセス権を受け継ぐことができます。これ
らのアクセス権は既存のアクセス権に追加されます。
2-222 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
トリガ アクションがストアド プロシジャである場合、ユーザにそのプロシジャに
対するアクセス権 EXECUTE があるかあるいは、トリガの所有者にアクセス権
EXECUTE とアクセス権 WITH GRANT OPTION があることが必要です。ユーザは、
ストアド プロシジャの内部でトリガの所有者のアクセス権を受け継ぐことはありま
せんが、下記のアクセス権を保持します。
1.
トリガ アクションは DBA アクセス権付きプロシジャです。
プロシジャに対するアクセス権 EXECUTE がユーザに与えられると、デー
タベース サーバは自動的に、プロシジャ実行のための DBA アクセス権を
そのユーザに与えます。それらの DBA アクセス権は、プロシジャ実行の
際にだけ利用できます。
2.
トリガ アクションは所有者アクセス権付きプロシジャです。
プロシジャの所有者が、基本的なデータベースオブジェクトに対して必要
なアクセス権の WITH GRANT OPTION 権を持っている場合、アクセス権
EXECUTE が与えられたときにこれらのアクセス権も受け継がれます。こ
の場合、プロシジャが参照するすべての修飾されていないオブジェクトに
プロシジャの所有者の名前が付けられます。
プロシジャの所有者が WITH GRANT OPTION 権を持っていない場合は、プ
ロシジャの実行時に基本的なデータベースオブジェクトに対する既存のア
クセス権のみを所有することになります。
ルーチンのアクセス権についての詳細は、
『Informix Guide to SQL: Tutorial』を参照
してください。
使用者を制限しないトリガアクションの作成
トリガ文を実行するアクセス権を持つすべてのユーザが実行できるトリガを作成す
るには、DBA に要求して、DBA アクセス権付きの手続きを作成してもらい、WITH
GRANT OPTION 権によってアクセス権 EXECUTE を許可してもらいます。次に、
DBA アクセス権付きの手続きをトリガアクションとして使用します。DBA アクセ
ス権付きの手続きには WITH GRANT OPTION 権が伴っているので、どのユーザで
もトリガアクションを実行することができます。手続きを起動すると、データベー
スサーバは DBA に対してアクセス権検査規則を適用します。
SQL 文
2-223
CREATE TRIGGER 文
カスケードトリガ
データベースサーバは、あるトリガのトリガアクションが別のトリガを起動すると
いうように、トリガを段階的に行うことができます。カスケードトリガとして連続
して行うことができるトリガの最大数は、最初のトリガに 60 個のカスケードトリ
ガを加えた 61 です。一連のカスケードトリガの数が最大数を超えると、データ
ベースサーバは次に示すような 748 番のエラーメッセージを返します。
Exceeded limit on maximum number of cascaded triggers.
次の例は、データベース stores7 の 3 つの表、manufact、stock、items に対して強制的
に参照整合を行う一連のカスケードトリガを示しています。表 manufact からメー
カーが削除されると、最初のトリガ del_manu が表 stock からそのメーカーに関する項
目をすべて削除します。表 stock から各項目が削除されると、次のトリガ del_items
が起動され、表 items から同じメーカーに関する項目がすべて削除されます。表
items から各項目が削除されると、最後にストアドプロシジャ log_order がトリガさ
れ、今後満たされることのない表 orders のすべての注文の記録を作成します。
CREATE TRIGGER del_manu
DELETE ON manufact
REFERENCING OLD AS pre_del
FOR EACH ROW(DELETE FROM stock
WHERE manu_code = pre_del.manu_code);
CREATE TRIGGER del_stock
DELETE ON stock
REFERENCING OLD AS pre_del
FOR EACH ROW(DELETE FROM items
WHERE manu_code = pre_del.manu_code);
CREATE TRIGGER del_items
DELETE ON items
REFERENCING OLD AS pre_del
FOR EACH ROW(EXECUTE PROCEDURE log_order(pre_del.order_num));
ログを使用していない場合、表 manufact と stock に対する参照整合制約によってこ
の例のようなトリガの実行が強制的に禁止される場合があります。ただし、ログ付
きのデータベースサーバを使用している場合は、トリガは正常に実行されます。こ
れは、カスケードトリガの動作を含むすべてのトリガアクションが完了するまで、
制約確認が延期されるからです。トリガ実行時の制約の処理についての詳細は、
2-225 ページの「制約確認」を参照してください。
2-224 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
データベースサーバは、UPDATE 文による変更を除き、カスケードトリガアクショ
ンのトリガ表の変更を禁止することにより、カスケードトリガのループを防いでい
ます。UPDATE 文は、トリガである UPDATE 文が更新した列は修正しません。
制約確認
ログを使用している場合、データベースサーバは、トリガアクションの並びに指定
された文が実行されるまで、トリガ文に対する制約確認を延期します。データベー
スサーバは、トリガ文を実行する前に、キーワード ALL DEFERRED を指定した
SET CONSTRAINTS 文を効果的に実行します。トリガアクションが完了すると、
〈制約名〉とキーワード IMMEDIATE を指定した SET CONSTRAINTS を効果的に実
行して、延期されていた制約確認を行います。このような動作が可能であるため、
トリガ文によって引き起こされる制約違反がトリガアクションで解決されるような
トリガを作成することができます。詳細は 2-512 ページの「SET Database Object
Mode 文」を参照してください。
次の例では、表 child に表 parent を参照する制約 r1 が設定されています。また、ト
リガ trig1 を定義して INSERT 文で実行するように記述されています。トリガアク
ションの中で、トリガ trig1 は、表 parent に表 child の現行行 cola の値を持つ行が存
在するかどうかを検査します。存在しなければ、行を新たに挿入します。
CREATE TABLE parent (cola INT PRIMARY KEY);
CREATE TABLE child (cola INT REFERENCES parent CONSTRAINT r1);
CREATE TRIGGER trig1 INSERT ON child
REFERENCING NEW AS new
FOR EACH ROW
WHEN((SELECT COUNT (*) FROM parent
WHERE cola = new.cola) = 0)
-- parent row does not exist
(INSERT INTO parent VALUES (new.cola));
参照制約の子表である表に行を挿入したとき、親表にその行が存在しない場合があ
ります。データベースはこのようなトリガ文のエラーを即座には返してきません。
その代わり、トリガアクションで親表に対応する行を挿入し、制約違反を解決しま
す。先の例で示したように、親表が存在するかどうかはトリガアクション内で検査
することができ、存在する場合は行の挿入は行いません。
SQL 文
2-225
CREATE TRIGGER 文
ログなしのデータベースを使用している場合、データベースサーバはトリガ文に対
する制約確認を延期しません。この場合、トリガ文が制約に違反していると、即座
にエラーが返されます。
データベースサーバは、トリガアクション内での SET 文使用を許していません。
データベースサーバは、トリガ起動時にこの制限を検査します。これは、SET 文が
ストアドプロシジャ内で発生する場合もあるからです。
トリガが相互に無効になることの回避
UPDATE 文で複数のトリガを起動すると、前のトリガによる変更をその後のトリガ
で無効にすることができます。トリガアクションが相互に影響しあうことを避けた
い場合は、UPDATE 文を分けて、それぞれの UPDATE 文が個々の列を更新するよ
うにすることができます。別の方法として、トリガアクションを必要とするすべて
の列に対して、単一の更新トリガを作成することもできます。トリガをこのように
作成すると、更新される列に対するテストをトリガアクション内で行い、希望する
順序でトリガアクションを実行することができます。ただし、この方法はデータ
ベースサーバが個々のトリガのアクションを実行する場合と異なり、次のような欠
点があります。
■
トリガに BEFORE アクションが含まれていると、列が変更されたかどうか
調べることができないため、そのアクションがすべての列に対して適用さ
れます。
■
トリガ文である UPDATE 文によって列に現行値が設定されると、更新され
ているかどうかわからないため、トリガアクションはスキップされます。
列の値が変更されていなくても、トリガアクションを実行した場合、期待
するような結果が得られません。
クライアント/サーバ環境
トリガアクション内の文から外部データベースの表に対して、トリガを発生させる
ことができます。次の例では、データベースサーバ dbserver2 の表注文品目に対す
る更新を起動する、データベースサーバ dbserver1 の更新トリガを示しています。
CREATE TRIGGER upd_nt UPDATE ON newtab
REFERENCING new AS post
FOR EACH ROW(UPDATE stores7@dbserver2:items
SET quantity = post.qty WHERE stock_num = post.stock
AND manu_code = post.mc)
2-226 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
ただし、外部データベースサーバの文によってトリガが開始され、そのトリガアク
ションが外部データベースの表を変更しようとすると、トリガアクションはエラー
となります。たとえば、次のトリガアクションとトリガ文の組合せは、トリガ文が
実行されるとエラーになります。
-- Triggered action from dbserver1 to dbserver3:
CREATE TRIGGER upd_nt UPDATE ON newtab
REFERENCING new AS post
FOR EACH ROW(UPDATE stores7@dbserver3:items
SET quantity = post.qty WHERE stock_num = post.stock
AND manu_code = post.mc);
-- Triggering statement from dbserver2:
UPDATE stores7@dbserver1:newtab
SET qty = qty * 2 WHERE s_num = 5
AND mc = 'ANZ';
ログと復旧
ログ付きかログなしかにかかわらず、データベースに対するトリガを作成すること
ができます。ただし、ログなしデータベースの場合、トリガ文が失敗してもロール
バックを行うことができません。この場合、データベース内のデータ整合性を維持
する責任はユーザにあります。
トリガが失敗し、データベースにトランザクションがある場合、すべてのトリガア
クションとトリガ文がロールバックされます。これはトリガアクションはトリガ文
の延長だからです。ただし、残りのトランザクションはロールバックされません。
トリガ文の行アクションは、FOR EACH ROW セクション内のトリガアクションよ
り前に発生します。ログなしのデータベースに対するトリガアクションが失敗する
とアプリケーション側で、トリガ文によって変更された行をもとの値に復旧しなけ
ればなりません。
SQL 文
2-227
CREATE TRIGGER 文
トリガアクションとしてストアドプロシジャを使用する場合、例外処理のセクショ
ンで手続きを終了すると、そのセクション内のデータを変更するアクションがトリ
ガ文とともにすべてロールバックされます。次の部分例では、例外処理がエラーを
トラップすると、表 logtab に行が挿入されます。
ON EXCEPTION IN (-201)
INSERT INTO logtab values (errno, errstr);
RAISE EXCEPTION -201
END EXCEPTION
ただし、RAISE EXCEPTION 文がエラーを返すと、データベースサーバはこの挿入
をロールバックします。これは、この挿入がトリガアクションの一部だからです。
手続きがトリガアクションの外で実行されている場合は、この挿入はロールバック
されません。
トリガアクションを実施するストアドプロシジャには、BEGIN WORK 文、
COMMIT WORK 文、ROLLBACK WORK 文を記述することはできません。ログ付
きデータベースを使用している場合は、トリガ文の前に明示的にトランザクション
を開始するか、トリガ文自体が暗黙のトランザクションでなければなりません。い
ずれの場合でも、別のトランザクションに関連する文をストアドプロシジャに記述
することはできません。
トリガを使用して、データベースサーバが現在対象としていないアクションを強制
的に参照することができます。ログなしデータベースでは、トリガ文が失敗した場
合、データ整合性の維持はユーザの責任となります。
トリガオブジェクトモード
トリガモードオプションを使用して、有効オブジェクトモードまたは無効オブジェ
クトモードのいずれかでトリガを作成することができます。
トリガモード
オプション
CREATE TRIGGER 文へ戻る
2-198 ページ
DISABLED
ENABLED
2-228 Informix Guide to SQL:Syntax
CREATE TRIGGER 文
トリガは次のモードで作成することができます。
モード
効果
無効
トリガが無効モードで作成されると、データベースサーバはトリ
ガイベント ( 挿入、削除、更新など ) が起きたときに、トリガア
クションを実行しません。つまり、カタログ情報は管理されて
も、トリガを無視します。
有効
トリガが有効モードで作成されると、データベースサーバはトリ
ガイベント ( 挿入、削除、更新など ) が起きたときに、トリガア
クションを実行します。
トリガのモードの指定
CREATE TRIGGER 文でトリガのオブジェクトモードを指定する場合は、次の規則
に従う必要があります。
■
モードが指定されない場合、トリガはデフォルトにより有効になります。
■
SET Database Object Mode 文を使用して、トリガの有効モードと無効モード
を切り替えることができます。トリガを再度有効にすると、データベース
サーバはトリガイベントが発生するたびにトリガアクションを実行しま
す。ただし、トリガを再有効化しても、トリガアクションが遡って実行さ
れることはありません。データベースサーバは、トリガが無効にされてか
ら再度有効にされるまでに挿入、削除、更新が行われた行に対するトリガ
は実行しようとしません。したがって、トリガを無効にする場合は十分注
意してください。トリガを無効にするとデータベースの意味整合性が破壊
される可能性がある場合はトリガを無効にしてはなりません。
■
違反表または診断表に対してトリガを作成することはできません。
参照
関連する文は、
「DROP TRIGGER 文」、
「CREATE PROCEDURE 文」、
「EXECUTE
、「SET Database Object Mode 文」です。
PROCEDURE 文」
タスクについての詳細は、
『Informix Guide to SQL: Tutorial』を参照してください。
SQL 文
2-229
CREATE VIEW 文
CREATE VIEW 文
CREATE VIEW 文を使用して、データベース内の既存の表やビューに基づいて新し
いビューを作成します。
構文
CREATE VIEW
< ビュー >
AS
,
(
<列>
要素
<列>
目的
ビュー列の名前です。
< ビュー >
ビューの名前です。
)
SELECT 文の
サブセット
2-231 ページ
WITH CHECK OPTION
制限
2-232 ページの「ビュー列の命
名規則」を参照してください。
ビュー名はデータベース内で
一意でなければなりません。
構文
識別子、
4-112 ページ
データベース
オブジェクト名
4-25 ページ
説明
表を使用できる箇所であれば、次に示す文を除く任意の SQL 文でビューを使用す
ることができます。
ALTER FRAGMENT 文
ALTER INDEX 文
ALTER TABLE 文
CREATE INDEX 文
CREATE TABLE 文
CREATE TRIGGER 文
2-230 Informix Guide to SQL:Syntax
DROP INDEX 文
DROP TABLE 文
DROP TRIGGER 文
LOCK TABLE 文
RENAME TABLE 文
UNLOCK TABLE 文
CREATE VIEW 文
ビューには < ビュー > が付けられ、表と同じように機能します。ビューは、その
ビューを使用して SELECT 文が実行されるたびに返される行と列で構成されます。
また、唯一の例外を除いて、基本表に対する変更はビューに反映されます。
SELECT 節でアスタリスク (*) を使用してビューを定義すると、そのビューは作成
された時点での基礎表の列だけで構成されます。ALTER TABLE 文を使用して基礎
表に追加された新しい列はビューに反映されません。
ビュー名は一意でなくてはなりません。表、シノニム、一時表などの他のオブジェ
クトと同じ名前を使用することはできません。
ビューを構成する列のデータ型は、基礎表の列と同じデータ型になります。仮想列
のデータ型はその列の値を計算する式によって決まります。
ビューを作成するには、そのビューの基となる列に対して、アクセス権 SELECT を
持っていなければなりません。
SELECT 文は、システムカタログ表 sysviews に格納されます。他の文でビューを後
から参照すると、データベースサーバは、その文を実行する時に SELECT 文の定義
を行います。
DB
DB-Access ではフラグ -ansi を指定しているか、環境変数 DBANSIWARN を設定してい
る場合には、CREATE SCHEMA 文の外でビューを作成しようとすると、警告メッ
セージが生成されます。♦
CREATE VIEW 文で使用できる SELECT 文のサブセット
SELECT 文には 2-450 ページで説明している形式がありますが、CREATE VIEW 文
では、SELECT 文の FROM 節に一時表の名前を含めることはできません。
選択対象の並びの中では、表示ラベルを使用しないでください。選択対象の並びの
中の表示ラベルは、列名と解釈されます。
CREATE VIEW 文の中の SELECT 文に次の節を含めることはできません。
✮
FIRST
■
INTO TEMP
■
ORDER BY
SQL 文
2-231
CREATE VIEW 文
ユニオン ビュー
CREATE VIEW 文の中の SELECT 文に、UNION または UNION ALL 演算子を含め
ることができます。SELECT 文に UNION または UNION ALL 演算子を含むビュー
を、ユニオン ビューといいます。ユニオン ビューについては、次の制限を守って
ください。
■
CREATE VIEW 文がユニオン ビューを定義したら、その CREATE VIEW 文
の中ではキーワード WITH CHECK OPTION を指定できません。
■
スタンドアロンのSELECT文中のUNIONまたはUNION ALL演算に適用され
る制限は、すべてユニオン ビューの SELECT 文中の UNION および
UNION ALL 演算にも適用されます。これらの制限の一覧については、
2-500 ページの「結合 SELECT 文に関する制限事項」を参照してください。
ユニオン ビューを定義している CREATE VIEW 文の例については、2-232 ページの
「ビュー列の命名規則」を参照してください。
ビュー列の命名規則
< 列名 > パラメータで指定する列数は、ビューを定義している SELECT 文から返さ
れてくる列数と同じでなくてはなりません。
列の並びを指定しない場合、ビューは基礎表の列名を受け継ぎます。次の例では、
ビュー herostock は SELECT 文で指定されている列名と同じ名前の列で構成されます。
CREATE VIEW herostock AS
SELECT stock_num, description, unit_price, unit, unit_descr
FROM stock WHERE manu_code = 'HRO'
SELECT 文が式を返す場合、ビューの中の対応する列を仮想列と呼びます。仮想列
には名前を用意しなければなりません。次の例でユーザは、SELECT 文の選択対象
の並びに集計式が含まれているため、パラメータ < 列 > を指定する必要があります。
CREATE VIEW newview (firstcol, secondcol) AS
SELECT sum(cola), colb
FROM oldtab
2-232 Informix Guide to SQL:Syntax
CREATE VIEW 文
表名を示す接頭辞を取り除くと指定した列名が重複する場合は、別の列名を指定し
なければなりません。たとえば、次の例に示すように、SELECT 文の選択対象の並
びに orders、order_num と items、order_num がある場合、CREATE VIEW 文では二
つの列を区別するために別の列名を付けて指定しなくてはなりません。
CREATE VIEW someorders (custnum,ocustnum,newprice) AS
SELECT orders.order_num,items.order_num,
items.total_price*1.5
FROM orders, items
WHERE orders.order_num = items.order_num
AND items.total_price > 100.00
また、SELECT 文に UNION または UNION ALL 演算子が含まれていて、SELECT
文の中の対応する列の名前が同一でないときも、パラメータ < 列 > に列名を指定す
る必要があります。次の例では、最初の SELECT 文の 2 番目の列が 2 番目の
SELECT 文の 2 番目の列とは異なる名前を持っているため、ユーザはパラメータ <
列 > を指定しなければなりません。
CREATE VIEW myview (cola, colb) AS
SELECT colx, coly from firsttab
UNION
SELECT colx, colz from secondtab
ビューに一部の列の名前を指定する必要がある場合は、他のすべての列の名前も指
定します。列の並びにはビュー内のすべての列を指定しなくてはなりません。
SELECT 文の中でのビューの使用
あるビューを基にして新しく別のビューを定義することができます。その場合は、
『Informix Guide to SQL: Tutorial』で説明しているビューの作成に関する制限事項に
従ってください。詳細はそのマニュアルを参照してください。
SQL 文
2-233
CREATE VIEW 文
キーワード WITH CHECK OPTION
キーワード WITH CHECK OPTION を指定すると、ビューを通して基礎表に対して
行ったすべての修正がビューの定義を満たしているかどうかを確認することができ
ます。
次の例では、palo_alto という名前のビューを作成します。これは、”Palo_Alto” にい
る顧客に関して表 customer のすべての情報を使用します。キーワード WITH
CHECK OPTION が指定されているので、データベースサーバは、ビュー palo_alto
を通して表 customer に対して行われた修正をすべて検査します。
CREATE VIEW palo_alto AS
SELECT * FROM customer
WHERE city = 'Palo Alto'
WITH CHECK OPTION
キーワード WITH CHECK OPTION が検査したり防ぐものは何でしょうか?ビュー
の条件を満たしていない行 ( ビューを通して明確にならない行 ) をビューに挿入で
きます。また、ビュー内の行をビューの条件を満たさないように更新することがで
きます。たとえば、ビューがキーワード WITH CHECK OPTION を指定しないで作
成されている場合は、表 customer の列 city が Los Altos である行をビューを通して
挿入したり、ビューを通してある行を更新し、列 city の値を ”Palo_Alto” から ”Los
Altos” に変更したりすることができます。
キーワード WITH CHECK OPTION を追加してビューを作成することにより、この
ような挿入や更新を防ぐことができます。これらのキーワードを指定すると、デー
タベースサーバは、入力された行や更新された行がビューの WHERE 節で指定され
ている条件を満たすことを保証するために検査を行います。行が条件を満たしてい
ない場合はエラーとなり、データベースサーバは処理を中止します。
ただし、ビューがキーワード WITH CHECK OPTION を指定して作成されている場
合でも、ビューの定義外の列に対しては、ビューを通して挿入や更新を行って列を
変更することができます。ビューの定義外の列とは、ビューを定義する SELECT 文
の WHERE 節に指定されていない列です。
2-234 Informix Guide to SQL:Syntax
CREATE VIEW 文
ビューによる更新
ビューが単一の表から構成されているとき、ビューを定義する SELECT 文に次の項
目のいずれも含まれていない場合は、そのビューを通してデータベースの列を更新
することができます。
■
集計関数値である、選択対象の並びの列
■
キーワード UNIQUE または DISTINCT を使用している、選択対象の並びの列
■
GROUP BY 節
■
算術式を使用して得られた列の導出値
■
UNION 演算子
更新可能なビューでは、ビューに値を挿入することによって基礎表の値を更新する
ことができます。
重要 : 検査オプションを指定しているビューを通して遠隔表の行の更新や挿入を
行うことはできません。
参照
関連する文は、
「CREATE TABLE 文」、
「DROP VIEW 文」、
「GRANT 文」
、「SELECT
文」
、「SET SESSION AUTHORIZATION 文」です。
ビューの説明については『Informix Guide to SQL: Tutorial』を参照してください。
SQL 文
2-235
DATABASE 文
DATABASE 文
+
DATABASE 文を使用して、アクセス可能なデータベースを現行データベースとし
て選択します。
構文
< データベース >
DATABASE
EXCLUSIVE
要素
< データ
ベース >
目的
選択するデータベースの名前
です。
制限
データベースが存在していなけ
ればなりません。
構文
データベース名、
4-22 ページ
説明
データベースサーバ上でデータベースを選択する際に使用します。また、データ
ベース名とともにデータベースサーバ名を指定すると、他のデータベースサーバ上
のデータベースを選択することもできます。
現行データベースサーバまたは他のデータベースサーバの名前をデータベース名と
ともに指定する場合、データベースサーバ名には大文字を使用できません。
データベースがすでにオープンしている状態で DATABASE 文を発行すると、新た
にデータベースをオープンする前に現行データベースがクローズされます。現行
データベースをクローズすると、データベースサーバが保有しているカーソルリ
ソースがすべて解放され、その時点までに宣言されたカーソルがすべて無効になり
ます。ユーザ ID が SET SESSION AUTHORIZATION 文によって変更された場合、
元のユーザ名が復元されます。
2-236 Informix Guide to SQL:Syntax
DATABASE 文
現行ユーザ ( または PUBLIC) は、DATABASE 文で指定されたデータベース上で接
続アクセス権を持っていなければなりません。現行ユーザは、データベース内の既
存のロールとして同じユーザ名を持つことはできません。
E/C
ESQL/C での DATABASE 文の使用
ESQL/C では、DATABASE 文を複数文の PREPARE 文処理に含めることはできま
せん。
DATABASE 文の実行後に sqlca 構造体中の警告フラグを調べると、ユーザが選択し
ているデータベースの特徴が判断できます。
トランザクション付きデータベースの場合、sqlwarn 構造体の 2 番目の要素
(sqlca.sqlwarn.sqlwarn 1 フィールド)には、DATABASE 文が実行された後に W が格
納されます。
ANSI
ANSI 標準準拠のデータベースの場合、sqlwarn 構造体の 3 番目の要素
(sqlca.sqlwarn.sqlwarn 2 フィールド)には、DATABASE 文が実行された後に W が格
納されます。♦
IDS
Dynamic Server を使用している場合、sqlwarn 構造体の 4 番目の要素
(sqlca.sqlwarn.sqlwarn 3 フィールド)には、DATABASE 文が実行された後に W が格
納されます。
データベースが副モードで実行されている場合、sqlwarn 構造体の 7 番目の要素
(sqlca.sqlwarn.sqlwarn 6 フィールド)には DATABASE 文が実行された後に W が格
納されます。♦
キーワード EXCLUSIVE
キーワード EXCLUSIVE は排他モードでデータベースをオープンし、現行ユーザ以
外のユーザによるアクセスを禁止します。他のユーザによるアクセスを許可するに
は、CLOSE DATABASE 文を実行してそのデータベースをクローズしてから、キー
ワード EXCLUSIVE を付けずに再びオープンしてください。
SQL 文
2-237
DATABASE 文
次の例では、training というデータベースサーバ上のデータベース stores7 を排他
モードでオープンしています。
DATABASE stores7@training EXCLUSIVE
データベースをオープンしようとするときに、他のユーザがすでにそのデータベー
スをオープンしている場合、排他アクセスは拒否されデータベースをオープンでき
ません。
参照
関連する文は、
「CLOSE DATABASE 文」と「CONNECT 文」です。
異なったデータ モデルを使用してデータベースを設計および実装する方法について
は、
『Informix Guide to Database Design and Implementation』を参照してください。
2-238 Informix Guide to SQL:Syntax
DEALLOCATE DESCRIPTOR 文
+
E/C
DEALLOCATE DESCRIPTOR 文
DEALLOCATE DESCRIPTOR 文は、割当て済みのシステム記述子領域を解放するた
めに使用します。
この文は ESQL/C で使用します。
構文
DEALLOCATE DESCRIPTOR
'< 記述子 > '
< 記述子変数 >
要素
< 記述子 >
目的
システム記述子領域を識別する
引用符付き文字列です。
< 記述子変数 > システム記述子領域を識別する
ホスト変数名です。
制限
システム記述子領域が前もって
割り当てられている必要があり
ます。引用符はシングルでなけ
ればなりません。
システム記述子領域が前もって
割り当てられている必要があり
ます。
構文
引用符付き文字列、
4-156 ページ
変数名は、変数名に
適用される言語特有
のルールに従ってい
る必要があります。
説明
DEALLOCATE DESCRIPTOR 文は、< 記述子 > または < 記述子変数 > によって識別
されるシステム記述子領域に関するメモリをすべて解放します。また、すべての値
記述子が解放され、項目記述子内のデータ値のためのメモリも解放されます。
記述子や記述子変数は、解放されると再利用することができます。領域の開放は、
プログラムの終了時に自動的に行われます。
存在しない名前を記述子や記述子変数に指定して領域を開放しようとすると、エ
ラーが発生します。
SQL 文
2-239
DEALLOCATE DESCRIPTOR 文
DEALLOCATE DESCRIPTOR 文を使用して sqlda 構造体の領域を開放することはで
きません。DEALLOCATE DESCRIPTOR 文で解放できるのは、システム記述子領域
に割り当てられたメモリだけです。
次に INFORMIX-ESQL/C での DEALLOCATE DESCRIPTOR 文の例を示します。そ
れぞれ最初の行は、割り当てられたシステム記述子領域の指定に埋込み変数名を使
用しています。2 行目は、記述子に引用符付き文字列を使用しています。
EXEC SQL deallocate descriptor :descname;
EXEC SQL deallocate descriptor 'desc1';
参照
関連する文は、
「ALLOCATE DESCRIPTOR 文」
、「DECLARE 文」
、「DESCRIBE 文」
、
「EXECUTE 文」、
「FETCH 文」、
「GET DESCRIPTOR 文」、
「OPEN 文」、
「PREPARE
文」
、「PUT 文」、
「SET DESCRIPTOR 文」です。
システム記述子領域の詳細については、
『INFORMIX-ESQL/C Programmer’s Manual』
を参照してください。
2-240 Informix Guide to SQL:Syntax
DECLARE 文
DECLARE 文
E/C
DECLARE 文を使用して、SELECT 文、INSERT 文、または EXECUTE
PROCEDURE 文で指定された行のアクティブ セットを表すカーソルを定義します。
この文は ESQL/C で使用します。
構文
< カーソル
識別子 >
DECLARE
CURSOR
INSERT 文の
サブセット
2-256
ページ
+
FOR
+
+
WITH HOLD
< カーソル変数 >
+
SELECT 文の
サブセット
2-252
ページ
FOR READ ONLY
FOR UPDATE
,
+
OF
<列>
FOR
SCROLL CURSOR
WITH HOLD
SELECT 文
2-450
ページ
< 文識別子 >
+
< 文識別子変数 >
EXECUTE PROCEDURE 文
2-297 ページ
SQL 文
2-241
DECLARE 文
要素
<列>
目的
カーソルによって更新できる
列の名前です。
< カーソル
識別子 >
DECLARE 文によってカーソ
ルに割り当てられた名前で、
他の文のカーソルを参照する
場合に使用します。
< カーソル変数 > < カーソル識別子 > の値を保
持する埋込み変数名です。
文の識別子で、PREPARE 文で
処理された文のテキストを表
しているデータ構造体です。
< 文識別子変数 > < 文識別子 > の値を保持する
埋込み変数名です。
< 文識別子 >
制限
指定された列が存在していなけ
ればなりませんが、SELECT 節
の選択リストにある必要はあり
ません。
同じプログラムで、以前に実行
された DECLARE 文が指定した
のと同じカーソル名を指定する
ことはできません。
変数は文字 (CHARACTER) 型で
なければなりません。
構文
識別子、4-112
ページ
識別子、4-112
ページ
変数名は、変数名に
適用される言語特有
のルールに従ってい
る必要があります。
識別子、4-112
ページ
< 文識別子 > は、すでに同じプ
ログラムの PREPARE 文で指定
されているはずです。
変数は文字 (CHARACTER) 型で 変数名は、変数名に
なければなりません。
適用される言語特有
のルールに従ってい
る必要があります。
説明
DECLARE 文は、SELECT 文、INSERT 文、または EXECUTE PROCEDURE 文に
カーソルを関連付けます。あるいは、PREPARE 文で処理された文の文識別子 (< 文
識別子 > または < 文識別子変数 >) に関連付けます。
DECLARE 文は、カーソルに識別子を割り当て、その使用方法を指定し、カーソル
を保持するための領域を割り当てるようプリプロセッサに指示します。
DECLARE 文は、プログラムの実行中にカーソルを参照するすべての文の前で記述
しなければなりません。
SELECT 文で使用されたときのカーソルは、その SELECT 文が検索した行のアク
ティブ セット内の特定格納場所を表すデータ構造体です。INSERT 操作でデータ
ベースに複数の行を追加したいときは、カーソルを INSERT 文に関連付けます。
INSERT 文で使用されたときのカーソルは、その INSERT 文がデータベースに追加
する行を表しています。EXECUTE PROCEDURE 文で使用されたときのカーソル
は、ストアド プロシジャが検索した列または値を表しています。
2-242 Informix Guide to SQL:Syntax
DECLARE 文
一回の処理で一度に持つことができるオープン済みのカーソルの数と PREPARE 文
で処理された文の数の合計は、システムで利用できる空きメモリ容量によって制限
されます。FREE< 文識別子 > または FREE< 文識別子変数 > を使用して、PREPARE
文で処理された文が保持しているリソースを解放し、FREE< カーソル識別子 > また
は FREE< カーソル変数 > を使用して、カーソルが保持しているリソースを解放し
ます。
プログラムは、一つまたは複数のソースコードファイルで構成できます。カーソル
の有効範囲のデフォルトはプログラム全体であるため、あるソースコードファイル
内で宣言されたカーソルを別のソースコードファイルから参照することができます。
複数ファイルのプログラムで、カーソルの有効範囲をカーソルが宣言されている
ファイルのみに制限したい場合は、すべてのソースコードファイルをコマンド行オ
プション -local を付けてプリプロセッサにかけなければなりません。
カーソル名または文識別子の代わりに使用する変数は、文字 (CHARACTER) データ
型でなければなりません。この変数は、ESQL/C プログラムの中では exec sql char
と定義される必要があります。
一つの文識別子を使用して、複数のカーソルを宣言することができます。たとえ
ば、次の INFORMIX-ESQL/C での例はエラーは返されません。
EXEC
EXEC
EXEC
EXEC
SQL
SQL
SQL
SQL
prepare id1 from 'select * from customer';
declare x cursor for id1;
declare y scroll cursor for id1;
declare z cursor with hold for id1;
コンパイルフラグ -ansi を付けるか、環境変数 DBANSIWARN を設定すると、動的
カーソル名や動的識別子名を使用する文および導出表を使用する文で警告メッセー
ジが生成されます。エラー検査には、実行時に行われるものがあります。その代表
的な検査を次に示します。
■
通常のカーソルをスクロールカーソルとして使用するようなカーソルの不
正使用
■
宣言されていないカーソルの使用
■
不正なカーソル名または文の名前 ( 空の場合 )
同じ名前のカーソルを複数宣言しているかどうかの検査は、カーソルや文が識別子
であるときだけコンパイル時に行われます。次の例では、ホスト変数を使用して
カーソル名を保持しています。
EXEC SQL declare x cursor for
select * from customer;
. . .
stcopy("x", s);
EXEC SQL declare :s cursor for
select * from customer;
SQL 文
2-243
DECLARE 文
カーソルの種類
機能の面から、カーソルを値を返す EXECUTE PROCEDURE 文、INSERT 文、また
は SELECT 文に関連付けることができます。このように関連付けたカーソルをそれ
ぞれプロシジャ カーソル、INSERT カーソル、SELECT カーソルと呼びます。
SELECT カーソルは、行を更新または削除するために使用できるので UPDATE
カーソルと呼ばれます。
カーソルは文識別子にも関連付けることができます。これにより、動的に
PREPARE 文で処理された EXECUTE PROCEDURE 文、INSERT 文、または
SELECT 文をカーソルで使用したり、異なった文を同じカーソルの異なった時点で
使用したりすることができます。この場合、カーソルの種類は、カーソルがオープ
ンされるとき PREPARE 文で処理される文によって決定されます。
ヒント : ストアド プロシジャ用のカーソルは、UPDATE カーソルとして有効化さ
れた SELECT カーソルと同様に動作します。
SELECT カーソルと FUNCTION カーソル
SELECT カーソルまたはプロシジャ カーソルにより、複数行にわたるデータを走査
し、受け取る変数のセットに 1 行ずつデータを送り込むことができます。その手順
を次に記述します。
1.
DECLARE 文
DECLARE 文を使用して、SELECT 文または EXECUTE PROCEDURE 文の
ためのカーソルを定義します。
2.
OPEN 文
OPEN 文でカーソルをオープンします。データベース サーバは、アクティ
ブ セットの最初の行を配置するか構築するまで問合せの処理をします。
3.
FETCH 文
FETCH 文により、連続したデータ行を検索します。
2-244 Informix Guide to SQL:Syntax
DECLARE 文
4.
CLOSE 文
アクティブ セットが不要になったら、CLOSE 文でカーソルをクローズし
ます。
5.
FREE 文
FREE 文でカーソルを解放します。FREE 文は、宣言されたカーソル用に
割り当てられたリソースを解放します。
SELECT カーソルは、オプション FOR READ ONLY により読込み専用と明示的に宣
言することができます。
読込み専用カーソル
オプション FOR READ ONLY を使用して、データの変更に SELECT カーソルは使
えないことを明示します。ANSI 標準準拠でないデータベースでは、通常の
SELECT カーソルは、オプション FOR READ ONLY で作成した SELECT カーソル
と同じです。どちらも、データの更新には使用できません。
ANSI
ANSI 標準準拠データベースの中で SELECT カーソルを読込み専用にしたい場合
は、カーソルを宣言するときにキーワード FOR READ ONLY を使用する必要があ
ります。♦
UPDATE カーソル
オプション FOR UPDATE は、UPDATE カーソルを宣言するために使用します。
UPDATE カーソルを使用すれば、現行行を変更 ( 更新または削除 ) することができ
ます。
ANSI
カーソルがキーワード FOR READ ONLY 付きで宣
ANSI 標準準拠データベースでは、
言されておらず、かつ 2-252 ページの「カーソルと関連付けられる SELECT 文のサ
ブセット」に説明されている UPDATE カーソルに対する制限を順守している限り、
SELECT カーソルを使用してデータの更新や削除を行うことができます。カーソル
を宣言するときにキーワード FOR UPDATE を使用する必要はありません。♦
INSERT カーソル
INSERT カーソルは、(INSERT 文を直接埋め込む場合と比較した ) 処理効率を向上
させます。INSERT カーソルを使用すれば、大量の挿入データをメモリにバッファ
リングし、バッファが限界に達したときディスクに書き込むことができます。この
処理により、プログラムとデータベース サーバの間の通信が減少し、挿入の速度も
向上します。
SQL 文
2-245
DECLARE 文
カーソルの特性
構造の面からは、カーソルを順カーソル ( デフォルト条件 )、スクロール カーソル
( キーワード SCROLL を使用 )、HOLD カーソル ( キーワード WITH HOLD を使用 )
のいずれかとしても宣言できます。ここでは、それらの構造的な特性を説明します。
順カーソル
DECLARE 文の中でキーワード CURSOR だけを使用すると、順カーソルが作成さ
れます。このカーソルを使うと、アクティブセットから次の行だけを順番に取り出
すことができます。また、このカーソルは、アクティブセットを 1 回オープンする
たびに、アクティブセット全体を 1 回だけ読み込むことができます。順カーソルを
使用すると、FETCH 文を実行するたびにデータベースサーバがアクティブセット
の現行行の内容を戻し、順カーソルを次の行に配置します。
次に示す ESQL/C の例は、ANSI 標準準拠でないデータベースでは読込み専用であ
り、ANSI 標準準拠データベースでは読込みおよび更新またはどちらか一方が可能
な例です。
EXEC SQL declare s_cur cursor for
select fname, lname into :st_fname, :st_lname
from orders where customer_num = 114;
スクロールカーソル
キーワード SCROLL によって、スクロール カーソルが作成されます。スクロール
カーソルを使用すると、あらゆるシーケンス内のアクティブセットの行を取り出す
ことができます。スクロール カーソルを実装するために、データベース サーバは
アクティブ セットを保持する一時表を作成します。アクティブ セットを表として
保持することにより、先頭行、最終行、または中間行を抽出したり、カーソルを一
度クローズして再びオープンしなくても、行を繰り返し取り出すことができます。
このような機能については、2-301 ページの「FETCH 文」を参照してください。
データベースサーバは、スクロールカーソルがクローズされるまでこのカーソルの
アクティブセットを一時表に保存します。マルチユーザシステムでは、表の中の行
からアクティブセットの行が取り出され、一時表にコピーされた後に変更されるこ
とがあります。スクロールカーソルをトランザクション内で使用する場合、排他レ
ベルを繰返し読込みに設定するか (INFORMIX-OnLine Dynamic Server でのみ使用可
能 )、またはトランザクションの実行中に表全体を共有モードでロックすることに
より、コピーされた行の変更を禁止することができます (「SET ISOLATION 文」と
「LOCK TABLE 文」を参照してください )。
2-246 Informix Guide to SQL:Syntax
DECLARE 文
次の例はスクロール カーソルを作成しています。
DECLARE sc_cur SCROLL CURSOR FOR
SELECT * FROM orders
HOLD カーソル
キーワード WITH HOLD を使用すると、HOLD カーソルが作成されます。このカー
ソルは、トランザクションが終了した後もオープン状態を持続します。キーワード
WITH HOLD を使用すれば、順カーソルとスクロール カーソルの両方を宣言できま
す。次の例で HOLD カーソルが作成されます。
DECLARE hld_cur CURSOR WITH HOLD FOR
SELECT customer_num, lname, city FROM customer
HOLD カーソルを使用すると、複数のトランザクションにまたがって、割込みを受
けることなく一連の行にアクセスできます。通常すべてのカーソルはトランザク
ションの終了時にクローズしますが、HOLD カーソルはクローズしません。
次の ESQL/C コードの例のように、HOLD カーソルを使用できます。このコードフ
ラグメントでは、HOLD カーソルを主カーソルとして使用してレコードの一つの
セットを走査し、順カーソルを従カーソルとして使用して別の表にあるレコードを
指しています。主カーソルが走査するレコードは、従カーソルが指すレコードの更
新の基礎となります。最初の WHILE ループの各繰返しの終わりにある COMMIT
WORK 文が、HOLD カーソル c_master をオープンしたままにする一方で、順カー
ソル c_detail をクローズしてすべてのロックを解除しています。この方法によって、
データベースサーバがロックや未完了のトランザクションに割り当てるリソースを
最小限にすることができます。また、他のユーザは更新済みの行にただちにアクセ
スできます。
EXEC SQL BEGIN DECLARE SECTION;
int p_custnum,
int save_status;
long p_orddate;
EXEC SQL END DECLARE SECTION;
EXEC SQL prepare st_1 from
'select order_date
from orders where customer_num = ? for update';
EXEC SQL declare c_detail cursor for st_1;
EXEC SQL declare c_master cursor with hold for
select customer_num
from customer where city = 'Pittsburgh';
EXEC SQL open c_master;
if(SQLCODE==0) /* the open worked */
EXEC SQL fetch c_master into :p_custnum; /* discover first customer */
SQL 文
2-247
DECLARE 文
while(SQLCODE==0) /* while no errors and not end of pittsburgh customers */
{
EXEC SQL begin work; /* start transaction for customer p_custnum */
EXEC SQL open c_detail using :p_custnum;
if(SQLCODE==0) /* detail open succeeded */
EXEC SQL fetch c_detail into :p_orddate; /* get first order */
while(SQLCODE==0) /* while no errors and not end of orders */
{
EXEC SQL update orders set order_date = '08/15/98'
where current of c_detail;
if(status==0) /* update was ok */
EXEC SQL fetch c_detail into :p_orddate; /* next order */
}
if(SQLCODE==SQLNOTFOUND) /* correctly updated all found orders */
EXEC SQL commit work; /* make updates permanent, set status */
else /* some failure in an update */
{
save_status = SQLCODE; /* save error for loop control */
EXEC SQL rollback work;
SQLCODE = save_status; /* force loop to end */
}
if(SQLCODE==0) /* all updates, and the commit, worked ok */
EXEC SQL fetch c_master into :p_custnum; /* next customer? */
}
EXEC SQL close c_master;
HOLD カーソルをクローズするには、CLOSE 文によって明示的にクローズする方
法と、CLOSE DATABASE 文または DISCONNECT 文によって暗黙的にクローズす
る方法があります。CLOSE DATABASE 文を実行すると、すべてのカーソルがデー
タベースサーバによってクローズされます。
UPDATE カーソルまたは読込み専用カーソルとしてカーソル
を宣言
カーソルを SELECT 文に関連付ければ、そのカーソルを UPDATE カーソルまたは
読込み専用カーソルとして定義することができます。次のようにキーワードを使い
分けてください。
■
カーソルを UPDATE カーソルとして定義するには、キーワード FOR
UPDATE を使用します。
■
カーソルを読込み専用カーソルとして定義するには、キーワード FOR
READ ONLY を使用します。
オプション FOR UPDATE とオプション FOR READ ONLY は互いに排他的なオプ
ションであるため、同じ DECLARE 文の中に両方指定することはできません。
2-248 Informix Guide to SQL:Syntax
DECLARE 文
UPDATE カーソルの定義
キーワード FOR UPDATE を使用して、データベース サーバに更新が可能であるこ
とを通知し、SELECT カーソルの場合よりも厳重なロックを適用させます。更新可
能な列を指定することもできます。
UPDATE カーソル作成後は、WHERE CURRENT OF 節を指定した UPDATE または
DELETE 文を使用することにより、現在選択されている行を更新または削除できま
す。語句 CURRENT OF は、最後に取り出された行を参照しており、WHERE 節の
中の通常の判定式の代わりをします。
UPDATE カーソルを使用すれば、更新の決定や新しいデータ項目の値の基礎が行の
既存の内容であってよいため UPDATE 文では不可能な更新も行うことができます。
ユーザのプログラムでは、選択されたデータを更新するかどうか決定する前に、そ
のデータの評価や操作が行えます。UPDATE 文では、更新中の表に問合せを行うこ
とはできません。
ANSI
ANSI 標準準拠データベースでは、単純な SELECT カーソルは、キーワード FOR
UPDATE なしで宣言されたものであっても、すべて潜在的に UPDATE カーソルで
す。(2-252 ページの「カーソルと関連付けられる SELECT 文のサブセット」に説明
されている、UPDATE カーソルに関連付けられた SELECT 文に対する制限を参照
してください )。♦
UPDATE カーソルでのロック
UPDATE カーソルを宣言することにより、プログラムで SELECT 文の一部として
取り出した行を更新 ( または削除 ) する可能性があることをデータベース サーバに
通知します。UPDATE カーソルは、プログラムが取り出した行に対して増進可能な
ロックを適用します。他のプログラムは、ロックされた行を読むことはできます
が、増進可能なロックや書込みロックの設定はできません。プログラムが行を変更
する前に、行ロックが排他ロックに昇格します。
キーワード WITH HOLD を指定して UPDATE カーソルを宣言できます。ただしこ
れを実行するのは、長々と続く一連の更新をもっと小さいトランザクションに分割
する場合に限られます。同じトランザクションの中では、特定の行を取り出して更
新する必要があります。
SQL 文
2-249
DECLARE 文
取り出して更新する行が非常に多いと、データベース サーバで管理しているロック
表がオーバフローする可能性があります。これは普通、更新される表全体をロック
して防止します。この防止方法がとれない場合は、HOLD カーソルを使用して更新
し COMMIT WORK 文を頻繁に実行するという方法もありますが、COMMIT WORK
文を実行すると、HOLD カーソルで設定したロックを含むすべてのロックが解除さ
れますので、適用は慎重に行う必要があります。
列の並びでキーワード FOR UPDATE を使用
UPDATE カーソルを宣言する場合、キーワード OF と列の並びを含めることにより
更新の対象を特定の列に限定できます。後続の UPDATE 文で変更できるのは、限
定された名前付き列だけです。それらの列が SELECT 節の選択対象の並びに入って
いる必要はありません。
この列の制限は UPDATE 文のみ適用されます。OF < 列 > 節は、WHERE CURRENT
OF 節を使用する後続の DELETE 文に影響を与えません。(DELETE 文は、すべての
列の内容を削除します )。
列を指定することの主な利点は、プログラム記述に対してとプログラミング エラー
の防止です。( データベース サーバは、他の列を更新することを拒否します )。な
お、SELECT 文が次の判定基準に合致していれば、速度の面でも利点があります。
■
インデックスを使用して SELECT 文を処理できる。
■
指定された列は、SELECT 文を処理するために使用するインデックスの一
部ではない。
更新しようとしている列が SELECT 文を処理するために使用するインデックスの一
部である場合、データベース サーバでは、2 回更新される行が生じないようにする
ため更新される各行のリストを保持する必要があります。キーワード OF を使用し
て更新可能な列を指定した場合、データベース サーバは、更新済みの行のリストを
保持するかどうか判断します。リスト不要と判断されると、リスト保持のための作
業がなくなって性能上の利点が生じます。キーワード OF が使用されない場合、
データベース サーバは更新済みの行のリストを保持しますが、このリストは不要に
なる可能性があります。
2-250 Informix Guide to SQL:Syntax
DECLARE 文
次の例には、現行行を削除するために DELETE 文で UPDATE カーソルを使用する
ESQL/C コードが含まれています。行が削除されると、カーソルは必ず行間にとど
まります。データを削除した後は、FETCH 文を使用してカーソルを次行に進めて
おかないと、DELETE 文または UPDATE 文の中でカーソルを参照できません。
EXEC SQL declare q_curs cursor for
select * from customer where lname matches :last_name
for update;
EXEC SQL open q_curs;
for (;;)
{
EXEC SQL fetch q_curs into :cust_rec;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;
/* Display customer values and prompt for answer */
printf("¥n%s %s", cust_rec.fname, cust_rec.lname);
printf("¥nDelete this customer? ");
scanf("%s", answer);
if (answer[0] == 'y')
EXEC SQL delete from customer where current of q_curs;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;
}
printf("¥n");
EXEC SQL close q_curs;
読込み専用カーソルの定義
キーワード FOR READ ONLY を使用してカーソルを読込み専用カーソルとして定義
します。キーワード FOR READ ONLY の要否は、データベースが ANSI 標準準拠の
データベースであるか ANSI 標準準拠でないデータベースであるかによって決まり
ます。
ANSI 標準準拠でないデータベースでは、DECLARE 文が定義するカーソルは、デ
フォルトによって読込み専用カーソルになります。したがって、カーソルを読込み
専用カーソルにしたい場合でもキーワード FOR READ ONLY を指定する必要はあり
ません。この場合、キーワード FOR READ ONLY を明示的に指定する利点は、プロ
グラム記述が解りやすくなるということです。
ANSI
ANSI 標準準拠データベースでは、DECLARE 文を通じて SELECT 文に関連付けた
カーソルは、デフォルトによって UPDATE カーソルになります。ただしそれは、
その SELECT 文が「カーソルと関連付けられる SELECT 文のサブセット」に示され
ている UPDATE カーソルに対する制限をすべて順守している場合に限られます。
SQL 文
2-251
DECLARE 文
したがってキーワード FOR READ ONLY は、カーソルを UPDATE カーソルでなく
読込み専用カーソルとしたいときにだけ DECLARE 文の中で使用してください。読
込み専用カーソルを宣言することにより、プログラムで SELECT 文の一部として取
り出した行を更新 ( または削除 ) しないようデータベース サーバに通知します。
データベース サーバでは、読込み専用カーソルに対して UPDATE カーソルの場合
よりも厳重でないロックを適用することができます。 ♦
カーソルと関連付けられる SELECT 文のサブセット
すべての SELECT 文を、UPDATE カーソルまたは読込み専用カーソルと関連付け
られるわけではありません。DELARE 文に FOR UPDATE 節または FOR READ
ONLY 節が含まれていれば、DECLARE 文に含まれる SELECT 文についての制限を
守らなければなりません (DECLARE 文の中に直接記述されていても、PREPARE 文
で処理されていても )。
DECLARE 文が FOR UPDATE 節を含む場合、SELECT 文は次の制限事項を守らな
ければなりません。
AD/XP
■
データは一つの表からのみ選択できます。
■
集計関数を含むことはできません。
■
次の節やキーワードは記述できません。DISTINCT、FOR READ ONLY、
FOR UPDATE、GROUP BY、INTO TEMP、ORDER BY、UNION、UNIQUE
■
Dynamic Server with AD and XP Options では、文に INTO EXTERNAL 節と
INTO SCRATCH 節を含めることはできません。♦
DECLARE 文が FOR READ ONLY 節を含む場合、SELECT 文は次の制限事項を守ら
なければなりません。
■
FOR READ ONLY 節は記述できません。
■
FOR UPDATE 節は記述できません。
SELECT 文の構文と使用方法についての詳細は、2-450 ページの「SELECT 文」の
を参照してください。
2-252 Informix Guide to SQL:Syntax
DECLARE 文
ANSI 標準準拠でないデータベースでのカーソル例
ANSI 標準準拠でないデータベースでは、SELECT 文に関連付けたカーソルはデ
フォルトによって読込み専用カーソルになります。次の例では、ANSI 標準準拠で
ないデータベースで読込み専用カーソルが宣言されます。
EXEC SQL declare cust_curs cursor for
select * from customer_notansi;
このカーソルが読込み専用カーソルであることをプログラム コードの中で明らかに
したいときは、次の例に示すように、オプション FOR READ ONLY を指定します。
EXEC SQL declare cust_curs cursor for
select * from customer_notansi
for read only;
このカーソルを UPDATE カーソルとしたい場合は、DECLARE 文にオプション
FOR UPDATE を指定する必要があります。次の例では UPDATE カーソルが宣言さ
れます。
EXEC SQL declare new_curs cursor for
select * from customer_notansi
for update;
表の中の特定の列しか UPDATE カーソルで変更できないようにしたい場合は、そ
れらの列をオプション FOR UPDATE に指定する必要があります。次の例では、
UPDATE カーソルを宣言したうえ、このカーソルが更新できるのは表
customer_notansi の列 fname および列 lname だけにすることを指定しています。
EXEC SQL declare name_curs cursor for
select * from customer_notansi
for update of fname, lname;
ANSI
ANSI 標準準拠のデータベースでのカーソル例
ANSI 標準準拠データベースでは、SELECT 文に関連付けたカーソルはデフォルト
によって UPDATE カーソルになります。次の例では、ANSI 標準準拠データベース
で UPDATE カーソルが宣言されます。
EXEC SQL declare x_curs cursor for
select * from customer_ansi;
SQL 文
2-253
DECLARE 文
このカーソルが UPDATE カーソルであることをプログラム記述の中で明らかにし
たいときは、次の例に示すように、オプション FOR UPDATE を指定します。
EXEC SQL declare x_curs cursor for
select * from customer_ansi
for update;
表の中の特定の列しか UPDATE カーソルで変更できないようにしたい場合は、そ
れらの列をオプション FOR UPDATE に指定する必要があります。次の例では、
UPDATE カーソルを宣言したうえ、このカーソルが更新できるのは表 customer_ansi
の列 fname および列 lname だけにすることを指定しています。
EXEC SQL declare y_curs cursor for
select * from customer_ansi
for update of fname, lname;
カーソルを読込み専用カーソルにしたいときは、DECLARE 文にオプション FOR
READ ONLY を指定することにより、DECLARE 文のデフォルト動作を取り消す必
要があります。次の例では読込み専用カーソルが宣言されます。
EXEC SQL declare z_curs cursor for
select * from customer_ansi
for read only;
カーソルと PREPARE 文で処理された文の関連付け
PREPARE 文を使用すると、実行時の SQL 文の文字列を作成し、この文字列をデー
タベースサーバに渡して実行することができます。PREPARE 文によって動的に処理
された SELECT 文または値を戻す EXECUTE PROCEDURE 文が複数行のデータを
生成すると予想できる場合、この SELECT 文または EXECUTE PROCEDURE 文は
カーソルと関連付けなければなりません。
PREPARE 文の処理結果は文識別子 (< 文識別子 > または < 文識別子変数 >) です。
これは PREPARE 文で処理された文を表すデータ構造体です。カーソルをこの文識
別子と関連付けることによって、処理された文のカーソルを宣言します。
順カーソルは、PREPARE 文で処理されたすべての SELECT 文または EXECUTE
PROCEDURE 文と関連付けることができます。
スクロールカーソルは、PREPARE 文で処理された INSERT 文や、FOR UPDATE 節
を含むように PREPARE 文で処理された SELECT 文と関連付けることはできません。
2-254 Informix Guide to SQL:Syntax
DECLARE 文
カーソルをオープンして使用し、その後クローズした後には、同じ文識別子を使っ
て別の文を PREPARE 文で処理できます。したがって、一つのカーソルを、別のタ
イミングで別の文とともに使用できます。カーソルは、再使用する前に必ず宣言し
直さなければなりません。
次の例は、SELECT 文を PREPARE 文で処理し、この PREPARE 文で処理された文
にカーソルを宣言する ESQL/C コードです。最初に、値を戻す SELECT 文を指定し
た st_1 という文識別子が PREPARE 文で処理され、次に文 st_1 に対してカーソル
c_detail が宣言されています。
EXEC SQL prepare st_1 from
'select order_date
from orders where customer_num = ?';
EXEC SQL declare c_detail cursor for st_1;
PREPARE 文で処理された SELECT 文を使用してデータを変更するには、次の
ESQL/C の例のように、その処理される文に FOR UPDATE 節を追加してください。
EXEC SQL prepare sel_1 from 'select * from customer for update';
EXEC SQL declare sel_curs cursor for sel_1;
トランザクションとともにカーソルを使用する方法
変更部分をロールバックする場合は、トランザクションの内部でその変更部分を操
作しなければなりません。ANSI 標準準拠でないデータベースのトランザクション
は、BEGIN WORK 文が実行されたときにのみ開始します。
ANSI
ANSI 標準準拠のデータベースでは、トランザクションは常に有効です。 ♦
WSERT カーソルと UPDATE カーソルは、必ず次のように使用してください。この
規則に従うことによって、変更が正しくコミットまたはロールバックされます。
■
INSERT カーソルまたは UPDATE カーソルは、トランザクションの内部で
オープンします。
■
PUT 文と FLUSH 文は、一つのトランザクション内に記述します。
■
更新、挿入、削除などのデータ変更は、一つのトランザクション内で行い
ます。
更新のために HOLD カーソルをトランザクションの外でオープンおよびクローズす
ることができます。ただし、所定の変更に関係するすべての行を取り出したら、更
新はすべて一つのトランザクション内で行ってください。トランザクションの外
で、HOLD カーソルと UPDATE カーソルのオープンやクローズを行うことはでき
ません。
SQL 文
2-255
DECLARE 文
次の例では、トランザクション内で UPDATE カーソルを使用しています。
EXEC SQL declare q_curs cursor for
select customer_num, fname, lname from customer
where lname matches :last_name
for update;
EXEC SQL open q_curs;
EXEC SQL begin work;
EXEC SQL fetch q_curs into :cust_rec; /* fetch after begin */
EXEC SQL update customer set lname = 'Smith'
where current of q_curs;
/* no error */
EXEC SQL commit work;
行をトランザクションの内部で更新する場合、カーソルがクローズされるかトラン
ザクションがコミットまたはロールバックされるまで、その行はロックされます。
有効なトランザクションが存在しないときに行を更新する場合、変更された行が
ディスクに書き込まれた時点で、この行ロックは解除されます。
行をトランザクションの外で更新または削除する場合、その操作をロールバックす
ることはできません。
挿入のために宣言されるカーソルは INSERT カーソルです。トランザクションを使
用するデータベースでは、INSERT カーソルが WITH HOLD 付きで宣言されていな
ければ、トランザクションの外で INSERT カーソルはオープンできません。
順カーソルと関連付けた INSERT 文のサブセット
INSERT カーソルを作成するには、制限された形式の INSERT 文に順カーソルを関
連付けます。INSERT 文には、VALUES 節が含まれる必要がありますが、埋込み
SELECT 文を含めることはできません。
次の例には、INSERT カーソルを宣言する ESQL/C コードが含まれています。
EXEC SQL declare ins_cur cursor for
insert into stock values
(:stock_no,:manu_code,:descr,:u_price,:unit,:u_desc);
2-256 Informix Guide to SQL:Syntax
DECLARE 文
INSERT カーソルはデータの行を挿入するだけで、データを取り出すために使用す
ることはできません。INSERT カーソルがオープンされると、行のブロックを保持
するためメモリ内にバッファが作成されます。このバッファは、プログラムが PUT
文を実行するとデータの行を受け取ります。行は、バッファが限界に達したときに
だけディスクに書き込まれます。バッファが限界に達していないときは、CLOSE
文、FLUSH 文、COMMIT WORK 文のうちいずれかを使用すれば、バッファをフ
ラッシュすることができます。このトピックは、
「PUT 文」と「CLOSE 文」で詳し
く説明します。プログラムが終了する前にデータベースにバッファリング済みの行
を挿入するには INSERT カーソルをクローズしなければなりません。カーソルを正
しくクローズしないと、データを失う場合があります。
HOLD カーソルとともに INSERT カーソルを使用
HOLD カーソルを INSERT 文に関連付ければ、トランザクションを使用して、長々
と続く一連の PUT 文をもっと小さい PUT 文セットに分割することができます。
PUT 文がバッファを満杯にしてデータベースへの自動書込みをトリガするのを待つ
代わりに、COMMIT WORK 文を実行して行バッファをフラッシュする方法もあり
ます。HOLD カーソルを使用した場合 COMMIT WORK 文は、挿入された行は確定
しますが、カーソルはオープン状態のまま残して以後も挿入が行えるようにしま
す。これは、大量の行を挿入するとき望ましい方法です。未確定の作業が保留され
ていると、データベース サーバのリソースが消費されるからです。
参照
関連する文は、
「CLOSE 文」、
「DELETE 文」
、「EXECUTE PROCEDURE 文」
、
「FETCH 文」、
「FREE 文」、
「INSERT 文」、
「OPEN 文」、
「PREPARE 文」
、「PUT 文」、
「SELECT 文」
、「UPDATE 文 」です。
カーソルとデータ変更の詳細については、
『Informix Guide to SQL: Tutorial』を参照
してください。
SQL 文
2-257
DELETE 文
DELETE 文
DELETE 文を使用して、表の一つ以上の行、あるいは SPL または INFORMIXESQL/C のコレクション変数に含まれる一つ以上の要素を削除します。
構文
DELETE
FROM
<表>
< ビュー >
< シノニム >
+
IDS
オプティマ
イザ指示表
4-140
ページ
WHERE
E/C
条件
4-5 ページ
CURRENT OF
要素
< カーソル
識別子 >
目的
削除される現行行のカーソル名
です。
< シノニム >
削除される行が一つ以上含まれ
ているシノニムの名前です。
<表>
削除される行が一つ以上含まれ
ている表の名前です。
制限
カーソルは、FOR UPDATE 節を
指定した DECLARE 文で前もっ
て宣言しておく必要があります。
該当するシノニム、およびこのシ
ノニムに指し示されている表が存
在していなければなりません。
該当する表が存在していなけれ
ばなりません。
< ビュー >
削除される行が一つ以上含まれ
ているビューの名前です。
該当するビューが存在していな
ければなりません。
< カーソル
識別子 >
構文
識別子、4-112
ページ
データベース オブ
ジェクト名、4-25
ページ
データベース オブ
ジェクト名、4-25
ページ
データベース オブ
ジェクト名、4-25
ページ
説明
WHERE 節なしで DELETE 文を使用すると、表の中のすべての行が削除されます。
トランザクションを使用するデータベースで、トランザクションの外で DELETE 文
を使用すると、実行される個々の DELETE 文が一つのトランザクションとして扱わ
れます。
2-258 Informix Guide to SQL:Syntax
DELETE 文
データベース サーバは、トランザクション内の DELETE 文の影響を受ける各行を
ロックし、そのトランザクションが行われているかぎりロックを保持します。デー
タベース サーバが使用するロックのタイプは、CREATE TABLE 文または ALTER
TABLE 文で設定する表のロック モードによって次のように変わります。
AD/XP
■
ロック モードが ROW に設定されている場合、データベース サーバは、こ
の削除の影響を受ける行一つにつきロックを一つ取得します。
■
Dynamic Server with AD and XP Options で、ロック モードが PAGE に設定され
ている場合、データベース サーバは、この削除の影響を受けるページ一つ
につきロックを一つ取得します。♦
ロック モードが ROW に設定されているときに、影響を受ける行があまり多くなる
と、オペレーティング システムが持つ同時に使用できるロック数の上限を超える恐
れがあります。同時に使用できるロック数の上限を超えてしまった場合は、
DELETE 文の有効範囲を縮小するか、表のロック モードを変更してください。
ビュー名を指定している場合は、そのビューが更新可能でなければなりません。更
新可能なビューについての詳細は、2-235 ページの「ビューによる更新」を参照し
てください。
DB
ANSI
SQL メニュー内で作業中に WHERE 節を省略すると、DB-Access によって、表から
すべての行を削除してよいかの確認が促されます。DELETE 文をコマンドファイル
内で実行する場合、このプロンプトは表示されません。 ♦
ANSI 標準準拠のデータベースでは、文は常に暗黙のトランザクション内部で実行
されます。したがって、DELETE 文をトランザクションの外で実行することはでき
ません。 ♦
カスケード削除
CREATE TABLE 文または ALTER TABLE 文の REFERENCES 節でオプション ON
DELETE CASCADE を使用すると、一つの表から別の表に対してカスケード削除を
指定できます。たとえば、表 stock には主キーとして列 stock_num が含まれていま
す。表 catalog と表 items にはそれぞれ、列 stock_num がオプション ON DELETE
CASCADE 付きの外部キーとして含まれています。表 stock から削除が行われると、
外部キーによって参照されている表 catalog と表 items からも列が削除されます。
WHERE 節なしでカスケード削除を実行すると、親表の中のすべての行が削除され
続いて影響を受ける子の表が削除されます。
SQL 文
2-259
DELETE 文
WHERE 節
WHERE 節は、一つまたは複数の削除する行を指定するときに使用します。
WHERE 節の条件は、SELECT 文の条件と同じです。次の例では、注文番号が 1034
未満となるすべての行を表 items から削除しています。
DELETE FROM items
WHERE order_num < 1034
DB
表のすべての行を選択する WHERE 節を記述すると、DB-Access は表からすべての
行を削除してよいかを確認せずに、すべての行を削除します。♦
削除と WHERE 節
WHERE 節を使用して表からデータを削除する場合、行を発見できなくてもエラー
は返されません。複数の SQL 文を処理する PREPARE 文の WHERE 節を使用して表
からデータを削除する場合、行が発見されないと SQLSTATE コード 02000 が返さ
れます。
ANSI
ANSI 標準準拠のデータベースで、WHERE 節を使用して表からデータを削除する
場合に、行が発見されないときは GET DIAGNOSTICS 文でこの状態を知ることがで
きます。GET DIAGNOSTICS 文は SQLSTATE 変数の内容を検索し、SQLSTATE
コード 02000 を返します。♦
SQLSTATE コードの詳細、および SQLSTATE コードのリストについては、このマ
ニュアルの「GET DIAGNOSTICS 文」を参照してください。
sqlca の SQLCODE フィールドを使用して、同じ結果を得ることもできます。
WHERE 節を使用して表から行を削除する場合、行が発見されないと、データベー
ス サーバは SQLCODE フィールドの値を 0( 成功 ) に設定します。
ANSI
ANSI 標準準拠データベースで、WHERE 節を使用して表からデータを削除する場合
に、行が発見されないと、データベース サーバは SQLCODE フィールドの値を
100( 該当するレコードなし ) に設定します。♦
2-260 Informix Guide to SQL:Syntax
DELETE 文
E/C
ESQL/C における CURRENT OF 節
ESQL/C で CURRENT OF 節を使用するには、FOR UPDATE 節付きの DECLARE 文
を使用して、あらかじめ < カーソル名 > を宣言しておかなければなりません。
CURRENT OF 節を使用する場合、DELETE 文はカーソルの現行位置にあるアク
ティブ セットの行を削除します。削除が実行されると、現行行は存在しなくなりま
す。FETCH 文によってカーソルの位置を再設定するまで、カーソルを使用して行
の削除または更新を行うことはできません。
ANSI
すべての SELECT カーソルが潜在的に UPDATE
ANSI 標準準拠のデータベースでは、
カーソルです。したがって、CURRENT OF 節を任意の SELECT カーソルとともに
使用できます。♦
参照
関連する文は、
「 INSERT 文」
、「UPDATE 文」、
「DECLARE 文」、
「GET
、「FETCH 文」です。
DIAGNOSTICS 文」
『Informix
DELETE 文、カーソル、SQLCODE コードについての説明については、
Guide to SQL: Tutorial』を参照してください。
DELETE 文の GLS 関連の説明については、『Informix Guide to GLS Functionality』を
参照してください。
SQL 文
2-261
DESCRIBE 文
+
E/C
DESCRIBE 文
DESCRIBE 文を使用して、PREPARE 文で処理された文についての情報をこの文の
実行前に取得します。DESCRIBE 文は、PREPARE 文で処理された文のタイプを返
します。EXECUTE PROCEDURE 文、INSERT 文、SELECT 文、UPDATE 文の場合、
DESCRIBE 文は、該当する問合わせが返してきた値の番号、データ型、サイズのほ
か、列名または式も返します。
この文は、ESQL/C で使用します。
構文
DESCRIBE
< 文識別子 >
USING SQL DESCRIPTOR
< 文識別子変数 >
< 記述子変数 >
INTO
要素
< 記述子 >
目的
システム記述子領域を識別す
る引用符付き文字列です。
< 記述子変数 >
システム記述子領域を識別す
るホスト変数です。
'< 記述子 > '
<sqlda ポインタ >
制限
システム記述子領域が前もって
割り当てられている必要があり
ます。
変数名には、割り当てられたシ
ステム記述子領域の名前が含ま
れている必要があります。
構文
引用符付き文字列、
4-156 ページ
変数名は、変数名に
適用される言語特有
のルールに従ってい
る必要があります。
(1/2)
2-262 Informix Guide to SQL:Syntax
DESCRIBE 文
要素
目的
<sqlda ポインタ > sqlda 構造体へのポインタ
です。
< 文識別子 >
PREPARE 文で処理された
SQL 文が使用する文識別子
です。
< 文識別子変数 > PREPARE 文で処理された
SQL 文が使用する文識別子の
値を含むホスト変数です。
制限
構文
sqlda ポインタは、ドル記号 ($) 『INFORMIX-ESQL/C
やコロンで (:) で開始すること
Programmer’s
はできません。
Manual』の sqlda 構
動的 SQL 文を使用している場合 造体の説明を参照し
てください。
には、sqlda 構造体を使用する
必要があります。
文識別子は事前に PREPARE
文で定義されている必要があり
ます。
文識別子は事前に PREPARE
文で定義されている必要があり
ます。
PREPARE 文、2-403
ページ
変数名は、変数名に
適用される言語特有
のルールに従ってい
変数は文字 (CHARACTER) 型で る必要があります。
なければなりません。
(2/2)
説明
DESCRIBE 文を使用すると、PREPARE 文で処理された文のタイプを実行時に決定
できます。また、PREPARE 文で処理された問合わせが実行されるときに返される
データの数や型も決定できます。これらの情報によって、抽出された値を保持する
ためのメモリを割り当てたり、取り出し後の値を表示したり処理したりするプログ
ラムを記述することができます。
文の型を記述する方法
DESCRIBE 文に対して入力できるのは、PREPARE 文が戻す文識別子です。
DESCRIBE 文を実行すると、データベースサーバは sqlca 構造体のフィールド
SQLCODE の値に、その文の型を示す文の始まりのキーワードを設定します。
PREPARE 文で処理された文に複数の SQL 文が記述されている場合、DESCRIBE 文
は処理された文中の最初の文の型を戻します。
INTO TEMP 節を指定していない SELECT 文を表すためには、SQLCODE にゼロ (0)
が設定されます。通常は、ほとんどこの状態になっています。他のすべての SQL
文では、SQLCODE に正の整数が設定されます。
この数値を定義されている定数名と照合して検査できます。ESQL/C では、定数名
はヘッダファイル sqlstype.h 内で定義されています。
SQL 文
2-263
DESCRIBE 文
DESCRIBE 文は、sqlca 構造体のフィールド SQLCODE を他の文とは異なった方法
で使用し、正しく実行された場合の多くはゼロ (0) 以外の値を戻します。必要なら
ば、標準のエラーチェックルーチンをこれに合わせて修正できます。
WHERE 節があるかどうかの検査
WHERE 節が指定されていない場合、更新や削除の処理は表全体に適用されます。
sqlca.sqlwarn.sqlwarn4 変数を検査すれば、誤って表全体を変更してしまうことを防
げます。
PREPARE 文で処理された文に WHERE 節を指定していない UPDATE 文や DELETE
文が含まれている場合、DESCRIBE 文は sqlca 構造体の sqlca.sqlwarn.sqlwarn4 変数
に W を設定します。
EXECUTE PROCEDURE 文、INSERT 文、SELECT 文、
UPDATE 文の記述
PREPARE 文で処理された文に INTO TEMP 節を指定していない SELECT 文、
EXECUTE PROCEDURE 文、INSERT 文、UPDATE 文が含まれている場合、
DESCRIBE 文はこれらの文のリストに含まれている個々の列や式についての記述も
戻します。これらの記述は、システム記述子領域、または sqlda 構造体を指し示す
ポインタに格納されます。
この記述には、次の情報が含まれています。
■
表で定義されている列のデータ型
■
バイト単位で表した列の長さ
■
列や式の名前
PREPARE 文で処理された文が、INSERT 文または UPDATE 文であった場合、
DESCRIBE 文はその文の動的パラメータ、すなわち、疑問符 (?) で表現されたパラ
メータのみを返します。
システム記述子領域の情報を修正して、この情報を EXECUTE 文、FETCH 文、
OPEN 文、PUT 文など USING SQL DESCRIPTOR をサポートする文中で使用するこ
とができます。記述された値を受け取るアドレスをメモリ内に示す場合、システム
記述子領域の修正が必要です。データ型は、互換性を有する他の型に変更すること
ができます。この変更によって、データが取り出されたときにデータ変換が実行さ
れます。
2-264 Informix Guide to SQL:Syntax
DESCRIBE 文
USING SQL DESCRIPTOR 節
USING SQL DESCRIPTOR 節を使用すると、EXECUTE PROCEDURE 文、INSERT
文、SELECT 文、または UPDATE 文のリストの記述を、ALLOCATE DESCRIPTOR
文を使用して割り当てたシステム記述子領域に格納できます。PREPARE 文によっ
て処理された文が戻す列についての情報は、システム記述子領域から得ることがで
きます。この場合、sqlda 構造体を示す記述子ではなく、キーワード USING SQL
DESCRIPTOR とシステム記述子領域を示す記述子を指定してください。
DESCRIBE 文は、EXECUTE PROCEDURE 文、INSERT 文、SELECT 文、または
UPDATE 文に記述した列の値の個数をシステム記述子領域のフィールド COUNT に
設定します。COUNT の値がシステム記述子領域の項目記述子の個数よりも大きい
場合、システムはエラーを返します。それ以外の場合は、TYPE、LENGTH、
NAME、SCALE、PRECISION、NULLABLE の各情報が設定され、メモリがフィー
ルド DATA に自動的に割り当てられます。
DESCRIBE 文の実行後は、フィールド SCALE には列の小数点以下桁数が、フィー
ルド PRECISION には有効桁数がそれぞれ格納されます。SCALE と PRECISION が
SET DESCRIPTOR 文で設定され、TYPE に 10 進数 (DECIMAL) 型または金額
(MONEY) 型が設定されている場合、フィールド LENGTH は 10 進数値の小数点以
下桁数と有効桁数に合うように変更されます。TYPE に 0 進数 (DECIMAL) 型や金
額 (MONEY) 型が設定されていない場合は、SCALE と PRECISION に対して値は設
定されず、LENGTH は影響を受けません。
次の例は、DESCRIBE 文でシステム記述子領域を使用する方法を示しています。シ
ステム記述子は最初の例では引用符付き文字列、二番目の例では埋込み変数名と
なっています。
main()
{
. . .
EXEC SQL allocate descriptor 'desc1' with max 3;
EXEC SQL prepare curs1 FROM 'select * from tab';
EXEC SQL describe curs1 using sql descriptor 'desc1';
}
EXEC SQL describe curs1 using sql descriptor :desc1var;
SQL 文
2-265
DESCRIBE 文
sqlda ポインタを指定する INTO 節
INTO sqlda_pointer 節を使用すると、sqlda 構造体にメモリを割り当てたり、そのア
ドレスを sqlda ポインタに格納したりすることができます。DESCRIBE 文は、これ
によって割り当てられたメモリに記述情報を記入します。また DESCRIBE 文は、
フィールド sqlda.sqld に EXECUTE PROCEDURE 文、INSERT 文、SELECT 文、
UPDATE 文内に記述された値の数を設定します。sqlda 構造体には、データ記述子
(sqlvar 構造体 ) も一式含まれており、データ記述子の配列は、EXECUTE
PROCEDURE 文、INSERT 文、SELECT 文、UPDATE 文に記述した列の値それぞれ
について一つずつ格納されます。DESCRIBE 文の実行後は、sqlda.sqlvar 構造体に
sqltype、sqllen、sqlname の各フィールド セットを持ちます。
DESCRIBE 文は、一度プログラム内で宣言されると sqlda ポインタのためのメモリ
を割り当てます。ただし、アプリケーションプログラムでは、必ずフィールド
sqlda.sqlvar.sqldata の格納領域を指定してください。
参照
関連する文は、
「ALLOCATE DESCRIPTOR 文」
、「DEALLOCATE DESCRIPTOR
文」
、「DECLARE 文」
、「EXECUTE 文」
、「FETCH 文」
、「GET DESCRIPTOR 文」
、
「OPEN 文」
、「PREPARE 文」、
「PUT 文」、
「SET DESCRIPTOR 文」です。
『Informix Guide to SQL: Tutorial』を
DESCRIBE 文のタスク指向の説明については、
参照してください。
システム記述子と sqlda ポインタを使用する方法については、『INFORMIX-ESQL/C
Programmer’s Manual』を参照してください。
2-266 Informix Guide to SQL:Syntax
DISCONNECT 文
DISCONNECT 文
+
DISCONNECT 文を使用して、アプリケーションとデータベースサーバ間の接続を
終了します。
構文
DISCONNECT
CURRENT
E/C
DEFAULT
ALL
'< 接続 >'
< 接続変数 >
要素
< 接続 >
目的
終了する接続を識別する文字列
です。
< 接続変数 >
< 接続 > を保持するホスト変数
です。
制限
指定する接続名は、CONNECT
文によって割り当てられた < 接
続名 > と一致していなければな
りません。
変数は固定長の文字
(CHARACTER) 型でなければな
りません。指定する接続名は、
CONNECT 文によって割り当て
られた < 接続名 > と一致してい
なければなりません。
構文
引用符付き文字列、
4-156 ページ
変数名は、変数名に
適用される言語特有
のルールに従ってい
る必要があります。
説明
DISCONNECT 文を使用して、データベースサーバへの接続を終了します。このと
きデータベースがオープンしていると、接続を切断する前にデータベースがクロー
ズされます。特定のデータベースにだけ接続した場合でも、データベースサーバへ
のこの接続は DISCONNECT 文により終了されます。
DISCONNECT 文を PREPARE 文で処理することはできません。
SQL 文
2-267
DISCONNECT 文
E/C
ESQL/C では、< 接続 > または < 接続変数 > を使用して特定の接続を終了する場合、
指定された接続が現行の接続でないかまたは休止状態の接続である場合、
DISCONNECT 文はエラーを生成します。
現行の接続を終了しない DISCONNECT 文は、現在の環境のコンテキスト ( 接続コ
ンテキスト ) を変更しません。 ♦
オプション DEFAULT
オプション DEFAULT を使用すると、DISCONNECT 文のデフォルト接続を識別で
きます。デフォルトの接続は次のどちらかの接続です。
■
明示的なデフォルト接続 (CONNECT TO DEFAULT 文で確立された接続 )
■
暗黙的なデフォルト接続 (DATABASE 文、
CREATE DATABASE 文のどちら
かを使用した接続 )
DISCONNECT を使用すると、デフォルト接続を切断できます。詳細は、2-79 ペー
ジの「DEFAULT オプション」と 2-80 ページの「DATABASE 文による暗黙的な接
続」を参照してください。
次の例に示すように、DATABASE 文でデータベースサーバを指定していない場合
は、デフォルトのデータベースサーバに接続されます。
EXEC SQL database 'stores7';
.
.
.
EXEC SQL disconnect default;
次の例のように、DATABASE 文がデータベースサーバを指定している場合は、そ
のデータベースサーバに接続されます。
EXEC SQL database 'stores7@mydbsrvr';
.
.
.
EXEC SQL disconnect default;
2-268 Informix Guide to SQL:Syntax
DISCONNECT 文
どちらの場合も、DISCONNECT のオプション DEFAULT によって、このデフォル
ト接続は切断されます。デフォルトデータベースサーバと暗黙的な接続についての
詳細は、2-79 ページの「DEFAULT オプション」と 2-80 ページの「DATABASE 文
による暗黙的な接続」を参照してください。
キーワード CURRENT
現行の接続を識別する省略形として、DISCONNECT 文にキーワード CURRENT を
使用します。キーワード CURRENT によって現行の接続名が置き換えられます。た
とえば、次に抜粋した DISCONNECT 文は、データベースサーバ mydbsrvr への現行
の接続を切断します。
CONNECT TO 'stores7@mydbsrvr'
.
.
.
DISCONNECT CURRENT
トランザクションが実行状態の場合
トランザクションが実行状態の場合、DISCONNECT 文はエラーを生成します。ト
ランザクションは実行状態のままになり、アプリケーションは明示的にコミットま
たはロールバックしなければなりません。システムクラッシュやプログラムエラー
などのために、アプリケーションが DISCONNECT 文を発行せずに終了した場合、
アクティブトランザクションはロールバックされます。
E/C
スレッド保護環境での切断
スレッド保護 ESQL/C アプリケーションで、DISCONNECT 文を発行する場合、ア
クティブ接続はこの接続が実行状態になっているスレッド内からだけ切断できま
す。したがって、あるスレッドは別のスレッドのアクティブ接続を切断できませ
ん。これを試みると、エラーメッセージが表示されます。
しかし、スレッド内で接続が休止状態になると、実行中のトランザクションがこの
休止状態の接続に関連付けられていないかぎり、他のスレッドがこの接続を切断で
きるようになります ( この接続は、CONNECT 文の WITH CONCURRENT
TRANSACTION によって確立されたものです )。休止状態の接続が WITH
CONCURRENT TRANSACTION 節によって確立された場合は、切断を試みるとエ
ラーメッセージが表示されます。
SQL 文
2-269
DISCONNECT 文
スレッド保護 ESQL/C アプリケーションでの接続についての詳細は、2-505 ページ
ページの「SET CONNECTION 文」を参照してください。
ALL オプションの指定
キーワード ALL を使用して、その時点までにアプリケーションにより確立された
すべての接続を終了します。たとえば、次の DISCONNECT 文は現行の接続と休止
状態の接続の両方を切断します。
DISCONNECT ALL
E/C
ESQL/C では、キーワード ALL は、マルチスレッドアプリケーションにも、シング
ルスレッドアプリケーションと同じ影響を与えます。DISCONNECT ALL 文を実行
すると、すべてのスレッド内のすべての接続が終了します。ただし、使用中の接続
がある場合、またはこの接続に関する実行中のトランザクションがある場合は、
DISCONNECT ALL 文は失敗します。これらの条件のどちらかが真であれば、接続
は切断されません。 ♦
参照
関連する文は、
「CONNECT 文」
、「DATABASE 文」
、「SET CONNECTION 文」です。
マルチスレッドアプリケーションについての詳細は、
『INFORMIX-ESQL/C
Programmer’s Manual』を参照してください。
2-270 Informix Guide to SQL:Syntax
DROP DATABASE 文
+
DROP DATABASE 文
DROP DATABASE 文を使用して、すべてのシステムカタログ、インデックス、
データを含むデータベース全体を削除します。
構文
DROP DATABASE
< データ
ベース名 >
4-22 ページ
説明
DROP DATABASE 文を正しく実行するには、DBA( データベース管理者 ) のアクセ
ス権を得ているか、ユーザ informix でなければなりません。そうでない場合、デー
タベースサーバがエラーメッセージを表示して、そのデータベースの削除は行われ
ません。
また、現行データベースや他のユーザが使用中のデータベースは、削除することが
できません。DROP DATABASE 文を実行する前に、すべてのデータベースユーザ
は CLOSE DATABASE 文を実行しなければなりません。
DROP DATABASE 文は、複数の SQL 文が記述された PREPARE 文では使用できま
せん。
DROP DATABASE の実行中、データベース サーバは、そのデータベース内の表一
つにつき一つのロックを取得し、DROP DATABASE の動作がすべて完了するまで
これを保持します。このような動作が可能になるだけのロックを確保してデータ
ベースを構成するようにしてください。例えば、削除するデータベースに 2500 の
表が含まれる場合に、2500 未満のロックしかサーバに構成されていないと、DROP
DATABASE 文が機能しません。データベース サーバにおけるロック数の設定につ
いての詳細は、『Administrator’s Guide』を参照してください。
SQL 文
2-271
DROP DATABASE 文
次の例では、データベース stores7 を削除しています。
DROP DATABASE stores7
DB
DB-Access では、データベース全体を削除するかどうかの確認を促すプロンプトは
表示されないので、DROP DATABASE 文は注意して使用してください。♦
参照
関連する文は、
「CREATE DATABASE 文」と「CONNECT 文」です。
2-272 Informix Guide to SQL:Syntax
DROP INDEX 文
DROP INDEX 文
+
DROPINDEX 文を使用して、インデックスを削除します。
構文
< インデックス >
DROP INDEX
要素
目的
制限
< インデックス > 削除されるインデックスの名 該当するインデックスが存在し
前です。
ていなければなりません。
構文
データベース オブ
ジェクト名、4-25
ページ
説明
DROP INDEX 文を使用するには、インデックスの使用者であるか、DBA ( データ
ベース管理者 ) のアクセス権を得ていなければなりません。
次の例では、joed が所有するインデックス o_num_ix を削除しています。この例で
データベース stores7 は、現行データベースでなければなりません。
DROP INDEX stores7:joed.o_num_ix
CREATE TABLE を使って作成された一意性制約を削除するために、列に対して
DROP INDEX 文を使用することはできません。CREATE TABLE 文または ALTER
TABLE 文を使って制約として作成されたインデックスを削除する場合は、ALTER
TABLE 文を使用してください。
制約によって共有されているインデックスは、実際には削除されません。その代わ
りシステムカタログ表 sysindexes の内部で、次のフォーマットを使用してインデッ
クスの名前が変更されます。
[ 空白 ]< 表識別子 >_< 制約識別子 >
SQL 文
2-273
DROP INDEX 文
この例で、< 表識別子 > はシステムカタログ表 systables に、< 制約識別子 > はシ
ステムカタログ表 sysconstraints に格納されています。表 sysconstraints の列
idxname( インデックス名 ) は、この変更を反映するために更新されます。たとえ
ば、インデックス名は “121_13” のように変更されます ( 引用符は空白を示すため
に使われます )。
このインデックスが、参照制約によってのみ共有されている、重複値を許さないイ
ンデックスならば、名前の変更後に重複値を許すインデックスに変更されます。
参照
関連する文は、
「ALTER TABLE 文」、
「CREATE INDEX 文」、
「CREATE TABLE 文」
です。
インデックスの性能の特徴については、
『Performance Guide』を参照してください。
2-274 Informix Guide to SQL:Syntax
DROP PROCEDURE 文
DROP PROCEDURE 文
+
DROP PROCEDURE 文を使用して、データベースからストアドプロシジャを削除し
ます。
構文
DROP PROCEDURE
要素
< プロシジャ >
目的
削除するプロシジャの名前
です。
< プロシジャ >
制限
そのプロシジャは、現行データ
ベースにある必要があります。
構文
識別子、4-112 ページ
説明
DROP PROCEDURE 文を使用するには、ストアド プロシジャの所有者であるか、
DBA( データベース管理者 ) のアクセス権を持っていなければなりません。
ストアド プロシジャを削除すると、このプロシジャのテキスト バージョン、およ
び実行可能バージョンも同時に削除されます。
ヒント : 同じプロシジャ内のストアド プロシジャを削除することはできません。
参照
関連する文は、
「CREATE PROCEDURE 文」です。
ストアドプロシジャを使用する方法については、
『Informix Guide to SQL: Tutorial』
を参照してください。
SQL 文
2-275
DROP ROLE 文
DROP ROLE 文
+
IDS
DROP ROLE 文を使用して、以前に作成したロールを削除します。
DROP ROLE 文は、Dynamic Server でのみ使用できます。
構文
< ロール >
DROP ROLE
要素
目的
制限
構文
< ロール >
削除するロール名です。
ロール名は、CREATE ROLE 文
によって作成されている必要が
あります。
識別子、4-112 ページ
説明
DROP ROLE 文は、既存のロールを削除するために使用します。DROP ROLE 文を
使用するには、DBA( データベース管理者 ) または WITH GRANT OPTION でロール
を付与されたユーザでなければなりません。
ロールが削除されると、表レベルのアクセス権やフラグメントレベルのアクセス権
などのこのロールに関するアクセス権は削除され、ユーザはこのロールを付与また
は有効化ができなくなります。ロールのアクセス権を使用しているときにロールが
削除されると、ユーザは自動的にこれらのアクセス権を失います。
ロールは、WITH GRANT OPTION でロールを付与された DBA( データベース管理者 )
またはユーザが DROP ROLE 文を使用してこのロールを削除するまで存在します。
参照
関連する文は、
「CREATE ROLE 文」
、
「GRANT 文」
、
「REVOKE 文」
、
「SET ROLE 文」
です。
ロールを使用する方法については、
『Informix Guide to SQL: Tutorial』を参照してく
ださい。
2-276 Informix Guide to SQL:Syntax
DROP SYNONYM 文
DROP SYNONYM 文
+
DROP SYNONYM 文を使用して、定義済みのシノニムを削除します。
構文
< シノニム >
DROP SYNONYM
要素
< シノニム >
目的
制限
削除されるシノニムの名前です。 該当するシノニム、およびこの
シノニムに示されている表が存
在していなければなりません。
構文
データベース オブ
ジェクト名、4-25
ページ
説明
DROP SYNONYM 文を使用するには、シノニムの所有者であるか、DBA( データ
ベース管理者 ) のアクセス権を得ていなければなりません。
次の例では、cathyg が所有するシノニム nj_cust を削除しています。
DROP SYNONYM cathyg.nj_cust
表が削除されると、その表と同じデータベース内のシノニムと、その表を参照する
シノニムも削除されます。
あるシノニムが外部表を参照していて、その外部表が削除されると DROP
SYNONYM 文を使用して明示的に削除するまでこのシノニムは残ります。削除され
た表の代わりに別の表やシノニムを作成して、新しいデータベースオブジェクトに
削除された表と同じ名前を指定することができます。それ以後、このシノニムは新
しいデータベースオブジェクトを参照します。シノニムの連鎖についての詳細は、
「CREATE SYNONYM 文」を参照してください。
SQL 文
2-277
DROP SYNONYM 文
参照
関連する文は、
「CREATE SYNONYM 文」です。
シノニムについての詳細は、
『Informix Guide to SQL: Tutorial』を参照してください。
2-278 Informix Guide to SQL:Syntax
DROP TABLE 文
DROP TABLE 文
+
DROP TABLE 文を使用して、表を、関連するインデックスやデータとともに削除し
ます。
構文
<表>
DROP TABLE
< シノニム >
CASCADE
RESTRICT
要素
<表>
目的
削除される表の名前です。
制限
該当する表が存在していなけれ
ばなりません。
< シノニム >
削除されるシノニムの名前です。 該当するシノニム、およびこの
シノニムに示されている表が存
在していなければなりません。
構文
データベース オブ
ジェクト名、4-25
ページ
データベース オブ
ジェクト名、4-25
ページ
説明
DROP TABLE 文を使用するには、表の所有者であるか、DBA( データベース管理者 )
のアクセス権を得ていなければなりません。
AD/XP
Dynamic Server with AD and XP Options を使用している場合、依存型 GK インデック
スが含まれている表は削除できません。ただし、依存型インデックスが削除しよう
としている表に全くに依存していない場合はこの限りではありません。♦
DB
DROP TABLE 文を発行すると、DB-Access による、表全体を削除するかどうかの確
認を促すプロンプトは表示されません。 ♦
SQL 文
2-279
DROP TABLE 文
DROP TABLE 文の影響
DROP TABLE 文は注意して使用してください。表を削除すると、その表に格納され
ているデータや、列に設定されているインデックス、設定されている参照制約を含
むすべての制約、割り当てられているローカルなシノニム、その表に対して作成さ
れているトリガ、その表に与えている権限もすべて削除されます。また、その表に
基づくビューおよびその表に関する違反表と診断表も削除されます。
削除する表のシノニムが外部データベースの中に作成されている場合、このシノニ
ムは削除されません。削除する表の外部にあるシノニムも削除したい場合は、
DROP SYNONYM 文を使用して、手動でこれを削除する必要があります。
CASCADE モードの指定
DROP TABLE 文で CASCADE モードを指定すると、表に構築された参照制約、表
に定義されたビュー、表に関連付けられた違反表と診断表などの、関連するデータ
ベースオブジェクトが削除されます。CASCADE モードは、DROP TABLE 文のデ
フォルトのモードです。キーワード CASCADE を使用して、このモードを明示的に
指定することもできます。
RESTRICT モードの指定
キーワード RESTRICT を指定すると、参照制約とビューが定義された表、および関
連付けられた違反表と診断表がある表を削除するかどうかを指定することができま
す。既存の参照制約が < 表名 > を参照している場合、既存のビューが < 表名 > に定
義されている場合、または違反表と診断表が < 表名 > に関連付けられている場合
は、オプション RESTRICT を使用すると、削除操作は失敗しエラー メッセージが
返されます。
2-280 Informix Guide to SQL:Syntax
DROP TABLE 文
削除できない表
次に示すタイプの表は削除することができません。
AD/XP
■
システムカタログ表は削除できません。
■
現行データベース以外の表は削除できません。
■
違反表と診断表は削除できません。このような表を削除するには、まず違
反表と診断表が関連付けられている基本表に対して、STOP VIOLATIONS
TABLE 文を発行しなければなりません。
■
Dynamic Server with AD and XP Options を使用している場合、GK インデック
スの FROM 節に表示されている表を削除することはできません。♦
表削除の例
次の例は、二つの表を削除します。どちらの表も現行データベース内にあり、現行
ユーザが所有しています。どちらの表にも違反表や診断表は関連付けられていませ
ん。また、どちらの表にも参照制約やビューは定義されていません。
DROP TABLE customer;
DROP TABLE stores7@accntg:joed.state;
参照
関連する文は、
「CREATE TABLE 文」と「DROP DATABASE 文」です。
表のデータ整合性についての詳細は、
『Informix Guide to SQL: Tutorial』を参照して
ください。
表の作成方法についての詳細は、
『Informix Guide to Database Design and
Implementation』を参照してください。
SQL 文
2-281
DROP TRIGGER 文
+
IDS
DROP TRIGGER 文
DROP TRIGGER 文を使用して、トリガをデータベースから削除します。
DROP TRIGGER 文は、Dynamic Server でのみ使用できます。
構文
< トリガ >
DROP TRIGGER
要素
< トリガ >
目的
制限
削除されるトリガの名前です。 該当するトリガが存在していな
ければなりません。
構文
識別子、4-112 ページ
説明
トリガを削除するには、そのトリガの所有者であるか、DBA( データベース管理者 )
のアクセス権を得ていなければなりません。
トリガを削除すると、トリガが定義されたテキストファイルと実行ファイルがデー
タベースから削除されます。
ストアドプロシジャがデータ操作文の中で呼び出されている場合、そのプロシジャ
内でトリガを削除することはできません。たとえば、次の INSERT 文では、ストア
ドプロシジャ proc1 内の DROP TRIGGER 文は不正となります。
INSERT INTO orders EXECUTE PROCEDURE proc1(vala, valb)
参照
関連する文は、
「CREATE PROCEDURE 文」と「CREATE TRIGGER 文」です。
2-282 Informix Guide to SQL:Syntax
DROP VIEW 文
DROP VIEW 文
+
DROP VIEW 文を使用して、定義済みのビューをデータベースから削除します。
構文
DROP VIEW
< ビュー >
< シノニム >
CASCADE
RESTRICT
要素
< シノニム >
< ビュー >
目的
制限
削除されるシノニムの名前です。 該当するシノニム、およびこのシ
ノニムに示されているビューが存
在していなければなりません。
削除されるビューの名前です。 該当するビューが存在していなけ
ればなりません。
構文
データベース オブ
ジェクト名、4-25
ページ
データベース オブ
ジェクト名、4-25
ページ
説明
トリガを削除するには、トリガの所有者であるか、DBA( データベース管理者 ) の
アクセス権を得ていなければなりません。
ビューまたはシノニムを削除すると、そのビューに定義されているすべてのビュー
が削除されます。キーワード CASCADE を使用して、このデフォルトの状態を指定
することもできます。
削除対象の既存のビューが < ビュー名 > に定義されている場合、DROP VIEW 文の
中でキーワード RESTRICT を使用すると削除操作は失敗します。
複数のビューが存在する場合、システムカタログ表 sysdepend に問合せを行うこと
で、それらのビューの依存関係を確認することができます。
SQL 文
2-283
DROP VIEW 文
参照
関連する文は、
「DROP VIEW 文」と「DROP TABLE 文」です。
ビューについての詳細は、
『Informix Guide to SQL: Tutorial』を参照してください。
2-284 Informix Guide to SQL:Syntax
EXECUTE 文
E/C
EXECUTE 文
EXECUTE 文を使用して、あらかじめ PREPARE 文で処理された文を実行します。
この文は、ESQL/C で使用します。
構文
EXECUTE
< 文識別子 >
< 文識別子変数 >
INTO 節
2-287 ページ
要素
< 文識別子 >
< 文識別子変数 >
USING 節
2-290 ページ
目的
制限
文識別子はあらかじめ
PREPARE 文で処理された
SQL 文のための文識別子です。 PREPARE 文で定義されている
必要があります。
SQL 文を識別するホスト変数
です。
FREE 文を使用してデータベー
スサーバのリソースを解放した
後は、再度 PREPARE 文で文を
処理するまでは、DECLARE
カーソルまたは EXECUTE 文で
文識別子を使用することはでき
ません。
この変数はあらかじめ
PREPARE 文で定義されている
必要があります。変数は文字
(CHARACTER) 型でなければな
りません。
構文
PREPARE 文、
2-403 ページ
PREPARE 文、
2-403 ページ
説明
EXECUTE 文は、PREPARE 文で処理された SQL 文を実行のためにデータベース
サーバへ渡します。SQL 文に位置指定子疑問符 (?) が含まれている場合は、実行す
る前に指定された値に置き換えられます。一度 PREPARE 文で処理された SQL 文
は、必要に応じて何度でも実行できます。
SQL 文
2-285
EXECUTE 文
PREPARE 文で処理された文はすべて実行可能です。しかし複数の行を戻すストア
ド プロシジャに対して、PREPARE 文で処理された SELECT 文や、PREPARE 文で
処理された EXECUTE PROCEDURE 文を実行できません。PREPARE 文で処理され
た SELECT 文を使用して複数行のデータを戻す場合は、DECLEAR 文、OPEN 文、
および FETCH カーソル文を使用して、データ行を抽出できます。また、PREPARE
文で処理された INTO TEMP 節を指定した SELECT 文に EXECUTE を使用しても、
同じ結果を得ることができます。複数行を戻すプロシジャのために EXECUTE
PROCEDURE 文を PREPARE 文で処理する場合は、SELECT 文のときと同様に、
DECLARE 文、OPEN 文、および FETCH カーソル文を使用する必要があります。
トリガ文である INSERT 文、DELETE 文、または UPSTATE 文を PREPARE 文で処
理した後に、トリガを作成したり削除したりすると、PREPARE 文で処理された文
から実行時エラーが返されます。
次の例は、ESQL/C プログラムでの EXECUTE 文を示しています。
EXEC SQL prepare del_1 from
'delete from customer
where customer_num = 119';
EXEC SQL execute del_1;
文識別子の有効範囲
プログラムは、一つまたは複数のソースコードファイルで構成されます。文識別子
の有効範囲のデフォルトは、プログラム全体です。したがって、一つのファイルで
作成された文識別子を別のファイルから参照することができます。
複数のファイルで構成されたプログラムで、文識別子の有効範囲を実行されている
ファイルに制限したい場合は、すべてのファイルをコマンド行オプション -local を
付けてプリプロセッサにかけてください。
2-286 Informix Guide to SQL:Syntax
EXECUTE 文
sqlca レコードと EXECUTE 文
EXECUTE 文を実行した後で、sqlca は、次の二つの結果を反映できます。
■
sqlca は、EXECUTE 文中のエラーを反映できます。たとえば、PREPARE 文
で処理された文内の UPDATE...WHERE... 文がゼロ行を処理した場合、
データベースサーバは sqlca を 100 に設定します。
■
sqlca は、実行された文の成功や失敗も反映できます。
INTO 節
INTO 節では、PREPARE 文で処理された単一行 SELECT 文や、PREPARE 文で処理
された EXECUTE PROCEDURE 文を実行し、その戻り値を出力変数、出力 SQL 記
述子、または出力 SQLDA ポインタへ格納できます。
INTO 節
EXECUTE 文へ戻る
2-285 ページ
,
INTO
< 出力変数名 >
:
< 標識変数 >
INDICATOR
< 標識変数 >
+
SQL DESCRIPTOR
'< 記述子 > '
< 記述子変数 >
DESCRIPTOR
<sqlda ポインタ >
SQL 文
2-287
EXECUTE 文
要素
< 記述子 >
目的
システム記述子領域を識別する
引用符付き文字列です。
制限
システム記述子領域があらかじ
め割り当てられていなければな
りません。
< 記述子変数 > システム記述子領域を識別する システム記述子領域があらかじ
ホスト変数名です。
め割り当てられていなければな
りません。
関連する < 出力変数 > に NULL 変数は日時 (DATETIME) 型、
< 標識変数 >
が指定されると、リターンコー または時間隔 (INTERVAL) 型
ドを受け取るホスト変数です。 であってはなりません。
< 出力変数 >
PREPARE 文で処理された文の
疑問符 (?) 位置指定子を置き換
えるホスト変数です。
<sqlda ポイン
タ>
PREPARE 文で処理された文の
疑問符 (?) 位置指定子に相当す
る値の、データ型とメモリでの
格納場所を定義する sqlda 構造
体を指します。
構文
引用符付き文字列、
4-156 ページ
引用符付き文字列、
4-156 ページ
変数名は、変数名に
適用される言語特有
のルールに従ってい
る必要があります。
変数は文字 (CHARACTER) 型 変数名は、変数名に
でなければなりません。
適用される言語特有
のルールに従ってい
る必要があります。
ドル記号 ($) やコロンで (:) で
DESCRIBE 文、
始めることはできません。動的 2-262 ページ
SQL 文を使用している場合に
は sql 構造体を使用しなくては
なりません。
INTO 節を使用することによって、複雑で長い構文の代わりに簡潔で効率的な構文
ができます。さらに、表示可能な変数に値を指定することで、簡単にそして機能的
にデータ値の抽出と表示が行えるようになります。INTO 節を使用すると、たとえ
ば表から値を抽出する場合、PREPARE 文、DECLARE 文、OPEN 文、FETCH 文と
いう一連の文を使用する必要がなくなります。
INTO 節での制限
複数行のデータを戻す PREPARE 文で処理された SELECT 文を実行すると、エラー
メッセージが表示されます。また、ある文を PREPARE 文で処理して宣言した後こ
の文を実行しようとすると、やはりエラーメッセージが返されます。
表の列から NULL を選択して、この値を出力変数に与えることはできません。表の
列に NULL が含まれていることが前もってわかっている場合は、このデータを選択
した後にこの列に関連付けられている標識変数を検査して、値が NULL でないかを
確認してください。
2-288 Informix Guide to SQL:Syntax
EXECUTE 文
次に、INTO 節を EXECUTE 文とともに使用する方法を説明します。
1.
EXECUTE 文が使用する出力変数を宣言します。
2.
PREPARE 文を使用して、SELECT 文または EXECUTE PROCEDURE 文を
処理します。
3.
INTO 節を指定した EXECUTE 文を使用して、SELECT 文または
EXECUTE PROCEDURE 文を実行します。
次の例は、ESQL/C で、EXECUTE 文とともに INTO 節を使用する方法を示してい
ます。
EXEC SQL prepare sel1 from 'select fname, lname from customer
where customer_num =123';
EXEC SQL execute sel1 into :fname, :lname using :cust_num;
次の例は、INTO 節を使用して複数のデータ行を戻す方法を示しています。
EXEC SQL BEGIN DECLARE SECTION;
int customer_num =100;
char fname[25];
EXEC SQL END DECLARE SECTION;
EXEC SQL prepare sel1 from 'select fname from customer
where customer_num=?';
for ( ;customer_num < 200; customer_num++)
{
EXEC SQL execute sel1 into :fname using customer_num;
printf("Customer number is %d¥n", customer_num);
printf("Customer first name is %s¥n¥n", fname);
}
SQL 文
2-289
EXECUTE 文
USING 節
USING 節は、PREPARE 文で処理された文中の疑問符 (?) 位置指定子に置き換わる
値を指定します。この指定を EXECUTE 文の中で行うことを、PREPARE 文で処理
された文のパラメータ化と呼ぶことがあります。
USING 節
EXECUTE 文へ戻る
2-285 ページ
,
USING
< パラメータ変数 >
:
< 標識変数 >
INDICATOR
< 標識変数 >
+
SQL DESCRIPTOR
'< 記述子 > '
< 記述子変数 >
DESCRIPTOR
要素
< 記述子 >
目的
システム記述子領域を識別する引
用符付き文字列です。
< 記述子変数 > システム記述子領域を識別するホ
スト変数名です。
<sqlda ポインタ >
制限
システム記述子領域が前もって
割り当てられている必要があり
ます。必ず単一引用符で囲んで
ください。
システム記述子領域が前もって
割り当てられている必要があり
ます。
構文
識別子、
4-156 ページ
変数名は、変数名
に適用される言語
特有のルールに
従っている必要が
あります。
(1/2)
2-290 Informix Guide to SQL:Syntax
EXECUTE 文
要素
< 標識変数 >
< パラメータ
変数 >
<sqlda ポイン
タ>
目的
制限
対応する < パラメータ変数 > に
変数は日時 (DATETIME) 型、ま
たは時間隔 (INTERVAL) 型で
NULL が指定されるとリターン
コードを受け取るホスト変数です。 あってはなりません。
切捨てが起こると、切捨て情報を
受け取ります。
PREPARE 文で処理された文内の
疑問符 (?) 位置指定子を置き換え
るホスト変数です。
PREPARE 文で処理された文内の
疑問符 (?) 位置指定子に相当する
値の、データ型とメモリでの格納
場所を定義する sqlda 構造体を指
します。
構文
変数名は、変数名
に適用される言語
特有のルールに
従っている必要が
あります。
変数は文字 (CHARACTER) 型で 変数名は、変数名
なければなりません。
に適用される言語
特有のルールに
従っている必要が
あります。
<sqlda ポインタ > は、ドル記号 DESCRIBE 文、
($) やコロンで (:) で始めること 2-262 ページ
はできません。動的 SQL 文を
使用している場合には、sqlda
構造体を使用しなくてはなりま
せん。
(2/2)
次の項目のどれかを指定して、文中の疑問符位置指定子を文の実行の前に置き換え
ることができます。
■
ホスト変数名(コンパイル時に疑問符 (?) の個数とデータ型がわかっている
場合)
■
システムを識別するシステム記述子
■
sqlda 構造体を指すポインタである記述子
ホスト変数やプログラム変数によってパラメータを与える方法
それぞれの位置指定子ごとに、一つのパラメータ変数を指定しなければなりませ
ん。各変数のデータ型には、PREPARE 文で処理された文が要求する値との互換性
が必要です。
次の例では、ESQL/C での PREPARE 文で処理された UPDATE 文を実行しています。
stcopy ("update orders set order_date = ? where po_num = ?", stm1);
EXEC SQL prepare statement_1 from :stm1;
EXEC SQL execute statement_1 using :order_date :po_num;
SQL 文
2-291
EXECUTE 文
システム記述子によってパラメータを与える方法
一つまたは複数の値のデータ型やメモリ位置を記述するシステム記述子領域を作成
してから、その記述子を EXECUTE 文の USING SQL DESCRIPTOR 節の中で指定で
きます。
EXECUTE 文が実行されるたびに、システム記述子領域に記述された値が
PREPARE 文で処理された文の疑問符 (?) 位置指定子と置き換えられます。
フィールド COUNT は、PREPARE 文で処理された文の動的パラメータの数に対応
します。COUNT の値は、ALLOCATE DESCRIPTOR 文でシステム記述子が割り当
てられたときに指定した、項目記述子の数以下でなければなりません。
次の例は、ESQL/C でシステム記述子を使用して PREPARE 文で処理された文を実
行する方法を示しています。
EXEC SQL execute prep_stmt using sql descriptor 'desc1';
sqlda 構造体によってパラメータを与える方法
EXECUTE 文の USING DESCRIPTOR 節の中で、SQLDA ポインタを指定できます。
EXECUTE 文を実行するたびに、sqlda 構造体が記述する値は、PREPARE 文の中の
疑問符 (?) 位置指定子を置き換えるために使用されます。
次の例は、sqlda 構造体を使用して、ESQL/C 内の PREPARE 文で処理された文を実
行する方法を示しています。
EXEC SQL execute prep_stmt using descriptor pointer2
2-292 Informix Guide to SQL:Syntax
EXECUTE 文
EXECUTE 文実行時のエラー状態
PREPARE 文で処理された文が行へのアクセスに失敗すると、データベースサーバ
は (0) を戻します。複数の SQL 文を処理する PREPARE 文では、次のリストのよう
な文が行へのアクセスに失敗すると、データベースサーバは SQLNOTFOUND(100)
を戻します。
ANSI
■
< 表 > を指定した INTO 節を含む INSERT 文の、WHERE 節を含む SELECT 文
■
INTO TEMP 節と WHERE 節を含む SELECT 文
■
WHERE 節を含む DELETE 文
■
WHERE 節を含む UPDATE 文
ANSI 標準準拠のデータベースでは、前述のリストにあるような文のいずれかを
PREPARE 文で処理し、実行した場合、行が戻されないと、データベースサーバは
SQLNOTFOUND (100) を戻します。♦
参照
関連する文は、
「ALLOCATE DESCRIPTOR 文」
、「DEALLOCATE DESCRIPTOR
文」
、「DECLARE 文」
、「EXECUTE IMMEDIATE 文」、
「FETCH 文」、
「PREPARE
文」
、「PUT 文」、および「SET DESCRIPTOR 文」です。
『Informix Guide to SQL: Tutorial』を参
EXECUTE 文のタスク指向の説明については、
照してください。
『INFORMIX-ESQL/C Programmer’s
EXECUTE 文に関する概念についての詳細は、
Manual』を参照してください。
SQL 文
2-293
EXECUTE IMMEDIATE 文
+
E/C
EXECUTE IMMEDIATE 文
EXECUTE IMMEDIATE 文は、PREPARE、EXECUTE、FREE の 3 つの SQL 文の機
能を一つの処理として実現します。
この文は、ESQL/C で使用します。
構文
EXECUTE IMMEDIATE
引用符付き
文字列
4-156 ページ
< 文変数 >
要素
< 文変数 >
目的
一つまたは複数の SQL 文に
よって構成される文字列の値を
持つホスト変数です。
制限
ホスト変数はあらかじめプログ
ラム内で定義されてなければな
りません。
構文
変数名は、変数名に
適用される言語特有
のルールに従ってい
変数は文字 (CHARACTER) 型で る必要があります。
なければなりません。
その他の制限については 2-295
ページの「EXECUTE
IMMEDIATE 文とともに実行で
きない文」と 2-296 ページの
「EXECUTE IMMEDIATE 文とと
もに実行できる文での制限」を
参照してください。
説明
EXECUTE IMMEDIATE 文を使用すると、プログラムの実行中に構築される一つの
単純な SQL 文を動的に実行することが容易になります。たとえば、データベース
の名前をプログラムで入力して、DATABASE 文をプログラム変数として構築した
後、EXECUTE IMMEDIATE 文を使用してこの文を実行すると、データベースを
オープンすることもできます。
2-294 Informix Guide to SQL:Syntax
EXECUTE IMMEDIATE 文
引用符付き文字列は、一つまたは複数の SQL 文を含む文字列です。この文字列、
または < 文変数名 > の内容は、正しければ構文解析されて実行されます。文の実行
後は、すべてのデータ構造体およびメモリリソースがただちに解放されます。通常
の動的な実行では、これらの機能は PREPARE 文、EXECUTE 文、FREE 文の 3 つ
の SQL 文を組み合わせて実現します。
EXECUTE IMMEDIATE 文とともに実行できない文
次の SQL 文は、EXECUTE IMMEDIATE 文を使用して実行できません。このリスト
に EXECUTE PROCEDURE 文がありますが、この制限は値を戻す EXECUTE
PROCEDURE 文に対してのみ適用されます。
CLOSE 文
CONNECT 文
DECLARE 文
DISCONNECT 文
EXECUTE 文
EXECUTE PROCEDURE 文
FETCH 文
GET DESCRIPTOR 文
GET DIAGNOSTICS 文
OPEN 文
OUTPUT 文
PREPARE 文
SELECT 文
SET AUTOFREE 文
SET CONNECTION 文
SET DEFERRED_PREPARE 文
SET DESCRIPTOR 文
WHENEVER 文
また、セミコロンで区切られた複数の文を含むテキスト内の次のような文を実行す
るために、EXECUTE IMMEDIATE 文を使用することはできません。
CLOSE DATABASE 文
CREATE DATABASE 文
DATABASE 文
DROP DATABASE 文
SELECT 文 (SELECT INTO TEMP を除く )
動的に構築された SELECT 文を実行するには、PREPARE 文を使用してください。
SQL 文
2-295
EXECUTE IMMEDIATE 文
EXECUTE IMMEDIATE 文とともに実行できる文での制限
引用符付き文字列や < 文変数 > に含まれる文には、次のような制限があります。
■
文にホスト言語で許されているコメントを含めることはできません。
■
ホスト言語の変数名は、PREPARE 文で処理されたテキストと同様に認識
されません。使用できる識別子は、表名や列名などのデータベース内で定
義された名前だけです。
■
文は、ホスト変数リストや記述子を参照できません。したがって PREPARE
文とは異なり、疑問符 (?) 位置指定子を含めることはできません。
■
テキストにはドル記号 ($)やキーワード EXEC SQL などの埋込みSQL文のプ
レフィクスを含めることはできません。必要はありませんが、SQL 文の終
端記号 (;) はテキストに含めることができます。
EXECUTE IMMEDIATE 文の例
次の例は、ESQL/C における EXECUTE IMMEDIATE 文を表しています。どちらの
例も、CREATE DATABASE 文を含むホスト変数を使用しています。最初の例は、
引用文字列の中で SQL 文の終端記号 (;) を使用しています。
sprintf(cdb_text1, "create database %s;", usr_db_id);
EXEC SQL execute immediate :cdb_text;
sprintf(cdb_text2, "create database %s", usr_db_id);
EXEC SQL execute immediate :cdb_text;
参照
関連する文は、
「EXECUTE 文」、
「FREE 文」、
「PREPARE 文」です。
高速実行の詳細については『Informix Guide to SQL: Tutorial』を参照してください。
2-296 Informix Guide to SQL:Syntax
EXECUTE PROCEDURE 文
EXECUTE PROCEDURE 文
+
EXECUTE PROCEDURE 文を使用して、DB-Access 対話型エディタからのプロシ
ジャ、ESQL/C、またはその他のストアドプロシジャを実行します。
構文
EXECUTE PROCEDURE
< プロシジャ >
)
(
,
E/C
,
SPL
引数
INTO
< 出力変数 >
引数
式
4-33 ページ
< パラメータ>
=
SELECT 文
( 単一行 )
2-450 ページ
SQL 文
2-297
EXECUTE PROCEDURE 文
要素
< 出力変数 >
目的
制限
プロシジャからの戻り値を受 ESQL/C プログラム内で EXECUTE
け取るホスト変数です。
PROCEDURE 文を記述する場合、
受け取る変数は、ホスト変数にす
る必要があります。
構文
受け取る変数名は、
変数名に適用される
言語特有のルールに
従っている必要があ
ります。
ストアド プロシジャ内で
EXECUTE PROCEDURE 文を記述 式、4-33 ページ
する場合、受け取る変数は、プロ
シジャ変数にする必要があります。
識別子、
CREATE TRIGGER 文内で
EXECUTE PROCEDURE 文を記述 4-112 ページ
する場合、受け取る変数は、トリ
ガ表またはその他の表内の列名に
する必要があります。
式、4-33 ページ
< パラメータ > プロシジャに引数を渡すとき パラメータ名は、対応する
のパラメータの名前です。
CREATE PROCEDURE 文内で指定
したパラメータ名と一致している
必要があります。
EXECUTE PROCEDURE 文内の
引数に対し、構文 < パラメータ =>
を使用する場合は、すべての引数
に対してそれを使用する必要があ
ります。
説明
EXECUTE PROCEDURE 文は、< プロシジャ > と呼ばれるプロシジャを起動します。
EXECUTE PROCEDURE 文が、呼び出されるプロシジャが必要とするよりも多い引
数を指定している場合は、エラーが返されます。
EXECUTE PROCEDURE 文が、呼び出されるプロシジャが必要とするよりも少ない
引数を指定している場合、指定されていない引数は欠落しているといいます。デ
フォルト値を指定してあれば、欠落している引数は対応するパラメータのデフォル
ト値に初期化されます (2-134 ページの「CREATE PROCEDURE 文」を参照 )。この
初期化は、プロシジャの本体にある最初の実行可能文の前で発生します。
2-298 Informix Guide to SQL:Syntax
EXECUTE PROCEDURE 文
引数が欠落し、かつデフォルト値がない場合、引数は UNDEFINED の値に初期化さ
れます。UNDEFINED の値を持つ変数を使用すると、エラーになります。
名前か位置のどちらか片方が、プロシジャ引数とプロシジャパラメータとをバイン
ドします。つまり構文 < パラメータ => を、一つの EXECUTE PROCEDURE 文で指
定された引数のすべてに対して使用するか、全く使用しないことが可能です。
たとえば次の例では、どちらのプロシジャ呼出しも 3 つの文字型引数 t、d、および
n を要求するプロシジャに対して有効です。
EXECUTE PROCEDURE add_col (t ='customer', d ='integer', n ='newint')
EXECUTE PROCEDURE add_col ('customer','newint','integer')
E/C
ESQL/C では、EXECUTE PROCEDURE 文が複数の行を戻す場合は、SPL FOREACH
ループで囲まれているか、カーソルを介してアクセスされる必要があります。♦
E/C
INTO 節
SPL
ESQL/C プログラムやストアド プロシジャでは、INTO 節は、プロシジャが戻す値
が格納される場所を指定します。
< 出力変数 > リストは、プロシジャ呼出しから戻された値を受け取るホスト変数のリ
ストです。複数の行を戻すプロシジャは、カーソルで囲まれている必要があります。
ストアド プロシジャの中からプロシジャを実行すると、リストにはプロシジャ変数
が入ります。
トリガ アクションの中からプロシジャを実行すると、リストにはトリガ表かその他
の表の列名が入ります。トリガ アクションについては、2-198 ページの「CREATE
TRIGGER 文」を参照してください。
INTO 節を持つ EXECUTE PROCEDURE 文は、PREPARE 文で処理できません。詳
細については、2-407 ページの「PREPARE 文でのストアド プロシジャの実行」を
参照してください。
SQL 文
2-299
EXECUTE PROCEDURE 文
参照
関連する文は、
「CREATE PROCEDURE 文」、
「DROP PROCEDURE 文」
、「GRANT
文」
、および「CALL 文」です。
ストアド プロシジャの作成方法および使用方法については、
『Informix Guide to SQL:
Tutorial』を参照してください。
2-300 Informix Guide to SQL:Syntax
FETCH 文
FETCH 文
E/C
FETCH 文を使用して、カーソルをアクティブ行の新しい列に移動し、メモリから
行の値を抽出することができます。
この文は、ESQL/C で使用します。
構文
,
< カーソル識別子 >
FETCH
INTO
< 出力変数 >
+
NEXT
< カーソル変数 >
+
< 標識変数 >
INDICATOR
< 標識変数 >
PREVIOUS
+
PRIOR
< データ構造体 >
FIRST
LAST
USING
CURRENT
SQL DESCRIPTOR
'< 記述子 >'
< 位置番号 >
RELATIVE
< 記述子変数 >
+
ABSOLUTE
< 位置番号変数 >
DESCRIPTOR
<sqlda ポインタ >
< 行位置 >
< 行位置変数 >
SQL 文
2-301
FETCH 文
要素
目的
<カーソル識別子> 行が取り出される SELECT
カーソルまたは FUNCTION
カーソルの識別子です。
制限
カーソルは、前もって
DECLARE 文で作成され、前
もって OPEN 文でオープンさ
れていなければなりません。
<カーソル識別子 <カーソル識別子>の値を格 指定されているカーソルは、以
変数>
納しているホスト変数です。 前の DECLARE 文で作成され、
以前の OPEN 文でオープンさ
れていなければなりません。
<データ構造体> ホスト変数として宣言され
データ構造体の各メンバは取り
た構造体です。
出されている値のタイプと一致
していなければなりません。
<記述子>
<記述子変数>
<標識変数>
プログラム配列を使用してい
る場合は、配列名と<データ
構造体>の配列の要素の両方
をリストする必要があります。
取り出した行の内容を入れ
記述子変数で指定されている
るシステム記述子領域を指
システム記述子領域は
定する文字列です。
ALLOCATE DESCRIPTOR 文で
割り当てなければなりません。
<記述子>の値を格納して
<記述子変数>で指定されて
いるホスト変数名です。
いるシステム記述子領域は
ALLOCATE DESCRIPTOR 文で
割り当てなければなりません。
NULL データが対応する<出 このパラメータはオプション
ですが、<出力変数>の値が
力変数>にある場合、リ
ターンコードを受け取るホ
NULL の可能性がある場合は標
識変数を使用してください。
スト変数です。
構文
識別子、4-112 ページ
変数名は言語特有の
規則に従わなければ
なりません。
データ構造体の名前
は言語特有の規則に
従わなければなりま
せん。
引用符付き文字列、
4-156 ページ
変数名は言語特有の
規則に従わなければ
なりません。
変数名は言語特有の
規則に従わなければ
なりません。
キーワード INDICATOR を使
用しないで標識変数を指定す
ると、<出力変数>と<標識
変数>の間にスペースを入れ
ることができなくなります。
<標識変数>の前のプレフィ
クスの ESQL/C における規則に
ついては、
『INFORMIX-ESQL/C
Programmer’s Manual』を参照
してください。
(1/2)
2-302 Informix Guide to SQL:Syntax
FETCH 文
要素
< 出力変数 >
目的
制限
構文
取り出された行から一つの値 ホスト変数には、取り出して
変数名は言語特有の
を受け取るホスト変数です。 格納する値に適合したデータ
規則に従わなければ
型が必要です。
なりません。
行のアクティブ セット内の現 0 の値は現行行を取り出します。 リテラル番号、
< 位置番号 >
行行に対する希望の行の相対
4-138 ページ。
位置を与える整数値です。
< 位置番号変数 > < 位置番号 > を格納するホス 0 の値は現行行を取り出します。 変数名は言語特有の
規則に従わなければ
ト変数です。
なりません。
行のアクティブセット内の
< 行位置 >
< 行位置 > は、1 以上の値が必 リテラル番号、
希望の行の位置を与える整
要です。
4-138 ページ。
数値です。
< 行位置変数 >
< 行位置 > を格納するホスト < 行位置 > は、1 以上の値が必 変数名は言語特有の
要です。
規則に従わなければ
変数です。
なりません。
< sqlda ポインタ> 取り出した行から値を受け取 ドル記号 ($) やコロン (:) で
『INFORMIX-ESQL/C
る sqlda 構造体へのポインタ sqlda ポインタを開始すること Programmer’s
です。
はできません。
Manual』の sqlda 構
造体の説明を参照し
てください。
(2/2)
説明
データベースサーバがアクティブセットのメンバを作成、格納する方法と、そのア
クティブセットから行を取り出す方法は、カーソルが順カーソルであるかスクロー
ルカーソルであるかによって異なります。
X/O
X/Open モードでは、カーソルの動作方向を示す NEXT や RELATIVE などの値が指
定されていると、その SQL 文が X/Open 標準に適合していないことを示す警告メッ
セージが表示されます。♦
SQL 文
2-303
FETCH 文
順カーソルを使用した FETCH 文の処理
順カーソルは、アクティブセットに順番にならんでいる次の行しか取り出すことが
できません。順カーソルで使用できるオプションのキーワードは、デフォルトであ
る NEXT のみです。順カーソルは、オープンされるごとに表を一度しか読むことが
できません。次の ESQL/C の例は、順カーソルを使用方法を示しています。
EXEC SQL fetch seq_curs into :fname, :lname;
プログラムが順カーソルをオープンすると、データベースサーバはデータの最初の
行を見つけるか構築する問合せを行います。データベースサーバは、拘束するリ
ソースをなるべく少なくしようとします。
順カーソルでは、現行行の次の行を 1 行単位で抽出するため、データベースサーバ
は 1 行毎のアクティブセットを頻繁に作成します。各 FETCH 文の処理で、データ
ベースサーバは現行行の内容を返し、次の行を探します。データベースサーバがア
クティブセット全体を作成して、どれが最初の行であるかを判断しなければならな
いような場合には、1 回に 1 行のこの方法は使用できません。たとえば、SELECT
文に ORDER BY 節が指定されている場合などがこれにあたります。
スクロールカーソルを使用した FETCH 文の処理
スクロールカーソルは、行の絶対位置または相対位置を指定することにより、アク
ティブセットのすべての行を取り出すことができます。次のようなキーワードを
使って、抽出したい特定の行を指定します。
キーワード
効果
NEXT
アクティブセットの次の行を取り出します。
PREVIOUS
アクティブセットの一つ前の行を取り出します。
PRIOR
アクティブセットの一つ前の行を取り出します(PREVIOUS
と同じ意味です)
。
FIRST
アクティブセットの先頭の行を取り出します。
LAST
アクティブセットの最後の行を取り出します。
(1/2)
2-304 Informix Guide to SQL:Syntax
FETCH 文
キーワード
効果
CURRENT
アクティブセットの現行行を取り出します ( その前の
FETCH 文によってスクロールカーソルから返された行と同
じです )。
RELATIVE
アクティブセットの現在のカーソル位置から n 行目にあたる
行を取り出します。n は<位置番号>(または<位置番号変
数>)によって与えられます。負の値の場合は、現在のカー
ソル位置から n 行前の行を取り出します。0 の場合は現在の
行を取り出します。
ABSOLUTE
アクティブセットの先頭から n 行目の行を取り出します。n
は<行位置>(または<行位置番号変数>)によって与えら
れます。絶対行位置は 1 から数えます。
(2/2)
次の ESQL/C の例は、FETCH 文を示しています。
EXEC SQL fetch previous q_curs into :orders;
EXEC SQL fetch last q_curs into :orders;
EXEC SQL fetch relative -10 q_curs into :orders;
printf("Which row? ");
scanf("%d",row_num);
EXEC SQL fetch absolute :row_num q_curs into :orders;
ABSOLUTE オプション
ABSOLUTE オプションで使用される行位置の値は、カーソルがオープンしている
間のみ有効です。行識別子の値と混同しないように注意してください。行識別子の
値は表の行位置に基づいており、表が再構築されるまで残っています。行位置の値
は、カーソルのアクティブセットにおける行の位置に基づいています。したがっ
て、カーソルが次にオープンされたときに別の行が選択されることもあります。
SQL 文
2-305
FETCH 文
データベースサーバが行を格納する方法
スクロールカーソルでは、カーソルがクローズされるまでアクティブセット内のす
べての行をデータベースサーバが保持しています。これは、プログラムが次にどの
行を要求するか未定義なためです。スクロールカーソルがオープンされると、デー
タベースサーバはアクティブセットを一時表として作成します。ただし、この一時
表に対してすぐには書き込まれない場合もあります。
最初に行が取り出されると、データベースサーバはそれをプログラムに返すだけで
はなく、一時表にコピーします。行が 2 度目に取り出されるとき、その行を一時表
から取り出すこともあります。この方法は、プログラムがすべての行を取り出さな
いうちに問合せを放棄したような場合に、使用するリソースを最小限に抑えること
ができます。通常、取り出されなかった行は、一時表に作成も保存もされません。
メモリ内での値の行先を指定する方法
問合せで選択対象の並びに指定した値や実行されたプロシジャの出力結果は、それ
ぞれメモリ内のある特定の位置に返されなければなりません。次のいずれかの方法
によって、メモリ内での格納場所を指定できます。
■
SELECT 文の INTO 節を使用する
■
EXECUTE PROCEDURE 文の INTO 節を使用する
■
FETCH 文の INTO 節を使用する
■
システム記述子領域を使用する
■
sqlda 構造体を使用する
SELECT 文や EXECUTE PROCEDURE 文の INTO 節の使用
カーソルに関連付けられた SELECT 文や EXECUTE PROCEDURE 文に INTO 節を含
めて、値を受け取るためのプログラム変数を指定できます。この方法は、SELECT
文や EXECUTE PROCEDURE 文がカーソル宣言の一部として記述されたときに限り
使用できます。この場合、FETCH 文は INTO 節を含むことができます。
2-306 Informix Guide to SQL:Syntax
FETCH 文
次の例では、ESQL/C 内のプログラム変数を指定するために、SELECT 文の INTO
節を使用しています。
EXEC SQL declare ord_date cursor for
select order_num, order_date, po_num
into :o_num, :o_date, :o_po;
EXEC SQL open ord_date;
EXEC SQL fetch next ord_date;
SELECT 文から返されるデータが NULL である可能性がある場合は、標識変数を使
用します。
FETCH 文の INTO 節
SELECT 文の INTO 節を省略した場合は、行が取り出されるたびにデータの格納場
所を指定しなければなりません。抽出したデータを変数に格納するには、FETCH
文に INTO 節を指定します。この方法を使うと、行ごとに別々のメモリ位置に格納
することができます。
次の ESQL/C の例では、一連の行全体がプログラム配列に取り出されています。各
FETCH 文の INTO 節は、配列名とともに配列の要素を指定します。
EXEC SQL BEGIN DECLARE SECTION;
char wanted_state[2];
short int row_count = 0;
struct customer_t{
{
int c_no;
char fname[15];
char lname[15];
} cust_rec[100];
EXEC SQL END DECLARE SECTION;
SQL 文
2-307
FETCH 文
main()
{
EXEC SQL connect to'stores7';
printf("Enter 2-letter state code: ");
scanf ("%s", wanted_state);
EXEC SQL declare cust cursor for
select * from customer where state = :wanted_state;
EXEC SQL open cust;
EXEC SQL fetch cust into :cust_rec[row_count];
while (SQLCODE == 0)
{
printf("¥n%s %s", cust_rec[row_count].fname,
cust_rec[row_count].lname);
row_count++;
EXEC SQL fetch cust into :cust_rec[row_count];
}
printf ("¥n");
EXEC SQL close cust;
EXEC SQL free cust;
}
プログラム配列の要素にデータを取り出すことができるのは、FETCH 文に INTO 節
を使用した場合のみです。カーソルを宣言しているときには、SQL 文の中で配列の
要素を参照しないでください。
システム記述子領域の使用
システム記述子領域は、出力変数として使用できます。キーワード USING SQL
DESCRIPTOR は、取り出した行の内容を格納するシステム記述子領域の名前を導
入します。FETCH 文によってシステム記述子領域から返された値を、GET
DESCRIPTOR 文を使用してホスト変数に移すことができます。
次の例は有効な FETCH USING SQL DESCRIPTOR 文を示しています。
EXEC SQL fetch selcurs using sql descriptor 'desc';
2-308 Informix Guide to SQL:Syntax
FETCH 文
sqlda 構造体の使用
sqlda 構造体へのポインタは、格納先を提供するために使用できます。この構造体
は、一つの選択値に対応するデータ型とメモリ位置を指定するデータ記述子を含ん
でいます。キーワード USING DESCRIPTOR は、sqlda ポインタ構造体の名前を導入
します。
SELECT 文を動的に作成する場合は、PREPARE 文で処理された文内のホスト変数
を指定できないため、INTO 節は使用できません。選択リスト内の値の数とデータ
型が確信できる場合は、FETCH 文で INTO 節を使用できます。しかしユーザの入力
が問合せを生成させた場合、選択される値の数とデータ型は確信できなくなりま
す。このような場合は、次のリストが説明するように、sqlda ポインタ構造体を使
用するべきです。
■
DESCRIBE 文を使用して文を sqlda 構造体に書き込む。
■
データ値を格納するためのメモリを割り当てる。
■
FETCH 文の中で sqlda 構造体を指定する。
次の例は、USING DESCRIPTOR 節を使用した有効な FETCH 文を表しています。
EXEC SQL fetch selcurs using descriptor pointer2;
更新のために行を取り出す方法
通常、FETCH 文は取り出される行をロックしません。したがって、取り出された行
をプログラムが受け取った直後に、その行が他のプロセスによって更新または削除
される可能性があります。次のような場合には、取り出された行がロックされます。
■
排他レベルを繰り返し読込みに設定すると、取り出した各行には、カーソ
ルがクローズされるか現行トランザクションが終了するまで、変更できな
いように読込みロックがかけられます。他のプログラムもロックされた行
を読み込むことは可能です。
■
排他レベルをカーソル安定性に設定すると、現行行がロックされます。
SQL 文
2-309
FETCH 文
ANSI
■
ANSI 標準準拠のデータベースでは、排他レベルは繰り返し読込みがデフォ
ルトですが、他の排他レベルを設定することも可能です。♦
■
キーワード FOR UPDATE 付きで宣言された UPADATE カーソルによって行
を取り出す場合は、取り出された各行に増進可能なロックがかけられま
す。この場合、他のプログラムもロックされた行を読むことができます
が、増進可能なロックや書込みロックをかけることはできません。した
がって、他のユーザが UPDATE 文や DELETE 文の WHERE CURRENT OF
節を使用して、その行を変更しようとしても行は変更されません。
行が変更されると、その行のロックは書込みロックに更新され、カーソルがクロー
ズされるかトランザクションが終了するまでそのまま維持されます。行が変更され
なかった場合は、排他レベルをどのように設定してあるかによって、他の行を取り
出したときに、その行のロックが解除されるかどうかが決まります。繰り返し読込
みを使用している場合を除き、変更されていない行のロックは、他の行が取り出さ
れるとすぐに解除されます。
重要 : 排他レベルの繰り返し読込みが未使用であったり、使用が不可能であったり
する場合でも、追加する行に対するロックを保持できます。未変更のデータで行を
更新すれば、プログラムが他の行を読み込んでいる間、行に対するロックは保持さ
れます。この方法がどのような影響を与えるかについては、アプリケーションごと
に評価しなければなりません。また、デッドロックの可能性が増すことに注意して
ください。
明示的なトランザクションを使用している場合は、必ず単一のトランザクション内
で行の取り出しと変更を行うようにしてください。FETCH 文とそれに続く
UPDATE 文や DELETE 文は、BEGIN WORK 文とそれに対応する COMMIT WORK
文との間になければなりません。
FETCH 文の結果を検査する方法
GET DIAGNOSTICS 文は、各 FETCH 文の結果を検査できます。GET
DIAGNOSTICS 文のフィールド RETURNED_SQLSTATE を調べ、そのフィールドに
02000 の値があるかどうか検査します。
2-310 Informix Guide to SQL:Syntax
FETCH 文
行が正常に戻される場合、GET DIAGNOSTICS 文のフィールド
RETURNED_SQLSTATE には 00000 の値が入っています。行が見つからなかった場
合は、プリプロセッサが、SQLSTATE コードにはデータが見つからなかったことを
示す 02000 を設定し、現行行は変更されません。次の 5 つの条件では、SQLSTATE
コードに 02000 が設定され、データが見つからなかったことを示します。
■
アクティブセットに行が含まれていない。
■
カーソルがアクティブセットの最後の行か、その後ろを指しているとき
に、FETCH NEXT 文を実行した。
■
カーソルがアクティブセットの先頭の行を指しているときに、FETCH
PRIOR 文か FETCH PREVIOUS 文を実行した。
■
n 番目の行がアクティブセットに存在しないときに、その行を指定した
FETCH RELATIVE 文を実行した。
■
n 行目の行がアクティブセットに存在しないときに、その行を指定した
FETCH ABSOLUTE 文を実行した。
sqlca の SQLCODE を使用しても、同じ結果を確認できます。
参照
関連する文は、このマニュアルの「ALLOCATE DESCRIPTOR 文」、
「CLOSE 文」、
「DEALLOCATE DESCRIPTOR 文」
、「DECLARE 文」
、「DESCRIBE 文」
、「GET
「OPEN 文」
、「PREPARE 文」、
「SET DESCRIPTOR 文」です。
DESCRIPTOR 文」、
『Informix Guide to SQL: Tutorial』を参照
FETCH 文のタスク指向についての説明は、
してください。
『INFORMIX-ESQL/C Programmer’s
FETCH 文に関する概念についての詳細は、
Manual』を参照してください。
SQL 文
2-311
FLUSH 文
FLUSH 文
+
E/C
FLUSH 文を使用して、PUT 文によってバッファに蓄積された行を強制的にデータ
ベースに書き込むことができます。
この文は、ESQL/C で使用します。
構文
< カーソル識別子 >
FLUSH
< カーソル識別子変数 >
要素
目的
<カーソル識別子> カーソルの名前です。
<カーソル識別子
変数>
<カーソル識別子>の値を
保持するホスト変数です。
制限
カーソルは前もって DECLARE
文で作成されていなければなり
ません。
ホスト変数は文字データ型でな
ければなりません。カーソルは
前もって DECLARE 文で作成さ
れていなければなりません。
構文
識別子、4-112 ページ
変数名は言語特有
の規則に従わなけ
ればなりません。
説明
PUT 文は、挿入された行をバッファに追加し、このバッファがいっぱいになると
データベースに書き込みます。FLUSH 文は、バッファに蓄積された行を、任意の
時点でデータベースに挿入する場合に使用します。
カーソルがクローズされないままプログラムが終了すると、バッファはフラッシュ
されません。したがって、その時点でバッファに蓄積されていた行、すなわち前回
のフラッシュ以降にバッファに登録された行は破棄されます。プログラムを終了す
るときに、自動的にカーソルのクローズやバッファのフラッシュは行われません。
次の文は FLUSH 文の使用例です。
FLUSH icurs
2-312 Informix Guide to SQL:Syntax
FLUSH 文
FLUSH 文のエラー検査
salc 構造体には、成功した FLUSH 文の情報や正常に挿入された行数が格納されま
す。FLUSH 文の結果は sqlca のフィールド、つまり、sqlca.sqlcode、SQLCODE、お
よび sqlca.sqlerrd [2] に格納されます。
INSERT カーソルによってバッファ内にデータを格納すると、バッファがフラッ
シュされるまでエラーは発見されません。たとえば、挿入したい列のデータ型と入
力値のデータ型が互換性がない場合でも、バッファがフラッシュされた時点でエ
ラーが検出されます。エラーが見つかった後のバッファ内の行は、データベースに
挿入されずにメモリから破棄されます。
SQLCODE にはエラーコードまたはゼロ (0) が設定されます。ゼロは、エラーがな
かったことを意味します。sqlerrd 配列の 3 番目の要素には、正常にデータベースに
挿入された行数が設定されます。
■
一連の行が正常にデータベースに挿入されると、SQLCODE にゼロ (0) が設
定され、sqlerrd には行数が設定されます。
■
FLUSH 文が一連の行を挿入しているときにエラーが発生すると、SQL
CODE はエラーの種類を示し、sqlerrd は正常に挿入された行数を示します
( 未挿入の行はバッファから破棄されます )。
ヒント : SQLCODE エラーが発生した場合には、それに対応する SQLSTATE エ
ラー値も存在します。メッセージテキストの取得方法については、GET
DIAGNOSTICS 文を調べてください。
SQL 文
2-313
FLUSH 文
総行数と未挿入行数のカウント方法
次の手順に従って、データベースに実際に挿入された行数と、まだ挿入されていな
い行数を数えることができます。
1.
総行数を格納する total と、まだ挿入されていない行数を格納する pending
というような二つの整数型変数を用意します。
2.
カーソルのオープン時に両方の変数にゼロを設定します。.
3.
PUT 文を実行するときに両方の変数の値を増やしていきます。
4.
FLUSH 文が実行されるか、カーソルをクローズするときに、pending から
SQLERRD 配列の 3 番目のフィールドの値を減算します。
参照
関連する文は、
「CLOSE 文」、
「DECLARE 文」、
「OPEN 文」
、「PREPARE 文」です。
『Informix Guide to SQL: Tutorial』を参照
FLUSH 文のタスク指向の説明については、
してください。
sqlca 構造体についての詳細は、『INFORMIX-ESQL/C Programmer’s Manual』を参照
してください。
2-314 Informix Guide to SQL:Syntax
FREE 文
FREE 文
+
E/C
FREE 文は、PREPARE 文で処理された文や、カーソルに対して割り当てられたリ
ソースを開放します。
この文は、ESQL/C で使用します。
構文
FREE
< カーソル識別子 >
< カーソル識別子変数 >
< 文識別子 >
< 文識別子変数 >
要素
<カーソル識別子>
<カーソル識別子
変数>
<文識別子>
<文識別子変数>
目的
カーソルの名前です。
制限
カーソルは前もって DECLARE
文で作成されていなければなり
ません。
<カーソル識別子>の値を 変数は文字データ型でなければ
保持するホスト変数です。 なりません。カーソルは前もっ
て DECLARE 文で作成されてい
なければなりません。
SQL 文を識別する文字列 文識別子は PREPARE 文で前処
理されなければなりません。
です。
SQL 文を識別するホスト
変数です。
データベースサーバのリソース
を解放すると、もう一度文を
PREPARE 文で処理するまで、
DECLARE カーソルまたは
EXECUTE 文で文識別子を使用
することができなくなります。
この変数は PREPARE 文で前処
理されなければなりません。
構文
識別子、4-112 ページ
変数名は言語特有の
規則に従わなければ
なりません。
PREPARE 文、2-403
ページ
PREPARE 文、2-403
ページ
ホスト変数は文字データ型でな
ければなりません。
SQL 文
2-315
FREE 文
説明
FREE 文は、データベースサーバやアプリケーション開発支援ツールが、PREPARE
文で処理された文や宣言されたカーソルに対して割り当てたリソースを解放します。
文の解放
カーソルを宣言していない文を PREPARE 文で処理した場合、FREE 文の文識別子、
または文識別子変数は、アプリケーション開発ツールとデータベースサーバの両方
のリソースを解放します。
PREPARE 文で処理された文に対してカーソルを宣言した場合、FREE 文の文識別子
または文識別子変数は、アプリケーション開発ツールのリソースのみを解放しま
す。このとき、カーソルはまだ使用できます。データベースサーバのリソースは、
カーソルを解放したときにのみ解放されます。
文を解放すると、再びその文を PREPARE 文で処理するまでは、その文を実行した
りその文に対してカーソルを宣言することはできません。
次の ESQL/C の例は、暗黙のうちに PREPARE 文で処理された文を解放するための
一連の文を示しています。
EXEC SQL prepare sel_stmt from 'select * from orders';
.
.
.
EXEC SQL free sel_stmt;
次の ESQL/C の例は、明示的に PREPARE 文で処理された文を解放するための一連
の文を示しています。一番目の FREE 文でカーソルを解放し、二番目の FREE 文で
PREPARE 文で処理された文を解放します。
sprintf(demoselect, "%s %s",
"select * from customer ",
"where customer_num between 100 and 200");
EXEC SQL prepare sel_stmt from :demoselect;
EXEC SQL declare sel_curs cursor for sel_stmt;
EXEC SQL open sel_curs;
.
.
.
EXEC SQL close sel_curs;
EXEC SQL free sel_curs;
EXEC SQL free sel_stmt;
2-316 Informix Guide to SQL:Syntax
FREE 文
カーソルの解放
IPREPARE 文で処理された文に対して宣言されているカーソルを解放すると、
FREE 文はデータベースサーバのリソースだけを解放します。アプリケーション開
発支援ツールの中の文に対するリソースを解放するには、FREE 文で文識別子また
は文識別子変数を指定してください。
PREPARE 文で処理された文に対して宣言されていないカーソルを解放すると、アプ
リケーション開発支援ツールとデータベースサーバの両方のリソースを解放します。
カーソルを解放すると、再びそのカーソルを宣言するまではオープンできません。
カーソルは、解放される前に明示的にクローズするようにしてください。
カーソルを開放する FREE 文の例については、2-316 ページの「文の解放」の 2 番
目の例を参照してください。
参照
関連する文は、
「CLOSE 文」、
「DECLARE 文」、
「EXECUTE 文」、
「EXECUTE
「PREPARE 文」
、「SET AUTOFREE 文」です。
IMMEDIATE 文」、
『Informix Guide to SQL: Tutorial』を参照し
FREE 文のタスク指向の説明については、
てください。
SQL 文
2-317
GET DESCRIPTOR 文
+
E/C
GET DESCRIPTOR 文
GET DESCRIPTOR 文を使用して、次のような個別のタスクを実行できます。
■
システム記述子領域の中で記述されている値の数を判断する。
■
システム記述子領域の中で記述されている個々の列や式の属性を判断する。
■
FETCH 文の後にシステム記述子領域の値をホスト変数にコピーする。
この文は ESQL/C で使用してください。
2-318 Informix Guide to SQL:Syntax
GET DESCRIPTOR 文
構文
GET DESCRIPTOR
'< 記述子 > '
< 合計項目 >
< 記述子変数 >
=
COUNT
,
VALUE
< 項目番号 >
記述された
項目情報
< 項目番号変数 >
記述された
情報項目
< フィールド変数 >
=
TYPE
LENGTH
PRECISION
SCALE
NULLABLE
INDICATOR
NAME
DATA
ITYPE
IDATA
ILENGTH
SQL 文
2-319
GET DESCRIPTOR 文
要素
<記述子>
目的
情報取出し元のシステム記述
子領域を識別する引用符付き
文字列です。
<記述子変数>
<記述子>の値を格納する埋
込み変数名です。
<フィールド
変数>
システム記述子領域から指定
したフィールドの内容を受け
取るホスト変数です。
<項目番号>
システム記述子領域内のオカ
レンス ( 項目記述子 ) の1つ
を表す符号なし整数です。
<項目番号変数> <項目番号>の値を保持する
ホスト変数です。
<合計項目変数> システム記述子領域に記述さ
れている項目の数を示すホス
ト変数です。
2-320 Informix Guide to SQL:Syntax
制限
システム記述子領域は
ALLOCATE DESCRIPTOR 文の
中に割り当てられなければなり
ません。
<記述子変数>で識別されるシ
ステム記述子は ALLOCATE
DESCRIPTOR 文で割り当てら
れていなければなりません。
<フィールド変数>は、適切な
型でないとシステム記述子領域
から指定されたフィールドの値
を受け取ることができません。
<項目番号>の値は 0 を超える
数で、システム記述子が
ALLOCATE DESCRIPTOR 文で
割り当てられたときに指定され
たオカレンスより小さくなけれ
ばなりません。
<項目番号変数>は整数
(INTEGER) 型でなければなりま
せん。
ホスト変数は整数 (INTEGER)
型でなければなりません。
構文
引用符付き文字列、
4-156 ページ
変数名は言語特有の
規則に従わなければ
なりません。
変数名は言語特有の
規則に従わなければ
なりません。
リテラル番号、
4-138 ページ
変数名は言語特有の
規則に従わなければ
なりません。
変数名は言語特有の
規則に従わなければ
なりません。
GET DESCRIPTOR 文
説明
識別されたいずれかのホスト変数に対する割り当て中にエラーが発生すると、ホス
ト変数の内容は未定義となります。
GET DESCRIPTOR 文は、パラメータ USING SQL DESCRIPTOR で記述された後の
EXECUTE PROCEDURE 文の中で使用できます。
GET DESCRIPTOR 文で使用されるホスト変数は、プログラムの BEGIN DECLARE
SECTION の中で宣言されている必要があります。
キーワード COUNT の使用
キーワード COUNT を使用して、システム記述子領域に記述されている値の数を調
べることができます。
次の ESQL/C の例では、GET DESCRIPTOR 文にホスト変数を使用して、desc1 とい
うシステム記述子領域に記述されている値の数を知る方法を示しています。
main()
{
EXEC SQL BEGIN DECLARE SECTION;
int h_count;
EXEC SQL END DECLARE SECTION;
EXEC SQL allocate descriptor 'desc1' with max 20;
/* This section of program would prepare a SELECT or INSERT
* statement into the s_id statement id.
*/
EXEC SQL describe s_id using sql descriptor 'desc1';
EXEC SQL get descriptor 'desc1' :h_count = count;
...
}
SQL 文
2-321
GET DESCRIPTOR 文
VALUE 節
VALUE 節を使用して、記述されている列や式についての情報を得たり、データ
ベースサーバが返す値を抽出することができます。
<項目番号>はゼロ (0) より大きい値でなければならず、ALLOCATE DESCRIPTOR
文でシステム記述子領域を割り当てたときに指定された項目記述子の数よりも小さ
くなければなりません。
DESCRIBE 文の実行後の VALUE 節の使用
SELECT 文、EXECUTE PROCEDURE 文、INSERT 文または UPDATE 文を記述した
後で、SELECT 文の選択対象の並びで指定している列や式の結果、EXECUTE
PROCEDURE 文によって返される値の結果や、INSERT 文または UPDATE 文の中
の列の結果がシステム記述子領域に返されます。システム記述子領域内のそれぞれ
の値は、返された一つの列あるいは式の特性を記述します。
次の ESQL/C の例は、GET DESCRIPTOR 文を使用して、システム記述子領域
demodesc からデータ型についての情報を得る方法を示しています。
EXEC SQL get descriptor 'demodesc' value :index
:type = TYPE,
:len = LENGTH,
:name = NAME;
printf("Column %d: type = %d, len = %d, name = %s¥n",
index, type, len, name);
データベースサーバが TYPE フィールドへ返す値は整数として定義されているため
返された値を特定の整数値と照合して評価することができます。整数データ型の値
についての詳細は、2-548 ページを参照してください。
X/O
X/Open モードでは、X/Open コードが TYPE フィールドに戻されます。二つのモー
ドを合わせて使用するとエラーになるので注意してください。たとえば、あるデー
タ型が X/Open モードでは定義されておらず、Informix 製品では定義されている場
合、GET DESCRIPTOR 文を実行するとエラーになることがあります。
X/Open モードでは、ILENGTH、DATA、ITYPE を使用すると警告メッセージが表
示されます。この警告は、これらのシステム記述子領域のフィールドが標準の
X/Open フィールドではないことを示しています。♦
2-322 Informix Guide to SQL:Syntax
GET DESCRIPTOR 文
取り出された値の TYPE が 10 進数 (DEClMAL) 型または金額 (MONEY) 型の場合、
データベースサーバは DESCRlBE 文の実行後に、列の有効桁数と小数点以下桁数を
PREClSlON フィールドと SCALE フィールドに返します。TYPE フィールドが 10 進
数型や金額型でない場合は、PRECISION フィールドと SCALE フィールドは未定義
となります。
FETCH 文の実行後の VALUE 節の使用
プログラムは行を取り出すたびに、再度そのデータを使用できるように、その値を
ホスト変数に格納しなければなりません。そのためには、選択対象の並びで指定し
てある各値を取り出した後に、それぞれ GET DESCRIPTOR 文を使用します。たと
えば、選択対象の並びに 3 つの値があって、その 3 つの値をすべて読み込みたい場
合には、値を一つ取り出すたぴに GET DESCRIPTOR 文を実行します。この場合、
各 GET DESCRIPTOR 文の項目番号は 1、2、3 となります。
次の ESQL/C の例は、データを取り出した後、DATA フィールドからホスト変数
result にデータをコピーする方法を示しています。ただし、この例では返された値
がすべて同じデータ型であることを前提にしています。
EXEC SQL get descriptor 'demodesc' :desc_count = count;
.
.
.
EXEC SQL fetch democursor using sql descriptor 'demodesc';
for (i = 1; i <= desc_count; i++)
{
if (sqlca.sqlcode != 0) break;
EXEC SQL get descriptor 'demodesc' value :i :result = DATA;
printf("%s ", result);
}
printf("¥n");
FETCH 文を使用して NULL を取り出す方法
データを取り出した後で、GET DESCRIPTOR 文を使用したときにその値が NULL
である場合は、INDlCATOR フィールドに -1(NULL) が設定されます。INDlCATOR
が NULL を示していると、DATA の値は未定義となります。したがって、DATA の
値を格納するホスト変数にはどんな値が格納されるかわかりません。
SQL 文
2-323
GET DESCRIPTOR 文
キーワード LENGTH と ILENGTH の使用
DATA または IDATA の値に文字列が含まれる場合、キーワード LENGTH に値を指
定しなければなりません。LENGTH=0 を指定すると、キーワード LENGTH は自動
的に文字列の最大長に設定されます。DATA または IDATA の値には、文字 (CHAR)
型または可変長文字 (VARCHAR) 型の文字型変数から抽出されるリテラル文字列ま
たは文字列が格納されます。これによって、DATA または IDATA フィールドの文
字列の長さは動的に決定されます。
DESCRlBE 文が GET DESCRIPTOR 文より前に指定されていると、表の文字型
フィールドの最大長の値が自動的にキーワード LENGTH に設定されます。
キーワード ILENGTH を使用する場合も、キーワード LENGTH と同様の結果となり
ます。X/Open 標準と互換しない動的プログラムを作成する場合には、ILENGTH を
使用します。
参照
関連する文は、
「ALLOCATE DESCRIPTOR 文」
、「DEALLOCATE DESCRIPTOR
文」
、「DECLARE 文」
、「DESCRIBE 文」
、「EXECUTE 文」
、「FETCH 文」
、「OPEN
文」
、「PREPARE 文」、
「PUT 文」
、「SET DEFERRED_PREPARE 文」、
「SET
DESCRIPTOR 文」です。
『INFORMIX-ESQL/C
GET DESCRIPTOR 文に関連する概念についての詳細は、
Programmer’s Manual』を参照してください。
2-324 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
+
E/C
GET DIAGNOSTICS 文
GET DIAGNOSTICS 文を使用して、SQL 文の実行の診断情報を返すことができま
す。GET DIAGNOSTICS 文では、次の二つの節のいずれかを使用します。
■
SQL 文節は、最新の SQL 文によって生成されたエラーや警告の数や文字あ
ふれの情報を判断します。
■
EXCEPTlON 節は、最新の SQL 文によって生成されたエラーや警告の特定
の情報を返します。
この文は、ESQL/C で使用します。
構文
GET DIAGNOSTICS
SQL 文節
2-331 ページ
EXCEPTION 節
2-333 ページ
説明
GET DIAGNOSTICS 文は、診断領域から選択された状態についての情報を抽出し、
数や文字あふれの情報、または特定の例外条件についての情報を抽出します。
GET DIAGNOSTICS 文によって診断領域の内容が変更されることはありません。
SQL 文
2-325
GET DIAGNOSTICS 文
エラー状態コード SQLSTATE の使用
SQL 文を実行すると、エラー状態コードが自動的に生成されます。このコードは、
success、failure、warning、または no data found を表します。このエラー状態コー
ドは SQLSTATE と呼ばれる変数に格納されます。
クラスコードとサブクラスコード
状態コード SQLSTATE は 5 バイトの文字列で、数字と大文字のみ含むことができ
ます。
SQLSTATE 状態コードの前半の 2 文字はクラスを表します。SQLSTATE コードの
後半の 3 文字はサブクラスを表します。図 2-1 に SQLSTATE コードの構造を示しま
す。この例では値は 08001 で、08 がクラスコード、001 がサブクラスコードです。
「データベース環境に接続できません」というエラーを表して
08001 という値は、
います。
0
8
クラス
コード
0
0
図 2-1
SQLSTATE コードの
構造
1
サブクラスコード
次の表はクラスコードの値の意味を表しています。
SQLSTATE クラスコード値
意味
00
成功
01
警告付き成功
02
データが見つかりません。
> 02
エラーまたは警告
2-326 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
ANSI( 米国規格協会 ) 標準のサポート
次の場合を除いて、SQLSTATE 変数に返されたすべての状態コードは ANSI 標準準
拠です。
■
クラスコードが 01 で、サブクラスコードが I で始まる SQLSTATE コード
は、Informix 特有の警告メッセージを示しています。
■
クラスコードが IX の SQLSTATE コードは、INFORMlX 特有のエラーメッ
セージを示しています。
■
または I から Z までの英大文字で始まるクラスコードは
5 から 9 までの数字、
ANSI によって定義されていないものです。ただし、前述のようにクラス
コードが IX の SQLSTATE コードはInformix 特有のエラーメッセージです。
SQLSTATE コードの意味
次の表は、クラスコード、サブクラスコードとエラー状態コード SQLSTATE に関
連しているすべての有効な警告とエラーコードの意味を示しています。
クラス サブクラス
意味
00
000
成功
01
000
警告付き成功
01
002
接続切断エラー。トランザクションはロールバックされました。
01
003
設定された関数で NULL が無視されました。
01
004
文字列データ、適切な切り捨て
01
005
項目記述子が足りません。
01
006
アクセス権は取り消されません。
01
007
アクセス権は与えられません。
(1/4)
SQL 文
2-327
GET DIAGNOSTICS 文
クラス サブクラス
意味
01
I01
データベースにトランザクションがあります。
01
I03
ANSI 準拠のデータベースが選択されています。
01
I04
Informix Dynamic Server データベースが選択されています。
01
I05
実数 (FLOAT) 型から 10 進数 (DECIMAL) 型への変換が使
用されました。
01
I06
ANSI 準拠の標準構文に対する Informix の拡張。
01
I07
UPDATE/DELETE 文に WHERE 節がありません。
01
I08
ANSI のキーワードがカーソル名として使用されました。
01
I09
選択されたリスト内の項目数が into リスト倍の数と同じで
はありません。
01
I10
副モードでデータベースサーバが実行中。
01
I11
データスキップがオンになっています。
02
000
データが見つかりません。
07
000
動的 SQL エラー
07
001
USING 節が動的パラメータと一致しません。
07
002
USING 節が目的の仕様と一致しません。
07
003
カーソル仕様を実行できません。
07
004
動的パラメータには USING 節が必要です。
07
005
前処理された文がカーソル仕様に合いません。
07
006
制限されたデータ型の属性違反
07
008
記述子数が無効です。
07
009
記述子インデックスが無効です。
08
000
例外接続
08
001
サーバが接続を拒否しました。
08
002
指定された接続名は使用中です。
08
003
接続が存在しません。
08
004
クライアントが接続を設定できません。
08
006
トランザクションがローバックされました。
08
007
トランザクションの状態が不明です。
08
S01
通信失敗
(2/4)
2-328 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
クラス サブクラス
意味
0A
000
機能がサポートされていません。
0A
001
複数サーバのトランザクション
21
000
基数違反
21
S01
挿入値の並びが列の並びと一致しません。
21
S02
取り出された表のレベルが列の並びと一致しません。
22
000
データ例外
22
001
文字列データ、適切なトランザクション
22
002
NULL 値、標識パラメータなし
22
003
範囲外の数値
22
005
割当てエラー
22
027
データ例外トリムエラー
22
012
0 による除算
22
019
無効なエスケープ文字
22
024
未終端の文字列
22
025
無効なエスケープシーケンス
23
000
整合性制約違反
24
000
カーソル状態が無効
25
000
トランザクション状態が無効
2B
000
トランザクション状態が無効
2D
000
トランザクションの終了が無効
26
000
SQL 文識別子が無効
2E
000
接続名が無効
28
000
ユーザの許可仕様が無効
33
000
SQL 文記述子名が無効
34
000
カーソル名が無効
35
000
例外番号が無効
(3/4)
SQL 文
2-329
GET DIAGNOSTICS 文
クラス サブクラス
意味
37
000
構文エラーまたは PREPARE 文か EXECUTE IMMEDIATE
文でのアクセス違反
3C
000
カーソル名の重複
40
000
カーソル名の重複
40
003
文の完了が不明
42
000
構文エラーまたはアクセス違反
S0
000
名前が無効
S0
001
基本表またはビュー表がすでに存在します。
S0
002
基本表が見つかりません。
S0
011
インデックスがすでに存在します。
S0
021
列がすでに存在します。
S1
001
メモリ割当ての失敗
IX
000
Informix が予約しているエラーメッセージ
(4/4)
アプリケーションでの SQLSTATE コードの使用
変数として SQLSTATE を使用するとき、前もって宣言する必要はありません。
SQL STATE には SQL 文を実行するたびに生成され、エラー処理に必要なエラー
コードが含まれています。SQLSTATE は自動的に作成されます。変数 SQLSTATE
を検査して SQL 文の実行が成功したかどうかを判断できます。変数 SQL STATE が
SQL 文が失敗したことを示している場合には、GET DIAGNOSTICS 文を実行して、
エラーのさらに詳しい情報を得ることができます。
プログラム中での SQLSTATE 変数の使用例については、2-340 ページの「GET
DlAGNOSTlCS 文を使用したエラーの検査」を参照してください。
2-330 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
SQL 文節
GET DIAGNOSTICS 文へ戻る
2-325 ページ
SQL 文節
,
=
< 状態変数 >
MORE
NUMBER
ROW_COUNT
要素
<状態変数>
目的
制限
最新の SQL 文の状態についての データ型は要求されている
情報を受け取るホスト変数です。 フィールドのデータ型に一致し
指定した状態フィールドに関す なければなりません。
構文
変数名は言語特有の
規則に従わなければ
なりません。
る情報を受け取ります。
GET DIAGNOSTICS 文を使用して数や文字あふれの情報を抽出すると、3 つの文
フィールドの値が対応するホスト変数に格納されます。ホスト変数のデータ型は、
要求されるフィールドのデータ型と同じでなければなりません。これら 3 つの
フィールドは次のキーワードで表されます。
フィールド名の
キーワード
フィールドの
データ型
フィールドの
内容
ESQL/C での
ホスト変数の
データ型
MORE
文字 (CHAR) 型
Y または N
char[2]
NUMBER
整数
(IN-TEGER) 型
1 から 35,000
int
ROW_COUNT
整数
(IN-TEGER) 型
0 to 999,999,999
int
SQL 文
2-331
GET DIAGNOSTICS 文
キーワード MORE の使用
キーワード MORE を使用して、実行された最新の SQL 文が次の動作を行ったかど
うかを判断できます。
■
診断領域で検出された例外がすべて格納された場合。GET DlAGNOSTlCS
文は値 N を返します。
■
診断領域に格納された例外以上の例外が検出された場合。GET
DlAGNOSTlCS 文は値 Y を返します。
キーワード MORE の値はつねに N となります。
キーワード NUMBER の使用
キーワード NUMBER を使用して、実行された最新の SQL 文が診断領域に格納した
例外数を数えることができます。フィールド NUMBER には、例外数によって 1 か
ら 35,000 までの値を格納できます。
キーワード ROW_COUNT の使用
キーワード ROW_COUNT を使用して、実行された最新の SQL 文が処理した列数を
数えることができます。ROW_COUNT を指定すると、次の行数を数えることがで
きます。
■
表に挿入された行数
■
表で更新された行数
■
表から削除された行数
2-332 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
EXCEPTION 節
Exception 節
GET DIAGNOSTICS 文へ戻る
2-325 ページ
,
EXCEPTION
< 例外番号 >
< 例外変数 >
< 情報 > =
CLASS_ORIGIN
CONNECTION_ALIAS
MESSAGE_LENGTH
MESSAGE_TEXT
RETURNED_SQLSTATE
SERVER_NAME
SUBCLASS_ORIGIN
要素
<例外番号>
<例外変数>
<情報>
目的
制限
GET DIAGNOSTICS 文に例外番 整数値は 1 から 35,000 の範囲
内でなければなりません。
号を指定するリテラル整数値
です。
構文
リテラル番号、4-138
ページ
<例外番号>リテラルは、SQL
文節のキーワード NUMBER に
よって返される例外数の一つを
示します。
GET DIAGNOSTICS 文に例外番 変数は 1 から 35,000 の範囲の
号を指定するホスト変数です。 整数値でなければなりません。
最新の SQL 文に関する例外情
報を受け取るホスト変数です。
指定された例外フィールド名に
関する情報を受け取ります。
変数名は言語特有の
規則に従わなければ
変数のデータ型は整数 (INT ) 型 なりません。
または小桁整数 (SMALLINT) 型
でなければなりません。
データ型は要求されている
変数名は言語特有の
フィールドのデータ型に一致し 規則に従わなければ
なければなりません。
なりません。
SQL 文
2-333
GET DIAGNOSTICS 文
例外情報を抽出すると、GET DlAGNOSTlCS 文はホスト変数に対応する 7 つの
フィールドのいずれかに値を格納します。これらのフィールドは診断領域に配置さ
れ、最新の SQL 文によって発生した例外から値が抽出されます。
ホスト変数のデータ型は、要求されるフィールドのデータ型と同じでなければなり
ません。7 つの例外情報フィールドは、次のキーワードで示されます。
フィール
ドのデー
タ型
フィールド
の内容
RETURNED_SQLSTATE
文字
(CHAR) 型
SQLSTATE
の値
char[6]
CLASS_ORIGIN
文字
(CHAR) 型
文字列型
char[255]
SUBCLASS_ORIGIN
文字
(CHAR) 型
文字列型
char[255]
MESSAGE_TEXT
文字
(CHAR) 型
文字列型
char[255]
MESSAGE_LENGTH
整数
(Integer) 型
数値
int
SERVER_NAME
文字
(CHAR) 型
文字列型
char[255]
CONNECTION_NAME
文字
(CHAR) 型
文字列型
char[255]
フィールド名の
キーワード
ESQL/C での
ホスト変数の
データ型
アプリケーションは、符号なしの整数、またはゼロ (0) の単位を含む正確な数値の
整数型のホスト変数を使用して、番号によって例外を指定します。1 という値を持
つ例外は、GET DIAGNOSTICS 文以外の最新の SQL 文によって設定される
SQLSTATE の値に対応します。他の例外番号と、SQL 文によって発生した例外の
関連は定義されていません。したがって、例外の値で満たされる診断領域に設定順
序は存在しません。SQLSTATE の値が成功を示す場合でも、最低一つの例外は受け
取ります。
GET DIAGNOSTICS 文内でエラーが発生すると、つまり不正な例外番号が要求され
ると、Informix の内部変数 SQLCODE と SQLSTATE は、その例外番号の値に設定さ
れます。さらに、GET DIAGNOSTICS のフィールドは未定義となります。
2-334 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
キーワード RETURNED_SQLSTATE の使用
キーワード RETURNED_SQLSTATE を使用して、例外を示す SQLSTATE の値を判
断できます。
キーワード CLASS_ORIGIN の使用
キーワード CLASS_ORIGIN を使用して、RETURNED_SQLSTATE の値のクラス部
分を抽出できます。国際標準化機構 (ISO) がそのクラスを標準定義している場合、
CLASS_ORIGIN の値は ISO 9075 で定められた値と同じものになります。それ以外
は、CLASS_ORIGIN の値は Informix によって定義されるので、ISO 9075 の値とは異
なります。ANSI SQL と ISO SQL は類似しています。
キーワード SUBCLASS_ORIGIN の使用
キーワード SUBCLASS_ORIGIN を使用して、RETURNED_SQLSTATE(および
SQLSTATE)の値のサブクラスの部分を定義できます。取り出したサブクラスが国
際標準化機構 (ISO) によって定義されている場合、SUBCLASS_ORIGIN の値は ‘ISO
9075’ で定められた値と同じものになります。
キーワード MESSAGE_TEXT の使用
キーワード MESSAGE_TEXT を使用して、エラーメッセージなど例外のメッセージ
のテキストを判断できます。
キーワード MESSAGE_LENGTH の使用
キーワード MESSAGE_LENGTH を使用して、現行の MESSAGE_TEXT の文字列の
長さを判断できます。
キーワード SERVER_NAME の使用
キーワード SERVER_NAME を使用して、データベースサーバや、CONNECT 文ま
たは DATABASE 文の動作で関連付けられたデータベースサーバの名前を判断でき
ます。
SQL 文
2-335
GET DIAGNOSTICS 文
SERVER_NAME フィールドが更新される場合
次のような場合には、GET DIAGNOSTICS 文は SERVER_NAME フィールドを更新
します。
■
CONNECT 文の実行に成功した。
■
SET CONNECTION 文の実行に成功した。
■
現行の接続に対して、DISCONNECT 文の実行に成功した。
■
DISCONNECT ALL 文が失敗した。
SERVER_NAME フィールドが更新されない場合
次のような場合には、SERVER_NAME フィールドは更新されません。
■
CONNECT 文が失敗した。
■
DlSCONNECT 文が失敗した (DlSCONNECT ALL 文は対象となりません )。
■
SET CONNECTION 文が失敗した。
SERVER_NAME フィールドには、先に実行された SQL 文によって設定された値が
そのまま残ります。前述の 3 つの条件のいずれかが、最初に実行される SQL 文で
発生すると、SERVER_NAME フィールドは空白となります。
2-336 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
SERVER_NAME フィールドの内容
次に示すように、SERVER_NAME フィールドには実行する SQL 文によって異なる
情報が格納されます。
実行した文
SERVER_NAME フィールドの内容
CONNECT
接続しているサーバまたは接続に失敗したサーバの名前
を格納しています。
現在接続が存在していない場合、またはデフォルトの接
続を行っている場合はフィールドは空白になります。
SET CONNECTION
接続を切り換えたサーバまたは切り換えに失敗したサー
バの名前を格納しています。
DISCONNECT
接続を切断したサーバまたは接続の切断に失敗したサー
バの名前を格納しています。
接続を切断して、現在の接続以外の接続に対して
DISCONNECT 文を実行しても、SERVER_NAME フィー
ルドの内容は何も変更されません。
DISCONNECT ALL
DISCONNECT ALL 文の実行が成功すると、フィールド
を空白にします。
DISCONNECT ALL 文の実行に失敗すると
SERVER_NAME フィールドは切断できなかったすべて
のデータベースサーバの名前を格納します。ただし、接
続がまだ存在しているわけではありません。
CONNECT 文が成功した場合、SERVER_NAME フィールドには次のいずれかの値
が設定されます。
■
デフォルトのデータベースサーバへの接続の場合には、INFORMIX
SERVER の値 ( つまり、CONNECT 文はデータベースサーバを表示しませ
ん )。
■
特定のデータベースサーバへの接続の場合には、特定のデータベースサー
バ名。
DATABASE 文
DATABASE 文を実行すると、SERVER_NAME フィールドにはデータベースが常駐
するデータベースサーバの名前が格納されます。
SQL 文
2-337
GET DIAGNOSTICS 文
キーワード CONNECTION_NAME の使用
キーワード CONNECTION_NAME を使用して、CONNECT 文または DATABASE 文
で使用される接続に対して名前を指定できます。
キーワード CONNECTION_NAME が更新される場合
次のような場合には、GET DIAGNOSTICS 文は CONNECTION_NAME フィールド
を更新します。
■
CONNECT 文の実行に成功した。
■
SET CONNECTION 文の実行に成功した。
■
現行の接続に対して、DISCONNECT 文の実行に成功した。現行の接続が存
在しないために GET DIAGNOSTICS 文が CONNECTION_NAME フィール
ドを空白で埋めた。
■
DlSCONNECT ALL 文が失敗した。
CONNECTION_NAME フィールドが更新されない場合
次のような場合には、CONNECTION_NAME フィールドは更新されません。
■
CONNECT 文が失敗した。
■
DlSCONNECT 文が失敗した (DISCONNECT ALL 文は対象となりません )。
■
SET CONNECTlON 文が失敗した。
CONNECTION_NAME フィールドには、先に実行された SQL 文によって設定され
た値がそのまま残ります。前述の 3 つの条件のいずれかが、最初に実行される SQL
文で発生すると、CONNECTION_NAME フィールドは空白となります。
2-338 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
CONNECTION_NAME フィールドの内容
次に示すように、CONNECTION_NAME フィールドには、実行する SQL 文によっ
て異なる情報が格納されます。
実行した文
CONNECTION_NAME フィールドの内容
CONNECT
CONNECT 文で指定した、接続または接続に失敗した接
続の名前を格納します。
現在接続が存在していない場合、またはデフォルトの接
続を行っている場合はフィールドは空白になります。
SET CONNECTION
CONNECT 文で指定した、接続の切り換えまたは切り換
えに失敗した接続の名前を格納します。
DISCONNECT
CONNECT 文で指定した、接続の切断または接続切断に
失敗した接続名が格納されます。
接続を切断し、現在の接続以外の接続に対して
DISCONNECT 文を実行しても、CONNECTION_NAME
フィールドの内容は何も変更されません。
DISCONNECT ALL
DISCONNECT ALL 文の実行に成功すると
CONNECTION_NAME フィールドは空白となります。
DISCONNECT ALL 文の実行に失敗すると
CONNECTION_NAME フィールドには切断できなかった
すべての接続名が格納されます。ただし、DISCONNECT
ALL 文の実行に失敗しても、接続がまだ存在しているわ
けではありません。
CONNECT が成功した場合、CONNECTION_NAME フィールドには次のいずれかの
値が設定されます。
■
CONNECT が AS 節を含んでいない場合には、CONNECT 文で指定されてい
るデータベース環境名
■
接続名 ( キーワード AS の後の
CONNECT 文が AS 節を含んでいる場合には、
識別子 )
SQL 文
2-339
GET DIAGNOSTICS 文
DATABASE 文
DATABASE 文を実行すると、CONNECTION_NAME フィールドは空白となります。
GET DlAGNOSTlCS 文を使用したエラーの検査
GET DIAGNOSTICS 文は、診断領域のさまざまなフィールドに格納されている情報
を返します。アクセスしたい診断領域の各フィールドに対して、互換性のあるデー
タ型でホスト変数を指定しなければなりません。
次の例は、GET DIAGNOSTICS 文を使用してエラー情報を表示する方法を示してい
ます。最初の例は、disp_sqlstate_err() という ESQL/C エラー表示ルーチンを示して
います。
void disp_sqlstate_err()
{
int j;
EXEC SQL BEGIN DECLARE SECTION;
int exception_count;
char overflow[2];
int exception_num=1;
char class_id[255];
char subclass_id[255];
char message[255];
int messlen;
char sqlstate_code[6];
int i;
EXEC SQL END DECLARE SECTION;
printf("---------------------------------");
printf("-------------------------¥n");
printf("SQLSTATE: %s¥n",SQLSTATE);
printf("SQLCODE: %d¥n", SQLCODE);
printf("¥n");
EXEC SQL get diagnostics :exception_count = NUMBER,
:overflow = MORE;
printf("EXCEPTIONS: Number=%d¥t", exception_count);
printf("More? %s¥n", overflow);
for (i = 1; i <= exception_count; i++)
2-340 Informix Guide to SQL:Syntax
GET DIAGNOSTICS 文
{
EXEC SQL get diagnostics exception :i
:sqlstate_code = RETURNED_SQLSTATE,
:class_id = CLASS_ORIGIN, :subclass_id = SUBCLASS_ORIGIN,
:message = MESSAGE_TEXT, :messlen = MESSAGE_LENGTH;
printf("- - - - - - - - - - - - - - - - - - - -¥n");
printf("EXCEPTION %d: SQLSTATE=%s¥n", i,
sqlstate_code);
message[messlen-1] ='¥0';
printf("MESSAGE TEXT: %s¥n", message);
j = stleng(class_id);
while((class_id[j] == '¥0') ||
(class_id[j] == ' '))
j--;
class_id[j+1] = '¥0';
printf("CLASS ORIGIN: %s¥n",class_id);
j = stleng(subclass_id);
while((subclass_id[j] == '¥0') ||
(subclass_id[j] == ' '))
j--;
subclass_id[j+1] = '¥0';
printf("SUBCLASS ORIGIN: %s¥n",subclass_id);
}
printf("---------------------------------");
printf("-------------------------¥n");
}
参照
タスク指向のエラー処理方法および SQLSTATE 変数については、
『Informix Guide to
SQL: Tutorial』を参照してください。
GET DIAGNOSTICS 文と SQLSTATE 変数に関する概念については、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。
SQL 文
2-341
GRANT 文
GRANT 文
GRANT 文を使用して、次のようなアクセス権を付与できます。
■
ユーザのデータベースに対するアクセス権
■
ユーザやロールの表、ビュー、またはシノニムに対するアクセス権
■
ユーザやロールのプロシジャに対するアクセス権
GRANT 文を使用して、ユーザや他のロールにロールを付与することもできます。
2-342 Informix Guide to SQL:Syntax
GRANT 文
構文
+
GRANT
データベースレベル
のアクセス権
2-345 ページ
TO
PUBLIC
,
< ユーザ >
' < ユーザ >'
+
IDS
< ロール >
TO
PUBLIC
,
< ユーザ >
WITH GRANT OPTION
' < ユーザ > '
+
EXECUTE ON
< プロシジャ >
< ロール >
' < ロール >'
PUBLIC とユーザに対する
表アクセス権
2-349 ページ
+
IDS
ロールに対する
表アクセス権
2-351 ページ
SQL 文
2-343
GRANT 文
要素
目的
< プロシジャ > 指定されたユーザまたはロール
が実行できるストアド プロシ
ジャの名前です。
< ロール >
< ユーザ >
制限
構文
ストアド プロシジャは、
データベースオブ
GRANT 文を実行するユーザに ジェクト名、4-25
よって所有されている必要があ ページ
ります。
ロールは、CREATE ROLE 文で 識別子、4-112 ペー
作成されている必要があります。 ジ
付与されるロールの名前、また
は他のロールに付与されるロー
ルの名前です。
ロールを付与されるユーザの名 < ユーザ > を引用符で囲むと、
前、または指定されたアクセス そのユーザ名は入力したとおり
権を受け取るユーザの名前です。 正確に格納されます。ANSI 標
準準拠のデータベースでは、
< ユーザ > を引用符で囲まない
と、ユーザ名が大文字で格納さ
れます。
識別子、4-112 ペー
ジ
PUBLIC にアクセス権を付与す
ると、個々のユーザにアクセス
権を付与する必要がありません。
PUBLIC はすべての公認ユーザ
にアクセス権を拡張します。
説明
GRANT 文はユーザのアクセス権を拡張できますが、既存のアクセス権を制限する
ことはできません。後から実行する GRANT 文は、すでにユーザに付与されたアク
セス権には影響を与えません。データベースレベルのアクセス権が表レベルのアク
セス権と一致しない場合は、より制限力のあるアクセス権が優先されます。表レベ
ルのアクセス権は、表またはビューに対して付与できます。
ユーザに付与されたアクセス権は、REVOKE 文でキャンセルするまで効力がありま
す。権限授与者だけが、前に実行したアクセス権を取り消すことができます。
ロールにアクセス権を付与したり、個々のユーザや他のロールにロールを付与する
こともできます。詳細については、2-348 ページの「ユーザや他のロールに対する
ロールの付与」を参照してください。
2-344 Informix Guide to SQL:Syntax
GRANT 文
データベースレベルのアクセス権
データベースレベル
のアクセス権
GRANT 文へ戻る
2-343 ページ
CONNECT
RESOURCE
DBA
データベースを作成する場合は、自分だけがそれをアクセスします。データベース
は、DBA として自分がデータベースアクセス権を付与するまで、他のユーザから
はアクセスできません。
SQL 文
2-345
GRANT 文
3 つのレベルのデータベースアクセス権がアクセスを制御します。データベースの
アクセス権レベルは、CONNECT、RESOURCE、DBA の順にレベルが高くなりま
す。これらのアクセス権は次のようなキーワードと関連付けられています。
アクセス権
機能
CONNECT
データの問合せや修正を可能にします。修正したいデータベース
オブジェクトを所有している場合は、そのデータベーススキーマ
を修正できます。このアクセス権を所有しているユーザはすべて
以下のことができます。
RESOURCE
■
CONNECT 文または他の接続文によるデータベースへの接続
■
必要な表レベルのアクセス権を持つ場合、SELECT、INSERT、
UPDATE、DELETE の各文の実行
■
基礎表に対してアクセス権 SELECT を持つ場合、ビューの作成
■
シノニムの作成
■
一時表の作成、およびこの一時表のインデックスの作成
■
表やインデックスの変更や削除、ただしユーザがその表やイン
デックスを所有する場合 ( またはその表に対する ALTER、
INDEX、あるいは REFERENCES アクセス権を持つ場合 )。
■
表やビューに対するアクセス権の付与、ただしユーザがその表
を所有している場合 ( またはキーワード WITH GRANT
OPTION でその表に対するアクセス権を与えられている場合 )
このアクセス権を所有しているユーザは、データベースの構造を
拡張することができます。アクセス権 CONNECT の所有者の権
限の他に、このアクセス権の所有者は以下のことができます。
■
新しい表の作成
■
新しいインデックスの作成
■
新しいプロシジャの作成
(1/2)
2-346 Informix Guide to SQL:Syntax
GRANT 文
アクセス権
機能
DBA
アクセス権 RESOURCE の所有者の権限の他に、このアクセス権
の所有者は以下のことができます。
■
アクセス権DBAも含めた任意のデータベースレベルのアクセス
権の他のユーザへの付与
■
任意の表レベルのアクセス権の他のユーザへの付与
■
任意の表レベルのアクセス権のロールへの付与
■
ユーザまたは他のロールへのロールの付与
■
SET SESSION AUTHORIZATION 文の実行
■
キーワードNEXT SIZEを使用したシステムカタログ内のエクス
テントサイズの変更
■
systables を除く任意のシステムカタログに対する行の挿入、削
除、更新
■
所有者であるかどうかに関わらないデータベースオブジェクト
の削除
■
表、ビュー、インデックスの作成と、データベースオブジェク
ト所有者としての他のユーザの指定
■
DROP DATABASE 文の実行
■
DROP DISTRIBUTIONS オプションを指定した UPDATE
STATISTICS 文の実行
(2/2)
ユーザ informix は、表 systables を含むシステムカタログ内の表を変更するのに必要
なアクセス権を持っています。
警告 : ユーザ informix と DBA は、ほとんどのシステムカタログ表を変更できます
(systables を変更できるのはユーザ informix のみ ) が、Informix では、システムカタ
ログ表の行の更新、削除、または変更をしないようお勧めします。システムカタロ
グ表を変更するとデータベースの整合性が失われることがあります。
次の例は、キーワード PUBLIC を使用して、現在有効なデータベースに対する
CONNECT アクセス権をすべてのユーザに付与しています。
GRANT CONNECT TO PUBLIC
SQL 文
2-347
GRANT 文
ユーザや他のロールに対するロールの付与
GRANT 文を使用して、他のロールやユーザにロールを付与できます。付与できる
のは、CREATE ROLE 文で作成されたロールだけです。ロールについては、2-146
ページの「CREATE ROLE 文」を参照してください。
ロールが付与されたら、SET ROLE 文を使用してそのロールを有効化する必要があ
ります。キーワード WITH GRANT OPTION を使用してロールを付与されたユーザ
は、そのロールを他のユーザやロールに付与できます。ユーザに付与されたロール
は、REVOKE 文でキャンセルされるまで付与された状態を保ちます。
表レベルのアクセス権とストアド プロシジャに対する EXECUTE アクセス権は、ロー
ルに付与できます。データベースレベルのアクセス権はロールに付与できません。
DBA、あるいはキーワード WITH GRANT OPTION を使用してロールを付与された
ユーザは、ユーザや他のロールにロールを付与できます。ロールは、直接的にも間
接的にもそのロール自身に付与することはできません。次のような文はエラーにな
ります。
GRANT engineer TO engineer -- Causes an error
次の例はロール engineer をユーザ maryf に付与しています。
GRANT engineer TO maryf
次の例はロール acct をロール engineer に付与しています。
GRANT acct TO engineer
次の例は、キーワード WITH GRANT OPTION を使用してロール engineer をユーザ
maryf に付与します。このアクセス権では、maryf がロール engineer を他のユーザや
ロールに付与できます。
GRANT engineer TO maryf WITH GRANT OPTION
ストアド プロシジャのアクセス権
プロシジャ名と一緒にオプション EXECUTE ON を使用して、自分が所有するスト
アド プロシジャを実行する能力を他のユーザやロールに付与します。
所有者アクセス権付きストアド プロシジャを作成すると、デフォルトのアクセス権
は PUBLIC になります。
2-348 Informix Guide to SQL:Syntax
GRANT 文
PUBLIC とユーザのための表アクセス権
PUBLIC とユーザのため
の表アクセス権
表レベルの
アクセス権
2-352 ページ
GRANT 文へ戻る
2-343 ページ
ON
<表>
TO
PUBLIC
,
+
< ビュー >
< シノニム >
< ユーザ >
AS < 授与者 >
' < ユーザ > '
+
WITH GRANT OPTION
要素
< 授与者 >
< シノニム >
<表>
目的
システムカタログ表 systabauth
で指定されたアクセス権のソー
スとしてリストされる人の名前
です。
GRANT 文を実行する人が
デフォルトのアクセス権授与者
です。
付与されるアクセス権の対象と
なるシノニムの名前です。
付与されるアクセス権の対象と
なる表の名前です。
制限
構文
識別子、4-112 ペー
< ユーザ > に対する指定された
アクセス権の授与者として別の ジ
人を指定すると、後で自分が
< ユーザ > の持つそのアクセス
権を取り消すことはできません。
シノニムが指すシノニムと表
は、現行のデータベースに存在
する必要があります。
表は現行のデータベースに存在
する必要があります。
データベースオブ
ジェクト名、4-25
ページ
データベースオブ
ジェクト名、4-25
ページ
(1/2)
SQL 文
2-349
GRANT 文
要素
< ユーザ >
< ビュー >
目的
指定されたアクセス権を受け取
るユーザの名前です。
付与されるアクセス権の対象と
なるビューの名前です。
制限
構文
< ユーザ > を引用符で囲むと、 識別子、4-112 ペー
ジ
そのユーザ名は入力したとお
り正確に格納されます。ANSI
標準準拠のデータベースでは、
< ユーザ > を引用符で囲まない
と、ユーザ名が大文字で格納
されます。
PUBLIC にアクセス権を付与す
ると、個々のユーザにアクセス
権を付与する必要がありませ
ん。PUBLIC はすべての公認
ユーザにアクセス権を拡張しま
す。2-355 ページの「表レベル
におけるアクセス権の制限」も
参照してください。
ビューは現行のデータベースに
存在する必要があります。
データベースオブ
ジェクト名、4-25
ページ
(2/2)
表、ビュー、シノニムのアクセス権は、ユーザ、ユーザのリスト、またはすべての
ユーザ (PUBLIC) に付与することができます。これらのアクセス権をユーザや
PUBLC に付与する場合は、WITH GRANT OPTION 節や、AS < 授与者 > 節を指定す
ることもできます。
付与するアクセス権の対象となる表、ビュー、またはシノニムは、現行のデータ
ベースに存在する必要があります。
次の例は、table1 の表レベルの INSERT アクセス権を mary というユーザに付与して
います。
GRANT INSERT ON table1 TO mary
2-350 Informix Guide to SQL:Syntax
GRANT 文
ロールに対する表アクセス権
ロールに対する
表アクセス権
GRANT 文へ戻る
2-343 ページ
表レベルの
アクセス権
2-352 ページ
ON
<表>
< ビュー >
TO
< ロール >
'< ロール > '
AS
< 授与者 >
< シノニム >
要素
< 授与者 >
目的
システムカタログ表 systabauth
で指定されたアクセス権のソー
スとしてリストされる人の名前
です。
GRANT 文を実行する人が
デフォルトのアクセス権授与者
です。
指定されたアクセス権を付与さ
れるロールの名前です。
付与されるアクセス権の対象と
なるシノニムの名前です。
制限
構文
< ロール > に対する指定された 識別子、4-112 ペー
アクセス権の授与者として、別 ジ
の人を指定すると、後で自分が
< ロール > の持つそのアクセス
権を取り消すことはできません。
<表>
付与されるアクセス権の対象と
なる表の名前です。
ロールは CREATE ROLE 文で作
成されている必要があります。
シノニムが指すシノニムと表
は、現行のデータベースに存在
する必要があります。
表は現行のデータベースに存在
する必要があります。
< ビュー >
付与されるアクセス権の対象と
なるビューの名前です。
ビューは現行のデータベースに
存在する必要があります。
< ロール >
< シノニム >
識別子、4-112 ペー
ジ
データベースオブ
ジェクト名、4-25
ページ
データベースオブ
ジェクト名、4-25
ページ
データベースオブ
ジェクト名、4-25
ページ
表、ビュー、またはシノニムのアクセス権はロールに付与できます。これらのアク
セス権をロールに付与する場合は、AS < 授与者 > 節を指定することはできますが、
WITH GRANT OPTION 節を指定することはできません。
付与するアクセス権の対象となる表、ビュー、またはシノニムは、現行のデータ
ベースに存在する必要があります。
次の例は、table1 の表レベルの INSERT アクセス権を engineer というロールに付与
しています。
GRANT INSERT ON table1 TO engineer
SQL 文
2-351
GRANT 文
表レベルのアクセス権
表レベルのアクセス権節によって、表レベルにおけるアクセス権を制御できます。
表レベルのアクセス権
PUBLIC と USERS に対する表のアクセス権へ戻る 2-349 ページ
ロールに対する表のアクセス権へ戻る 2-351 ページ
ALL
PRIVILEGES
,
INSERT
DELETE
SELECT
,
+
(
)
<列>
UPDATE
,
+
(
<列>
)
REFERENCE
,
+
(
<列>
)
INDEX
ALTER
要素
<列>
目的
列の名前またはアクセス権
SELECT、UPDATE、
REFERENCES が制限されてい
る列の名前です。
<列>を省略すると、アクセス
権は指定された表のすべての列
に適用されます。
2-352 Informix Guide to SQL:Syntax
制限
指定された列は存在しなけれ
ばなりません。
構文
識別子、4-112 ページ
GRANT 文
表の所有者としてまたは DBA として、7 つの表レベルのアクセス権を介して表へ
のアクセスを制御します。SELECT、INSERT、DELETE、および UPDATE の 4 つ
のアクセス権は、表データに対するアクセスを制御します。残りの 3 つのアクセス
権は、インデックス作成を制御する INDEX、表定義の変更やインデックスの変更
の能力を制御する ALTER、および表の列に参照制約を配置する能力を制御する
REFERENCES です。
表を作成する人は表の所有者であり、7 つの表レベルのアクセス権をすべて受け取
ります。表の所有権は他のユーザに譲渡できません。
GRANT 文を使用するには、< ユーザ > に付与するアクセス権をリストします。す
べての表レベルのアクセス権を付与する場合は、キーワード ALL を使用します。
SELECT、UPDATE、または REFERENCES アクセス権を付与する場合は、特定の
列の名前をリストすることによりアクセス権を制限できます。
< ユーザ > が表を変更できるように、< ユーザ > に ALTER アクセス権を付与する
場合は、表を含むデータベースに対する RESOURCE アクセス権も付与する必要が
あります。
< ユーザ > が表の基礎構造を変更できるように、< ユーザ > に INDEX アクセス権
を付与する場合は、データベース構造を変更できるように、< ユーザ > がデータ
ベースに対する RESOURCE アクセス権も持つ必要があります。表レベルのアクセ
ス権は、次の表のように定義されています。
アクセス権
機能
INSERT
行を挿入できるようにします。
DELETE
行を削除できるようにします。
SELECT
SELECT 文において列名を指定できるようにします。
列をリストして、SELECT アクセス権を一つまたは複数の列
に制限できます。
UPDATE
UPDATE 文において列名を指定できるようにします。
列をリストして、UPDATE アクセス権を一つまたは複数の
列に制限できます。
(1/2)
SQL 文
2-353
GRANT 文
アクセス権
機能
REFERENCES
参照制約において列を参照できるようにします。
REFERENCES アクセス権を利用するには、RESOURCE アク
セス権が必要です。( しかし、ALTER TABLE 文の中で参照
制約を追加することもできます。この操作には、データベー
スに対する RESOURCE アクセス権は必要ありません。) 列
をリストすることにより、REFERENCES アクセス権を一つ
または複数の列に制限できます。
カスケード削除を指示するために必要なのは、
REFERENCES アクセス権だけです。表にカスケード削除を
配置するために、DELETE アクセス権は必要ありません。
INDEX
永久インデックスを作成できるようにします。
INDEX アクセス権を使用するには、RESOURCE アクセス権
が必要です (CONNECT アクセス権を持つユーザは、一時表
にインデックスを作成できます )。
ALTER
列の追加や削除、列のデータ型の変更、あるいは制約の追加
や削除ができるようにします。
このアクセス権は、一意性インデックスや一意性制約のデー
タベース オブジェクト モードを有効、無効、あるいはフィ
ルタ モードに設定できるようにもします。またこのアクセ
ス権は、非一意性インデックスや非一意性トリガのデータ
ベース オブジェクト モードを、有効モードや無効モードに
設定できるようにします。ALTER アクセス権を使用するに
は、RESOURCE アクセス権が必要です。
ALL
すべてのアクセス権を提供します。
キーワード PRIVILEGES はオプションです。
(2/2)
次の例は、すべての列に対する DELETE アクセス権と SELECT アクセス権を、
ユーザ mary と john に付与しています。また、表 customer の customer_num、fname、
および lname に対する UPDATE アクセス権も付与しています。
GRANT DELETE, SELECT, UPDATE (customer_num, fname, lname)
ON customer TO mary, john
この表レベルのアクセス権をすべてのユーザに対して与えるには、次のようにキー
ワード PUBLIC を使用してください。
GRANT DELETE, SELECT, UPDATE (customer_num, fname, lname)
ON customer TO PUBLIC
2-354 Informix Guide to SQL:Syntax
GRANT 文
表レベルにおけるアクセス権の制限
表レベルではアクセス権を制限するための操作が必要です。データベースサーバ
は、すべての表レベルのアクセス権を自動的に PUBLIC に付与します。ただし自分
が表を作成した場合の ALTER アクセス権と REFERENCES アクセス権は例外です。
表アクセスを制限するには、次の例のように、すべてのアクセス権を取り消し、必
要なアクセス権だけを付与しなおす必要があります。
REVOKE ALL ON customer FROM PUBLIC
GRANT ALL ON customer TO john, mary
GRANT SELECT (fname, lname, company, city)
ON customer TO PUBLIC
ANSI
ANSI 標準準拠のデータベースでは、表が作成されると、表の所有者だけがアクセ
ス権を受け取ります。♦
キーワード ALL の動作
キーワード ALL は、指定したユーザに、すべての表レベルのアクセス権を与えま
す。権限授与者が表レベルのアクセス権の一部しか持っていない場合、または全く
持っていない場合には、キーワード ALL を指定した GRANT 文は成功しますが、
次の SQLSTATE の警告メッセージが返されます。
01007 - Privilege not granted.
たとえば、ユーザ ted が表 customer_num に対してアクセス権 SELECT と INSERT を
持っていて、それらのアクセス権を他のユーザに付与する権限を持っているとしま
す。ユーザ ted は 7 つの表レベルのアクセス権をすべてユーザ tania に与えたいとし
ます。ユーザ ted は次の GRANT 文を実行します。
GRANT ALL ON customer TO tania
この文は成功しますが、次の理由により、SQLSTATE コード 01007 が返されます。
■
文はアクセス権 SELECT と INSERT をユーザ tania に与えることに成功しま
す。ユーザ ted はこれらのアクセス権を持っていて、これらのアクセス権
を他のユーザに付与する権限も持っています。
■
ユーザ ted はアクセス権 DELETE、UPDATE、REFERENCES、INDEX、お
よび ALTER を持っていないため、これらを与えることができません。
ユーザ tania もこれらを持っていません。
SQL 文
2-355
GRANT 文
キーワード WITH GRANT OPTION
キーワード WITH GRANT OPTION を使用すると、指定したアクセス権がユーザに
与えられと同時に、そのユーザは同じアクセス権を別のユーザに与えることができ
るようになります。これによって最初にアクセス権が与えられた人から、< ユーザ
> へさらにアクセス権を付与する権限が与えられた < ユーザ > へ連鎖的にアクセス
権が与えられるようになります。キーワード WITH GRANT OPTION を使用すると、
アクセス権が拡散され制御できなくなります。
キーワード WITH GRANT OPTION を使用して付与したアクセス権を < ユーザ > か
ら取り消すと、アクセス権の連鎖は切断されます。つまり、< ユーザ > のアクセス
権を取り消すと、< ユーザ > からアクセス権を受け取った、または < ユーザ > が作
成した連鎖のアクセス権を受け取ったすべてのユーザのアクセス権は自動的に取り
消されます。ただし、< ユーザ >、または < ユーザ > からアクセス権を受け取った
ユーザが、同じアクセス権のセットを他の誰からも付与されていな場合に限りま
す。次の例は、この状態を表したものです。表 items の所有者は、次のような文を
実行してユーザ mary に対してアクセスを付与します。
REVOKE ALL ON items FROM PUBLIC
GRANT SELECT, UPDATE ON items TO mary WITH GRANT OPTION
ユーザ mary は、自分の新しいアクセス権を使用して、ユーザ cathy と paul に表の
アクセス権を付与します。
GRANT SELECT, UPDATE ON items TO cathy
GRANT SELECT ON items TO paul
その後、表 items に対するユーザ mary のアクセス権を取り消すために、次の文を実
行します。
REVOKE SELECT, UPDATE ON items FROM mary
この文によって、表 items に対するアクセス権はユーザ mary、cathy、および paul
から取り消されます。
他のユーザを創始者にしてアクセス権の連鎖を作成したい場合は、AS< 授与者 > 節
を使用します。
2-356 Informix Guide to SQL:Syntax
GRANT 文
AS <授与者>節
AS< 授与者 > 節を使用すると、他のユーザを創始者にしたアクセス権の連鎖を作成
できます。これは、アクセス権の連鎖を切断する機能を放棄することを意味しま
す。たとえ DBA( データベース管理責任者 ) であっても最初にアクセス権を付与し
た DBA でないかぎり、アクセス権を取り消すことはできません。次にこの場合の
例を示します。表 items の所有者が、すべてのアクセス権をとともにそれらを譲渡
する権利もユーザ tom に与えています。
REVOKE ALL ON items FROM PUBLIC
GRANT ALL ON items TO tom WITH GRANT OPTION
次に、別の例を示します。SELECT アクセス権と PUDATE アクセス権をユーザ jim
に付与していますが、ユーザ tom が付与したように指定しています ( データベース
サーバのシステムカタログ表 systabauth はユーザ tom が権限授与者であることを示
します )。
GRANT SELECT, UPDATE ON items TO jim AS tom
その後、次の文を実行して、表 items に対するユーザ tom のアクセス権を取り消す
ことができます。
REVOKE ALL ON items FROM tom
しかし次の例で示しているように、同じような文を使ってユーザ jim のアクセス権
を取り消そうとすると、データベースサーバがエラーを返します。
REVOKE SELECT, UPDATE ON items FROM jim
580: Cannot revoke permission.
データベースサーバの記録は、ユーザ tom を権限授与者として記録しているため、
エラーが返され、アクセス権を取り消すことはできません。したがって表の所有者
であっても、他のユーザが付与したアクセス権は取り消せません。
SQL 文
2-357
GRANT 文
ビューに対するアクセス権
ビューに対するアクセス権は、新しく作成された表の場合によくあることですが、
public に自動的に付与されないため、自分が明示的にユーザに付与する必要があり
ます。
ビューを作成するとき、基礎表を所有していないユーザの場合は、少なくともその
表または列の SELECT アクセス権を所有している必要があります。ビューの作成者
が基礎表に対して持っているアクセス権は、表の上に作成されるビューにも適用さ
れます。ビューは表に基づいているため、ビューの所有者は他のアクセス権を持ち
ません。また他のアクセス権を与える権限も持ちません。表に対して DELETE、
INSERT、あるいは UPDATE アクセス権を持っている場合、そのビューを更新でき
ます。
ビューに対するアクセス権を付与または取り消しできるのは、基礎表の所有者であ
る場合か、キーワード WITH GRANT OPTION によって、その基礎表に対するこれ
らのアクセス権を譲渡権付きで受け取っている場合に限ります。ビューに対する
INDEX、ALTER、または REFERENCES アクセス権は付与できません。また All ア
クセス権も INDEX、REFERENCES、ALTER を含んでいるため付与できません。
現行のデータベース内の表だけを参照するビューの場合、ビューの所有者がその
ビューの基礎表に対する SELECT アクセス権を失うと、そのビューは削除されます。
詳細については、ビューの作成についても説明している「CREATE TABLE 文」を
参照してください。
参照
関連する文は、
「CREATE TABLE 文」、
「GRANT FRAGMENT 文」
、「REVOKE 文」、
および「REVOKE FRAGMENT 文」です。
ロールについては、
「CREATE ROLE 文」
、「DROP ROLE 文」、および「SET ROLE
文」を参照してください。
データベースレベルのアクセス権と表レベルのアクセス権の説明については、
『Informix Guide to Database Design and Implementation』を参照してください。
プログラムに GRANT 文や REVOKE 文を埋め込む方法については、
『Informix Guide
to SQL: Tutorial』を参照してください。
2-358 Informix Guide to SQL:Syntax
GRANT FRAGMENT 文
GRANT FRAGMENT 文
+
IDS
GRANT FRAGMENT 文を使用して、断片化された表の個別のフラグメントにアク
セス権 INSERT、UPDATE、DELETE を与えます。
この文は、Dynamic Server でのみ使用できます。この文は、Dynamic Server、
Workgroup Edition と Developer Edition では使用できません。
構文
,
フラグメントレベ
ルのアクセス権
2-361 ページ
GRANT FRAGMENT
ON
<表>
(
<DB 領域 >
)
,
TO
< ユーザ >
' < ユーザ > '
要素
< DB 領域>
<授与者>
WITH GRANT OPTION
目的
フラグメントが格納されている
DB 領域の名前です。
制限
少なくとも一つの DB 領域を
指定しなければなりません。
このパラメータを使用してフラグ 指定された DB 領域は存在し
メントまたは、権限授与されるフ なければなりません。
ラグメントで指定して下さい。
デフォルト値はありません。
指定されたアクセス権の授与者 <授与者>で指定されたユー
として sysfragauth システムカタ ザは有効なユーザでなければ
ログ表の列 grantor にリストさ
なりません。
れるユーザの名前です。
AS
< 授与者 >
構文
識別子、4-112 ページ
識別子、4-112 ページ
デフォルトでは GRANT
FRAGMENT 文を発行するユー
ザがそのアクセス権の授与者に
なります。
(1/2)
SQL 文
2-359
GRANT FRAGMENT 文
要素
<表>
<ユーザ>
目的
アクセス権が授与されるフラグ
メントを含む表の名前です。
デフォルト値はありません。
指定された権限を与えられる
ユーザの名前です。
デフォルト値はありません。
制限
構文
指定された表は存在し、式で断 データベースオブジェ
片化されなければなりません。 クト名、4-25 ページ
<ユーザ>を引用符で囲むと、 識別子、4-112 ページ
そのユーザ名は入力したとお
りに正確に格納されます。
ANSI 準拠データベースでは、
ユーザ名を引用符で囲まない
と、ユーザ名は大文字で格納
されます。
(2/2)
説明
GRANT FRAGMENT 文は GRANT 文と類似しています。どちらの文もユーザにアク
セス権を与えます。GRANT 文は表にアクセス権を与える場合に使用し、GRANT
FRAGMENT 文は表フラグメントにアクセス権を与える場合に使用します。
GRANT FRAGMENT 文を使用して、一つ以上の表フラグメントのアクセス権
INSERT、UPDATE、DELETE を、1 人以上のユーザへ与えることができます。
GRANT FRAGMENT 文は、式方式の分散スキームによって断片化された表に対し
てのみ有効です。式方式の分散スキームについての詳細は、2-8 ページの「ALTER
FRAGMENT 文」を参照してください。
2-360 Informix Guide to SQL:Syntax
GRANT FRAGMENT 文
フラグメントレベルのアクセス権
フラグメントレベルの
アクセス権
GRANT FRAGMENT 文へ戻る
2-359 ページ
ALL
,
INSERT
DELETE
UPDATE
次の表は各フラグメントレベルのアクセス権を定義しています。
アクセス権
機能
ALL
フラグメントに対する挿入、削除、および更新のアクセス権を
与えます。
INSERT
フラグメントに行を挿入できるようにします。
DELETE
フラグメントの行を削除できるようにします。
UPDATE
フラグメントの行を更新し、UPDATE 文で表の任意の列を命名
できるようにします。
フラグメントレベルの権限の定義
ANSI 標準準拠のデータベースでフラグメント表が作成された場合、表の所有者は
新しい表で暗黙のうちにすべての表レベルのアクセス権を受け取りますが、他の
ユーザはアクセス権を受け取りません。
ANSI に標準準拠していないデータベースで断片化された表が作成された場合、表
の所有者は新しい表で暗黙のうちにすべての表レベルのアクセス権を受け取り
PUBLIC である他のユーザは、表に対してデフォルトのアクセス権 SELECT、
UPDATE、INSERT、DELETE、INDEX を受け取ります。PUBLIC に与えられてい
るアクセス権は、システムカタログ表 systabauth に明示的に記録されます。
SQL 文
2-361
GRANT FRAGMENT 文
断片化された表に対して表アクセス権を持っているユーザは、表のすべてのフラグ
メントに対して暗黙のうちにアクセス権を持ちます。これらのアクセス権はシステ
ムカタログ表 sysfragauth には記録されません。
データベースが ANSI 標準準拠しているかどうかにかかわらず、GRANT
FRAGMENT 文を使用して、式方式によって断片化された表の一つ以上のフラグメ
ントに、明示的にアクセス権 INSERT、UPDATE、DELETE を与えることができま
す。GRANT FRAGMENT 文によって与えられたアクセス権は、システムカタログ
表 sysfragauth に明示的に記録されます。
GRANT FRAGMENT 文によって表フラグメントに与えられたアクセス権 INSERT、
UPDATE、DELETE はフラグメントレベルのアクセス権、またはフラグメントレベ
ルの権限として認識されます。
コマンド妥当性検査でのフラグメントレベルの権限の役割
フラグメントレベルの権限によって、たとえユーザが表全体に対してアクセス権
INSERT、UPDATE、DELETE を持っていなくても、表フラグメントで INSERT 文、
UPDATE 文、DELETE 文を実行することができます。表レベルのアクセス権を持っ
ていないユーザでも、権限を与えられたフラグメントで行の挿入、削除、更新を行
うことができます。これはデータベースサーバのコマンドの妥当性を検査するアル
ゴリズムのためです。このアルゴリズムには次の検査が含まれます。
1.
ユーザが INSERT 文、DELETE 文、UPDATE 文を実行すると、データベー
スサーバは、実行した操作に必要な、表に対する権限をユーザが持ってい
るかどうかを最初に調べます。表に対する権限を持っている場合には、処
理は続行されます。
2.
表に対する権限を持っていない場合には、データベースサーバは表が式方
式によって断片化されているかどうか調べます。表が式方式によって断片
化されていない場合には、データベースサーバはユーザにエラーを返しま
す。このエラーは、ユーザがコマンドを実行するアクセス権を持っていな
いことを示しています。
3.
表が式方式によって断片化されている場合には、データベースサーバは、
実行した操作に必要な、フラグメントに対する権限をユーザが持っている
かどうか調べます。フラグメントに対する権限を持っている場合には、処
理は続行されます。フラグメントに対する権限を持っていない場合には、
データベースサーバはユーザにエラーを返します。このエラーは、ユーザ
がコマンドを実行するアクセス権を持っていないことを示しています。
2-362 Informix Guide to SQL:Syntax
GRANT FRAGMENT 文
フラグメントレベルの権限の継続期間
フラグメントレベルの権限の継続期間は、表全体のフラグメンテーションストラテ
ジの継続期間に連動しています。
DROP TABLE 文または ALTER FRAGMENT 文で INIT 節、DROP 節、または
DETACH 節を指定してフラグメンテーションストラテジを削除すると、影響のある
フラグメントのために存在するあらゆる権限も削除されます。同様に、DB 領域を
削除すると、DB 領域に常駐するフラグメントのために存在するあらゆる権限も削
除されます。
ALTER FRAGMENT 文の DETACH 節または INIT 節によって作成された表は、以前
のフラグメントが持っていた、つまり断片化された表の一部であったときに持って
いた権限を保持しません。その代わりに、そのような表はデフォルトの表に対する
権限を使用します。
フラグメントに対する権限が定義されている表が、ラウンドロビンアルゴリズム戦
略の表、または他の式方式による戦略の表に変更された場合も、フラグメントに対
する権限は削除され、表はデフォルトの表に対する権限を使用します。
一つのフラグメント、または一連のフラグメントへのアクセス
権の付与
フラグメントレベルのアクセス権を、表の一つのフラグメントまたは一連のフラグ
メントに与えることができます。
一つのフラグメントへのアクセス権の付与
次の文は、DB 領域 dbsp1 にある表 customer_num のフラグメントに対するアクセス
権 INSERT、UPDATE、DELETE をユーザ larry に与えます。
GRANT FRAGMENT ALL ON customer (dbsp1) TO larry
二つ以上のフラグメントへのアクセス権の付与
次の文は、DB 領域 dbsp1、dbsp2 にある表 customer_num のフラグメントに対する
アクセス権 INSERT、UPDATE、DELETE をユーザ millie に与えます。
GRANT FRAGMENT ALL ON customer (dbsp1, dbsp2) TO millie
SQL 文
2-363
GRANT FRAGMENT 文
表のすべてのフラグメントへのアクセス権の付与
GRANT FRAGMENT 文の代わりに GRANT 文を使用して、表のすべてのフラグメン
トに対するアクセス権を同じユーザに与えることができます。GRANT FRAGMENT
文も同様に使用することができます。
表 customer_num が式方式によって 3 つのフラグメントに断片化され、これらのフ
ラグメントが DB 領域 dbsp1、dbsp2、dbsp3 に常駐しているとします。この場合、
次のいずれかの文を使用して、表のすべてのフラグメントに対するアクセス権
INSERT をユーザ helen に与えることができます。
GRANT FRAGMENT INSERT ON customer (dbsp1, dbsp2, dbsp3)
TO helen;
GRANT INSERT ON customer TO helen;
1 人のユーザ、または一連のユーザへのアクセス権の付与
フラグメントレベルのアクセス権を 1 人、または一連のユーザに与えることができ
ます。
1 人のユーザへのアクセス権の付与
次の文は、DB 領域 dbsp3 にある表 customer_num のフラグメントに対するアクセス
権 INSERT、UPDATE、DELETE をユーザ oswald に与えます。
GRANT FRAGMENT ALL ON customer (dbsp3) TO oswald
一連のユーザに対するアクセス権の付与
次の文は、DB 領域 dbsp3 にある表 customer_num のフラグメントに対するアクセス
権 INSERT、UPDATE、DELETE をユーザ jerome と hilda に与えます。
GRANT FRAGMENT ALL ON customer (dbsp3) TO jerome, hilda
2-364 Informix Guide to SQL:Syntax
GRANT FRAGMENT 文
一つのアクセス権、または一連のアクセス権の付与
GRANT FRAGMENT 文を使用して、フラグメントレベルのアクセス権を指定する
場合、一つのアクセス権、一連のアクセス権、またはすべてのアクセス権を指定す
ることができます。
一つのアクセス権の付与
次の文は、DB 領域 dbsp1 にある表 customer_num のフラグメントに対するアクセス
権 UPDATE をユーザ ed に与えます。
GRANT FRAGMENT UPDATE ON customer (dbsp1) TO ed
一連のアクセス権の付与
次の文は、DB 領域 dbsp1 にある表 customer_num のフラグメントに対するアクセス
権 UPDATE と INSERT をユーザ susan に与えます。
GRANT FRAGMENT UPDATE, INSERT ON customer (dbsp1) TO susan
すべてのアクセス権の付与
次の文は、DB 領域 dbsp1 にある表 customer_num のフラグメントに対するアクセス
権 INSERT、UPDATE、DELETE をユーザ harry に与えます。
GRANT FRAGMENT ALL ON customer (dbsp1) TO harry
WITH GRANT OPTION 節
GRANT FRAGMENT 文で WITH GRANT OPTION 節を指定すると、指定したフラグ
メントレベルのアクセス権がユーザに与えられるとともに、そのユーザは同じアク
セス権を別のユーザに与えることができるようになります。
次の文は、DB 領域 dbsp3 の表 customer_num のフラグメントに対するアクセス権
UPDATE とともに、そのアクセス権を他のユーザに付与する権利もユーザ george
に与えています。
GRANT FRAGMENT UPDATE ON customer (dbsp3) TO george
WITH GRANT OPTION
SQL 文
2-365
GRANT FRAGMENT 文
AS <授与者>節
AS <授与者>節は GRANT FRAGMENT 文ではオプションです。この節は、アクセ
ス権の権限授与者を指定するのに使用します。
AS <授与者>節の指定
GRANT FRAGMENT 文で AS <授与者>節を指定すると、<授与者>のパラメータ
で指定したユーザ名が、システムカタログ表 sysfragauth の授与者の列にアクセス権
の権限授与者として登録されます。
次の例で DBA は、表領域 dbsp3 にある表 customer_num のフラグメントに対するア
クセス権 DELETE をユーザ martha に与えています。GRANT FRAGMENT 文の中で
は、DBA は AS <授与者>節を使用して、ユーザ jack がシステムカタログ表
sysfragauth でアクセス権の授与者として登録しています。
GRANT FRAGMENT DELETE ON customer (dbsp3) TO martha AS jack
AS <授与者>節の省略
GRANT FRAGMENT 文で AS <授与者>節を指定しないと、文を実行した人が、文
で特定されるデフォルトの授与者になります。
次の例でユーザは、DB 領域 dbsp3 にある表 customer_num のフラグメントに対する
アクセス権 UPDATE をユーザ fred に与えています。この文は AS <授与者>節を指
定していないため、この文を実行するユーザが、システムカタログ表 sysfragauth で
アクセス権の授与者としてデフォルトで登録されています。
GRANT FRAGMENT UPDATE ON customer (dbsp3) TO fred
2-366 Informix Guide to SQL:Syntax
GRANT FRAGMENT 文
AS <授与者>節の結果
AS <授与者>節を省くと、または授与者のパラメータに自分のユーザ名を指定す
ると、特定のユーザに与えたアクセス権を後で取り消すことができます。しかし、
特定のユーザに対する特定のアクセス権の授与者として自分自身以外の誰かを指定
した場合には、その授与者のみがユーザのアクセス権を取り消すことができます。
たとえば、DB 領域 dbsp3 にある表 customer_num のフラグメントに対するアクセス
権 DELETE をユーザ martha に与え、アクセス権の授与者としてユーザ jack を指定
すると、ユーザ jack はユーザ martha のアクセス権を取り消すことができますが、
表の作成者はユーザ martha のアクセス権を取り消すことはできません。
参照
関連する文は、
「GRANT 文」と「REVOKE FRAGMENT 文」です。
フラグメントレベルのアクセス権と表レベルのアクセス権の説明については、
『Informix Guide to Database Design and Implementation』を参照してください。
SQL 文
2-367
INFO 文
INFO 文
+
DB
INFO 文を使用して、データベースや表についてのさまざまな情報を表示します。
この文は、DB-Access で使用します。
構文
INFO
TABLES
COLUMNS
FOR
< 表名 >
INDEXES
ACCESS
PRIVILEGES
REFERENCES
STATUS
FRAGMENTS
要素
< 表名 >
目的
制限
構文
情報を検索したい表の名前です。 表が存在しなければなりません。 データベース
オブジェクト名、
4-25 ページ
2-368 Informix Guide to SQL:Syntax
INFO 文
説明
INFO 文にキーワードを使用すると、次の情報が表示できます。
キーワード INFO
表示される情報
TABLES
現行データベース内の表の名前
COLUMNS
指定された表の列情報
INDEXES
指定された表のインデックス情報
FRAGMENTS
表のフラグメントストラテジ
ACCESS
指定された表のユーザアクセス権
PRIVILEGES
指定された表のユーザアクセス権
REFERENCES
指定された表の列の参照アクセス権
STATUS
指定された表の状態情報
キーワード TABLES
現行データベース内の表およびビューの一覧を表示するには、キーワード TABLES
を使用します。キーワード TABLES は、システムカタログ表を表示しません。
表の名前は次のいずれかの方法で表示されます。
■
ユーザが表 cust_calls の所有者であれば、cust_calls と表示されます。
■
ユーザが表 cust_calls の所有者でなければ、たとえば ’june’.cust_calls のよう
に表の所有者名を先頭にして表示されます。
SQL 文
2-369
INFO 文
キーワード COLUMNS
指定された表の列の名前やデータ型、列が NULL 値を許すかどうかを表示するに
は、キーワード COLUMNS を使用します。
キーワード INDEXES
キーワード INDEXES は、指定された表の各インデックスについて、インデックス
名、インデックス所有者、インデックス タイプ 、クラスタ化の有無、およびイン
デックスが設定されている列の名前といった情報を表示するのに使用します。
キーワード FRAGMENTS
キーワード FRAGMENTS を使用して、指定された表のフラグメントが配置されて
いる DB 領域名を表示します。表が式に基づく分散スキームで断片化されている場
合、INFO 文を実行すると式も表示されます。
W/D
キーワード FRAGMENTS は、Dynamic Server、Workgroup Edition と Developer Edition
では使用できません。♦
キーワード ACCESS
指定された表に対するユーザアクセス権を表示するには、キーワード ACCESS また
は PRIVILEGES を使用します。
キーワード REFERENCES
指定された表の列に対するユーザの参照アクセス権を表示するには、キーワード
REFERENCES を使用します。
データベースレベルアクセス権についての情報が必要な場合は、SELECT 文を使用
してシステムカタログ表 sysusers にアクセスしてください。
2-370 Informix Guide to SQL:Syntax
INFO 文
キーワード STATUS
指定された表の所有者、行の長さ、行と列の数、作成日付、および更新記録の状態
を表示するには、キーワード STATUS を使用します。
参照
関連する文は、
「GRANT 文」と「REVOKE 文」です。
DB-Access の SQL メニューまたは TABLE メニューのオプション INFO の説明につ
いては、
『DB-Access User Manual』を参照してください。
SQL 文
2-371
INSERT 文
INSERT 文
INSERT 文を使用して、表またはビューに、一つまたは複数の新しい行を挿入します。
構文
<表>
INSERT INTO
VALUES 節
2-377 ページ
,
< ビュー >
< シノニム >
(
<列>
)
SELECT 文
( サブセット )
2-380 ページ
+
(
< プロシジャ >
EXECUTE PROCEDURE
,
引数
AD/XP
< 外部表 >
,
(
<列>
SELECT 文
( サブセット )
2-380 ページ
)
引数
式
4-33 ページ
< パラメータ >
2-372 Informix Guide to SQL:Syntax
=
SELECT 文
( 単一 )
2-450 ページ
)
INSERT 文
要素
<列名>
目的
新しい列値を受け取る列、または新
しい値を受け取る列のリストの名前
です。
制限
構文
指定する列の数は、VALUES 節 識別子、
または SELECT 文で暗黙的か明 4-112 ページ
示的に指定された値の数に一致
列リストを指定すると、列をリスト していなければなりません。
する順序で値が列に挿入されます。 列リストから列を省略するとそ
列リストを指定しない場合は、表を の列にはデフォルト値が関連付
作成したときまたは最後に変更した けられず、データベースサーバ
ときに確立された列順序で値が列に は INSERT 文を実行するときに
挿入されます。
NULL 値を列に配置します。
データを挿入したい外部表の名前
外部表が存在していなければな データベース
< 外部表 >
オブジェクト名、
です。
りません。
4-25 ページ
< パラメータ > プロシージャに対する入力パラメー 指定されるプロシージャに関す 式、
タの名前です。
る CREATE PROCEDURE 文で、 4-33 ページ
入力パラメータが定義されてい
なければなりません。
プロシジャが存在していなけれ データベース
< プロシジャ > データの挿入に使用されるプロシ
オブジェクト名、
ジャの名前です。
ばなりません。
4-25 ページ
データを挿入したいシノニムの名前 シノニムおよびシノニムが示す データベース
< シノニム >
です。
表が、存在していなければなり オブジェクト名、
ません。
4-25 ページ
データを挿入したい表の名前です。 表が存在していなければなりま データベース
<表>
せん。
オブジェクト名、
4-25 ページ
データを挿入したいビューの名前
ビューが存在していなければな データベース
< ビュー >
オブジェクト名、
です。
りません。
4-25 ページ
説明
INSERT 文を使用して、列値で構成される単一の新規行、または他の表から選択し
たデータを使用する新規行のグループを作成します。
表にデータを挿入するには、その表を所有しているか、またはその表に対して挿入の
アクセス権を持っていなければなりません (2-342 ページの「GRANT 文」を参照 )。
ビューにデータを挿入するには、必要な INSERT アクセス権を持っていなければなり
ません。さらに、そのビューが「ビューによる行の挿入」で説明されている条件を満
たしていることも必要です。
SQL 文
2-373
INSERT 文
データ整合性制約が関連付けられている表にデータを挿入する場合は、そのデータ
も制約の基準を満たしていなければなりません。基準を満たしていない場合は、
データベースサーバはエラーを返します。
検査モードが IMMEDIATE に設定されている実効確認を使用していると、各
INSERT 文の終りで指定されたすべての制約が検査されます。検査モードが
DEFERRED に設定されている場合、トランザクションがコミットされてからすべ
ての制約が検査されます。
列の指定
列を明示的に指定しないと、表が作成された時点か最後に変更された時点での列の
順序でデータが列に挿入されます。列の順序はシステムカタログ表 syscolumns に記
述されています。
E/C
ESQL/C では、DESCRIBE 文を INSERT 文とともに使用して、表の中の列の順序や
データ型を取得することができます。♦
INSERT 文の INTO 節に指定する列の個数は、VALUES 節に設定した値の個数、ま
たは SELECT 文によって返される値の個数と同じでなければなりません。指定は明
示的または暗黙的のどちらでもかまいません。列は、指定された順にデータを受け
取ります。キーワード VALUES 以降に記述した最初の値が指定された列の最初の
列に挿入され、2 番目の値が 2 番目の列に挿入されるというように、指定された個
数分のデータが挿入されます。
ビューによる行の挿入
ある単一表のビューに対して挿入のアクセス権を得ていれば、そのビューを用いて
データを挿入できます。ただし、一つの表からのみ選択処理を行う SELECT 文で、
SELECT 文の定義中に次の要素がないことが条件です。
■
キーワード DISTINCT
■
GROUP BY 節
■
導出値 ( 仮想列 )
■
集約値
ビューに指定されていない基礎表の列はデフォルト値を受け取ります。デフォルト
値が指定されていない場合は NULL 値を受け取ります。デフォルト値が指定されて
いない列のうち一つでも NULL 値を許可しない列があった場合には、この挿入は失
敗になります。
2-374 Informix Guide to SQL:Syntax
INSERT 文
データ整合性制約を使用すると、ビューを定義している SELECT 文に記述されてい
ない基礎表に対してユーザが値を挿入することを防ぐことができます。詳細は、こ
の章の CREATE VIEW 文のキーワード WITH CHECK OPTION の説明を参照してく
ださい (2-230 ページ )。
一つの表に複数のユーザがデータを入力している場合は、USER 関数を使用すると
各ユーザのビューを制限して自分が挿入した特定の行だけを見ることができます。
次の例は、ビューおよびこの効果を実現する INSERT 文を示します。
CREATE VIEW salary_view AS
SELECT lname, fname, current_salary
FROM salary
WHERE entered_by = USER
INSERT INTO salary
VALUES ('Smith', 'Pat', 75000, USER)
E/C
カーソルによる行の挿入
ESQL/C では、カーソルを INSERT 文と関連付けるときは、OPEN 文、PUT 文、
CLOSE 文を使用して挿入操作を実行します。トランザクション付きの ANSI 標準準
拠ではないデータベースの場合は、トランザクション内部でこれらの文を実行して
ください。
INSERT 文と関連付けられたカーソルを使用すると、行はディスクに書き込まれる前
にバッファに入ります。この挿入バッファは次の条件のもとでフラッシュ されます。
■
バッファがいっぱいになった。
■
FLUSH 文が実行された。
■
CLOSE 文が実行されてカーソルがクローズされた。
■
ANSI 標準に準拠していないデータベースで、OPEN 文が暗黙的にカーソル
をクローズしてから再度オープンした。
■
COMMIT WORK 文が実行されてトランザクションが終了した。
挿入バッファがフラッシュされるとき、クライアントプロセッサは、行をデータ
ベースサーバに送信する前に適切なデータ変換を行います。データベースサーバ
は、このバッファを受け取ると、それらの行を一括してデータベースに挿入しま
す。データベースサーバがバッファ内部の行をデータベースに挿入しているときに
エラーが発生すると、バッファ内部のそれ以降の行は廃棄されます。
SQL 文
2-375
INSERT 文
トランザクションなしのデータベースに対する行の挿入
トランザクションなしのデータベースに行を挿入する場合は、失敗後に挿入済みの
行を復元するときに明示的なアクションをとらなければなりません。たとえば、一
部の行を挿入した後で INSERT 文が失敗した場合、正常に挿入された行は表に残り
ます。挿入に失敗しても、表を自動的に復旧することはできません。
トランザクション付きのデータベースに対する行の挿入
トランザクション付きのデータベースに行を挿入していて、トランザクションを明
示的に使用している場合は、ROLLBACK WORK 文を使用して挿入を取り消すこと
ができます。BEGIN WORK 文を実行しないで挿入を行っていて挿入に失敗すると
データベースサーバは、挿入開始以降に行われたデータベースに対する変更を自動
的にロールバックします。
ANSI
ANSI 標準準拠のデータベースに行を挿入している場合、トランザクションは暗黙の
うちに開始され、データベースに対するすべての変更はトランザクション内で行わ
れます。この場合に INSERT 文が失敗しても、ROLLBACK WORK 文を使用して挿
入を取り消すことができます。
データベースサーバを使用する場合は、明示的に開始されたトランザクション中に
更新が失敗すると、データベースサーバによって自動的に更新結果が取り消されま
す。♦
AD/XP
Dynamic Server with AD and XP Options を使用している場合は、RAW 表型で作成する
表はまったくログされません。したがって、データベースがログ機能を使用してい
る場合でも、RAW 表は回復不可能です。RAW 表についての詳細は、
『Informix
Guide to SQL: Reference』を参照してください。♦
トランザクション内で挿入する行は、そのトランザクションが終了するまでロック
されます。トランザクションの終了は、すべての変更がデータベースに反映される
COMMIT WORK 文か、いかなる変更もデータベースに反映されない ROLLBACK
WORK 文のどちらかです。一つの INSERT 文によって影響をうける行数が多くなり
すぎると、同時に使用できるロック数を超えることがあります。このような状況を
防ぐためには、1 回のトランザクションでの挿入行数を少なくするか、INSERT を
実行する前にページまたは表全体をロックしてください。
2-376 Informix Guide to SQL:Syntax
INSERT 文
VALUES 節
VALUES 節
INSERT 文へ戻る
2-372 ページ
,
VALUES
(
E/C
)
< 入力変数 >
:
< 標識変数 >
$
< 標識変数 >
+
NULL
USER
リテラル番号
4-138 ページ
引用符付き文字列
4-156 ページ
+
リテラル日時
(DATETIME) 型
4-132 ページ
リテラル時間隔
(INTERVAL) 型
4-135 ページ
TODAY
CURRENT
SITENAME
DBSERVERNAME
SQL 文
2-377
INSERT 文
要素
< 標識変数 >
< 入力変数 >
目的
制限
ESQL/C プログラムの SQL 文が ESQL/C の標識変数に適用され
る制限については、
NULL 値を < 入力変数 > にい
つ戻すかを示すプログラム変数 『INFORMIX-ESQL/C
です。
Programmer’s Manual』を参照し
てください。
列に挿入される値を指定するホ < 入力変数 > には、VALUES 節
スト変数です。
にリストされている他の任意の
値オプションを指定することが
できます (NULL、リテラル番号
など )。
構文
名前が変数名のため
の言語に固有の規則
に従っていなければ
なりません。
名前が変数名のため
の言語に固有の規則
に従っていなければ
なりません。
VALUES 節を使用するときは、1 回に 1 行だけを挿入することができます。キー
ワード VALUES の後に続く値が、INTO 節で指定されている対応する列に割り当て
られます。列の並びが指定されていない場合は、デフォルトの列の順序で割り当て
られます。
単一引用符付き文字列を列に挿入する場合、その文字列の最大長は 256 バイトで
す。256 バイトより長い文字列を挿入するとエラーになります。
E/C
ESQL/C では、変数を使用している場合は、256 バイトより長い引用符付き文字列を
表に挿入できます。♦
VALUES 節で使用するキーワードについての説明は、4-47 ページの「定数式」を参
照してください。
値と列のデータ型との互換性
挿入する値のデータ型は、それを受け入れる列のデータ型と同じである必要はあり
ませんが、値のデータ型と列のデータ型に互換性がなければなりません。文字
(CHAR) 型列には文字だけが挿入でき、数値型列には数値または数値データを表す
文字だけを挿入できます。次の例では、表 customer の列に値を挿入します。
INSERT INTO customer
VALUES (0, 'Nadia', 'Broadam', 'Ski & Stuff',
'89 Coniston Road', NULL, 'Short Hills',
'NJ', '07079', '201-457-4100')
2-378 Informix Guide to SQL:Syntax
INSERT 文
データベース サーバは、できる限りのデータ変換を実行します。データが変換でき
ない場合、挿入操作は失敗します。指定された値をターゲット データ型で保持でき
ない場合も、データ変換は失敗します。たとえば整数 123456 は、小桁整数
(SMALLINT) 型データとして定義された列には挿入できません。なぜなら、この
データ型には値が大きすぎるからです。
シリアル (SERIAL) 型列への値の挿入
連続するシリアル値を表のシリアル (SERIAL) 型列に挿入する場合は、INSERT 文
のシリアル (SERIAL) 型列にゼロを挿入します。シリアル (SERIAL) 型列にゼロが設
定されていると、データベース サーバは次に高い値を割り当てます。シリアル
(SERIAL) 型列に明示的な値を挿入したい場合は、まずゼロ以外の挿入したい値が
表にすでにある値と重複しないことを確認してから、その値を指定します。シリア
ル (SERIAL) 型列が一意にインデックス付けされているか、または一意性制約が設
定されている場合に、表にすでにある値と重複する値を挿入しようとするとエラー
になります。シリアル (SERIAL) データ型についての詳細は、『Informix Guide to
SQL: Reference』を参照してください。
VALUE 節での関数の使用
現在の日付、日時、現行ユーザのログイン名、または現行データベースのデータ
ベース サーバ名を列に挿入できます。キーワード TODAY は、システム日付を戻し
ます。キーワード CURRENT は、システム日時を戻します。キーワード USER は、
現行ユーザのログイン アカウント名が入った 8 文字の文字列を戻します。
DBSERVERNAME 関数または SITENAME 関数は、現行データベースが置かれた
データベース サーバ名を戻します。次の例では、キーワード CURRENT とキー
ワード USER を使用して、表 cust_calls に新規行を挿入します。
INSERT INTO cust_calls (customer_num, call_dtime, user_id,
call_code, call_descr)
VALUES (212, CURRENT, USER, 'L', '2 days')
VALUE 節で使用できるキーワードについての説明は、4-47 ページの「定数式」を
参照してください。
SQL 文
2-379
INSERT 文
VALUES 節による NULL 値の挿入
INSERT 文を実行すると、値を設定していない列や明示的に指定されていない列に
対して NULL 値が挿入されます。また、キーワード NULL を使用して列に NULL
値を割り当てることもできます。次の例では、表 orders の 3 つの列に値が挿入され
ています。
INSERT INTO orders (orders_num, order_date, customer_num)
VALUES (0, NULL, 123)
この例では、明示的に列 order_date に NULL 値が入力されています。更に INSERT
INTO 節に明示的に指定されていない表 orders の他のすべての列にも、暗黙的に
NULL 値が入力されます。
SELECT 文のサブセット
挿入データが別の表、または複数の別の表から選択される場合のみ、SELECT 文で
得た行の値を表に挿入できます。つまり、列を挿入する表からはデータを選択でき
ません。
この SELECT 文に行を返さない WHERE 節が含まれていると、ANSI 標準準拠の
データベースの場合、sqlca 構造体は SQLNOT-FOUND(100) を返します。ANSI 標準
準拠のデータベースでない場合、sqlca はゼロ (0) を返します。PREPARE 文で処理
された複数の文の一部を挿入しようとしても何も行が挿入されないと、sqlca 構造体
は、ANSI 標準準拠のデータベースと ANSI 標準準拠でないデータベースのどちら
の場合でも SQLNOTFOUND(100) を返します。
SELECT 文の節およびオプションのすべてが INSERT 文の中で使用できるわけではあ
りません。SELECT 文の構文についての詳細は、2-450 ページを参照してください。
2-380 Informix Guide to SQL:Syntax
INSERT 文
次の SELECT 文の節は使用できません。
IDS
AD/XP
■
FIRST 節
✮
INTO TEMP 節
■
ORDER BY 節
■
UNION 演算子 (Dynamic Server) ♦
外部表の使用
Dynamic Server with AD and XP Options において、外部表を含むロード操作またはア
ンロード操作の一部として SELECT 文を使用するときは、次の制限に注意してくだ
さい。
■
FROM 節では、外部表を一つだけ使用できます。
■
有効な SQL 節は
SELECT 副問合せには INTO 節を含むことはできませんが、
どれでも含むことができます。
データベースから外部表にデータを移動するときは、SELECT 文で外部表のすべて
の列を定義しなければなりません。SELECT 文には、FIRST、FOR UPDATE、
INTO、INTO SCRATCH、または INTO TEMP の各節を含むことはできません。ただ
し ORDER BY 節を使用して、ファイル間で順序付けられた複数ファイルを作成す
ることはできます。
E/C
動的管理文としての INSERT の使用
ESQL/C では、コンパイル時にはデータの構造がわからない場合に、INSERT 文を
使用して、そのようなデータが挿入可能なコードを作成する必要のある状態が処理
できます。
詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』の動的管理に関する部分を
参照してください。
SQL 文
2-381
INSERT 文
ストアド プロシジャを使用したデータの挿入
プロシジャ呼出しの結果得られたデータの行を、表に挿入できます。
プロシジャが返す値は、その数とデータ型が列リストで予定されているものと一致
しなければなりません。列の数とデータ型は、列リストが予定しているものと一致
しなければなりません。
参照
関連する文は、
「SELECT 文」
、「DECLARE 文」
、「DESCRIBE 文」
、「EXECUTE 文」
、
「FLUSH 文」、
「OPEN 文」
、「PREPARE 文」、
「CREATE EXTERNAL TABLE 文」、お
よび「PUT 文」です。
表へのデータの挿入に関するタスク指向についての説明は、
『Informix Guide to SQL:
Tutorial』を参照してください。
『Informix Guide to GLS Functionality』を
INSERT 文の GLS の観点からの説明は、
参照してください。
2-382 Informix Guide to SQL:Syntax
LOAD 文
LOAD 文
+
DB
LOAD 文を使用して、オペレーティングシステムのテキストファイルから既存の
表、シノニム、ビューへデータを挿入します。
SQLE
この文は、DB-Access および SQL エディタで使用します。
構文
LOAD FROM
' < ファイル名 > '
INSERT INTO
<表>
,
< ビュー >
<区切り記号>
目的
ロード操作中にロードファイ
ルからデータ値を受け取る列
の名前です。
< シノニム >
)
要素
<列>
' < 区切り記号 > '
制限
データをすべての列にロードす
るわけではない場合は、データ
を受け取る列を指定しなければ
なりません。また、ロードファ
イル内のフィールドの順序が、
表内の列のデフォルト順序 ( 表
の作成時に確立される順序 ) に
一致しない場合も列を指定しな
ければなりません。
ロード ファイルの各行で
次の文字は、区切り記号文字と
データ値を区切るために使用 して使用できません。半角円記
する文字を識別する引用符付 号 (¥)、復帰改行文字 (=CTRLき文字列です。
J)、および 16 進数字 (0-9、a-f、
デフォルトの区切り記号は、 A-F)。
環境変数 DBDELIMITER に
設定された文字です。
DBDELIMITER が設定されて
いない場合、デフォルトの区
切り記号は縦棒 (|) です。
<列>
(
DELIMITER
構文
識別子、
4-112 ページ
引用符付き
文字列、
4-156 ページ
(1/2)
SQL 文
2-383
LOAD 文
要素
<ファイル名>
< シノニム >
<表>
< ビュー >
目的
ロードファイルのパス名と
ファイル名を識別する引用符
付き文字列です。
制限
<列>パラメータに列のリスト
をインクルードしない場合は、
ロードファイル内のフィールド
ロードファイルには、指定さ が表に対して指定された列に、
れた表またはビューにロード 数、順序、型について一致して
いなければなりません。
されるデータが入ります。
各行の同じ数のフィールド、
LOAD FROM ファイルのデ
フォルトパス名は、カレント フィールド長と列長の関係、
ファイル内のデータ型の表現、
ディレクトリです。
および、特定の文字と半角円記
号 ( ¥ ) の組合せに関する制限と
可変長文字 (VARCHAR) 型デー
タおよび BLOB 型データの特殊
ルールにも従わなければなりま
せん。これらの制限の詳細につ
いては、2-385 ページの「LOAD
FROM ファイル」を参照してく
ださい。
データを挿入したいシノニム シノニムおよびシノニムが示す
の名前です。
表が存在していなければなりま
せん。
データを挿入したい表の名前 表が存在していなければなりま
です。
せん。
データを挿入したいビューの ビューが存在していなければな
名前です。
りません。
構文
引用符付き
文字列、
4-156 ページ。
引用符付き文字列で
指定するパス名と
ファイル名は、使用
するオペレーティン
グシステムの規約に
従っていなければな
りません。
データベース
オブジェクト名、
4-25 ページ
データベース
オブジェクト名、
4-25 ページ
データベース
オブジェクト名、
4-25 ページ
(2/2)
説明
LOAD 文は、新しい行を表に追加します。既存のデータが上書きされることはあり
ません。
既存の行と同じキーを持つ行は追加できません。
LOAD 文を使用するには、データを挿入したい表に対して挿入のアクセス権を得て
いなければなりません。データベースレベルおよび表レベルのアクセス権について
の詳細は、2-342 ページの「GRANT 文」を参照してください。
2-384 Informix Guide to SQL:Syntax
LOAD 文
LOAD FROM ファイル
LOAD FROM ファイルとは表に追加するデータを含んでいるファイルのことです。
UNLOAD 文によって作成されたファイルは LOAD FROM ファイルとして使用でき
ます。
INSERT 文の INTO 節に列を指定しない場合は、ファイル内のフィールドの数、順
序およびデータ型が、指定された表の列と一致しなければなりません。
ファイル内の各行は同じ数のフィールドを持っていなければなりません。フィール
ドの長さは、対応する列に指定されている長さ以下に定義しなければなりません。
対応する列のデータ型に変換できる値のみを指定してください。次に、データベー
スサーバにおける LOAD ファイル内のデータ型を示します ( デフォルトロケールと
してアメリカ英語を使用する場合 )。
データ型
入力フォーマット
空白
区切り記号間の一つ、または、複数の空白文字。
文字 (CHARACTER) 型列に対応しないフィールドには先
行空白をインクルードすることができます。
日付 (DATE) 型
mm/dd/yyyy というフォーマットの文字列。
月は 2 桁の数字で表さなければなりません。20 世紀の年に
は 2 桁の数字を使用することができます ( 環境変数
DBCENTURY で別の世紀のアルゴリズムを指定できます )。
値は実際の日付になっていなければなりません。たとえば、
February 30 は不正な値です。環境変数 DBDATE および
GL_DATE で異なる日付フォーマットを指定することがで
きます。
金額 (MONEY) 型
先頭の通貨記号 ($)、3 桁区切り記号としてカンマ (,)、小
数点記号としてピリオド (.) 通貨表記を含めることができ
る値。
環境変数 DBMONEY でこの表記を指定すれば、別の通貨
表記を使用できます。
(1/2)
SQL 文
2-385
LOAD 文
データ型
入力フォーマット
NULL 値
区切り記号の間に何もない状態。
TIME 型
year-month-day hour:minute:second.fraction というフォー
マットの文字列。
日時 (DATETIME) 型値または時間隔 (INTERVALS) 型値
に対して型指定または修飾子を使用することはできませ
ん。年は 4 桁の数字、月は 2 桁の数字でなければなりま
せん。環境変数 GL_DATETIME または環境変数 DBTIME
によって、別の日付と時刻のフォーマットを指定できま
す。
(2/2)
環境変数 DB についての詳細は、
『Informix Guide to SQL: Reference』を参照してくだ
さい。環境変数 GL についての詳細は、『Informix Guide to GLS Functionality』を参照
してください。
GLS
デフォルト以外のロケールを使用している場合、LOAD FROM ファイルの日付
(DATE) 型、日時 (DATETIME) 型、金額 (MONEY) 型、および数値列の値は、これ
らのデータ型についてロケールがサポートするフォーマットと互換性が必要です。
詳細は『Informix Guide to GLS Functionality』を参照してください。♦
2-386 Informix Guide to SQL:Syntax
LOAD 文
フィールドの値の一部として次の特殊文字を指定する場合は、その文字の前に半角
円記号 (¥) を付けなければなりません。
■
半角円記号
■
区切り記号
■
可変長文字 (VARCHAR) 型列または各国語可変長文字 (NVARCHAR) 型列の
値の中の復帰改行文字
■
テキスト (TEXT) 型値の終りの復帰改行文字
半角円記号をフィールド区切り記号として使用しないでください。半角円記号に
は、次の文字をデータの一部として解釈するように LOAD 文に指示するエスケープ
文字としての機能があります。
文字 (CHARACTER) 型列に対応するフィールドには、そのフィールドに対する最大
値として定義されている数より多くの文字を格納することができます。外字は無視
されます。
バイト (BYTE) 型、テキスト (TEXT) 型、または可変長文字 (VARCHAR) 型の各
データ型を含むファイルをロードする場合は、次の点に注意してください。
■
(可変長文字(VARCHAR)を含む)LOAD文のデータの文字フィールドが列サ
イズより長いと、余分な文字は無視されます。
■
バイト(BYTE)フィールドに先行または後書きの空白を入れることはできま
せん。
■
半角円記号 (¥) を使用して、可変長文字 (VARCHAR) およびテキスト (TEXT)
を含む、すべての文字フィールドの埋込み区切り記号および半角円記号を
エスケープします。
■
バイト (BYTE) 列にロードされるデータは、
ASCII 16 進数形式でなければな
りません。バイト (BYTE) 列には先行空白を入れることはできません。
■
ファイル LOAD FROM では、次の文字を区切り記号文字として使用しない
でください。0 から 9、a から f、A から F、半角円記号、復帰改行文字。
SQL 文
2-387
LOAD 文
次の例は、new_custs という入力ファイルの内容を示しています。
0|Jeffery|Padgett|Wheel Thrills|3450 El Camino|Suite 10|Palo Alto|CA|94306||
0|Linda|Lane|Palo Alto Bicycles|2344 University||Palo Alto|CA|94301|(415)3236440
このデータファイルから次のようなことがわかります。
■
シリアル (SERIAL) 型のフィールドにはゼロ (0) を指定しています。
■
デフォルトの区切り記号である縦棒 ( | ) を使用しています。
■
最初の行のフィールド phone と 2行目のフィールド address2 に、
NULL 値を設
定しています。NULL 値は、二つの区切り記号の間に何も表示されないこ
とで示されます。
次の文は、ファイル new_custs からユーザ jason が所有する表 customer に値を
ロードします。
LOAD FROM 'new_custs' INSERT INTO jason.customer
DELIMITER 節
DELIMITER 節を使用して、入力ファイル内の行の各列に格納されているデータを
区切るための区切り記号を指定します。区切り記号としてタブ (Ctrl-I)、または空白
(ASCII コード 32)を指定することができます。次の文字は区切り記号として使用
できません。
■
半角円記号 (¥)
■
復帰改行文字 (CTRL-J)
■
16 進数字 (0 ∼ 9、a ∼ f、A ∼ F)
この節を省略すると、データベースサーバは環境変数 DBDELIMITER を調べます。
環境変数 DBDELIMITER の設定方法についての詳細は『Informix Guide to SQL:
Reference』を参照してください。
次の文では区切り記号としてセミコロン (;) を指定しています。この例は、
Windows NT のファイル命名規則に従っています。
LOAD FROM 'C:¥data¥loadfile' DELIMITER ';'
INSERT INTO orders
2-388 Informix Guide to SQL:Syntax
LOAD 文
INSERT INTO 節
INSERT INTO 節を使用して、新しいデータをロードする表、シノニム、ビューを指
定できます。次のいずれかの場合には、列名を必ず指定して行を挿入してください。
■
すべての列ではなく、行の一部の列に対してのみデータを追加する。
■
入力ファイルに格納されているフィールドデータが、表が作成されたとき
に決定された列のデフォルトの順序と一致しない。
次の例では、列 price と列 discount が、データを追加する唯一の列として識別され
ます。この例は、Windows NT の命名規則に従っています。
LOAD FROM 'C:¥tmp¥prices' DELIMITER ','
INSERT INTO norman.worktab(price,discount)
参照
関連する文は、
「UNLOAD 文」と「INSERT 文」です。
LOAD 文およびデータを移動するためのその他のユーティリティのタスク指向の説
明については、
『Informix Migration Guide』を参照してください。
『Informix Guide to GLS Functionality』を
GLS 環境での LOAD 文の使用については、
参照してください。
SQL 文
2-389
LOCK TABLE 文
+
LOCK TABLE 文
LOCK TABLE 文を使用して、他のプロセスによる表へのアクセスを制御します。
構文
< 表名 >
LOCK TABLE
IN
< シノニム >
要素
< シノニム >
目的
ロックされる表のシノニムの名
前です。
< 表名 >
ロックされる表の名前です。
SHARE
MODE
EXCLUSIVE
制限
シノニム、およびシノニムが示
す表が存在していなければなり
ません。
排他モードでは、LOCK TABLE
文を実行する前に、他のプロセ
スが表をロックすることはでき
ません。
構文
データベース
オブジェクト名、
4-25 ページ
データベース
オブジェクト名、
4-25 ページ
共有モードでは、LOCK TABLE
EXCLUSIVE 文を実行する前に、
他のプロセスが表をロックする
ことはできません。
説明
表の所有者である場合、または表か表の列に対して直接的な付与または PUBLIC へ
の付与により選択アクセス権を得ている場合に、表をロックできます。その表がす
でに他のプロセスによって排他モードでロックされている場合や、他のユーザが共
有モードで表をロックしている間に排他ロックをかけようとした場合、LOCK
TABLE 文は失敗します。
キーワード SHARE を使うと、表は共有モードでロックされます。共有モードでは
他プロセスによる表の読込みアクセスは許可されますが、書込みアクセスは拒否さ
れます。表が共有モードでロックされている場合、他プロセスからのデータの更新
や削除はできません。
2-390 Informix Guide to SQL:Syntax
LOCK TABLE 文
キーワード EXCLUSIVE を使うと、表は排他モードでロックされます。排他モード
では、他のプロセスによる表に対する読込みアクセス、書込みアクセスの両方が拒
否されます。
ALTER INDEX 文、CREATE INDEX 文、DROP INDEX 文、RENAME COLUMN 文、
RENAME TABLE 文、ALTER TABLE 文を実行すると、表は自動的に排他モードで
ロックされます。
トランザクション付きのデータベース
データベースがトランザクション付きで作成されている場合、LOCK TABLE 文は
トランザクション内で実行された場合にのみ成功します。このため、LOCK TABLE
文を実行する前に BEGIN WORK 文を実行してください。
ANSI
ANSI 標準準拠のデータベースでは、トランザクションは暗黙的に開始されます。指
定した表が他のプロセスによってロックされていなければ、LOCK TABLE 文は、
成功します。 ♦
LOCK TABLE 文をトランザクション内で使用する場合は次の点に注意してください。
■
システムカタログ表をロックすることはできません。
■
トランザクション内で、表に対するロックの共有モードと排他モードを切
り替えることはできません。たとえば、いったん共有モードで表をロック
すると排他モードにアップグレードすることができません。
■
表の行にアクセスする前に LOCK TABLE 文を実行すると、この表に対して
行ロックは設定されません。このように行レベルロックを無視することに
より、データベースサーバ構成で定義されている最大ロック数を超えてし
まう状況の発生を防止できます。
■
トランザクションが完了すると、行と表に対するすべてのロックが自動的
に解放されます。トランザクションを使用するデータベースで UNLOCK
TABLE 文を実行すると失敗することに注意してください。
次の例では、トランザクションログ機能付きで作成されたデータベースの中で、表
のロックモードを変更する方法を示しています。
BEGIN WORK
LOCK TABLE orders IN EXCLUSIVE MODE
...
COMMIT WORK
BEGIN WORK
LOCK TABLE orders IN SHARE MODE
...
COMMIT WORK
SQL 文
2-391
LOCK TABLE 文
トランザクションなしのデータベース
トランザクションなしで作成されたデータベースでは、LOCK TABLE 文を使用し
て設定された表ロックは、次のいずれかの状況が発生すると解除されます。
■
UNLOCK TABLE 文が実行された。
■
ユーザがデータベースをクローズした。
■
ユーザがアプリケーションを終了した。
表に対するロックモードを変更するには、UNLOCK TABLE 文を使用してロックを
解除してから、新たに LOCK TABLE 文を実行してください。
次の例では、トランザクションなしで作成されたデータベースの中で、表のロック
モードを変更する方法を示しています。
LOCK TABLE orders IN EXCLUSIVE MODE
.
.
.
UNLOCK TABLE orders
.
.
.
LOCK TABLE orders IN SHARE MODE
参照
関連する文は、
「BEGIN WORK 文」、
「COMMIT WORK 文」
、「ROLLBACK WORK
文」
、「SET ISOLATION 文」
、「SET LOCK MODE 文」
、「UNLOCK TABLE 文」です。
同時実行と表のロックについての詳細は、
『Informix Guide to SQL: Tutorial』を参照
してください。
2-392 Informix Guide to SQL:Syntax
OPEN 文
E/C
OPEN 文
OPEN 文を使用して EXECUTE PROCEDURE 文、INSERT 文、または SELECT 文に
関連するカーソルを起動し、これによって EXECUTE PROCEDURE 文、INSERT
文、または SELECT 文の実行を開始します。
この文は、ESQL/C で使用します。
構文
OPEN
< カーソル変数 >
+
< カーソル識別子変数 >
WITH REOPTIMIZATION
,
USING
< パラメータ変数 >
SQL DESCRIPTOR
' < 記述子 > '
< 記述子変数 >
DESCRIPTOR
要素
<カーソル
識別子>
<カーソル
識別子変数>
<記述子>
<sqlda ポインタ >
目的
カーソルの名前です。
制限
カーソルは DECLARE 文で事前に作成
しておかなければなりません。
< カーソル識別子 > の値を ホスト変数は文字 (CHARACTER) 型で
保持するホスト変数です。 なければなりません。
システム記述子領域を識
別する引用符付き文字列
です。
カーソルは DECLARE 文で事前に作成
しておかなければなりません。
システム記述子領域は事前に割り当て
ておかなければなりません。
構文
識別子、
4-112 ページ
名前は言語に特定
の変数名のルール
に従っていなけれ
ばなりません。
引用符付き文字列、
4-156 ページ
(1/2)
SQL 文
2-393
OPEN 文
要素
目的
<記述子変数> システム記述子領域を識
別するホスト変数です。
<パラメータ その内容によって
変数>
PREPARE 文で処理した文
の疑問符位置指定子を置
き換えるホスト変数です。
< sqlda ポイン PREPARE 文で処理した文
タ>
での疑問符位置指定子に相
当する値のデータ型とメモ
リ位置を定義する sqlda 構
造体のポインタです。
制限
システム記述子領域は事前に割り当て
ておかなければなりません。
変数名は文字 (CHARACTER) 型または
コレクョン型でなければなりません。
構文
引用符付き文字列、
4-156 ページ
名前は言語に特定
の変数名のルール
に従っていなけれ
ばなりません。
sqlda 構造体の先頭にドル記号やコロン DESCRIBE 文、
を付けてはなりません。
2-262 ページ
動的 SQL 文を使用する場合は sqlda 構
造体を使用しなければなりません。
(2/2)
説明
OPEN 文を使用して、宣言されたカーソルをオープンし、関連する EXECUTE
PROCEDURE 文、INSERT 文、または SELECT 文をデータベース サーバに渡して実
行を開始します。プログラムが必要な行をすべて抽出、または挿入してから、
CLOSE 文によりカーソルをクローズします。
データベース サーバが実行する特定の動作は、カーソルが関連付けられた文により
異なります。
EXECUTE PROCEDURE 文、INSERT 文、または SELECT 文をカーソルに直接関連
付けるとき ( つまり PREPARE 文により文を処理しないで文識別子をカーソルに関
連付けるとき ) は、OPEN 文が暗黙的に文を処理します。
ANSI
ANSI 標準準拠のデータベースでは、すでにオープンされているカーソルをオープン
しようとするとエラーメッセージが表示されます。 ♦
SELECT カーソルのオープン
SELECT...FOR UPDATE 構文で作成された SELECT カーソルまたは UPDATE 文を
オープンすると、USING 節に指定された値とともに SELECT 文がデータベース
サーバに渡されます ( この SELECT 文があらかじめ PREPARE 文で処理されていた
場合には、その時点でデータベースサーバに渡されています )。データベースサー
バは、アクティブセットの最初の行の位置付けまたは構築の時点まで問合せを処理
します。
2-394 Informix Guide to SQL:Syntax
OPEN 文
SELECT カーソルのオープンの例
次の例は、ESQL/C での単純な OPEN 文を示しています。
EXEC SQL declare s_curs cursor for
select * from orders;
EXEC SQL open s_curs;
トランザクション内での UPDATE カーソルのオープン
明示的なトランザクション付きのデータベースで作業している場合は、トランザク
ションの中で UPDATE カーソルをオープンしてください。ただし、そのカーソル
をキーワード WITHHOLD を使用して宣言している場合は、この条件の限りではあ
りません。
PROCEDURE カーソルのオープン
PROCEDURE かカーソルをオープンすると、USING 節に指定された値とともに
EXECUTE PROCEDURE 文がデータベースサーバに渡されます。この値は引数とし
てストアドプロシジャに渡され、プロシジャはこの値を受け取るように宣言されな
ければなりません ( この EXECUTE PROCEDURE 文があらかじめ PREPARE 文で処
理されていた場合は、その時点でデータベースサーバに渡されています )。データ
ベースサーバは、プロシジャによって戻される値の最初のセットの時点までプロシ
ジャを実行します。
次の例は、ESQL/C での単純な OPEN 文を示しています。
EXEC SQL declare s_curs cursor for
execute procedure new_proc();
EXEC SQL open s_curs;
SQL 文
2-395
OPEN 文
SELECT カーソルおよび PROCEDURE カーソルに関連する
エラー
データベース サーバは初めて問合せを調べるので、ここで多数のエラーが検出され
ます。データベース サーバは実際にはデータの最初の行を返さず、sqlca のフィー
ルド sqlca.sqlcode,SQLCODE に復帰コードを設定します。次の表に示すように、復
帰コードの値は負またはゼロです。
復帰コード値
意味
負
SELECT 文でエラーが検出されたことを示します。
ゼロ
SELECT 文が有効であることを示します。
SELECT 文、SELECT...FOR UPDATE 文、または EXECUTE PROCEDURE 文が有効
であっても、その基準と一致する行が見つからない場合は、最初の FETCH 文で行
が見つからなかったことを意味する値 100(SQLNOTFOUND) を返します。
ヒント : SQLCODE エラーが発生した場合、対応する SQLSTATE エラーの値が存
在している可能性があります。メッセージテキストを取得する方法の詳細は、GET
DIAGNOSTICS 文を参照してください。
INSERT カーソルのオープン
INSERT カーソルをオープンすると、このカーソルによって INSERT 文がデータ
ベースサーバに渡され、データベースサーバは、キーワードおよび列名が有効かど
うかを検査します。また、データベースサーバは、新しいデータを保持する
INSERT バッファのためのメモリも割り当てます。2-241 ページの「DECLARE 文」
を参照してください。
INSERT 文に関する OPEN 文では、USING 節は使用できません。
次の ESQL/C プログラムには、INSERT カーソルを伴う OPEN 文が示されています。
EXEC SQL prepare s1 from
'insert into manufact values ('npr', 'napier')';
EXEC SQL declare in_curs cursor for s1;
EXEC SQL open in_curs;
EXEC SQL put in_curs;
EXEC SQL close in_curs;
2-396 Informix Guide to SQL:Syntax
OPEN 文
SELECT カーソルまたは PROCEDURE カーソルの
再オープン
USING 節の中で指定された値は、カーソルがオープンされたときだけ評価されま
す。カーソルがオープンされている間は、USING 節の中のプログラム変数に対する
その後の変更では、選択された行のアクティブ セットは変更されません。その後に
OPEN 文がカーソルをクローズしてこれを再オープンするまで、またはプログラム
がオープン カーソルをクローズしてアクティブ セットを解放するまでは、アク
ティブ セットは一定の値を維持します。
カーソルを再オープンすると、変数の現行値に基づく新しいアクティブ セットが作
成されます。前の OPEN 文以降にプログラム変数が変更されている場合、カーソル
を再オープンするとまったく別のアクティブ セットが作成されます。変数の値に変
更がない場合でも、次の場合に、アクティブ セットの中の行が別のものになる可能
性があります。
■
前の OPEN 文以降に表内のデータが変更され
SELECT カーソルについては、
ていた場合。
■
PROCEDURE カーソルについては、プロシジャが前の OPEN 文とは異なる
実行パスを使用する場合。
INSERT カーソルの再オープン
すでにオープンしている INSERT カーソルを再オープンすると、INSERT バッファ
がフラッシュされ、INSERT バッファに格納されている行がすべて表に書き込まれ
ます。データベースサーバは、最初にカーソルをクローズし、フラッシュを実行し
てからカーソルを再オープンします。エラー検査および挿入行のカウントの方法に
ついての詳細は、2-417 ページの「PUT 文」を参照してください。
USING 節
疑問符 (?) で記述する位置指定子を含む SELECT 文を、PREPARE 文で処理して
カーソルと関連付けるときは、USING 節を使用する必要があります (2-403 ページ
の「PREPARE 文」を参照 )。次の二つの方法のどちらかにより、これらのパラメー
タに値を指定できます。すなわち、USING 節でホスト変数を指定するか、または
USING SQL DESCRIPTOR 節でシステム記述子領域を指定します。
SQL 文
2-397
OPEN 文
USING 節での変数の指定
実行時に供給されるパラメータの数とデータ型がわかっている場合は、文が必要と
するパラメータをプログラム中のホスト変数として定義できます。キーワード
USING 以降に記述した変数名を使ってカーソルをオープンし、パラメータをデータ
ベースサーバに渡します。これらの変数は、SELECT 文の中の疑問符 (?) パラメー
タに対して一対一で左から右の順で対応づけられます。
変数名のリストに標識変数を入れることはできません。標識変数を使用するには、
DECLARE 文の一部として SELECT 文を含めなければなりません。
OPEN 文がある USING 節の例を次の ESQL/C のコードに示します。
sprintf (select_1, "%s %s %s %s %s",
"SELECT o.order_num, sum(total price)",
"FROM orders o, items i",
"WHERE o.order_date > ? AND o.customer_num = ?",
"AND o.order_num = i.order_num",
"GROUP BY o.order_num");
EXEC SQL prepare statement_1 from :select_1;
EXEC SQL declare q_curs cursor for statement_1;
EXEC SQL open q_curs using :o_date, :o_total;
USING SQL DESCRIPTOR 節
システム記述子領域から入力値を関連付けることもできます。キーワード USING
SQL DESCRIPTOR は、システム記述子の使用を示します。これを使用すると、シ
ステム記述子領域から入力値を関連付けカーソルをオープンすることができます。
システム記述子領域を使用する場合、COUNT 値は sqlvar が発生したときに記述され
る入力値の数を指定します。この数は、PREPARE 文で処理された文の中の動的パラ
メータの数に相当しなければなりません。フィールド COUNT の値は、システム記
述子領域を割り当てたときに指定した項目記述子の数以下でなければなりません。
OPEN...USING SQL DESCRIPTOR 節の例を次に示します。
EXEC SQL open selcurs using sql descriptor 'desc1';
2-398 Informix Guide to SQL:Syntax
OPEN 文
USING DESCRIPTOR 節
PREPARE 文で処理される文のパラメータを、sqlda ポインタ構造体の形式で渡すこ
とができます。この構造体には、疑問符 (?) 位置指定子と置き換えられる一つまた
は複数の値のデータ型とメモリ内の位置がリストされています。sqlda の説明につ
いての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。
ESQL/C の OPEN...USING DESCRIPTOR 節の例を次に示します。
struct sqlda *sdp;
.
.
.
EXEC SQL open selcurs using descriptor sdp;
WITH REOPTIMIZATION オプション
WITH REOPTIMIZATION オプションを使用して、問合せ設計計画を再度最適化で
きます。SELECT 文または EXECUTE PROCEDURE 文を PREPARE 文で処理すると
データベースサーバは問合せ設計計画を使用してその問合せを最適化します。
PREPARE 文で処理された SELECT 文に関連付けられているデータや、EXECUTE
PROCEDURE 文に関連付けられているデータを後から変更すると、その文の問合せ
設計計画の有効性が損なわれる場合があります。つまり、データを変更すると、問
合せを非最適化することがあります。問合せの最適化を確実に行うため PREPARE
文で SELECT 文または EXECUTE PROCEDURE 文を再び処理するか、あるいは
WITH REOPTIMIZATION 節を使用してカーソルを再びオープンします。PREPARE
文で再度文を処理する場合に比べて次のような利点が得られるので、WITH
REOPTIMIZATION 節を使用することをお勧めします。
■
文全体ではなく問合せ設計計画のみを再構築できる。
■
使用するリソースが少ない。
■
オーバヘッドが少なくなる。
■
処理時間が短い。
WITH REOPTIMIZATION 節を使用して、データベースサーバで OPEN カーソル文
を処理する前に問合せ設計計画を最適化することができます。
次の例は、WITH REOPTIMIZATION 節を示しています。
EXEC SQL open selcurs using descriptor sdp with reoptimization;
SQL 文
2-399
OPEN 文
OPEN 文と FREE 文の関係
データベース サーバは、PREPARE 文で処理された文およびオープン カーソルにリ
ソースを割り当てます。FREE 文に文識別子または文識別子変数を指定して実行し
た場合、解放された文識別子に関連付けられたカーソルをまだオープンできます。
しかし、カーソル識別子またはカーソル識別子変数を指定した FREE 文でリソース
を解放した場合は、カーソルを再び宣言しない限りカーソルを使用することはでき
ません。
同様に、一つまたは複数のカーソルに対して SET AUTOFREE 文を使用した場合、
プログラムで特定のカーソルをクローズすると、データベース サーバはそのカーソ
ルに関連するリソースを自動的に解放します。この場合、カーソルを再び宣言しな
い限りこのカーソルを使用することはできません。
参照
関連する文は、
「ALLOCATE DESCRIPTOR 文」
、「DEALLOCATE DESCRIPTOR
文」
、「DESCRIBE 文」
、「CLOSE 文」
、「DECLARE 文」
、「EXECUTE 文」
、「FETCH
文」
、「FLUSH 文」
、「FREE 文」
、「GET DESCRIPTOR 文」
、「PREPARE 文」、
「PUT
文」
、「SET AUTOFREE 文」
、「SET DEFERRED_PREPARE 文」、および「SET
DESCRIPTOR 文」です。
『Informix Guide to SQL: Tutorial』を参照し
OPEN 文のタスク指向についての説明は、
てください。
システム記述子領域および sqlda 構造体についての詳細は、『INFORMIX-ESQL/C
Programmer’s Manual』を参照してください。
2-400 Informix Guide to SQL:Syntax
OUTPUT 文
+
DB
OUTPUT 文
OUTPUT 文を使用して、問合せ結果を直接オペレーティングシステムのファイルに
送信したり、パイプで他のプログラムへ渡したりします。
この文は、DB-Access で使用します。
構文
SELECT 文
2-450 ページ
< ファイル名 >
OUTPUT TO
UNIX
WITHOUT HEADINGS
PIPE< プログラム >
要素
<ファイル名>
<プログラム>
目的
問合せの結果が書かれるオ
ペレーティングシステム
ファイルのパス名とファイ
ル名です。
制限
構文
ファイル名には新しいファイル パス名とファイル名
または既存のファイルを指定す は使用するオペレー
ることができます。指定した
ティングシステムの
ファイルが存在していると、問 規約に従っていなけ
デフォルトのパス名はカレン 合せの結果によってファイルの ればなりません。
現行の内容が上書きされます。
トディレクトリです。
問合せの結果が送信される
プログラムが存在していてオペ プログラムの名前は
プログラムの名前です。
レーティングシステムによって 使用するオペレー
認識されなければなりません。 ティングシステムの
またプログラムは問合せの結果 規約に従っていなけ
を読み込めなければなりません。 ればなりません。
説明
OUTPUT 文を使用して、問合せ結果をオペレーティングシステム ファイル、また
はプログラムに出力できます。また、問合せ出力で列見出しを省略するかどうかも
指定できます。
SQL 文
2-401
OUTPUT 文
ファイルへの問合せ結果の送信
ファイルのフルパス名を指定することにより、問合せ結果をオペレーティングシス
テム ファイルに送信できます。ファイルがすでに存在している場合、ファイルの現
在の内容は出力によって上書きされます。
次の例は、問合せ結果をオペレーティングシステム ファイルに送信する方法を示し
ます。この例では、UNIX ファイル命名規則を使用しています。
OUTPUT TO /usr/april/query1
SELECT * FROM cust_calls WHERE call_code = 'L'
列見出しを付けない問合せ結果の表示
キーワード WITHOUT HEADINGS を使用して、列見出しを付けずに問合せ結果を
表示することができます。
UNIX
別のプログラムへの問合せ結果の送信
UNIX 環境では、次の例のようにキーワード PIPE を使用して、問合せ結果を他のプ
ログラムに送信することができます。
OUTPUT TO PIPE more
SELECT customer_num, call_dtime, call_code
FROM cust_calls
参照
関連する文は、
「SELECT 文」と「UNLOAD 文」です。
2-402 Informix Guide to SQL:Syntax
PREPARE 文
+
E/C
PREPARE 文
INFORMIX-ESQL/C プログラムの実行時に、SQL 文の構文解析、妥当性検査、実行
計画の作成を行います。
この文は、ESQL/C で使用します。
構文
PREPARE
< 文識別子 >
FROM
引用符付き
文字列
4-156 ページ
< 文識別子変数 >
< 文変数 >
要素
< 文識別子 >
目的
SQL 文または SQL 文のシー
ケンスのデータ構造を表す
識別子です。
制限
構文
データベースサーバ資源を解放 識別子、4-112 ページ
した後は (FREE 文を使用して )、
再度 PREPARE 文で処理するま
では、DECLARE カーソルまた
は EXECUTE 文に文識別子を使
用することはできません。
< 文識別子変数 > SQL 文を識別するホスト変数 この変数は文字 (CHARACTER) 名前は、変数名に適
型でなければなりません。
用される言語使用に
です。
従っている必要があ
ります。
その値が一つまたは複数の
この変数は文字 (CHARACTER) 名前は、変数名に適
< 文変数 >
用される言語使用に
SQL 文によって構成される文 型でなければなりません。
字列であるホスト変数です。 制限の一覧については 2-408
従っている必要があ
ります。
ページの「処理できる文」と
2-415 ページの「複数の文を
PREPARE 文で処理する場合の
制限」を参照してください。
SQL 文
2-403
PREPARE 文
説明
PREPARE 文を使用すると、プログラムで実行時に SQL 文のテキストを組み立てて
実行可能なものにすることができます。この動的な SQL のフォームは次の 3 つの
手順で確立されます。
1.
PREPARE 文は、引用符付き文字列または文字変数に格納された状態で、
入力として SQL 文のテキストを受け取ります。文テキストには、文の実
行時に定義する値を表す位置指定子 (?) を記述することができます。
2.
EXECUTE 文または OPEN 文が必要な入力値を提供し、PREPARE 文で処
理された文を実行します。
3.
作業終了後 FREE 文を使用して、PREPARE 文で処理した文に割り当てら
れていた資源を解放することができます。
一つのプログラムの中で PREPARE 文で処理される項目の個数は、使用可能なメモ
リによって制限されます。これらの項目には PREPARE 文で指定された文識別子
( 文識別子または文識別子変数 ) の個数、および EXECUTE PROCEDURE 文、
INSERT 文または SELECT 文を組み込むカーソル宣言の個数の両方が含まれます。
この制限を超えないようにするには、FREE 文で一部の文またはカーソルを解放し
てください。
文識別子の使用
PREPARE 文は、構文解析を行うために文テキストをデータベースサーバに送りま
す。構文エラーがなければそのテキストは内部形式に変換され、それ以降の実行に
備えて PREPARE 文が割り当てたデータ構造体の中に保存されます。この構造体が
PREPARE 文の文識別子で指定した名前を持ちます。以降の SQL 文は PREPARE 文
で使用された同じ文識別子を使用して構造体を参照します。
PREPARE 文の実行後に実行された FREE 文は、PREPARE 文で割り当てられていた
資源を解放します。データベースサーバの資源を解放すると、再びその SQL 文を
PREPARE 文で処理するまで、DECLARE カーソル文や EXECUTE 文では、その
SQL 文に対応する文識別子を使用できません。
2-404 Informix Guide to SQL:Syntax
PREPARE 文
文識別子の範囲
プログラムは一つまたは複数のソースコードファイルで構成されます。デフォルト
では文識別子はプログラム全体で有効です。したがってある一つのファイル内で
PREPARE 文で処理された文識別子は、他のファイルからも参照できます。
複数のファイルで構成されているプログラムで、文識別子を参照できる有効範囲を
PREPARE 文を実行するソースコードファイルだけに限定したい場合はすべてのファ
イルをコマンド行オプション -local を指定してプリプロセッサにかけてください。
文識別子の解放
文識別子は、一つの SQL 文または一連の SQL 文を同時に表すことができます。既
存の文識別子を別の SQL 文のテキストとバインドしたい場合は、その文識別子と
ともに新しい PREPARE 文を実行します。
PREPARE 文は、識別子または文字列のホスト変数として文識別子を処理すること
によって、動的な文識別子の名前をサポートします。
最初の例は、SQL API ホスト変数として処理された文識別子を示しています。二番
目の例は、文字列定数として処理された文識別子を示しています。
stcopy ("query2", stmtid);
EXEC SQL prepare :stmtid from
'select * from customer';
EXEC SQL prepare query2 from
'select * from customer';
文識別子の名前のデータ型は、文字型でなければなりません。文識別子変数は、C
言語では char と定義しなければなりません。
SQL 文
2-405
PREPARE 文
文テキスト
PREPARE 文は引用符付き文字列またはプログラム変数に格納されたテキストの形
式で、文テキストを受け取ることができます。文テキストには次のような制限事項
があります。
■
テキストには SQL 文だけが記述できます。ホストプログラミング言語特有
の文やコメントは記述できません。
■
テキストには、
二重ハイフン (--) が先行するコメントや中カッコ ({}) で囲ま
れているコメントを記述することができます。これらのコメント記号によ
り SQL コメントであることが示されます。SQL のコメント記号について
は 1-6 ページの「SQL コメントの入力方法」を参照してください。
■
テキストは、一つの SQL 文またはセミコロン (;) によって分離された一連の
SQL 文で構成されます。単一 SQL 文を PREPARE 文で処理する方法につ
いての詳細は 2-408 ページの「処理できる文」を参照してください。複数
の SQL 文を PREPARE 文で処理する方法についての詳細は 2-413 ページの
「複数の SQL 文の前処理」を参照してください。
■
ホスト言語変数の名前は PREPARE 文で処理したテキストの場合のように
認識されません。したがって、INTO 節が指定された SELECT 文や
EXECUTE PROCEDURE 文は PREPARE 文で処理できません。これは
INTO 節ではホスト言語変数が必要なためです。
■
使用できる識別子は、表名や列名などのデータベース中で定義された名前
だけです。文テキストで識別子を使用する方法についての詳細は 2-410
ページの「SQL 識別子が付いた文の前処理」を参照してください。
■
文が実行された時に値が挿入される位置を示すには、疑問符 (?) 位置指定子
を使用してください。位置指定子として疑問符を使用する方法についての
詳細は 2-409 ページの「パラメータを受け取る文の前処理」を参照してく
ださい。
■
テキストには、ドル記号 ($)、キーワード EXECSQL などの埋込み SQL 文の
プレフィクスや終端記号を記述することはできません。
次の例は、ESQL/C の PREPARE 文を示しています。
EXEC SQL prepare new_cust from
'insert into customer(fname,lname) values(?,?)';
2-406 Informix Guide to SQL:Syntax
PREPARE 文
PREPARE 文でのストアド プロシジャの実行
EXECUTE PROCEDURE 文に INTO 節が含まれない場合、この文は PREPARE 文で
処理できます。PREPARE 文で処理されるストアド プロシジャを実行する方法は、
そのストアド プロシジャが値を返すかどうかにより異なります。
■
ストアド プロシジャが値を返さない ( そのプロシジャに RETURN 文が含ま
れない ) 場合、EXECUTE 文を使用して EXECUTE PROCEDURE 文を実行
します。
■
ストアド プロシジャが 1 行だけを返す場合、
EXECUTE 文の INTO 節を使用
して、戻り値を保持するホスト変数を指定できます。複数の行を返すスト
アド プロシジャを EXECUTE...INTO を使用して実行すると、実行時エ
ラーになります。
■
ストアド プロシジャが複数の行を返す場合、DECLARE 文を使用して、
PREPARE 文で処理される EXECUTE PROCEDURE 文をカーソルと関連付
けなければなりません。OPEN 文により文を実行し、FETCH 文の INTO 節
により戻り値をホスト変数に抽出します。
ストアド プロシジャが返す値の数およびデータ型がわからない場合、動的管理構造
体を使用して戻り値を保持しなければなりません。システム記述子領域を使用し、
ALLOCATE DESCRIPTOR または GET DESCRIPTOR などの SQL 文によりこれを管
理するか、または sqlda 構造体を使用することができます。ただしシステム記述子
領域は、X/Open 標準に準拠します。
SQL 文
2-407
PREPARE 文
処理できる文
一般に、PREPARE 文によって任意のデータベース操作文を処理しておくことがで
きます。ただし、次の SQL 文は PREPARE 文で処理することはできません。
ALLOCATE DESCRIPTOR
CLOSE
CONNECT
DEALLOCATE DESCRIPTOR
DECLARE
DESCRIBE
DISCONNECT
EXECUTE
EXECUTE IMMEDIATE
FETCH
FLUSH
FREE
GET DESCRIPTOR
GET DIAGNOSTICS
INFO
LOAD
OPEN
OUTPUT
PREPARE
PUT
SET AUTOFREE
SET CONNECTION
SET DEFERRED_PREPARE
SET DESCRIPTOR
UNLOAD
WHENEVER
PREPARE 文によって SELECT 文を前処理することができます。SELECT 文で
INTO TEMP 節が記述されている場合は、PREPARE 文で処理された文を EXECUTE
文によって実行できます。INTO TEMP 節が記述されていない場合は、SELECT 文
は行の値を返します。行を抽出するには DECLARE、OPEN または FETCH などの
カーソル文を使用してください。
PREPARE 文で処理された SELECT 文に FOR UPDATE 節が記述されていても構い
ません。通常、この節は UPDATE カーソルを作成するために、DECLARE 文ととも
に使用されます。次に、ESQL/C での FOR UPDATE 節を記述した SELECT 文の例
を示します。
sprintf(up_query, "%s %s %s",
"select * from customer ",
"where customer_num between ? and ? ",
"for update");
EXEC SQL prepare up_sel from :up_query;
EXEC SQL declare up_curs cursor for up_sel;
EXEC SQL open up_curs using :low_cust,:high_cust;
2-408 Informix Guide to SQL:Syntax
PREPARE 文
すべてのパラメータがわかっているときの前処理
PREPARE 文で処理される文によっては、その文が PREPARE 文で処理されるとき
に必要な情報がすべてわかっていることがあります。ESQL/C での次の例は定数
データから PREPARE 文で処理された二つの文を示しています。
sprintf(redo_st, "%s %s",
"drop table workt1; ",
"create table workt1 (wtk serial, wtv float)" );
EXEC SQL prepare redotab from :redo_st;
パラメータを受け取る文の前処理
文によっては、PREPARE 文で処理される時点でパラメータがわからないことがあ
ります。これは、その文が実行されるたびに別の値が挿入される可能性があるため
です。このような文に対しては、文の実行時にパラメータが挿入されるべき位置を
示す疑問符 (?) 位置指定子を使用します。
次の ESQL/C の例での PREPARE 文は、位置指定子を表す (?) の使用方法を示して
います。
EXEC SQL prepare s3 from
'select * from customer where state matches ?';
EXEC SQL prepare in1 from
'insert into manufact values (?,?,?)';
sprintf(up_query, "%s %s",
"update customer set zipcode = ?"
"where current of zip_cursor");
EXEC SQL prepare update2 from :up_query;
位置指定子を使用することで、式に対してのみ、値の評価を実行時まで遅らせるこ
とができます。2-410 ページの「SQL 識別子が付いた文の前処理」に記述されてい
る場合を除き、SQL 識別子を表すのに疑問符 (?) 位置指定子は使用できません。
SQL 文
2-409
PREPARE 文
ESQL/C コードフラグメントの次の例では、変数 demoquery に基づいて文が
PREPARE 文で処理されます。変数に格納されたテキストには、疑問符 (?) 位置指定
子が一つ指定されています。PREPARE 文で処理された文はカーソルと関連付けら
れそのカーソルがオープンされるときに OPEN 文の USING 節が位置指定子に対し
て値を挿入します。
EXEC SQL BEGIN DECLARE SECTION;
char queryvalue [6];
char demoquery [80];
EXEC SQL END DECLARE SECTION;
EXEC SQL connect to 'stores7';
sprintf(demoquery, "%s %s",
"select fname, lname from customer ",
"where lname > ? ");
EXEC SQL prepare quid from :demoquery;
EXEC SQL declare democursor cursor for quid;
stcopy("C", queryvalue);
EXEC SQL open democursor using :queryvalue;
USING 節は、OPEN 文と EXECUTE 文の両方で利用できます。OPEN 文は、カーソ
ルと関連した文に対して使用します。EXECUTE 文は、PREPARE 文で処理された
他のすべての文に対して使用できます。
SQL 識別子が付いた文の前処理
表名または列名などの SQL 識別子に対して疑問符 (?) 位置指定子は使用できませ
ん。つまり、PREPARE 文で処理するときに、これらの識別子は文テキストに指定
しなければなりません。
ただし、次の場合には SQL 識別子に対して疑問符 (?) 位置指定子を使用することが
できます。
■
DATABASE 文のデータベース名に疑問符 (?) 位置指定子を使用できます。
■
CREATEDATABASE文のIN<DB領域>節のDB領域名に疑問符(?)位置指定子
を使用できます。
■
カーソル名を使用する文のカーソル名に疑問符(?)位置指定子を使用できます。
2-410 Informix Guide to SQL:Syntax
PREPARE 文
ユーザ入力からの SQL 識別子の取得
PREPARE 文で処理された文が識別子を必要としているがその文を記述するときに
識別子が分からない場合、ユーザ入力から SQL 識別子を受け取る文を構築するこ
とができます。
次の ESQL/C のプログラムの例では、ユーザに対して表名を入力するようプロンプ
トを表示して、入力された名前を SELECT 文の中で使用しています。表名が実行時
までわからないため、表の列の数やデータ型も不明です。したがって、このプログ
ラムでは、各行からデータを受け取るためのホスト変数をあらかじめ割り当てるこ
とができません。その代わりに、文を sqlda 記述子の中に記述し、この記述子を使
用して各行を取り出しています。この取出し動作によって各行は、プログラムに
よって動的に提供されたメモリ内のある場所に置かれます。
アクティブセットのすべての行を抽出するときは、各行を取り出すループの中に
FETCH 文を記述します。FETCH 文で列から複数のデータ値を抽出する場合は
FETCH 文の後に、各データに対して何らかの処理をする別のループが存在します。
#include <stdio.h>
EXEC SQL include sqlda;
EXEC SQL include sqltypes;
char *malloc( );
main()
{
struct sqlda *demodesc;
char tablename[19];
int i;
EXEC SQL BEGIN DECLARE SECTION;
char demoselect[200];
EXEC SQL END DECLARE SECTION;
/* This program selects all the columns of a given tablename.
The tablename is supplied interactively. */
EXEC SQL connect to 'stores7';
printf( "This program does a select * on a table¥n" );
printf( "Enter table name: " );
scanf( "%s", tablename );
sprintf(demoselect, "select * from %s", tablename );
EXEC SQL prepare iid from :demoselect;
EXEC SQL describe iid into demodesc;
/* Print what describe returns */
for ( i = 0; i < demodesc->sqld; i++ )
prsqlda (demodesc->sqlvar + i);
SQL 文
2-411
PREPARE 文
/* Assign the data pointers. */
for ( i = 0; i < demodesc->sqld; i++ )
{
switch (demodesc->sqlvar[i].sqltype & SQLTYPE)
{
case SQLCHAR:
demodesc->sqlvar[i].sqltype = CCHARTYPE;
demodesc->sqlvar[i].sqllen++;
demodesc->sqlvar[i].sqldata =
malloc( demodesc->sqlvar[i].sqllen );
break;
case SQLSMINT: /* fall through */
case SQLINT:
/* fall through */
case SQLSERIAL:
demodesc->sqlvar[i].sqltype = CINTTYPE;
demodesc->sqlvar[i].sqldata =
malloc( sizeof( int ) );
break;
/* And so on for each type. */
}
}
/* Declare and open cursor for select . */
EXEC SQL declare d_curs cursor for iid;
EXEC SQL open d_curs;
/* Fetch selected rows one at a time into demodesc. */
for( ; ; )
{
printf( "¥n" );
EXEC SQL fetch d_curs using descriptor demodesc;
if ( sqlca.sqlcode != 0 )
break;
for ( i = 0; i < demodesc->sqld; i++ )
{
switch (demodesc->sqlvar[i].sqltype)
{
case CCHARTYPE:
printf( "%s: ¥"%s¥n", demodesc->sqlvar[i].sqlname,
demodesc->sqlvar[i].sqldata );
break;
case CINTTYPE:
printf( "%s: %d¥n", demodesc->sqlvar[i].sqlname,
*((int *) demodesc->sqlvar[i].sqldata) );
break;
/* And so forth for each type... */
2-412 Informix Guide to SQL:Syntax
PREPARE 文
}
}
}
EXEC SQL close d_curs;
EXEC SQL free d_curs;
/* Free the data memory. */
for ( i = 0; i < demodesc->sqld; i++ )
free( demodesc->sqlvar[i].sqldata );
printf ("Program Over.¥n");
}
prsqlda(sp)
struct sqlvar_struct *sp;
{
printf ("type = %d¥n", sp->sqltype);
printf ("len = %d¥n", sp->sqllen);
printf ("data = %lx¥n", sp->sqldata);
printf ("ind = %lx¥n", sp->sqlind);
printf ("name = %s¥n", sp->sqlname);
}
複数の SQL 文の前処理
複数の SQL 文がすべて同じ PREPARE 文の中に記述されているのであれば、一つの
動作として実行できます。複数の文のテキストは 1 単位として処理され、処理が 1
文ずつ順番に行われるということはありません。したがって、複数の文テキストの
中で互いに影響を及ぼすような文は記述できません。たとえば同じ PREPARE 文の
ブロックの中で表を作成し、その表に値を挿入することはできません。
通常の場合、コンパイルされた製品は、複数文テキスト内の最初のエラーについて
エラー状態情報を返します。複数の文テキストのどの文がエラーを引き起こしたか
は特定できません。ただし、sqlca 構造体の中の sqlca.sqlerrd[4] を使って、エラーの
オフセットを見つけることはできます。
SQL 文
2-413
PREPARE 文
PREPARE 文で複数の文を処理する場合は、次の SQL 文で指定されている WHERE
節から一つも行が返されないと、データベースサーバは SQLNOTFOUND(100) を
返します。
■
WHERE 節を含む UPDATE 文
■
INTO TEMP 節と WHERE 節を含む SELECT 文
■
WHERE 節を含む INSERT INTO 文
■
DELETE FROM…WHERE…
次の例では、4 つの SQL 文が query と呼ばれる ESQL/C プログラムの単一文字列に
PREPARE 文で処理されています。それぞれの SQL 文は、セミコロン (;) によって
区切られています。一つの execsqlprepare 文で 4 つの SQL 文をすべて実行用に処理
し、さらに一つの EXECUTE 文で、その文識別子 qid を実行しています。
sprintf (query, "%s %s %s %s %s %s %s ",
"update account set balance = balance + ? ",
"where acct_number = ?;",
"update teller set balance = balance + ? ",
"where teller_number = ?;",
"update branch set balance = balance + ? ",
"where branch_number = ?;",
"insert into history values (?, ?);";
EXEC SQL prepare qid from :query;
EXEC SQL begin work;
EXEC SQL execute qid using
:delta, :acct_number, :delta, :teller_number,
:delta, :branch_number, :timestamp, :values;
EXEC SQL commit work;
上記のプログラム例では、query に格納されているテキスト内の各 SQL 文の間には
SQL 文の終端記号としてセミコロン (;) が必要です。
2-414 Informix Guide to SQL:Syntax
PREPARE 文
複数の文を PREPARE 文で処理する場合の制限
2-408 ページの「処理できる文」で一覧した例外の文に加えて、セミコロン (;) で分
離された複数の SQL 文が含まれているテキストでは次の文を使用することはでき
ません。
CLOSE DATABASE 文
CREATE DATABASE 文
DATABASE 文
DROP DATABASE 文
SELECT 文 ( INTO TEMP を含む
SELECT 文を除く )
したがって、PREPARE 文で処理する複数の文に普通の SELECT 文を使用すること
はできません。PREPARE 文で処理する複数の文で使用できる SELECT 文の唯一の
形式は、INTO TEMP 節を含む SELECT 文です。
また、一連の文を実行している間に現行データベースをクローズさせてしまうよう
な文も使用することはできません。
PREPARE 文で処理された文の効率的な使用法
ループの中で PREPARE 文や EXECUTE 文を使用すると、必要のない構文解析や最
適化によるオーバヘッドをなくし、処理効率を向上させることができます。たとえば
WHILE ループの内部に記述されている UPDATE 文は、ループが実行されるたびに構
文解析されます。この UPDATE 文をループの外で PREPARE 文を使用して処理する
と構文解析は 1 回しか行われないため、オーバヘッドがなくなって文の実行速度が向
上します。次の例で、ESQL/C 文を使用して性能を向上させる方法を示します。
EXEC SQL BEGIN DECLARE SECTION;
char disc_up[80];
int cust_num;
EXEC SQL END DECLARE SECTION;
main()
{
sprintf(disc_up, "%s %s",
"update customer ",
"set discount = 0.1 where customer_num = ?");
EXEC SQL prepare up1 from :disc_up;
while (1)
{
printf("Enter customer number (or 0 to quit): ");
SQL 文
2-415
PREPARE 文
scanf("%d", cust_num);
if (cust_num == 0)
break;
EXEC SQL execute up1 using :cust_num;
}
}
参照
関連する文は、
「DECLARE 文」、
「DESCRIBE 文」、
「EXECUTE 文」、
「FREE 文」、
「INFO 文」
、「SET AUTOFREE 文」
、および「SET DEFERRED_PREPARE 文」です。
PREPARE 文に関する基本概念についての詳細は、『Informix Guide to SQL: Tutorial』
を参照してください。
PREPARE 文に関するさらに高度な概念についての詳細は、『INFORMIX-ESQL/C
Programmer’s Manual』を参照してください。
2-416 Informix Guide to SQL:Syntax
PUT 文
+
E/C
PUT 文
後からデータベースに挿入できるように、INSERT バッファに行を格納します。
この文は、ESQL/C で使用します。
構文
PUT
< カーソル識別子 >
< カーソル変数 >
,
FROM
< 出力変数 >
:
< 標識変数 >
$
< 標識変数 >
INDICATOR
USING
< 標識変数 >
SQL DESCRIPTOR
' < 記述子 > '
< 記述子変数 >
DESCRIPTOR
要素
< カーソル識
別子 >
目的
カーソルの名前です。
< カーソル
変数 >
< カーソル識別子 > の値を保持
するホスト変数です。
制限
DECLARE 文でカーソルを事前
に作成しておかなければなりま
せん。
ホスト変数は文字
(CHARACTER) データ型でなけ
ればなりません。DECLARE 文
でカーソルを事前に作成してお
かなければなりません。
<sqlda ポインタ >
構文
識別子、4-112 ページ
名前は、変数名に対
する言語固有の規則
に従わなければなり
ません。
(1/2)
SQL 文
2-417
PUT 文
要素
< 記述子 >
目的
システム記述子領域を識別する
引用符付き文字列です。
制限
システム記述子領域がすでに割
り当てられていなければなりま
せん。
< 記述子変数 > システム記述子領域を識別する システム記述子領域がすでに割
ホスト変数名です。
り当てられていなければなりま
せん。
対応するデータ変数に NULL
変数は日時 (DATETIME) データ
< 標識変数 >
値のデータが置かれた場合に復 型または時間隔 (INTERVAL)
帰コードを受け取るホスト変数 データ型にはできません。
です。
その内容によって PREPARE 文 変数は文字 (CHARACTER) デー
< 出力変数 >
で処理された文の疑問符 (?) 位置 タ型でなければなりません。
指定子を置き換えるホスト変数
です。
<sqlda ポイン PREPARE 文で処理された文の sqlda ポインタの先頭にドル符
タ>
疑問符 (?) 位置指定子に対応す 号 ($) やコロン (:) を付けること
る値の型とメモリ位置を定義す はできません。
る sqlda 構造体のポインタです。
構文
引用符付き文字列、
4-156 ページ
引用符付き文字列、
4-156 ページ
名前は、変数名に対
する言語固有の規則
に従わなければなり
ません。
名前は、変数名に対
する言語固有の規則
に従わなければなり
ません。
DESCRIBE 文、
2-262 ページ
(2/2)
説明
一つの PUT 文を実行すると、INSERT バッファに 1 行が格納されます。INSERT
バッファはカーソルがオープンされた時点で作成されます。文の実行時に INSERT
バッファに新しい行を入れる空き領域がない場合は、バッファ内の行が一括して
データベースに書き込まれて、バッファが空になります。したがって PUT 文を実
行したときに、必ずデータベースに対して行が書き込まれるわけではありません。
現行データベースが明示的なトランザクションを使用している場合はトランザク
ションの中で PUT 文を実行しなければなりません。
次の例は、ESQL/C での PUT 文の使用法を示しています。
EXEC SQL prepare ins_mcode from
'insert into manufact values(?,?)';
EXEC SQL declare mcode cursor for ins_mcode;
EXEC SQL open mcode;
EXEC SQL put mcode from :the_code, :the_name;
X/O
PUT 文は、X/Open 標準 SQL 文ではありません。したがって、INFORMIX-ESQL/C の
X/Open モードで PUT 文をコンパイルすると、警告メッセージが表示されます。♦
2-418 Informix Guide to SQL:Syntax
PUT 文
挿入値の取込み
挿入される行を構成する値の取り込み先は、次の 4 種類のうちの一つです。
■
INSERT 文の中に記述された定数値
■
INSERT 文の中で指定されたプログラム変数
■
PUT 文の FROM 節の中で指定されたプログラム変数
■
sqlda 構造体またはシステム記述子領域によってアドレス指定され、メモリ
内で PREPARE 文で処理された後、PUT 文の USING 節の中で指定された値
INSERT 文での定数値の使用
INSERT 文の INSERT 節には挿入する列の値を記述します。これらの値は、定数 (
数字または文字列 ) であってもかまいません。
挿入値のすべてが定数であるとき、PUT 文は特殊な効果を与えます。行を作成して
INSERT バッファに挿入する代わりに、PUT 文はカウンタを単に増加させます。
FLUSH 文か CLOSE 文を使用してバッファを空にすると、1 行分のデータと繰り返し
カウントがデータベースサーバに送られ繰り返しカウンタ分のデータを挿入します。
次の ESQL/C プログラムの例では、99 個の空の顧客情報レコードが表 customer に
挿入されています。すべての値が定数であるため、カーソルがクローズされるまで
ディスクへの出力は行われません ( ここでは、列 customer_num に定数 0 を指定して
シリアル (SERIAL) 型の値を挿入しています )。
int count;
EXEC SQL declare fill_c cursor for
insert into customer(customer_num) values(0);
EXEC SQL open fill_c;
for (count = 1; count <= 99; ++count)
EXEC SQL put fill_c;
EXEC SQL close fill_c;
SQL 文
2-419
PUT 文
INSERT 文でのプログラム変数の指定
DECLARE 文の中で INSERT 文をカーソル宣言の一部として記述すると、プログラ
ム変数を VALUES 節で指定できます。プログラム変数は、PUT 文が実行されると
き、バッファ内に挿入される時点の行を構成するために使用されます。
INSERT 文とともに DECLARE 文を使用して INSERT カーソルを作成するときに、
VALUE 節に指定できるのはプログラム変数だけです。文識別子によってカーソル
と関連付けられる PREPARE 文で処理される文の中では、変数名は認識されませ
ん。
次の ESQL/C の例は、INSERT カーソルの使用方法を示しています。この例に記述
されている文は次のとおりです。
■
DECLARE 文はカーソル ins_curs を表 customer の中にデータを挿入する
INSERT 文と関連付けています。VALUES 節ではデータ構造体 cust_rec が
指定されています。ESQL/C のプリプロセッサでは、データ構造体 cust_rec
が値の並びに変換されます。挿入される値は、構造体の各構成要素に対応
します。
■
OPEN 文はバッファを作成します。
■
この例では定義されていない関数によって顧客情報をユーザから取得して
それを cust_rec 構造体に保存します。
■
PUT 文はデータ構造体 cust_rec の現在の内容で 1 行文のデータを構成し、こ
れを行バッファに送ります。
■
CLOSE 文は行バッファに残っている行を表 customer に挿入し、
INSERT カー
ソルをクローズします。
int keep_going = 1;
EXEC SQL BEGIN DECLARE SECTION
struct cust_row { /* fields of a row of customer table */ } cust_rec;
EXEC SQL END DECLARE SECTION
EXEC SQL declare ins_curs cursor for
insert into customer values (:cust_row);
EXEC SQL open ins_curs;
while ( (sqlca.sqlcode == 0) && (keep_going) )
{
keep_going = get_user_input(cust_rec); /* ask user for new customer */
if (keep_going )
/* user did supply customer info */
{
cust_rec.customer_num = 0;
/* request new serial value */
EXEC SQL put ins_curs;
}
if (sqlca.sqlcode == 0)
/* no error from PUT */
keep_going = (prompt_for_y_or_n("another new customer") =='Y')
}
EXEC SQL close ins_curs;
2-420 Informix Guide to SQL:Syntax
PUT 文
PUT 文でのプログラム変数の指定
INSERT 文が PREPARE 文によって処理されるときは (2-403 ページの「PREPARE
文」を参照 )、VALUES 節の中でプログラム変数は使用できません。ただし、疑問
符 (?) 位置指定子を使用してプログラム変数を使用したい位置を示すことはできま
す。位置指定子に実際のプログラム変数値を格納するには、PUT 文の FROM 節に
プログラム変数の名前を並べて指定します。次の ESQL/C の例では PUT 文の中でホ
スト変数を記述しています。
char answer [1] = 'y';
EXEC SQL BEGIN DECLARE SECTION;
char ins_comp[80];
char u_company[20];
EXEC SQL END DECLARE SECTION;
main()
{
EXEC SQL connect to 'stores7';
EXEC SQL prepare ins_comp from
'insert into customer (customer_num, company) values (0, ?)';
EXEC SQL declare ins_curs cursor for ins_comp;
EXEC SQL open ins_curs;
while (1)
{
printf("¥nEnter a customer: ");
gets(u_company);
EXEC SQL put ins_curs from :u_company;
printf("Enter another customer (y/n) ? ");
if (answer = getch() != 'y')
break;
}
EXEC SQL close ins_curs;
EXEC SQL disconnect all;
}
システム記述子領域の使用法
一つまたは複数の値のデータ型とメモリ位置を記述する、システム記述子領域を作
成できます。その後 PUT 文の USING SQL DESCRIPTOR 節で、そのシステム記述子
領域を指定できます。
次の ESQL/C の例は、システム記述子領域の値を関連付ける例を示しています。
EXEC SQL put selcurs using sql descriptor 'desc1';
SQL 文
2-421
PUT 文
sqlda 構造体の使用法
一つまたは複数の値のデータ型とメモリ位置を記述する、sqlda 構造体を作成でき
ます。その後 PUT 文の USING DESCRIPTOR 節で、その sqlda 構造体を指定できま
す。PUT 文が実行されるたびに、INSERT 文の中の疑問符 (?) 位置指定子の位置に
sqlda 構造体によって記述されている値が挿入されます。この方法はプログラムに
よってデータ値のメモリ内の位置が完全に制御できるという点を除いて、FROM 節
で変数の並びを記述して使用するのと同じです。
次の例は、PUT 文に USING DESCRIPTOR 節の使用方法を示したものです。
EXEC SQL put selcurs using descriptor pointer2;
バッファ内の行の書込み
OPEN 文によって INSERT カーソルをオープンすると、INSERT バッファが作成さ
れます。PUT 文は、この INSERT バッファに行を追加します。必要な場合にのみ
バッファ内の行のブロックはブロック単位でデータベースの表に挿入されます。こ
のプロセスは、バッファのフラッシュと呼ばれます。次にバッファがフラッシュさ
れるタイミングを示します。
■
PUT 文の開始時にバッファがいっぱいになって新しい行を格納できない。
■
FLUSH 文が実行された。
■
CLOSE 文によってカーソルがクローズされた。
■
カーソルに対する OPEN 文が実行された。
オープン済みのカーソルに対して OPEN 文が実行されると、OPEN 文は
カーソルを再びオープンする前に一度クローズします。この暗黙の
CLOSE 文によってバッファがフラッシュされます。
■
COMMIT WORK 文が実行された。
■
バッファに、一つの PUT 文の実行後にフラッシュされたバイト(BYTE)
型またはテキスト(TEXT)型のデータが含まれている。
プログラムが INSERT カーソルをクローズせずに終了すると、INSERT バッファは
フラッシュされません。前回のフラッシュ以降にバッファに挿入された行は破棄さ
れます。カーソルのクローズおよびバッファのフラッシュは、プログラムの終了に
よって行うのではなく、プログラム内でそれぞれの処理を記述してください。
2-422 Informix Guide to SQL:Syntax
PUT 文
エラーの検査
sqlca 構造体には、挿入された行数に関する情報とともに、各 PUT 文の成否に関す
る情報が格納されます。各 PUT 文の結果は、sqlca 構造体の sqlca.sqlcode、
SQLCODE、sqlca.sqlerrd[2] の各フィールドに格納されます。
INSERT カーソルによってバッファ内にデータを格納すると、バッファがフラッ
シュされるまでエラーは発見されません。たとえば、入力値が挿入したい列のデー
タ型と互換性のない値であるということは、バッファがフラッシュされたときに検
出されます。バッファ内のエラーが見つかった後の行は、挿入されずにメモリから
破棄されます。
エラーがなければ、フィールド SQLCODE には 0 が設定されます。エラーが検出さ
れると、エラーコードが設定されます。また、配列 sqlerrd の 3 番目の要素には、
データベースに正常に挿入された行数が設定されます。
■
ある行が INSERT バッファに挿入されても、バッファに格納された行がデー
タベースに書き込まれなかった場合は、SQLCODE と sqlerrd には同時に 0
が設定されます。この 0 は、SQLCODE ではエラーが検出されなかったこ
と、sqlerrd ではデータベースに行が挿入されなかったことを示します。
■
INSERT バッファに格納された行ブロックが PUT 文の実行中にデータベー
スに書き込まれる場合、SQLCODE には 0 が設定され、sqlerrd にはデータ
ベースに正常に挿入された行数が設定されます。
■
INSERT バッファに格納された行ブロックがデータベースに書き込まれて
いる間にエラーが発生すると、SQLCODE コードがエラーを示すのに対
し、sqlerrd にはデータベースに正常に挿入された行数が格納されます。挿
入されなかった行は、INSERT バッファから廃棄されます。
ヒント : SQLCODE にエラーコードが設定されている場合、対応する SQLSTATE
のエラー値が存在する可能性があります。メッセージテキストを取得する方法の詳
細については、GET DIAGNOSTICS 文を確認してください。
SQL 文
2-423
PUT 文
総行数と未挿入行数のカウント方法
次の手順に従って、データベースに実際に挿入された行数と、未挿入の行数を数え
ることができます。
1.
たとえば、すべての行数を示す total と挿入されていない行数を格納する
pending というような二つの整数型変数を用意します。
2.
カーソルのオープン時に、両方の変数に 0 を設定します。
3.
PUT 文が実行されるたびに、両方の変数の値を増やしていきます。
4.
PUT 文または FLUSH 文が実行されるか、カーソルをクローズするときに、
pending から配列 sqlerrd の 3 番目のフィールドの値を減算します。
total と pending の差分は、いつでも実際に挿入された行数になります。すべてのコ
マンドが正常に実行された場合は、カーソルがクローズされた時点で pending の値
が 0 になります。PUT 文、FLUSH 文または CLOSE 文の実行時にエラーが発生した
場合には、pending の値はまだ挿入されていない行数、つまり INSERT バッファか
ら廃棄された行数を表します。
参照
関連する文は、「CLOSE 文」、「FLUSH 文」、「DECLARE 文」および「OPEN 文」
です。
PUT 文のタクス指向の説明については、『Informix Guide to SQL: Tutorial』を参照し
てください。
2-424 Informix Guide to SQL:Syntax
RENAME COLUMN 文
RENAME COLUMN 文
+
IDS
RENAME COLUMN 文を使用して列の名前を変更します。
RENAME COLUMN 文は、Dynamic Server でのみ使用できます。
構文
<表>
RENAME COLUMN
要素
< 新しい列 >
< 旧列 >
<表>
.
< 旧列 >
TO
< 新しい列 >
目的
制限
列に割り当てる新しい名前です。 トリガ定義内に記述されている
列の名前を変更するときは、一
定の条件に一致している場合に
のみ新しい列名によって古い列
名が置き換えられます。この制
限についての詳細は 2-426 ペー
ジの「トリガへの影響」を参照
してください。
名前を変更したい列の現行名
列は表内に存在していなければ
です。
なりません。
列が存在している表の名前です。 表は存在していなければなりま
せん。
構文
識別子、
4-112 ページ
識別子、
4-112 ページ
データベースオブ
ジェクト名、
4-25 ページ
説明
次のいずれかの条件が成立する場合に、表の列名を変更できます。
■
表の所有者である。
■
データベースに対してデータベースアクセス権 DBA を得ている。
■
表に対して変更のアクセス権を得ている。
SQL 文
2-425
RENAME COLUMN 文
ビューと検査制約への影響
データベース内のビューが参照する列名が変更されると、新しい列名を反映するた
めの更新がシステム カタログ表 sysviews のビューテキストに対して行われます。
列がデータベースの検査制約によって参照されている場合、システム カタログ表
syschecks の検査制約テキストが変更されます。
トリガへの影響
トリガの中で指定されている列名を変更する場合、次のいずれかの条件が成立する
場合にのみ新しい列名に置き換わります。
■
FOR EACH ROW トリガアクション節内の関連名の一部として指定されて
いる。
■
EXECUTE PROCEDURE 文の INTO 節内の関連名の一部として指定されて
いる。
■
UPDATE 節のトリガ列として指定されている。
このような条件にあてはまるトリガを実行したときに、指定された列が表の中に存
在しない場合、データベースサーバはエラーを返します。
RENAME COLUMN 文の例
次の例では、表 customer の中の列 customer_num を c_num という名前に変えています。
RENAME COLUMN customer.customer_num TO c_num
参照
関連する文は、
「ALTER TABLE 文」、
「CREATE TABLE 文」
、
「RENAME TABLE 文」
です。
2-426 Informix Guide to SQL:Syntax
RENAME DATABASE 文
RENAME DATABASE 文
+
RENAME DATABASE 文を使用してデータベースの名前を変更します。
構文
RENAME DATABASE
要素
< 新データ
ベース >
< 旧データ
ベース >
< 旧データベース >
TO
< 新データベース >
目的
制限
構文
データベースに割り当てる新 名前は一意でなければなりません。 データベース名、
しい名前です。
現行データベースの名前を変更す 4-22 ページ
ることはできません。
名前を変更するデータベースは、
RENAME DATABASE コマンドを
実行するときにユーザがオープン
していてはなりません。
名前を変更したいデータベー データベースが存在していなけれ
スの名前です。
ばなりません。
データベース名、
4-22 ページ
説明
次のいずれかの条件が成立する場合に、データベース名を変更できます。
■
データベースの作成者である。
■
データベースに対してデータベースアクセス権 DBA を得ている。
名前を変更できるのは、ローカルデータベースのみです。ローカルデータベースの
名前は、ストアドプロシジャ内から変更できます。
参照
関連する文は、
「CREATE DATABASE 文」です。
SQL 文
2-427
RENAME TABLE 文
RENAME TABLE 文
+
RENAME TABLE 文を使用して表の名前を変更します。
構文
< 旧表名 >
RENAME TABLE
要素
< 新表名 >
< 旧表名 >
TO
< 新表名 >
目的
制限
表に割り当てる新しい名前です。 表の新しい名前では owner. 規約
を使用することはできません。
表の現在の名前です。
表は存在していなければなりま
せん。
構文
識別子、
4-112 ページ
識別子、
4-112 ページ
説明
次のいずれかの条件が成立する場合に、表の名前を変更できます。
■
表の所有者である。
■
データベースに対してデータベースアクセス権 DBA を得ている。
■
表に対して変更のアクセス権を得ている。
表の名前を変更しても、表の所有者は変更できません。owner. 規約を旧表名の一部
として指定できますが、新表名の一部として指定するとコンパイル時にエラーとな
ります。
AD/XP
Dynamic Server with AD and XP Options を使用している場合は、依存性のある GK イ
ンデックスを含む表の名前は変更できません。♦
ANSI
ANSI 標準準拠のデータベースで自分が所有していない表を参照する場合は、必ず
owner. 規約を使用してください。♦
2-428 Informix Guide to SQL:Syntax
RENAME TABLE 文
RENAME TABLE 文を使用して、表を現行データベースから別のデータベースに移
動したり、別の表から現行データベースに移動することはできません。名前を変更
したい表は現行データベースに常駐していなければなりません。この文によって名
前を変更された表は現行データベース内にそのまま残ります。
ビューが参照する表名の変更
ビューが名前を変更された表を参照し、そのビューが表と同じデータベースに常駐
していると、システム カタログ表 sysviews 内のそのビューに関する内容が新しい表
名を反映するために更新されます。システム カタログ表 sysviews についての詳細
は、
『Informix Guide to SQL: Reference』を参照してください。
トリガが定義されている表の名前の変更
トリガが定義されている表の名前を変更すると、次のような結果が生じます。
■
データベースサーバは、トリガの定義で指定されている表の名前を新しい
名前に置き換えます。
■
トリガアクション内で指定されている表の名前は変更されません。
■
新しい表の名前が、トリガの定義で指定されている REFERENCING 節の関
連名と同じである場合、データベースサーバはエラーを返します。
トリガを実行した時に、指定された表が存在しないと、データベースサーバはエ
ラーを返します。
SQL 文
2-429
RENAME TABLE 文
表名の変更の例
次の例では、表 items を再編集しています。その目的は、列 quantity の順番を 5 番目
から 3 番目に移動することです。この例は、次の 4 つの手順で構成されています。
1.
列 quantity が 3 番目の位置にある新しい表 new_table を作成します。
2.
表 new_table に表 items のデータをコピーします。
3.
古い表 items を削除します。
4.
名前 new_table を items に変更します。
次の例では、最後に RENAME TABLE 文を使用しています。
CREATE TABLE new_table
(
item_num
SMALLINT,
order_num
INTEGER,
quantity
SMALLINT,
stock_num
SMALLINT,
manu_code
CHAR(3),
total_price
MONEY(8)
)
INSERT INTO new_table
SELECT item_num, order_num, quantity, stock_num,
manu_code, total_price
FROM items
DROP TABLE items
RENAME TABLE new_table TO items
参照
関連する文は、
「ALTER TABLE 文」、
「CREATE TABLE 文」
、「DROP TABLE 文」、
「RENAME COLUMN 文」です。
2-430 Informix Guide to SQL:Syntax
REVOKE 文
+
REVOKE 文
REVOKE 文を使用して、データベース、表、ビュー、プロシージャまたはロールに
対するアクセス権を取り消します。
構文
REVOKE
表レベルの
アクセス権
2-435 ページ
ON
<表>
FROM
PUBLIC
,
< ビュー >
< ユーザ >
< シノニム >
EXECUTE ON
' < ユーザ > '
< プロシジャ >
IDS
IDS
< ロール >
< ロール >
' < ロール >'
表レベルの
アクセス権
2-435 ページ
ON
<表>
FROM
PUBLIC
,
< ビュー >
< ユーザ >
< シノニム >
' < ユーザ > '
CASCADE
RESTRICT
データベースレベルの
アクセス権
2-435 ページ
FROM
PUBLIC
,
< ユーザ >
' < ユーザ > '
SQL 文
2-431
REVOKE 文
要素
目的
< プロシジャ > 実行アクセス権を取り消すプロ
シジャの名前です。
< ロール >
< シノニム >
<表>
< ユーザ >
< ビュー >
制限
存在するプロシジャの名前でな
ければなりません。
構文
データベース オブ
ジェクト名、
4-25 ページ
ロールは CREATE ROLE 文で作 識別子、
成され、GRANT 文で付与され 4-112 ページ
ていなければなりません。
アクセス権または別のロールを
取り消すロール、あるいは、
ユーザまたは別のロールから取
り消すロールです。
アクセス権を取り消すシノニム名 シノニムおよびシノニムが指す
です。
表が存在していなければなりま
せん。
アクセス権を取り消す表名です。 存在する表の名前でなければな
りません。
アクセス権またはロールを取り
消されるユーザです。
アクセス権を取り消すビュー
です。
有効なユーザでなければなりま
せん。
存在するビューの名前でなけれ
ばなりません。
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
説明
次の目的のために、REVOKE 文を使用することができます。
■
ユーザまたはロールの、表またはビューに対するアクセス権を取り消すこ
とができます。
■
ユーザまたはロールの、プロシジャに対する実行アクセス権を取り消すこ
とができます。
■
ユーザの、データベースに対するアクセス権を取り消すことができます。
■
ユーザまたは別のロールから、ロールを取り消すことができます。
REVOKE 文を GRANT 文とともに使用することで、ユーザのデータベースを変更す
る機能や、表のデータに対してアクセスや変更を行う機能をうまく制御することが
できます。
キーワード FROM の後にキーワード PUBLIC を使用すると、REVOKE 文はすべて
のユーザのアクセス権を取り消します。
2-432 Informix Guide to SQL:Syntax
REVOKE 文
ユーザが他のユーザに付与したアクセス権のすべて、または一部を取り消すことが
できます。他のユーザが付与したアクセス権を取り消すことはできません。
ユーザのストアド プロシジャに対する実行アクセス権を取り消すと、そのユーザは
以後、EXECUTE PROCEDURE 文や CALL 文を使用して、そのプロシジャを実行す
ることができなくなります。
引用符を使用すると、< ユーザ > は入力したとおりに表示されます。
ANSI
ANSI 標準準拠のデータベースでは、< ユーザ > を引用符で囲まないと、ユーザ名
は大文字で格納されます。♦
ユーザは自分自身のアクセス権を取り消すことはできません。
ロールでの REVOKE 文の使用
REVOKE 文を使用して、ロールのアクセス権を取り消したり、ユーザや別のロール
のロールを取り消すことができます。ユーザのロールを取り消すと、ユーザはその
ロールを有効化することができなくなります。ユーザまたはロールに付与したロー
ルのすべて、または一部を取り消すことができます。
ユーザのロールが取り消されると、そのロールに関連付けられていたアクセス権
を、そのユーザが SET ROLE 文で取得することはできなくなります。ただし、現在
取得しているアクセス権には影響しません。
REVOKE 文を使用して、ロールの表レベルのアクセス権を取り消すことができま
す。ただし、この場合、RESTRICT 節や CASCADE 節は使用できません。
ロールのアクセス権を取り消すことができるのは、DBA または WITH GRANT
OPTION を使用してロールを付与されたユーザだけです。
ロールのストアド プロシジャに対する実行アクセス権を取り消すと、そのロール
は、以後、そのプロシジャを実行することができなくなります。
ユーザは自分自身のロールを取り消すことはできません。ロールを取り消す際、
WITH GRANT OPTION を個別に取り消すことはできません。WITH GRANT
OPTION を使用してロールを付与していた場合、ロールとオプション GRANT の両
方が取り消されます。
次の例では、ユーザ maryf のロール engineer を取り消しています。
REVOKE engineer FROM maryf
SQL 文
2-433
REVOKE 文
WITH GRANT OPTION で付与されたアクセス権の取消し
< ユーザ > から、キーワード WITH GRANT OPTION を使用して付与されたアクセ
ス権を取り消すと、そのユーザが付与したアクセス権の連鎖が切断されます。この
場合、< ユーザ > のアクセス権を取り消すと、自動的にその < ユーザ > または <
ユーザ > が作成した連鎖から付与されたすべてのユーザのアクセス権が取り消され
ます。このデフォルト条件は、キーワード CASCADE で指定することもできます。
オプション RESTRICT による REVOKE 範囲の制御
キーワード RESTRICT を使用して、アクセス権を取り消すデータベース オブジェ
クトの依存性の有無に基づき、REVOKE コマンドの成否を制御します。キーワード
RESTRICT を使用したときに REVOKE 文が失敗するのは次のような場合です。
■
アクセス権を取り消されるユーザが、同じアクセス権を他のユーザに付与
している場合。
■
ビューが取り消す選択アクセス権に依存している場合。
■
外部キーが取り消す参照アクセス権に依存している場合。
アクセス権を取り消されるユーザがアクセス権を付与している場合の
REVOKE 文の失敗
アクセス権を取り消されるユーザが、同じアクセス権を他のユーザに付与していた
場合、キーワード RESTRICT を指定した REVOKE 文は失敗します。ただし、取り
消されるユーザが他のユーザに対するアクセス権を付与するの権限を持っていて
も、実際にはどのユーザにもアクセス権を付与していない場合は、同じ REVOKE
文でも失敗しません。このことについて、例を挙げて説明します。
ユーザ clara が、表 customer に対する選択アクセス権をユーザ ted に付与したとしま
す。さらに clara は、ユーザ ted に対して他のユーザに選択アクセス権を付与する権
限も与えたとします。ユーザ ted はこの権限を使用して、tania というユーザに表
customer の選択アクセス権を付与します。このとき、ユーザ clara がユーザ ted の選
択アクセス権を次の REVOKE 文で取り消そうとします。
REVOKE SELECT ON customer FROM ted RESTRICT
この場合、ユーザ ted が既にユーザ tania に選択アクセス権を付与しているため、こ
の文は失敗します。
2-434 Informix Guide to SQL:Syntax
REVOKE 文
アクセス権を取り消されるユーザが、他のユーザに対してアクセス権を付与する権
限を持っていても、実際にはこのアクセス権をどのユーザにも付与していなければ
どうなるでしょう。たとえば、ユーザ clara が、表 customer に対する選択アクセス
権をユーザ roger に付与したとします。さらに clara は、ユーザ roger に対して他の
ユーザに選択アクセス権を付与する権限も与えたとします。しかしまだ、ユーザ
roger はこの権限を使用して、他のユーザに選択アクセス権を付与していません。
このとき、ユーザ clara がユーザ roger の選択アクセス権を次の REVOKE 文で取り
消そうとします。
REVOKE SELECT ON customer FROM roger RESTRICT
この場合、ユーザ roger がまだどのユーザにも選択アクセス権を付与していないた
め、この文は成功します。
表レベルのアクセス権
表レベルの
アクセス権
REVOKE 文へ戻る
2-431 ページ
ALL
PRIVILEGES
,
INSERT
DELETE
SELECT
UPDATE
INDEX
ALTER
REFERENCES
ユーザの表レベルのアクセス権を取り消すには、すべてのアクセス権を取り消す必
要があります。たとえば、2 ユーザが同じユーザに同じアクセス権を付与した場合、
両者がアクセス権を取り消す必要があります。一方の権限授与者がアクセス権を取
り消しても、もう一方の権限授与者から受けたアクセス権は残ります ( データベー
ス サーバは、それぞれの表レベルの許可に関するレコードを、システム カタログ
表 syscolauth および systabauth に保持しています )。
SQL 文
2-435
REVOKE 文
表の所有者が PUBLIC に対してアクセス権を付与した場合、所有者は、そのアクセ
ス権を特定のユーザから取り消すことはできません。たとえば、表の所有者が
PUBLIC に選択アクセス権を付与した場合、mary の選択アクセス権を取り消そうと
すると、REVOKE 文はエラーを発生させます。選択アクセス権は mary ではなく
PUBLIC に付与されているので、mary のアクセス権を取り消すことはできません。
「-111 ISAM エラー : 行がみつかりません。」が発生します。これは、表の所有者が
取り消そうとするアクセス権があるはずのシステム カタログ表 syscolauth と
systabauth のどちらにも、レコードが存在しないことを表します。
表レベルのアクセス権を、個別に、または組合せによって取り消すことができま
す。取り消す < ユーザ > のアクセス権に対応するキーワードを並べます。キーワー
ドは次のリストで説明します。GRANT 文とは違い、REVOKE 文では選択アクセス
権、更新アクセス権、参照アクセス権を、列で修飾することはできません。そのた
め、特定の列のアクセス権を取り消すことはできません。
アクセス権
機能
INSERT
行を挿入できるようにします。
DELETE
行を削除できるようにします。
SELECT
SELECT 文で獲得したデータを表示できるようにします。
UPDATE
列値を変更できるようにします。
INDEX
永久インデックスを作成できるようにします。インデックス
のアクセス権を利用するには、リソース アクセス権を持っ
ていなければなりません(接続アクセス権を持っているユー
ザであれば、一時表に対してインデックスを作成することが
できます)
。
(1/2)
2-436 Informix Guide to SQL:Syntax
REVOKE 文
アクセス権
機能
ALTER
列の追加、削除、列データ型の変更、および制約の追加、削
除を実行できるようにします。
また、このアクセス権を使用して、一意のインデックスと制
約のオブジェクト モードを有効化モード、中止モードまた
はフィルタリング モードに設定することができます。さら
に、このアクセス権を使用すると、一意ではないインデック
スとトリガのオブジェクト モードを有効化モードまたは中
止モードに設定することができます。
REFERENCES
外部キーとして表の列を参照する能力を取り消します。
参照アクセス権を利用するには、リソース アクセス権を
持っていなければなりません ( ただし、ALTER TABLE 文の
実行中に参照制約を追加することができます。この方法で
は、データベースに対してリソース アクセス権を持ってい
いる必要はありません )。カスケード削除を禁止にするには
参照アクセス権を取り消します。
ALL
上記のすべてのアクセス権を提供します。ALL はキーワー
ド PRIVILEGES にオプションで使用できます。
(2/2)
キーワード ALL の働き
キーワード ALL は、表レベルのアクセス権をすべて取り消します。取り消される
ユーザに付与されていない表レベルのアクセス権がある、または、表レベルのアク
セス権が全く付与されていない場合、キーワード ALL を使用した REVOKE 文の実
行は成功しますが、次の SQLSTATE コードを戻します。
01006 - Privilege not revoked
たとえば、ユーザ hal が表 customer に対する選択と挿入のアクセス権を持っている
ものとします。ユーザ jocelyn が、次の REVOKE 文でユーザ hal のすべての表レベル
アクセス権を取り消します。
REVOKE ALL ON customer FROM hal
SQL 文
2-437
REVOKE 文
この文の実行は成功しますが、SQLSTATE コード 01006 を戻します。次のような文
の成功とともに SQLSTATE の警告を戻します。
■
ユーザ hal は選択アクセス権と挿入アクセス権を持っていたため、REVOKE
文によるこれらのアクセス権の取消しが成功した。
■
キーワード ALL で指定された他の 5 つのアクセ
SQLSTATE コード 01006 は、
ス権 ( 削除、更新、参照、インデックス、変更 ) をユーザ hal が持ってい
ないため、これらのアクセス権が取り消されなかったことを示します。
ヒント : キーワード ALL は、データベース サーバに取消し可能なアクセス権をす
べて削除するよう指示します。これには、何も削除しないことも含まれます。アク
セス権を取り消されるユーザがその表のアクセス権を何も持っていなくても、キー
ワード ALL を指定した REVOKE 文は、取消し可能なアクセス権 ( この場合、対象
となるアクセス権はない ) をすべて削除するため、成功します。
表レベルのアクセス権の取消しと再付与の例
次の例では、表 customer に対するすべてのユーザのインデックスと変更のアクセス権
を取り消し、その後、同じアクセス権をユーザ mary に限定して再付与しています。
REVOKE INDEX, ALTER ON customer FROM PUBLIC;
GRANT INDEX, ALTER ON customer TO mary;
特定の列に対するアクセス権を取り消すことはできないので、ユーザの選択アクセ
ス権、更新アクセス権、参照アクセス権を取り消す場合は、表の中のすべての列に
対するアクセス権を取り消します。次に GRANT 文を使用して、ユーザが利用でき
る列指定のアクセス権を特別に再付与します。以下に例を示します。
REVOKE ALL ON customer FROM PUBLIC;
GRANT ALL ON customer TO john, cathy;
GRANT SELECT (fname, lname, company, city)
ON customer TO PUBLIC;
2-438 Informix Guide to SQL:Syntax
REVOKE 文
データベース レベルのアクセス権
データベース レベル
のアクセス権
REVOKE 文へ戻る
2-431 ページ
CONNECT
RESOURCE
DBA
データベース レベルのアクセス権の付与または取消しができるのは、DBA アクセ
ス権を付与されたユーザだけです。
3 つのレベルのデータベースのアクセス権で、アクセスを制御します。レベルの低
い方から高い方に並べると、接続、リソース、DBA になります。データベースの
アクセス権を取り消すには、キーワード CONNECT、RESOURCE、DBA のうち一
つを、REVOKE 文で指定します。
アクセス権は階層構造になっているので ( この節の後の方で説明する、アクセス権
の定義で概要を示します )、DBA アクセス権を付与されたユーザのリソースのアク
セス権や接続アクセス権を取り消そうとしても、この文に効果はありません。DBA
アクセス権を付与されたユーザの DBA アクセス権を取り消しても、そのユーザは
データベースに対する接続アクセス権を失いません。DBA アクセス権またはリ
ソースのアクセス権を付与されたユーザがデータベースにアクセスするのを拒否す
るには、まず DBA アクセス権またはリソースのアクセス権を取り消し、次に別の
REVOKE 文で接続アクセス権を取り消します。
同様に、リソースのアクセス権を付与されたユーザの接続アクセス権を取り消そう
としても、この文に効果はありません。ユーザのリソースのアクセス権を取り消し
ても、そのユーザはデータベースに対する接続アクセス権を失いません。
SQL 文
2-439
REVOKE 文
データベースのアクセス権は、次のキーワードと関連付けられています。
アクセス権
機能
CONNECT
データの問合せと変更ができます。変更しようとするデータベー
ス オブジェクトの所有者であれば、データベース スキーマを変
更できます。接続アクセス権を付与されたユーザは、次の機能を
実行できます。
RESOURCE
■
CONNECT 文などの接続文によって、データベースに接続。
■
必要な表レベルのアクセス権が付与されている場合、
SELECT、INSERT、UPDATE、DELETE 文を実行。
■
基礎の表に対する選択アクセス権が付与されている場合、
ビューを作成。
■
シノニムを作成。
■
一時表および一時表のインデックスを作成。
■
表またはインデックスの所有者である場合 ( あるいは、表に対
する変更、インデックス、または参照アクセス権が付与されて
いる場合 )、その表またはインデックスを変更、または削除。
■
表の所有者である場合 ( あるいは、表に対するアクセス権を
キーワード WITH GRANT OPTION で付与されている場合 )、
その表に対するアクセス権を付与。
データベース構造を拡張できます。リソースのアクセス権を持つ
ユーザは、接続アクセス権の機能に加えて、次の機能を実行でき
ます。
■
新しい表を作成
■
新しいインデックスを作成
■
新しいプロシジャを作成
(1/2)
2-440 Informix Guide to SQL:Syntax
REVOKE 文
アクセス権
機能
DBA
DBA アクセス権を持つユーザは、リソースのアクセス権の機能
に加えて、次の機能を実行できます。
■
DBA アクセス権を含む、任意のデータベース レベルのアクセ
ス権を他のユーザに付与
■
任意の表レベルのアクセス権を他のユーザに付与
■
任意の表レベルのアクセス権をロールに付与
■
ユーザまたは他のロールに、ロールを付与
■
SET SESSION AUTHORIZATION 文を実行
■
キーワード NEXT SIZE を使用して、システム カタログ表のエ
クステント サイズを変更
■
所有者にかかわらず、データベース オブジェクトを削除
■
表、ビュー、インデックスを作成し、他のユーザをデータベー
ス オブジェクトの所有者に指定
■
DROP DATABASE 文を実行
■
systables 以外の、任意のシステム カタログ表の行を挿入、
削除、更新
(2/2)
警告 : ユーザ Informix および DBA は、ほとんどのシステム カタログ表を変更でき
ますが (systables を変更できるのは、ユーザ Informix だけです )、これらの表の行
は、更新、削除、挿入しないよう、強くお薦めします。システム カタログ表を変更
すると、データベースの保全性を損なうおそれがあります。Informix では、ALTER
TABLE 文を使用したシステム カタログ表の追加エクステント サイズの変更をサ
ポートしています。
未確定トランザクションの効果
REVOKE 文が実行されると、アクセス権が取り消される表に対するシステム カタ
ログ表 systables のエントリ行が排他ロックされます。このロックは、REVOKE 文
を含んだトランザクションが完了するまで解除されません。他のトランザクション
がこの表に対して SELECT 文を処理しようとすると、この表に対する systables のエ
ントリが排他ロックされているため、失敗します。最初のトランザクションがコ
ミットされるまで、SELECT 文の処理は成功しません。
SQL 文
2-441
REVOKE 文
参照
関連する文は、
「GRANT 文」、
「GRANT FRAGMENT 文」、
「REVOKE FRAGMENT
文」です。
ロールについての詳細は、
「CREATE ROLE 文」
、「DROP ROLE 文」、
「SET ROLE
文」を参照してください。
データベース レベルのアクセス権と表レベルのアクセス権の説明については、
『Informix Guide to Database Design and Implementation』を参照してください。
『Informix
GRANT 文と REVOKE 文をプログラムに埋め込む方法の説明については、
Guide to SQL: Tutorial』を参照してください。
2-442 Informix Guide to SQL:Syntax
REVOKE FRAGMENT 文
+
IDS
REVOKE FRAGMENT 文
REVOKE FRAGMENT を使用して、フラグメント表の個々のフラグメントに対して
付与されたアクセス権を取り消します。挿入、更新、削除のフラグメント レベルの
アクセス権をユーザから取り消すことができます。
この文は、Dynamic Server でのみ使用できます。Dynamic Server Workgroup Edition と
Developer Editions では使用できません。
構文
フラグメントレベル
のアクセス権
2-445 ページ
REVOKE FRAGMENT
<表>
ON
,
FROM
,
(
<DB 領域 >
< ユーザ >
' < ユーザ > '
)
SQL 文
2-443
REVOKE FRAGMENT 文
要素
<DB 領域 >
<表>
< ユーザ >
目的
フラグメントを格納する DB 領
域の名前です。
制限
指定された DB 領域は存在して
いなければなりません。
構文
識別子、
4-112 ページ
このパラメータを使用してアク
セス権を取り消すフラグメント
を指定します。フラグメントを
指定しないと、REVOKE 文は、
指定されたアクセス権が設定さ
れている一定の表内のすべての
フラグメントに適用されます。
アクセス権を取り消すフラグメ 指定された表は存在していて、
ントが含まれている表の名前
しかも式によって断片化されて
です。
いなければなりません。
データベースオブ
ジェクト名、
4-25 ページ
デフォルト値はありません。
指定されたアクセス権を取り消
すユーザの名前です。
識別子、
4-112 ページ
ユーザは有効なユーザでなけれ
ばなりません。
デフォルト値はありません。
説明
REVOKE FRAGMENT 文を使用して、断片化した表の一つまたは複数のフラグメン
トに対する挿入、更新、削除のアクセス権を 1 人または複数のユーザから取り消し
ます。
REVOKE FRAGMENT 文は、式に基づく分散方式によって断片化された表に対して
のみ有効です。式に基づく分散方式についての詳細は 2-8 ページの「ALTER
FRAGMENT 文」を参照してください。
REVOKE FRAGMENT 文では、フラグメントを一つまたは複数指定できます。フラ
グメントの指定は、フラグメントが常駐する DB 領域の指定によって行います。
特定のフラグメントやフラグメントのリストを REVOKE FRAGMENT 文に指定する
必要はありません。REVOKE FRAGMENT 文にフラグメントを何も指定しないと、
指定されたユーザは、現在持っているすべてのフラグメントに対する指定されたア
クセス権を失います。
2-444 Informix Guide to SQL:Syntax
REVOKE FRAGMENT 文
フラグメントレベルのアクセス権
フラグメントレベル
のアクセス権
REVOKE FRAGMENT 文へ戻る
2-443 ページ
ALL
,
INSERT
DELETE
UPDATE
フラグメントレベルのアクセス権は、個別に取り消したり、組み合わせて取り消し
たりすることができます。ユーザから取り消すアクセス権に対応するキーワードの
一覧を次に示します。
アクセス権
機能
ALL
フラグメントに挿入、削除、更新のアクセス権を与えます。
INSERT
行をフラグメントに挿入することができます。
DELETE
フラグメント内の行を削除することができます。
UPDATE
フラグメント内の行を更新したり、UPDATE 文で表の列を指定し
たりすることができます。
REVOKE FRAGMENT 文でキーワード ALL を指定すると、指定されたユーザは、
現在指定されたフラグメントに対して持っているフラグメントレベルのアクセス権
をすべて失います。
たとえば、ユーザが表の一つのフラグメントに対して更新アクセス権を現在持って
いるとします。キーワード ALL を使用して、このフラグメントに対する現在のす
べてのアクセス権をこのユーザから取り消すと、そのユーザはこのフラグメントに
対して持っていた更新アクセス権を失います。
SQL 文
2-445
REVOKE FRAGMENT 文
REVOKE FRAGMENT 文の例
次に、表 customer に基づく例を示します。次の例では、表 customer が式に基づく分
散方式によって 3 つのフラグメントに断片化され、フラグメントはそれぞれ dbsp1、
dbsp2、dbsp3 と名付けられた DB 領域に常駐すると想定しています。
一つのアクセス権の取消し
次の文は、dbsp1 に常駐する表 customer のフラグメントに対する更新アクセス権を
ユーザ ed から取り消しています。
REVOKE FRAGMENT UPDATE ON customer (dbsp1) FROM ed
複数のアクセス権の取消し
次の文は、dbsp1 に常駐する表 dbsp1 のフラグメントに対する更新と挿入のアクセ
ス権をユーザ susan から取り消しています。
REVOKE FRAGMENT UPDATE, INSERT ON customer (dbsp1) FROM susan
すべてのアクセス権の取消し
次の文は、dbsp1 に常駐する表 dbsp1 のフラグメントに対する、現在付与されてい
るすべてのアクセス権をユーザ harry から取り消しています。
REVOKE FRAGMENT ALL ON customer (dbsp1) FROM harry
複数のフラグメントに対するアクセス権の取消し
次の文は、dbsp1 と dbsp2 に常駐する表 customer のフラグメントに対する、現在付
与されているすべてのアクセス権をユーザ millie から取り消しています。
REVOKE FRAGMENT ALL ON customer (dbsp1, dbsp2) FROM millie
複数のユーザからのアクセス権の取消し
次の文は、dbsp3 に常駐する表 customer のフラグメントに対する、現在付与されて
いるすべてのアクセス権をユーザ jerome と hilda から取り消しています。
REVOKE FRAGMENT ALL ON customer (dbsp3) FROM jerome, hilda
2-446 Informix Guide to SQL:Syntax
REVOKE FRAGMENT 文
フラグメントを指定しないアクセス権の取消し
次の文は、現在アクセス権を持っているすべてのフラグメントに対するアクセス権
を、ユーザ mel から取り消します。
REVOKE FRAGMENT ALL ON customer FROM mel
参照
関連する文は、
「REVOKE 文」
、「GRANT FRAGMENT 文」です。
フラグメントレベルのアクセス権および表レベルのアクセス権についての説明は、
『Informix Guide to Database Design and Implementation』を参照してください。
SQL 文
2-447
ROLLBACK WORK 文
ROLLBACK WORK 文
ROLLBACK WORK 文を使用してトランザクションを中止し、そのトランザクショ
ンの開始以降に行われた変更を無効にします。ROLLBACK WORK 文は、データ
ベースをトランザクション開始前の状態に復元します。
構文
ROLLBACK
WORK
説明
ROLLBACK WORK 文は、トランザクション付きのデータベースでのみ有効です。
ANSI 標準準拠でないデータベースでは、BEGIN WORK 文でトランザクションを開
始します。また、トランザクションを終了する場合には COMMIT WORK 文を使用
し、トランザクションをキャンセルする場合は ROLLBACK WORK 文を使用しま
す。ROLLBACK WORK 文は、データベースをトランザクションの開始直前の状態
に復元します。
ROLLBACK WORK 文は、複数の SQL 文による処理の終了時にのみ使用してくだ
さい。
また、ROLLBACK WORK 文は、取り消されたトランザクションに保持されていた
行や表のロックをすべて解除します。実行中のトランザクションが一つも存在しな
い場合に ROLLBACK WORK 文を実行すると、エラーになります。
ANSI
ANSI 標準準拠のデータベースでは、トランザクションは暗黙のうちに作成されま
す。トランザクションは、COMMIT WORK 文または ROLLBACK WORK 文の後に
開始されるので、BEGIN WORK 文は不要です。実行中のトランザクションがない
ときに ROLLBACK WORK 文を実行しても、文は受け付けられますが効果はありま
せん。♦
E/C
ESQL/C では、ROLLBACK WORK 文は、WITH HOLD カーソルを除き、オープンし
ているカーソルをすべてクローズします。WITH HOLD カーソルは、トランザク
ションが確定またはロール バックされた後もオープンされたままです。
2-448 Informix Guide to SQL:Syntax
ROLLBACK WORK 文
ROLLBACK WORK 文を WHENEVER 文によって呼び出された処理の中で使用する
場合は、ROLLBACK WORK 文の前に、WHENEVER SQL ERROR CONTINUE 文と
WHENEVER SQL WARNING CONTINUE 文を指定してください。これにより、
ROLLBACK WORK 文にエラーや警告が発生してもプログラムがループすることを
防止できます。♦
キーワード WORK
キーワード WORK は、ROLLBACK WORK 文のオプションです。次の二つの文は、
同じです。
ROLLBACK;
ROLLBACK WORK;
参照
関連する文は、
「BEGIN WORK 文」、
「COMMIT WORK 文」です。
トランザクションと ROLLBACK WORK 文の説明については、『Informix Guide to
SQL: Tutorial』を参照してください。
SQL 文
2-449
SELECT 文
SELECT 文
SELECT 文を使用して、データベースに対して問合せを行います。
構文
UNION
UNION ALL
Select 節
2-452 ページ
SELECT
オプティマイザ
ディレクティブ
4-140 ページ
+
IDS
E/C
SPL
INTO 節
2-494 ページ
FROM 節
2-466 ページ
WHERE 節
2-471 ページ
GROUP BY 節
2-481 ページ
+
HAVING 節
2-483 ページ
+
ORDER BY 節
2-485 ページ
INTO Tables 節
2-496 ページ
FOR READ ONLY
FOR UPDATE
,
OF
要素
<列>
<列>
目的
制限
取出しのあと更新できる列の 指定された列は表の中に存在しな
名前です。
ければなりませんが、SELECT 節
の選択対象の並びの中に存在する
必要はありません
2-450 Informix Guide to SQL:Syntax
構文
識別子、
4-112 ページ
SELECT 文
説明
SELECT 文を使用すると、現行データベースや、非現行データベース、現行データ
ベースとは異なるデータベースサーバ上にあるデータベースの表の問合せが可能です。
SELECT 文は多くの基本節で構成されています。各節を次に説明します。
E/C, SPL
節
目的
SELECT
データベースから読み込まれる項目の並びの名前
INTO
ESQL/C または格納プロシジャで選択されたデータを受
け取るプログラム変数またはホスト変数を指定します。
FROM
選択された列を含む表を指定します。
WHERE
選択された行に条件を設定します。
GROUP BY
行のグループを結合して要約結果に入れます。
HAVING
要約結果に条件を設定します。
ORDER BY
選択された行をソートします。
FOR UPDATE
SELECT 文が返す値を取出し後に更新可能な値として
指定します。
FOR READ ONLY
SELECT 文が返す値を取出し後に更新できない値とし
て指定します。
INTO TEMP
現行データベースに一時表を作成し、問合せの結果を
この表に入れます。
INTO SCRATCH
現行データベースにログなし一時表を作成し、問合せ
の結果をこの表に入れます。
INTO EXTERNAL
外部表に問合せの結果をロードします。
SQL 文
2-451
SELECT 文
SELECT 節
SELECT 節は、次のダイヤグラムに示すようにキーワード SELECT と、選択対象の
データベースオブジェクトまたは式で構成されます。
SELECT 文へ戻る
2-450 ページ
Select 節
,
選択対象
の並び
FIRST
ALL
< 番号 >
DISTINCT
+
UNIQUE
選択対象
の並び
式
4-33 ページ
< 表示ラベル >
AS
*
< 表 >.
< ビュー >.
< シノニム >.
< 別名 >.
AD/XP
< 外部 >.
2-452 Informix Guide to SQL:Syntax
SELECT 文
要素
*
目的
指定された表またはビューの
中のすべての列が選択される
ことを示します。
制限
このシンボルは、表またはビューの中
のすべての列を定義された順序で抽出
したいとき、常に使用してください。
すべての列を他の順序で抽出したいと
き、または列のサブセットを抽出した
いときは、これらの列を SELECT の
並びで明示的に指定しなければなりま
せん。
< 別名 >
FROM 節の表またはビューに FROM 節で表またはビューに別名を
対する一時的な代替名です。 割り当てないと、SELECT 節に別名を
使用することはできません。
別名の詳細については、
2-466 ページの「FROM 節」
を参照して下さい。
< 表示ラベル > 列に割り当てる一時名です。 表示ラベルは、選択対象の並びの中の
DB-Access では、表示ラベル どの列にも割り当てることができま
す。INTO TEMP 節を設定した
は SELECT 文の出力で列の
ヘッダとして表示されます。 SELECT 文で一時表を作成している場
ESQL/C では、< 表示ラベル > 合、単純な列式でないすべての列に表
の値は構造体 sqlda のフィー 示ラベルを指定しなければなりませ
ルド sqlname に格納されます。 ん。表示ラベルは、一時表の中で列の
パラメータ < 表示ラベル > に 名前として使用されます。ビューの作
ついての詳細は、2-460 ペー 成に SELECT 文を使用しているとき、
ジの「表示ラベルの使用」を 表示ラベルは使わないでください。表
示ラベルの代わりに、必要なラベル名
参照してください。
を列 CREATE VIEW で指定してくだ
さい。表示ラベルがキーワードである
場合、キーワード AS を表示ラベルと
ともに使用してキーワードの使用を明
確にすることができます。キーワード
UNITS、YEAR、MONTH、DAY、
HOUR、MINUTE、SECOND、
FRACTION を表示ラベルとして使用
するには、キーワード AS とともに使
用しなければなりません。
構文
アスタリスク (*)
はこの文の中で
特別な意味を持つ
リテラル値です。
識別子、
4-112 ページ
識別子、
4-112 ページ
(1/2)
SQL 文
2-453
SELECT 文
要素
< 外部 >
< 番号 >
< シノニム >
<表>
< ビュー >
目的
制限
データの抽出元となる外部表 外部表が存在していなければなりま
の名前です。
せん。
構文
データベース オ
ブジェクト名、
4-25 ページ
返す行数を示す整数です。
この値は、1 以上でなければなりませ リテラル番号、
ん。この値が問合せの選択基準に一致 4-138 ページ
する行数よりも大きい場合は、一致す
るすべての行が返されます。
データの抽出元となるシノニ シノニムとそのシノニムが指す表が存 データベース オ
ムの名前です。
在していなければなりません。
ブジェクト名、
4-25 ページ
データの抽出元となる表の名 表が存在していなければなりません。 データベース オ
前です。
ブジェクト名、
4-25 ページ
データの抽出元となるビュー ビューが存在していなければなりま
データベース オ
の名前です。
せん。
ブジェクト名、
4-25 ページ
(2/2)
SELECT 節では、どのデータを選択するか正確に指定すると同時に、重複値を省略
するかどうかについても指定してください。
FIRST 節
FIRST 節を使用すると、SELECT 文で指定された条件に一致する行の最大抽出行数
を指定できます。選択基準に一致する行であっても、指定された数を超える分は返
されません。
次の例は、表から最大 10 行を抽出するものです。
SELECT FIRST 10 a, b FROM tab1;
このオプションを ORDER BY 節で使用すると、順序条件に従って最初の番号の行
を抽出できます。たとえば、次の問合せでは、給与の高い社員の中から上位 10 人
が検索されます。
SELECT FIRST 10 name, salary
FROM emp
ORDER BY salary DESC
2-454 Informix Guide to SQL:Syntax
SELECT 文
AD/XP
Dynamic Server with AD and XP Options を使用している場合は、FIRST 節を使用して、
ユニオン問合せの結果返される最初の行を選択することもできます。次の例で、
FIRST 節は UNION 式の結果に適用されます。
SELECT FIRST 10 a, b FROM tab1 UNION SELECT a, b FROM tab2
♦
FIRST 節での制限
次の場合、FIRST 節は使用できません。
IDS
IDS
■
ビューを定義するとき
■
入れ子 SELECT 文内
■
副問合せ内
■
INSERT 文の SELECT 節内
■
SELECT 文でデータを選択し、それを一時表、スクラッチ表、または外部
表などの別の表に挿入するとき
■
ストアド プロシジャ内
■
埋込み SELECT 文を式として使用できる文内
■
UNION 問合せの一部として (Dynamic Server を使用している場合 ) ♦
Dynamic Server における列名としての FIRST の使用
FIRST はキーワードですが、データベース サーバは、これを列名として解釈するこ
ともできます。キーワードの後に整数が付いていない場合、データベース サーバ
は、FIRST を列の名前と解釈します。たとえば、表に first、second、および third の
各列がある場合、次の問合せでは、列 first のデータが返されます。
SELECT first
from T
SQL 文
2-455
SELECT 文
重複値の許可
ALL、UNIQUE、DISTINCT のいずれかのキーワードを使用して、重複値が返され
るのを許可するかどうかを指定できます。これらのキーワードを一つも指定しない
と、デフォルトですべての行が返されます。
キーワード
意味
ALL
重複値が存在するかどうかにかかわらず、選択されたすべて
の値を返すことを指定します。
ALL はデフォルト値です。
DISTINCT
問合せ結果から重複行を除去します。
UNIQUE
問合せ結果から重複行を除去します。
UNIQUE は DISTINCT のシノニムです。
たとえば、次の問合せ例では、すべての注文品目の中から重複する品目を除いて、
stock_num と manu_code を出力します。
SELECT DISTINCT stock_num, manu_code FROM items
キーワード DISTINCT またはキーワード UNIQUE は、問合せや副問合せの各レベ
ルで 1 回しか使用できません。次の例では、問合せと副問合せの両方でキーワード
DISTINCT を使用しています。
SELECT DISTINCT stock_num, manu_code FROM items
WHERE order_num = (SELECT DISTINCT order_num FROM orders
WHERE customer_num = 120)
選択対象の並びでの式
SELECT 節の選択対象の並びには、列、定数、関数、集計関数、ストアドプロシ
ジャの 5 種類の基本式を単独か、組み合わせて使用できます。これら 5 種類の式に
ついての詳細は、4-33 ページの「式」を参照してください。
ここでは、選択対象の並びで各種の単純式を使用する例を示しています。
加減乗除の算術演算子を使用して、単純式を組み合わせることができます。ただ
し、列式や集計関数を組み合わせる場合は、列式を GROUP BY 節に指定しなけれ
ばなりません。
2-456 Informix Guide to SQL:Syntax
SELECT 文
選択対象の並び自体に、変数名 ( たとえば ESQL/C アプリケーションのホスト変数
や ストアドプロシジャのストアドプロシジャ変数 ) は使用できません。ただし、算
術演算子または連結演算子によって変数が定数に関連付けられている場合は、選択
対象の並びにその変数名を含めることができます。
列の指定
列式は、SELECT 文の中でもっともよく使用されます。列式の構文および使用方法
についての詳細は、4-35 ページの「列式」を参照してください。
次は、選択対象の並びでの列式の使用例です。
SELECT orders.order_num, items.price FROM orders, items
SELECT customer.customer_num ccnum, company FROM customer
SELECT catalog_num, stock_num, cat_advert [1,15] FROM catalog
SELECT lead_time - 2 UNITS DAY FROM manufact
定数の指定
SELECT 節の選択対象の並びの中に定数式を記述すると、問合せによって返される
各行に同じ値が返されます。定数式の構文と使用方法についての詳細は、4-47 ペー
ジの「定数式」を参照してください。
次は、選択対象の並びでの定数式の使用例です。
SELECT 'The first name is', fname FROM customer
SELECT TODAY FROM cust_calls
SELECT SITENAME FROM systables WHERE tabid = 1
SELECT lead_time - 2 UNITS DAY FROM manufact
SELECT customer_num + LENGTH('string') from customer
SQL 文
2-457
SELECT 文
関数式の指定
関数式とは、各行に対する問合せで評価される関数を使用する式です。すべての関
数式には引数が必要です。引数として列名が指定される関数式には、時刻関数や長
さ関数があります。
次は、選択対象の並びでの関数式の使用例です。
SELECT EXTEND(res_dtime, YEAR TO SECOND) FROM cust_calls
SELECT LENGTH(fname) + LENGTH(lname) FROM customer
SELECT HEX(order_num) FROM orders
SELECT MONTH(order_date) FROM orders
集計関数の指定
集計関数は、問合せの対象となった一組の行に対して、一つの値を返します。集計
関数は、SELECT 文の WHERE 節が返した行の組によって決められる値を受け付け
ます。WHERE 節がない場合は、FROM 節での記述から選択されるすべての行に
よって決められる値を受け付けます。
次は、選択対象の並びでの集計関数の使用例です。
SELECT SUM(total_price) FROM items WHERE order_num = 1013
SELECT COUNT(*) FROM orders WHERE order_num = 1001
SELECT MAX(LENGTH(fname) + LENGTH(lname)) FROM customer
ストアド プロシジャ式の指定
ストアド プロシジャは、使用できる関数の範囲を広げ、選択した行ごとに副問合せ
を実行できるようにします。
2-458 Informix Guide to SQL:Syntax
SELECT 文
次の例では、customer_num ごとに get_orders プロシジャを呼び出し、n_orders とい
うラベルを付けてプロシジャの結果を出力しています。
SELECT customer_num, lname,
get_orders(customer_num) n_orders
FROM customer
---get_orders is a stored procedure that
--finds the number of orders placed by a customer;
--(customer_num) is the argument to the procedure;
--n_orders is a display label for the return value.
プロシジャの入力パラメータの名前を知っている場合は、次の例で示すように、こ
の名前をストアド プロシジャ式に含めることができます。この例に示した SELECT
文は、ストアド プロシジャ式に入力パラメータの名前と等号 (=) が含まれることを
除いて、前の例で示した文と同じです。
SELECT customer_num, lname,
get_orders(custnum = customer_num) n_orders
FROM customer
---get_orders is a stored procedure that
--finds the number of orders placed by a customer;
--custnum is the name assigned
--to the input parameter of the stored procedure
--by a CREATE PROCEDURE statement;
--customer_num is the value assigned to custnum
--by the SELECT statement;
--n_orders is a display label for the return value.
選択対象の並びでストアド プロシジャ式を使用する場合、そのストアド プロシ
ジャは、単一の値だけを返すものでなければなりません。複数の値を返すプロシ
ジャを使用すると、SELECT 文は失敗して、エラー メッセージが返されます。この
メッセージは、プロシジャが返す値が多すぎることを示します。
ストアド プロシジャ式の詳しい構文については、4-110 ページの「プロシジャ 呼出
し式」を参照してください。
SQL 文
2-459
SELECT 文
算術演算子を使用する式の指定
算術演算子によって数値式を組み合わせると、複合式が作成できます。ただし、集
計関数が記述されている式は、列式と組み合わせることはできません。次に、選択
対象の並びで算術演算子を使用している式の例を示します。
SELECT stock_num, quantity*total_price FROM customer
SELECT price*2 doubleprice FROM items
SELECT count(*)+2 FROM customer
SELECT count(*)+LENGTH('ab') FROM customer
表示ラベルの使用
一時表を作成する場合は、単純な記述の列式以外のすべての表示列に対して、表示
ラベルを指定します。表示ラベルは、一時表内で列名として使用されます。
DB
DB-Access の表示ラベルは、SELECT 文の出力でその列のヘッダとして使用され
ます。♦
E/C
ESQL/C の表示ラベルに指定した値は、
sqlda 構造体のフィールド sqlname に格納され
ます。sqlda 構造体についての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』
を参照してください。♦
ビューを作成する際に SELECT 文を使用している場合は、表示ラベルは使用できま
せん。その代わり CREATE VIEW 文の列の並びの中で、必要なラベル名を指定して
ください。
キーワード AS の使用法
表示ラベルがキーワードの場合は、表示ラベルとともにキーワード AS を使用して、
その語の使用を明確にできます。UNITS、YEAR、MONTH、DAY、HOUR、
MINUTE、SECOND、FRACTION を表示ラベルとして使用する場合は、表示ラベル
とともにキーワード AS を指定しなければなりません。次の例では、表示ラベルと
して minute を指定する場合のキーワード AS の使用を示しています。
SELECT call_dtime AS minute FROM cust_calls
2-460 Informix Guide to SQL:Syntax
SELECT 文
INTO 節
ストアド プロシジャまたは ESQL/C で INTO 節を使用して、SELECT 文によって取
り出されたデータを受け取るプログラム変数やホスト変数を指定します。次のダイ
ヤグラムに INTO 節の構文を示します。
SELECT 文へ戻る
2-450 ページ
INTO 節
,
INTO
< 出力変数 >
E/C
:
< 標識変数 >
+
$
INDICATOR
< 標識変数 >
< 標識変数 >
< データ構造体 >
要素
< データ構
造体 >
目的
ホスト変数として宣言された構造
体です。
制限
構造体の個々の要素は、選択さ
れている値のデータ型に正しく
一致しなければなりません。
構文
データ構造体の名前
は、データ構造体の
言語固有のルールに
従わなければなりま
せん。
< 標識変数 > 対応するデータ変数にナルデータ このパラメータはオプションで 標識変数の名前は標
が配置された場合にリターンコー すが、対応する < 出力変数 > の 識変数の言語固有の
ドを受け取るプログラム変数です。 値が NULL である可能性があれ ルールに従わなけれ
ば標識変数を使用してください。 ばなりません。
(1/2)
SQL 文
2-461
SELECT 文
要素
目的
< 出力変数 > プログラム変数またはホスト変数
です。
この変数は、SELECT 節の選択対
象の並びにある対応する値を受け
取ります。
制限
INTO 節に変数を受け取る順序
は、SELECT 節の選択対象の並
びにある対応する項目の順序と
一致しなければなりません。
構文
名前は、変数名に関
する言語固有の規則
に従わなければなり
ません。
受け取る変数の数は、選択対象
の並び内の項目数と等しくなけ
ればなりません。
受け取る各変数のデータ型は、
選択対象の並び内の対応する列
または式のデータ型と一致しな
ければなりません。
受け取る変数のデータ型が選択
された項目のデータ型と一致し
ない場合にデータベース サーバ
がとるアクションについては、
2-465 ページの「ESQL/C での警
告」を参照してください。
(2/2)
SELECT 文とともに INTO 節を指定して、問合せが戻す値を受け取る変数に名前を
付けなければなりません。問合せが複数の値を戻す場合、値は指定した順序で選択
対象の並びに戻されます。
DECLARE 文の一部ではなく、INTO 節を指定しない単独の SELECT 文である場合
は、1 行だけを返す単一 SELECT 文でなければなりません。次の例は、ESQL/C に
おける単一 SELECT 文を示しています。
EXEC SQL select fname, lname, company_name
into :p_fname, :p_lname, :p_coname
where customer_num = 101;
2-462 Informix Guide to SQL:Syntax
SELECT 文
E/C
標識変数を使用した INTO 節
ESQL/C では SELECT 文によって NULL 値が返される可能性がある場合は、INTO
節の標識変数を使用してください。標識変数についての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。
カーソルを使用した INTO 節
SELECT 文が複数の行を返す場合は、カーソルを使用して FETCH 文で一度に 1 行
ずつ取り出します。SELECT 文ではなく、FETCH 文でも INTO 節を設定することが
できますが、両方の文に同時に設定することはできません。
次の ESQL/C コードの例では、INTO 節の異なる使用方法を示しています。
SELECT 文での INTO 節の使用
EXEC SQL declare q_curs cursor for
select lname, company
into :p_lname, :p_company
from customer;
EXEC SQL open q_curs;
while (SQLCODE == 0)
EXEC SQL fetch q_curs;
EXEC SQL close q_curs;
FETCH 文での INTO 節の使用
EXEC SQL declare q_curs cursor for
select lname, company
from customer;
EXEC SQL open q_curs;
while (SQLCODE == 0)
EXEC SQL fetch q_curs into :p_lname, :p_company;
EXEC SQL close q_curs;
SQL 文
2-463
SELECT 文
E/C
INTO 節を設定した SELECT 問合せ文の
PREPARE 文による処理
ESQL/C では INTO 節を指定した問合せを、PREPARE 文で処理することはできませ
ん。この場合、INTO 節を指定していない問合せ文を PREPARE 文で処理し、処理
した問合せ文に対してカーソルを宣言して、カーソルをオープンします。次に
FETCH 文で INTO 節を指定し、カーソルを使用して値をプログラム変数の中に取り
出します。別の方法としては、問合せを PREPARE 文で処理せずにこの問合せに対
してカーソルを宣言し、宣言の際に INTO 節を設定します。次に、そのカーソルを
オープンし、FETCH 文で INTO 節を指定せずに、カーソルを使用して値を取り出し
ます。
E/C
INTO 節での配列変数の使用
ESQL/C では DECLARE 文を INTO 節付きの SELECT 文とともに使用していて、
INTO 節中のプログラム変数が配列の要素である場合、整数定数値または変数に
よって配列の個々の要素を識別できます。添字と使用される変数の値は、カーソル
の宣言時に決定されます。したがって、いったんカーソルが宣言されると、その添
字変数は定数としての機能を持ちます。
たとえば、次の ESQL/C コードでは、変数 i および j を配列 a に対する添字として
使用して、INTO 節を指定した SELECT 文に対してカーソルを宣言しています。こ
のカーソルを宣言すると、SELECT 文の INTO 節は INTO a[5],a[2] と指定したこと
と同じになります。
i = 5
j = 2
EXEC SQL declare c cursor for
select order_num, po_num into :a[i], :a[j] from orders
where order_num =1005 and po_num =2865
2-464 Informix Guide to SQL:Syntax
SELECT 文
また、FETCH 文の中でプログラム変数を使用して、INTO 節の中でプログラム配列
の要素を指定することもできます。FETCH 文の場合、プログラム変数の評価は
カーソルの宣言時ではなく、値を取り出すたびに行われます。
エラー検査
選択した項目のデータ型は、受け取る変数のデータ型と一致しない場合には、可能
であれば、変換されます。可能でなければ、エラーが発生し、状態変数 SQLCODE
(sqlca.sqlcode) に負の値が返されます。この場合、プログラム変数の値は予測できま
せん。
ANSI
E/C
ANSI 標準準拠のデータベースでは、INTO 節に並べられた変数の値が SELECT 節の
項目数と異なる場合は、エラーが返されます。♦
ESQL/C での警告
ESQL/C では、
INTO 節で並べられた変数の数が SELECT 節の項目数と異なる場合は、
sqlwarn 構造体の sqlca.sqlwarn.sqlwarn3 に警告が返されます。実際に転送される変数
の数は、この 2 つの数のうち小さい方の値になります。sqlwarn 構造体の詳細につ
いては、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。
SQL 文
2-465
SELECT 文
FROM 節
FROM 節にはデータを選択したい表を指定します。次に FROM 節の構文を示します。
SELECT 文へ戻る
2-450 ページ
FROM 節
<表>
FROM
AD/XP
< 番号 >
< ビュー >
AD/XP
SAMPLES OF
表の追加
+
< シノニム >
LOCAL
,
< 別名 >
AS
AD/XP
< 外部 >
表の追加
,
<表>
AD/XP
< 番号 >
< ビュー >
AD/XP
SAMPLES OF
LOCAL
< 別名 >
+
< シノニム >
AS
AD/XP
< 外部 >
+
<表>
OUTER
< ビュー >
< 別名 >
< シノニム >
OUTER
(
AS
)
<表>
< ビュー >
< シノニム >
2-466 Informix Guide to SQL:Syntax
< 別名 >
AS
,
表の追加
SELECT 文
要素
<別名>
目的
SELECT 文の有効範囲内の表ま
たはビューの一時的な代替名
です。
< 外部 >
データの抽出元となる外部表の
名前です。
制限
SELECT 文がセルフ結合の場合
FROM 節で表名を二度指定して
表名が現れるたびに異なる別名
を付けなければなりません。表
やビューの別名があいまいに
なってしまう可能性がある場合
は、その単語の前にキーワード
AS を記述してください。この制
限についての詳細は、2-468 ペー
ジの「別名に付けるキーワード
AS」を参照してください。
外部表が存在していなければな
りません。
< 番号 >
返すサンプル行数を示す整数
です。
この値は、1 以上の符号なし整
数でなければなりません。
別名を使用して問合せを短くす
ることができます。
< シノニム >
データの抽出元となるシノニム
の名前です。
<表>
データの抽出元となる表の名前
です。
この値が表内の行数よりも大きい
場合は、表全体が走査されます。
シノニムとそのシノニムが指す
表が存在していなければなりま
せん。
表が存在していなければなりま
せん。
< ビュー >
データの抽出元となるビューの
名前です。
ビューが存在していなければな
りません。
構文
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
リテラル番号、
4-138 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
外部結合を形成するにはキーワード OUTER を使用します。外部結合では、通常の
単純結合では結合対象とされない行が取り出されます。外部結合についての詳細は
『Informix Guide to SQL: Tutorial』を参照してください。
表名やビュー名に別名を付けることができます。表やビューの別名を使用して、
SELECT 文の他の節でその表を参照することができます。別名は、セルフ結合の場
合に特に便利です。セルフ結合についての詳細は、2-471 ページの「WHERE 節」を
参照してください。
SQL 文
2-467
SELECT 文
次の例では、FROM 節の一般的な使用方法を示しています。最初の問合せでは、表
customer からすべての行と列を選択しています。二番目の問合せでは、表 customer
と表 orders 間の結合関係を使用して、製品を発注している顧客の情報をすべて選択
しています。
SELECT * FROM customer
SELECT fname, lname, order_num
FROM customer, orders
WHERE customer.customer_num = orders.customer_num
次の例は、先ほどの例の二番目の問合せと同じです。ただし、FROM 節の中で表の
別名を設定して、その別名を WHERE 節の中で使用しています。
SELECT fname, lname, order_num
FROM customer c, orders o
WHERE c.customer_num = o.customer_num
次の例では、キーワード OUTER を使用して外部結合を作成して、顧客が発注して
いるかどうかにかかわらず、すべての顧客とその注文の一覧を作成しています。
SELECT c.customer_num, lname, order_num
FROM customer c, OUTER orders o
WHERE c.customer_num = o.customer_num
別名に付けるキーワード AS
表やビューの別名があいまいになってしまう可能性がある場合は、その単語の前に
キーワード AS を記述してください。特に、表やビューの別名に ORDER、FOR、
GROUP、HAVING、INTO、UNION、WHERE、WITH,、CREATE、GRANT の各
キーワードを使用する場合には、必ずキーワード AS を記述してください。
2-468 Informix Guide to SQL:Syntax
SELECT 文
AD/XP
結合と副問合せでの外部表の使用に関する制限
Dynamic Server with AD and XP Options では、結合または副問合せで外部表を使用す
る場合に、次の制限が適用されます。
■
1 回の問合せでは一つの外部表しか使用できない。
■
外部表は外部結合の外部表にできない。
■
結合に変換できない副問合せでは、主問合せに外部表を使用できるが、副
問合せではできない。
■
外部表に対してセルフ結合は実行できない。
副問合せの詳細については、
『Performance Guide』を参照してください。
AD/XP
キーワード LOCAL
Dynamic Server with AD and XP Options では、LOCAL 表機能を使用すると、クライア
ント アプリケーションが表のローカル フラグメントからだけデータを読み取るよ
うにできます。つまり、クライアントが接続されているコサーバ上にあるフラグメ
ントだけをアプリケーションが読み取るようにできます。
この機能では、アプリケーションの区分化を行うことができます。アプリケーショ
ンは、複数のコサーバに接続して、コサーバごとに LOCAL 読取りを実行し、クラ
イアント マシン上で最終結果をアセンブルできます。
ローカル コサーバ上のフラグメントだけから行を抽出することを示すには、表の名
前をキーワード LOCAL によって修飾します。キーワード LOCAL は、断片化され
ていない表から抽出されたデータに対しては効果がありません。
問合せに結合が含まれる場合は、クライアントに集計可能なデータを抽出するかど
うかを慎重に考慮して決定する必要があります。結合によって集計に適したデータ
を確実に抽出するには、LOCAL 表の数を一つに制限する方法が最も簡単です。こ
れによって、クライアントはその表に関連してデータを集計できます。
次の例は、クライアントによる集計に適したデータを返す問合せを示しています。
SELECT x.col1, y.col2
FROM LOCAL tab1 x, tab2 y {can be aggregated by client}
INTO TEMP t1
WHERE x.col1 = y.col1 ;
{tab1 is local}
SQL 文
2-469
SELECT 文
次の例は、クライアントが集計できないデータを示しています。
SELECT x.col1, y.col2
FROM LOCAL tab1 x, LOCAL tab2 y {cannot be aggregated by
client}
INTO SCRATCH s4
WHERE x.col1 = y.col1 ; {tab1 and tab2 are local}
クライアントは、コサーバごとにまったく同じ問合せを実行要求して、集計可能な
データを抽出する必要があります。
AD/XP
サンプル問合せ : オプション SAMPLES OF
Dynamic Server with AD and XP Options では、サンプル問合せがサポートされていま
す。サンプル問合せとは、サンプル表に基づく問合せのことをいいます。サンプル
表とは、選択基準に一致するすべての行ではなく、指定された数の行を表からラン
ダムに選択した結果のことをいいます。
サンプル問合せを使用すると、大きな表内にあるデータのおよそのプロフィールを
速やかに収集できます。十分に大きなサンプル サイズを使用すれば、すべてのデー
タを走査する代わりにデータのサンプルをとって、データの傾向を調べることがで
きます。このような場合、データを走査するよりもサンプル問合せを使用した方が
パフォーマンスが向上します。
表がサンプリングされることを示すには、SELECT 文の FROM 節のオプション
SAMPLES OF に、返されるサンプル数を指定します。サンプル問合せは、表やシノ
ニムに対して実行できますが、ビューには実行できません。サンプル問合せは、
INSERT、DELETE、UPDATE などの SQL 文ではサポートされていません。
サンプル問合せには、少なくとも一つのサンプル表があります。1 回のサンプル問
合せですべての表をサンプリングする必要はありません。表の中には、FROM 節で
オプション SAMPLES OF を指定できるものとできないものがあります。
このサンプリング方法は、置換えなしのサンプリングとして知られているもので
す。この用語は、サンプリングされた行は再度サンプリングされないということを
意味します。データベース サーバは、サンプルが選択された後で選択基準を適用し
ます。したがって、データベース サーバは、この選択基準を使用して、サンプリン
グ元の行ではなくサンプル セットを制限します。
2-470 Informix Guide to SQL:Syntax
SELECT 文
表が断片化している場合、データベース サーバは、指定された数のサンプルをこれ
らのフラグメント間で割り振ります。一つのフラグメントからのサンプル数は、フ
ラグメントのサイズと表のサイズの比率に比例します。つまり、フラグメントが大
きいほど、データベース サーバがとるサンプル数は多くなります。
重要 : UPDATE STATISTICS LOW を実行してから、オプション SAMPLES OF を
付けた問合せを実行する必要があります。UPDATE STATISTICS を実行しないと、
SAMPLE 節は無視されて、すべてのデータが返されます。UPDATE STATISTICS
LOW を実行してから、オプション SAMPLES OF を付けた問合せを実行するよう
にお勧めします。
サンプル問合せの結果には、すべての行を完全に走査した場合との一定量の偏差も
含まれます。ただし、実際の行に対するサンプル行の比率を増やすことによって、
この予測されるエラーは許容できるレベルまで減らすことができます。サンプル問
合せを結合で使用すると、予測されるエラーは大幅に増加します。許容できるレベ
ルの精度を維持するには、各表で使用するサンプルを大きくする必要があります。
たとえば、およそ 100,000,000 行が含まれることがわかっている表 parts_sold から、
各パーツがいくつ売れるかを示すリストを生成する場合を想定します。次の問合せ
は、1 パーセントのサンプリング比率を与えて、およその結果を返すものです。
SELECT part_number, COUNT(*) * 100 AS how_many
FROM 1000000 SAMPLES OF parts_sold
GROUP BY part_number;
WHERE 節
検索範囲と結合条件を指定してデータを検索する場合に使用します。
WHERE 節
AND
WHERE
SELECT 文へ戻る
2-450 ページ
条件
セグメント
4-5 ページ
結合
2-478 ページ
SQL 文
2-471
SELECT 文
WHERE 節における条件の使用
WHERE 節では、次に示す種類の単純な条件比較が使用できます。
■
関係演算子
✮
BETWEEN
✮
IN
✮
IS NULL
■
LIKE または MATCHES
また、WHERE 節の中でも SELECT 文が使用できます。このような使用は副問合せ
と呼ばれます。以下に副問合せ WHERE 節の種類を示します。
✮
IN
✮
EXISTS
■
ALL/ANY/SOME
ここでは、それぞれの条件の例を説明します。各条件についての詳細は、4-5 ペー
ジの「条件セグメント」の説明を参照してください。
集計関数が副問合せの一部でない場合、または集計関数は元の問合せに含まれてい
る列を対象としているけれども、WHERE 節が HAVING 節の中の副問合せの中にあ
る場合、集計関数を WHERE 節で使用することはできません。
関係演算子条件
関係演算子条件についての詳細は、4-9 ページを参照してください。
関係演算子条件は、関係演算子の左右の式がその演算子によって設定された関係を
満足するときに成立します。次の SELECT 文では、より大きい (>) と等号 (=) の二
つの演算子を使用しています。
SELECT order_num FROM orders
WHERE order_date > '6/04/98'
SELECT fname, lname, company
FROM customer
WHERE city[1,3] = 'San'
2-472 Informix Guide to SQL:Syntax
SELECT 文
BETWEEN 条件
BETWEEN 条件についての詳細は、4-10 ページを参照してください。
BETWEEN 条件は、キーワード BETWEEN の左側にある値が右側にある二つの値の
範囲に収まる場合に成立します。次の例のうち、最初の二つの問合せでは、
BETWEEN キーワードの後に定数値を使用しています。3 番目の問合せでは、
CURRENT 関数と時間隔 (INTERVAL) 型定数を使用して、現在の日付とその 7 日前
の間に収まる日付を探しています。
SELECT stock_num, manu_code FROM stock
WHERE unit_price BETWEEN 125.00 AND 200.00
SELECT DISTINCT customer_num, stock_num, manu_code
FROM orders, items
WHERE order_date BETWEEN '6/1/97' AND '9/1/97'
SELECT * FROM cust_calls WHERE call_dtime
BETWEEN (CURRENT - INTERVAL(7) DAY TO DAY) AND CURRENT
IN 条件
IN 条件についての詳細は、4-16 ページを参照してください。
IN 条件は、キーワード IN の左側にある式が右側にある値の中に存在する場合に成
立します。次に IN 条件の使用例を示します。
SELECT lname, fname, company
FROM customer
WHERE state IN ('CA','WA', 'NJ')
SELECT * FROM cust_calls
WHERE user_id NOT IN (USER )
IS NULL 条件
NULL 条件についての詳細は、4-11 ページを参照してください。
NULL 条件は、列値が NULL 値を持つ場合に成立します。NOT オプションを使用
すると、列が NULL 値以外の値を持つ場合に条件が成立します。次の例では、支払
いが済んでいない注文の注文番号と顧客番号を選択しています。
SELECT order_num, customer_num FROM orders
WHERE paid_date IS NULL
SQL 文
2-473
SELECT 文
LIKE 条件と MATCHES 条件
LIKE 条件と MATCHES 条件についての詳細は、4-11 ページを参照してください。
LIKE 条件または MATCHES 条件は、次のテストのいずれかが真である場合に成立
します。
■
キーワード LIKE または MATCHES が先行する列の値が、引用符付き文字列
が指定するパターンに一致する。文字列ではワイルドカード文字を使用で
きます。
■
キーワードLIKEまたはMATCHESが先行する列の値が、
キーワードLIKEま
たは MATCHES に続く列により指定されたパターンに一致する。右側の列
の値は、条件での一致パターンを示します。
次の SELECT 文では、表 customer から列 lname が定数文字列 ’Baxter’ で始まる行を
取り出しています。文字列が定数文字列であるため、この条件では、大文字と小文
字が区別されます。
SELECT * FROM customer WHERE lname LIKE 'Baxter%'
次の SELECT 文では、表 customer から列 lname の値が列 fname の値に一致するすべ
ての行を取り出しています。
SELECT * FROM customer WHERE lname LIKE fname
次の例では、LIKE 条件をワイルドカードとともに使用しています。最初の
SELECT 文では、ボールに分類される取扱品目をすべて選択しています。二番目の
SELECT 文では、会社名にパーセント記号 (%) が含まれるものをすべて選択してい
ます。バックスラッシュ (¥) は、ワイルドカードのパーセント記号 (%) の標準エス
ケープ文字です。3 番目の SELECT 文では、LIKE 条件とともに ESCAPE オプショ
ンを使用して列 company にパーセント記号 (%) が含まれる行を表 customer から選択
しています。ここでは、ワイルドカードのパーセント記号 (%) のエスケープ文字と
して ”z” を使用しています。
SELECT stock_num, manu_code FROM stock
WHERE description LIKE '%ball'
SELECT * FROM customer
WHERE company LIKE '%¥%%'
SELECT * FROM customer
WHERE company LIKE '%z%%' ESCAPE 'z'
2-474 Informix Guide to SQL:Syntax
SELECT 文
次の例では、キーワード MATCHES をワイルドカードとともに使用しています。最
初の SELECT 文では、ボールに分類される取扱品目をすべて選択しています。二番
目の SELECT 文では、会社名にアスタリスク (*) が含まれるものをすべて選択して
います。バックスラッシュ (\) または円記号 (¥) は、ワイルドカードのアスタリスク
(*) の標準エスケープ文字です。3 番目の SELECT 文では、MATCHES 条件ととも
に ESCAPE オプションを使用して、列 company にアスタリスク (*) が含まれる行を
表 customer から選択しています。ここでは、ワイルドカードのアスタリスク (*) の
エスケープ文字として文字 ”z” を使用しています。
SELECT stock_num, manu_code FROM stock
WHERE description MATCHES '*ball'
SELECT * FROM customer
WHERE company MATCHES '*¥**'
SELECT * FROM customer
WHERE company MATCHES '*z**' ESCAPE 'z'
SQL 文
2-475
SELECT 文
キーワード IN を使った副問合せ文
キーワード IN を使った副問合せ文についての詳細は、4-11 ページを参照してくだ
さい。
キーワード IN を使った副問合せ文を使用して、複数の列が返される可能性があっ
ても、ただ一つの列を返すように指定することができます。次の例は、SELECT 文
の中での IN 副問合せ文の使用を示しています。
SELECT DISTINCT customer_num FROM orders
WHERE order_num NOT IN
(SELECT order_num FROM items
WHERE stock_num = 1)
キーワード EXISTS を使った副問合せ文
キーワード EXISTS を使った副問合せ文についての詳細は、4-17 ページを参照して
ください。
キーワード EXISTS を使った副問合せ文を使用して、任意の個数の列を返すことが
できます。
次の EXISTS 副問合せ文を使った SELECT 文の例では、受注したことがないために
表 items にない品目の stock_num と manu_code を返します。ここでは、表 items の
stock_num と manu_code を検査するための相関副問合せが必要なため、キーワード
EXISTS を使用しています。
SELECT stock_num, manu_code FROM stock
WHERE NOT EXISTS
(SELECT stock_num, manu_code FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code)
この例では行の有無を検査しているため、副問合せ文に選択する列名の代わりに
SELECT * 文を使用しても同じように機能します。
2-476 Informix Guide to SQL:Syntax
SELECT 文
キーワード ALL、ANY、SOME を使った副問合せ文
ALL、ANY、SOME の各キーワードを使った副問合せ文についての詳細は、4-18
ページを参照してください。
次の SELECT 文は、合計金額が、注文番号 1023 の中の各品目の合計金額より大き
くなる品目が含まれるすべての注文の注文番号を返します。一番目の SELECT 文で
はキーワード ALL を使用して副問合せを行い、二番目の SELECT 文では MAX 集
計関数を使用して同じ結果を得ています。
SELECT DISTINCT order_num FROM items
WHERE total_price > ALL (SELECT total_price FROM items
WHERE order_num = 1023)
SELECT DISTINCT order_num FROM items
WHERE total_price > SELECT MAX(total_price) FROM items
WHERE order_num = 1023)
次の SELECT 文では、注文番号 1023 の注文品目の合計金額と比べて一つでも大き
い合計金額になる注文品目があれば、その注文番号を返します。一番目の SELECT
文ではキーワード ANY を使用し、二番目の SELECT 文では MIN 集計関数を使用し
ています。
SELECT DISTINCT order_num FROM items
WHERE total_price > ANY (SELECT total_price FROM items
WHERE order_num = 1023)
SELECT DISTINCT order_num FROM items
WHERE total_price > (SELECT MIN(total_price) FROM items
WHERE order_num = 1023)
副問合せ文で取り出す値が一つしかないことがわかっている場合には、ANY、
ALL、SOME の各キーワードは省略できます。キーワードを省略したときに副問合
せ文で複数の値を取り出すと、エラーが返されます。次の例の副問合せ文では集計
関数を使用しているため、1 行だけが返されます。
SELECT order_num FROM items
WHERE stock_num = 9 AND quantity =
(SELECT MAX(quantity) FROM items WHERE stock_num = 9)
SQL 文
2-477
SELECT 文
WHERE 節における結合の使用
WHERE 節で二つの表を使用するとき、一方の表の少なくとも 1 列と、もう一方の
表の少なくとも 1 列の間に関係を設定すると、これら二つの表は結合され一時複合
表が生成されます。一時複合表では、結合される二つの表で結合条件を満足する行
が組み合わされ、1 行が作成されます。表の結合には、2 表結合、複数表結合、セ
ルフ結合の 3 種類があります。
次のダイヤグラムに、結合の構文を示します。
WHERE 節へ戻る
2-471 ページ
結合
<列>
関係演算子
4-160 ページ
<列>
< 表 >.
< 表 >.
< ビュー >.
< シノニム >.
< 別名 >.
< 別名 >.
AD/XP
AD/XP
< 外部 >.
要素
< 別名 >
<列>
< ビュー >.
< シノニム >.
目的
FROM 節内の表またはビューに
割り当てられる一時的な代替名
です。
< 外部 >.
制限
結合する表が同じ表の場合
( 結合がセルフ結合の場合 )、
FROM 節内でその表のインスタ
表およびビューの別名について ンスに割り当てられた別名に
の詳細は 2-466 ページの「FROM よって、WHERE 節内の表の各
インスタンスを参照しなければ
節」を参照してください。
なりません。
表またはビューの一つから結合 指定された列が結合される表や
される列の名前です。
ビュー内で同じ名前を持ってい
指定された列どうしの値が一致 るときは、その列が常駐する表
したとき、表またはビューから やビューの名前か別名を各列名
の前に置くことによって、列を
の行が結合されます。
区別しなければなりません。
構文
識別子、
4-112 ページ
識別子、
4-112 ページ
(1/2)
2-478 Informix Guide to SQL:Syntax
SELECT 文
要素
< 外部 >
目的
データの抽出元となる外部表の
名前です。
< シノニム >
結合されるシノニムの名前です。 シノニムとそのシノニムが指す
表が存在していなければなりま
せん。
結合される表の名前です。
表が存在していなければなりま
せん。
<表>
< ビュー >
結合されるビューの名前です。
制限
外部表が存在していなければな
りません。
ビューが存在していなければな
りません。
構文
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
(2/2)
2 表結合
次に、2 表結合の例を示します。
SELECT order_num, lname, fname
FROM customer, orders
WHERE customer.customer_num = orders.customer_num
ヒント : 2 表が SELECT 文の並びに結合されている場合は、列を指定する必要は
ありません。
複数表結合
複数表結合とは、3 つ以上の表の結合のことです。構造は 2 表結合の構造と似てい
ますが、WHERE 節に複数の表に対する結合条件が存在します。異なる表の列が同
じ名前である場合は、table.column などのように関連する表または表の別名を先頭
に付けて区別してください。表名の構文についての詳細は、4-25 ページの「データ
ベース オブジェクト名」を参照してください。
次の複数表結合の例では、受注した顧客の会社名、その受注品目の品目番号
(stock_num)とメーカーコード(manu_code)を取り出しています。
SELECT DISTINCT company, stock_num, manu_code
FROM customer c, orders o, items i
WHERE c.customer_num = o.customer_num
AND o.order_num = i.order_num
SQL 文
2-479
SELECT 文
セルフ結合
表をその表自体に結合できます。そのためには、表名を FROM 節で 2 回記述し、そ
の表名に 2 種類の別名を指定します。WHERE 節でその別名を使用して、実際には
同じ表である二つの表をそれぞれ参照します。
次の例は、表 stock に対するセルフ結合の例です。単価の値が 2.5 倍を超える取扱
品目のペアを取り出します。x と y の文字は表 stock の別名です。
SELECT x.stock_num, x.manu_code, y.stock_num, y.manu_code
FROM stock x, stock y
WHERE x.unit_price > 2.5 * y.unit_price
AD/XP
Dynamic Server with AD and XP Options を使用している場合は、外部表でセルフ結合
を使用することはできません。♦
外部結合
次の例の外部結合では、表 customer の会社名と、表 orders の注文番号 (order_num)
を取り出します。表 customer にある顧客番号 (customer_num) が表 orders にない場合
でも、会社名の値だけは取り出され、注文番号には NULL 値が返されます。
SELECT company, order_num
FROM customer c, OUTER orders o
WHERE c.customer_num = o.customer_num
AD/XP
Dynamic Server with AD and XP Options を使用している場合は、外部表を外部結合の
外部表として使用することはできません。♦
外部結合についての詳細は、
『Informix Guide to SQL: Tutorial』を参照してください。
2-480 Informix Guide to SQL:Syntax
SELECT 文
GROUP BY 節
GROUP BY 節を使用すると、取り出した結果をあるグループとしてまとめることが
できます。グループとは、ある列の値が同じ値を持っている行の集まりのことです。
SELECT 文へ戻る
2-450 ページ
GROUP BY 節
,
<列>
GROUP BY
< 表 >.
< ビュー >.
< シノニム >.
< 別名 >.
AD/XP
< 外部 >.
+
要素
< 別名 >
<列>
< 外部 >
目的
FROM 節内の表またはビュー
に割り当てられた一時的代替
名です。
表とビューの別名についての詳
細は、2-466 ページの「FROM
節」を参照してください。
SELECT 節の選択対象の並びの
中の独立した列の名前、または
選択対象の並びの中の算術演算
子で結合された列の一つの名前
です。
SELECT 文は、< 列 > の中で同
じ値を持つ行の各グループに対
して一行の結果を返します。
データの抽出元となる外部表の
名前です。
< 選択番号 >
制限
構文
別名を FROM 節の中の表または 識別子、
ビューに割り当てないかぎり、 4-112 ページ
GROUP BY 節の中で表やビュー
の別名を使用することはできま
せん。
2-482 ページの「GROUP BY 節 識別子、
と SELECT 節との関係」を参照 4-112 ページ
してください。
外部表が存在していなければな
りません。
データベース オブ
ジェクト名、
4-25 ページ
(1/2)
SQL 文
2-481
SELECT 文
要素
< 選択番号 >
< シノニム >
目的
選択対象の並びの中で順序を指
定することにより、SELECT 節
の選択対象の並びの中の列また
は式を示す整数です。
SELECT 文は、< 選択番号 > で
示された列または式の中の同じ
値を持つ行の各グループに対し
て一行の結果を返します。
列が存在するシノニムの名前
です。
制限
2-483 ページの「選択番号の使
用」を参照してください。
構文
リテラル番号、
4-138 ページ
シノニムとそのシノニムが指す
表が存在していなければなりま
せん。
表が存在していなければなりま
せん。
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
<表>
列が存在する表の名前です。
< ビュー >
列が存在するビューの名前です。 ビューが存在していなければな
りません。
(2/2)
GROUP BY 節と SELECT 節との関係
GROUP BY 節を使用すると、SELECT 節に設定できる内容が制限されます。
GROUP BY 節を使用する場合は、選択する列は GROUP BY 節に記述しなければ
なりません。SELECT 節の選択対象の並びで集計関数および一つまたは複数の列式
を使用する場合は、集計関数式や時刻関数式の一部として使用されていない列の名
前をすべてを GROUP BY 節に指定してください。GROUP BY 節の中に、定数式や
バイト (BYTE) 型やテキスト (TEXT) 型の列は記述できません。また、バイト
(BYTE) 型またはテキスト (TEXT) 型の列が SELECT 節の選択対象の並びに指定さ
れているとき、GROUP BY 節は使用できません。バイト (BYTE) 型やテキスト
(TEXT) 型の列を選択する場合、GROUP BY 節は使用できません。さらに、GROUP
BY 節で ROWID を使用することもできません。
次の例では、集計関数式にない列を指定しています。列 total_price は、集計関数の
引数で使用されているため、GROUP BY 節に記述できません。キーワード COUNT
とキーワード SUM は各グループに対して適用され、問合せの結果全体には適用さ
れません。
SELECT order_num, COUNT(*), SUM(total_price)
FROM items
GROUP BY order_num
2-482 Informix Guide to SQL:Syntax
SELECT 文
SELECT 節の選択対象の並びに記述した列が列式の中で独立している場合は、必ず
GROUP BY 節にもその列を記述してください。ある列が別の列と算術演算子によっ
て組み合わされている場合は、個々の列や、選択番号を使用する複合式によってグ
ループ化することができます。
選択番号の使用
GROUP BY 節では、列式を表すための一つまたは複数の整数が使用できます。次の
例の最初の SELECT 文では、GROUP BY 節で order_date と式 (paid_date - order_date)
に対して選択番号を使用しています。複合式によるグループ化は、選択番号の指定
によってのみ行えます。したがって、二番目の SELECT 文では、2 という番号を式
(paid_date - order_date) に置き換えることはできません。
SELECT order_date, COUNT(*), paid_date - order_date
FROM orders
GROUP BY 1, 3
SELECT order_date, paid_date - order_date
FROM orders
GROUP BY order_date, 2
GROUP BY 節における NULL 値
GROUP BY 節によって指定された列に NULL 値を持つ各行は、一つのグループに
属します。つまり、すべての NULL 値は一つにグループ化されます。
HAVING 節
HAVING 節はグループに一つまたは複数の修飾条件を適用する場合に使用します。
SELECT 文へ戻る
2-450 ページ
HAVING 節
HAVING
条件
セグメント
4-5 ページ
SQL 文
2-483
SELECT 文
次の例では、グループごとのある算出値をある条件での別の算出値または定数と比
較しています。最初の SELECT 文では、COUNT(*) の算出値を定数 2 と比較する
HAVING 節を使用しています。この問合せでは、2 件以上の注文があったグループ
における合計金額の平均を返します。二番目の SELECT 文では、同じ月に 2 回以上
の問合せがあった顧客の顧客情報とその月を取り出します。
SELECT order_num, AVG(total_price) FROM items
GROUP BY order_num
HAVING COUNT(*) > 2
SELECT customer_num, EXTEND (call_dtime, MONTH TO MONTH)
FROM cust_calls
GROUP BY 1, 2
HAVING COUNT(*) > 1
また、HAVING 節を使用すると、算出値と同様に GROUP BY 節の列の値に条件を
与えることができます。次の例では、customer_num、call_dtime( 精度 YEAR TO FRACTION)、cust_code が返され、これらの情報が、customer_num が 120 より小さい
番号の顧客から受けた問合せに対して、その call_code ごとにグループ化されます。
SELECT customer_num, EXTEND (call_dtime), call_code
FROM cust_calls
GROUP BY call_code, 2, 1
HAVING customer_num < 120
通常、HAVING 節は GROUP BY 節とともに指定します。GROUP BY 節なしで
HAVING 節を使用すると、その HAVING 節は問合せを満足するすべての行に適用
されます。GROUP BY 節を指定しないと、表の中の行全部が一つのグループになり
ます。次の例では、表中に行が 11 行以上あるときに、表の合計金額の平均が返さ
れます。
SELECT AVG(total_price) FROM items
HAVING COUNT(*) > 10
2-484 Informix Guide to SQL:Syntax
SELECT 文
ORDER BY 節
ORDER BY 節は問合せ結果を一つまたは複数の列の値によってソートします。
SELECT 文へ戻る
2-450 ページ
ORDER BY 節
,
<列>
ORDER BY
+
< 表 >.
[< 最初 >, < 最後 >]
< ビュー >.
ASC
DESC
< シノニム >.
< 別名 >.
AD/XP
< 外部 >.
< 選択番号 >
< 表示レベル >
+
IDS
要素
<別名>
ROWID
目的
制限
構文
FROM 節の表またはビューに割 FROM 節の中の表またはビュー 識別子、
り当てられた別名です。
に別名を付けていないかぎり
4-112 ページ
節の中の表または
ORDER
BY
表とビューの別名についての詳
ビューに別名を指定することは
細は、2-466 ページの「FROM
できません。
節」を参照してください。
(1/3)
SQL 文
2-485
SELECT 文
要素
<列>
目的
指定された表またはビューの中
の列の名前です。
問合せの結果は、この列に含ま
れる値によりソートされます。
< 外部 >
<表示ラベル>
<最初>
<最後>
<選択番号>
制限
構文
ORDER BY 節で指定された列は 識別子、
SELECT 節の選択対象の並びで 4-112 ページ
明示的または暗示的に並べなけ
ればなりません。
問合せ結果を導出列によって
ソートしたい場合、選択対象の
並びの中でこの導出列に表示ラ
ベルを指定してこのラベルを
ORDER BY 節で指定しなければ
なりません。または、選択対象
の並びで導出列の表示ラベルを
省略して、導出列を ORDER BY
節の中の選択番号によって指定
することもできます。
データの抽出元となる外部表の 外部表が存在していなければな データベース オブ
名前です。
りません。
ジェクト名、
4-25 ページ
SELECT 節の選択対象の並びの 選択対象の並びの中の列に表示 識別子、
中の列に割り当てられる一時名 ラベルを指定していないかぎ
4-112 ページ
り、ORDER BY 節に表示ラベル
です。
ORDER BY 節の中の列名の代わ を指定することはできません。
りに表示ラベルを使用できます。
問合せ結果をソートするために 列は、BYTE 型、CHAR 型、
リテラル番号、
使用する列の一部の中の最初の NCHAR 型、NVARCHAR 型、 4-138 ページ
文字の位置です。
TEXT 型、または VARCHAR 型
のいずれかでなければなりま
せん。
問合せ結果をソートするために 列は、BYTE 型、CHAR 型、
リテラル番号、
使用する列の一部の中の最後の NCHAR 型、NVARCHAR 型、 4-138 ページ
文字の位置です。
TEXT 型、または VARCHAR 型
のいずれかでなければなりま
せん。
選択対象の並びの中での列の順 SELECT 文がキーワード
リテラル番号、
序を指定することによって、
4-138 ページ
UNION またはキーワード
SELECT 節の選択対象の並びの UNION ALL で結合されている
中の列を示す整数です。
とき、および同じ位置にある互
ORDER BY 節の中の列名の代わ 換性のある列が別の名前を持っ
りに選択番号を使用できます。 ているとき、ORDER BY 節で選
択番号を指定しなければなりま
せん。
(2/3)
2-486 Informix Guide to SQL:Syntax
SELECT 文
要素
< シノニム >
目的
指定された列に含まれているシ
ノニムの名前です。
<表>
指定された列に含まれている表
の名前です。
制限
シノニムおよびシノニムが指す
表が存在していなければなりま
せん。
表が存在していなければなりま
せん。
< ビュー >
指定された列に含まれている
ビューの名前です。
ビューが存在していなければな
りません。
構文
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
(3/3)
ORDER BY 節を使用して列をソートできます。また、SELECT * や SELECT 文で表
示ラベルを使用している場合は、集計関数式をソートできます。
次の問合せでは、表 orders から order-date と shipdate を明示的に選択し、その問合せ
結果を order-date 順に並び替えています。デフォルトでは、問合せ結果は昇順で
ソートされます。
SELECT order_date, ship_date FROM orders
ORDER BY order_date
次の問合せでは、列 order_date がアスタリスク (*) によって暗黙のうちに選択され
ているため、ORDER BY 節で列 order_date を使用することができます。
SELECT * FROM orders
ORDER BY order_date
副文字列によるソート
列のすべてをソートせずに、副文字列をソートすることができます。副文字列は、
データベースサーバがソートに使用する列の一部です。副文字列は、列サブスクリ
プト ( 先パラメータと後パラメータ ) を指定することにより定義できます。列サブ
スクリプトは、副文字列列の最初と最後の文字の位置を示します。
SQL 文
2-487
SELECT 文
次の例は、表 customer に問合せを行い、列 ORDER BY に副文字列を指定する
SELECT 文を示しています。副文字列は、データベースサーバに対して、問合せ結果
を、列の 6 ∼ 9 番目の位置に含まれる列 lname の部分でソートするよう指示します。
SELECT * from customer
ORDER BY lname[6,9]
表 customer のある行の lname の値が Greenburg であるとします。ORDER BY 節の
中の副文字列のため、データベースサーバは、Greenburg の値ではなく burg の値
を使ってこの行のソート位置を決定します。
副文字列は、文字データ型を持つ列にだけ指定できます。ORDER BY 節で副文字列
を指定する場合、この列はバイト (BYTE) 型、文字 (CHAR) 型、各国語文字
(NCHAR) 型、各国語可変長文字 (NVARCHAR) 型、または可変長文字 (VARCHAR)
型のいずれかでなければなりません。
GLS
『Informix Guide to GLS
ORDER BY 節での副文字列の使用の GLS についての詳細は、
Functionality』を参照してください。♦
導出列によるソート
次の例のように、SELECT 節で表示ラベルを指定すると、導出列によってソートで
きます。
SELECT paid_date - ship_date span, customer_num
FROM orders
ORDER BY span
昇順と降順
キーワード ASC またはキーワード DESC のどちらかを使用して、ソートされる順
序を昇順 ( 最小値が先頭 ) または降順 ( 最大値が先頭 ) に指定できます。デフォルト
のソート順は昇順です。
日付 (DATE) 型や日時 (DATETIME) 型では、最小は最も古い時間を、最大は最も新
しい時間を意味します。文字 (CHAR) 型では ASCII コード照合順序が使用されま
す。照合順序表については、4-161 ページの「英語データの照合順序」を参照して
ください。
2-488 Informix Guide to SQL:Syntax
SELECT 文
ORDER BY 節における NULL 値
NULL 値は、NULL でない値よりも小さい値としてソートされます。キーワード
ASC を使用したとき、NULL 値は非 NULL 値の前に並べられます。キーワード
DESC を使用したとき、NULL 値は最後に並べられます。
多重ソート
ORDER BY 節に複数の列を並べると、問合せ結果は多重ソートされます。1 回目の
ソートは、指定した最初の列に基づいて行われます。次に、二番目に記述した列で
2 回目のソートが行われます。次の多重ソートの例では、表 cust_calls のすべての行
が選択されたあと、最初に問合せ分類によってソートされます。次に、call_code ご
とに call_dtime によるソートが行われます。
SELECT * FROM cust_calls
ORDER BY call_code, call_dtime
選択番号の使用
列名の代わりに、SELECT 節の項目位置を表す一つまたは複数の整数で設定するこ
とができます。選択番号を使用すると、式でソートすることができます。次の例で
は、多重ソートで選択番号を使用して、式 (paid_date - order_date) の結果と
customer_num によってソートを行っています。
SELECT order_num, customer_num, paid_date - order_date
FROM orders
ORDER BY 3, 2
SELECT 文がキーワード UNION またはキーワード UNION ALL のどちらかによっ
て結合され、同じ位置にともに使用できる列が異なる名前で存在するときは、
ORDER BY 節に選択番号を記述してください。
IDS
行 ID によるソート
Dynamic Server を使用する場合、行 ID 列を ORDER BY 節の列として指定すること
ができます。行 ID 列は、断片化されていない表および WITH ROWIDS 節を使用し
て作成された断片化された表の隠れた列です。行 ID 列には、表内の行に関連付け
られている一意の内部レコード番号が格納されています。ただし、アクセス方法と
して、行 ID 列よりも主キーを使用することをお勧めします。
SQL 文
2-489
SELECT 文
ORDER BY 節に行 ID 列を指定するには、キーワード ROWID を小文字または大文
字で入力します。
選択する表が行 ID 列を持たない断片化された表の場合は、ORDER BY 節に行 ID 列
を指定できません。
SELECT 節の選択対象の並びに行 ID 列を含めていない場合は、ORDER BY 節に行
ID 列を指定できません。
列式での行 ID 列の使用についての詳細は、4-33 ページの「式」を参照してください。
E/C
ORDER BY 節と DECLARE 文の共用
ESQL/C では ORDER BY 節を持つ SELECT 文に対して、FOR UPDATE 節付きの
DECLARE 文を使ってカーソルを関連付けることはできません。
ORDER BY 節へのインデックスの配置
SELECT 文に ORDER BY 節を記述する場合、ORDER BY 節で指定する一つまたは
複数の列にインデックスを作成して、問合せの性能を向上させることができます。
データベースサーバは列 ORDER BY 列に配置されたインデックスを使用して、
もっとも効率的な方法で問合せ結果をソートします。ORDER BY 節の列に対応する
インデックスの作成についての詳細は、CREATE INDEX 文の中の 2-111 ページの
「キーワード ASC および DESC」を参照してください。
FOR UPDATE 節
SELECT 文を v 文で処理するときに FOR UPDATE 節を指定すると、値が取り出さ
れるとき SELECT 文によって返される値を更新できます。FOR UPDATE 節を指定
した SELECT 文を PREPARE 文で処理することは、FOR UPDATE 節を指定せずに
SELECT 文を PREPARE 文で処理し、PREPARE 文に対して FOR UPDATE カーソル
を宣言することと同じです。
キーワード FOR UPDATE は、更新が可能であることをデータベースサーバに知ら
せ、SELECT カーソルが指定されているときよりも厳しいロックを使用させます。
この場合、FOR UPDATE 節が指定されていないカーソルからデータを修正すること
はできません。ただし、更新の対象となる特定の列を指定することはできます。
2-490 Informix Guide to SQL:Syntax
SELECT 文
FOR UPDATE 節を指定した SELECT 文に対してカーソルを宣言した後に、WHERE
CURRENT OF 節を指定した UPDATE 文か DELETE 文を使用して、現在選択されて
いる行を更新または削除できます。キーワード CURRENT OF を指定すると、取り
出された最新の行が参照されます。キーワード CURRENT OF によって WHERE 節
の中の通常のテスト式が置き換えられます。
特定の値で列を更新するために、次の例に示すような連続した文をプログラムに記
述することができます。
EXEC SQL BEGIN DECLARE SECTION;
char fname[ 16];
char lname[ 16];
EXEC SQL END DECLARE SECTION;
.
.
.
EXEC SQL connect to 'stores7';
/* select statement being prepared contains a for update clause */
EXEC SQL prepare x from 'select fname, lname from customer for update';
EXEC SQL declare xc cursor for x; --note no 'for update' clause in declare
for (;;)
{
EXEC SQL fetch xc into $fname, $lname;
if (strncmp(SQLSTATE, '00', 2) != 0) break;
printf("%d %s %s¥n",cnum, fname, lname );
if (cnum == 999) --update rows with 999 customer_num
EXEC SQL update customer set fname = 'rosey' where current of xc;
}
EXEC SQL close xc;
EXEC SQL disconnect current;
UPDATE カーソルのように、FOR UPDATE 節を指定した SELECT 文を使用して、
UPDATE 文だけではできないような更新を行うことができます。これは、更新の決
定と新しいデータ項目の値が、行の元の値に基づいて行われるためです。更新中の
表に UPDATE 文で問合せを行うことはできません。
SQL 文
2-491
SELECT 文
FOR UPDATE 節とともに使用できない構文
FOR UPDATE 節を使用する SELECT 文には、次のような制限があります。
■
データを選択できるのは、一つの表からだけです。
■
集計関数 (AVG、COUNT、MAX、MIN、SUM) とともに使用できません。
■
次の節やキーワードとともに使用できません。DISTINCT、FOR READ
ONLY、GROUP BY、INTO TEMP、INTO EXTERNAL、ORDER BY、
UNION、UNIQUE
FOR UPDATE 節を含まない SELECT 文に FOR UPDATE カーソルを宣言する方法に
ついての詳細は、2-249 ページを参照してください。
FOR READ ONLY 節
FOR READ ONLY 節を使用して、SELECT 文について宣言された SELECT カーソル
が読込み専用カーソルであることを指定します。読込み専用カーソルは、データを
変更できないカーソルです。ここでは、FOR READ ONLY 節について次の情報を記
載します。
■
FOR READ ONLY 節を使用しなければいけない場合
■
FOR READ ONLY 節を使用する SELECT 文に対する構文制限
読込み専用モードでの FOR READ ONLY 節の使用
通常、SELECT 文に FOR READ ONLY 節を記述する必要はありません。定義上
SELECT 文は読込み専用操作なので、FOR READ ONLY 節は普通必要ありません。
しかし、特別な場合で、SELECT 文に FOR READ ONLY 節を記述しなければなりま
せん。
ANSI
ハイパフォーマンスローダ ( HPL) をエクスプレスモードで使用して、
データを ANSI
モードデータベースにロードし、このデータのレベル 0 バックアップを行っていな
い場合、データベースは読込み専用モードになっています。データベースは読込み
専用モードであるとき、SELECT 文または DECLARE 文が FOR READ ONLY 節を記
述していないかぎり、SELECT カーソルのアクセスをすべて拒否します。この制限
は、ユーザがデータのレベル 0 バックアップを行うまで存在します。
2-492 Informix Guide to SQL:Syntax
SELECT 文
データベースが ANSI 標準準拠のデータベースである場合、SELECT カーソルはデ
フォルトで UPDATE カーソルです。UPDATE カーソルは、データを更新できる
カーソルです。これらの UPDATE カーソルは、データベースが読込み専用モード
にあるとき使用できません。たとえば、表 customer_ansi に対する次の SELECT 文
は失敗します。
EXEC SQL declare ansi_curs cursor for
select * from customer_ansi;
解決策は、SELECT カーソルに FOR READ ONLY 節を記述することです。この節が
指定する読込み専用カーソルは、データベースの読込み専用モードとともに使用で
きます。たとえば、表 customer_ansi に対する FOR READ ONLY 節を指定した次の
SELECT 文は成功します。
EXEC SQL declare ansi_read cursor for
select * from customer_ansi for read only;
♦
DB
DB-Access は、SELECT カーソルを持つすべての SELECT 文を実行します。したがっ
て、読込み専用 ANSI 標準準拠のデータベースのデータにアクセスするすべての
SELECT 文に、FOR READ ONLY 節を記述する必要があります。FOR RREAD
ONLY 節を記述すると、DB-Access は SELECT 文のカーソルを読込み専用カーソル
として宣言します。♦
IDS
『Guide to the
Dynamic Server を使用する場合、HPL の高速モードについての詳細は、
High- Performance Loader』を参照してください。レベル 0 バックアップについての
詳細は『Backup and Restore Guide』を参照してください。SELECT カーソル、読込
み専用カーソル、UPDATE カーソルについては、2-241 ページの「DECLARE 文」
を参照してください。♦
FOR READ ONLY 節とともに使用できない構文
同じ SELECT 文に FOR READ ONLY 節と FOR UPDATE 節の両方を記述することは
できません。これを試みると、SELECT 文は失敗します。
FOR READ ONLY 節を記述しない SELECT 文に読込み専用カーソルを宣言する方法
については、2-251 ページを参照してください。
SQL 文
2-493
SELECT 文
INTO Table 節
INTO Table 節を使用すると、SELECT 文が抽出するデータを受け取るように表を指
定できます。
SELECT 文へ戻る
2-450 ページ
INTO Table 節
INTO
TEMP
<表>
WITH NO LOG
AD/XP
SCRATCH
<表>
EXTERNAL
<表>
USING
(
表
オプション
2-498 ページ
要素
<表>
目的
SELECT 文の結果を含む表の名
前です。
一時表の列名は、SELECT 節の
選択対象の並びの中で指定され
た名前です。
DATAFILE 節
2-97 ページ
,
,
制限
この名前は、現行データベース
のすべての既存の表、ビュー、
またはシノニムの名前と異なっ
ていなければなりません。ただ
し、別のユーザが使用している
他の一時表名と異なる必要はあ
りません。
データベースで一時表を作成す
るには、そのデータベースに対
する接続アクセス権が必要です。
INTO TEMP 節を使用して一時
表を作成する場合は、単純列式
以外の選択対象の並びの中の式
すべてに表示ラベルを指定しな
ければなりません。
2-494 Informix Guide to SQL:Syntax
)
表
オプション
2-498 ページ
構文
データベース オブ
ジェクト名、
4-25 ページ
SELECT 文
列の命名
一時表、スクラッチ表、または外部表の列名は、SELECT 節の中で命名されたもの
です。表示ラベルは、単純列式以外のすべての式に指定する必要があります。列ま
たは式の表示ラベルは、一時表、スクラッチ表、または外部表内の列名になります。
列式に表示ラベルを指定しないと、表は、選択対象の並びから列名を使用します。
次の INTO TEMP 節の例は、二つの列 customer_num と slowdate を持つ表 pushdate を
作成するものです。
SELECT customer_num, call_dtime + 5 UNITS DAY slowdate
FROM cust_calls INTO TEMP pushdate
行が返されない場合の結果
INTO Table 節を WHERE 節と結合して使用する場合に行が返されないと、
SQLNOTFOUND 値は、ANSI 標準準拠のデータベースで 100、ANSI 標準準拠でな
いデータベースで 0 です。INTO TEMP...WHERE... 節の付いた SELECT 文が複数の
SQL 文を処理する PREPARE 文の一部であるときに行が返されないと、
SQLNOTFOUND 値は、ANSI 標準準拠のデータベースおよび ANSI 標準準拠でない
データベースの両方で 100 です。
E/C
ESQL/C での INTO Table 節の制限
ESQL/C では、INTO Table 節とともに INTO 節を使用しないでください。使用した
場合は、プログラム変数の結果が返されず、sqlca.sqlcode すなわち SQLCODE 変数
が負の値に設定されます。
SQL 文
2-495
SELECT 文
INTO TEMP 節と INTO SCRATCH 節の優先順位
環境変数 DBSPACETEMP が設定されている場合、INTO TEMP 節と INTO
SCRATCH 節によって作成された一時表は、DBSPACETEMP の並びに指定された
DB 領域内にあります。ONCONFIG パラメータ DBSPACETEMP によって、DB 領
域設定を指定することもできます。環境変数も構成パラメータも設定されていない
場合、デフォルト設定はルート DB 領域です。環境変数 DBSPACETEMP に指定さ
れた設定は、ONCONFIG パラメータ DBSPACETEMP およびデフォルト設定よりも
優先されます。環境変数 DBSPACETEMP の詳細については、『Informix Guide to
SQL: Reference』を参照してください。ONCONFIG パラメータ DBSPACETEMP の
詳細については、
『Administrator’s Guide』を参照してください。
INTO TEMP 節
INTO TEMP 節は、問合せ結果を格納する一時表を作成します。一時表に対する初
期および追加のエクステントは、つねに 8 ページです。
同じ問合せ結果を繰り返し使用するようなときに一時表を作成すると、問合せ時間
を短縮することができます。また、INTO TEMP 節を使用すると SELECT 文がわか
りやすくなります。ただし、一時表の中のデータは静的です。したがって、一時表
の構築に使用された表に対して変更を加えても一時表のデータは更新されません。
一時表にはインデックスが設定できます。
ログ付き一時表は、プログラムが終了すると、あるいはその一時表に対して DROP
TABLE 文を実行すると、削除されます。
IDS
Dynamic Server を使用していてデータベースにログ機能がない場合は、表はオプ
ション WITH NO LOG を使用する表と同様に動作します。♦
2-496 Informix Guide to SQL:Syntax
SELECT 文
オプション WITH NO LOG の使用
オプション WITH NO LOG を使用すると、トランザクション ログのオーバーヘッド
を減らすことができます。オプション WITH NO LOG を使用した場合、一時表に対
する操作はトランザクション ログ操作には含まれません。
オプション WITH NO LOG によって作成する一時表の動作は、スクラッチ表の動作
と同じです。
AD/XP
INTO SCRATCH 節
Dynamic Server with AD and XP Options を使用している場合は、INTO SCRATCH 節を
使用すると、トランザクション ログのオーバーヘッドを減らすことができます ( ス
クラッチ表に対する操作は、トランザクション ログ操作には含まれません )。
スクラッチ表は、インデックス、制約、またはロールバックをサポートしません。
スクラッチ表は、次の 3 つの状態のいずれかが起こった場合に、削除されます。
■
プログラムが終了する。
■
DROP TABLE 文が一時表に対して実行される。
■
データベースがクローズされる。
スクラッチ表は、オプション WITH NO LOG によって作成された一時表と同じです。
AD/XP
INTO EXTERNAL 節
Dynamic Server with AD and XP Options を使用している場合は、INTO EXTERNAL 節
を使用して、データベースから外部表にデータをアンロードする SELECT 文を作成
します。INTO EXTERNAL 節を使用してデータをアンロードする場合は、デフォル
トの外部表記述を作成します。この節は、後でファイルを再ロードするときにその
外部表記述が使用できるので、Informix 内部データ ファイルをアンロードするのに
特に有効です。
テキスト表に対して同じ効果を得るには、CREATE EXTERNAL...SAMEAS 文を実
行し、その後 INSERT INTO...SELECT 文を実行します。
SQL 文
2-497
SELECT 文
表オプション
INTO Table 節へ戻る
2-494 ページ
表
オプション
,
FORMAT
'
DELIMITED
'
INFORMIX
CODESET
'
ASCII
'
EBCDIC
DELIMITER
RECORDEND
' < フィールド区切り記号 >'
' < レコード区切り記号 >'
ESCAPE
要素
< フィールド
区切り記号 >
目的
フィールドを区切る文字です。
< レコード
区切り記号 >
レコードを区切る文字です。
デフォルト値はパイプ (|) 文字
です。
環境変数 RECORDEND を設定
しない場合は、デフォルト値は
改行文字 (¥n) になります。
制限
非印刷文字は、区切り記号とし
て使用する場合は、ASCII 文字
の 8 進表現として符号化する必
要があります。たとえば、
’¥006’ は CTRL-F を表します。
非印刷文字は、区切り記号とし
て使用する場合は、ASCII 文字
の 8 進表現として符号化する必
要があります。たとえば、
’¥006’ は CTRL-F を表します。
構文
引用文字列、
4-156 ページ
引用文字列、
4-156 ページ
次の表は、データのアンロードに適用されるキーワードを説明しています。後で表
を再ロードするために追加の表オプションを外部表記述に指定する場合は、2-99
ページの「表のオプション」を参照してください。SELECT...INTO EXTERNAL 文
には、固定フォーマット オプションを除いて、CREATE EXTERNAL TABLE 文で説
明されているすべての表オプションを指定できます。
2-498 Informix Guide to SQL:Syntax
SELECT 文
INTO EXTERNAL 節は、作成されたデータ ファイルのフォーマット タイプが、
DELIMITED テキストか Informix 内部データ フォーマットのテキストのどちらかで
ある場合に使用できます。固定フォーマット アンロードには使用できません。
キーワード
目的
CODESET
コード セットのタイプを指定します。
DELIMITER
区切りテキスト ファイル内のフィールドを区切る文字を指
定します。
ESCAPE
データベース サーバに対して、ASCII テキスト ベースの
データ ファイルに埋め込まれた ASCII 特殊文字を認識する
ように指示します。
データをロードするときに ESCAPE を指定しないと、デー
タベース サーバでは、テキスト データ ファイルの文字
フィールドの埋込み特殊文字はチェックされません。
データをアンロードするときに ESCAPE を指定しないと、
データベース サーバでは、テキスト フィールドに埋込み 16
進文字は作成されません。
FORMAT
データ ファイル内のデータのフォーマットを指定します。
RECORDEND
区切りテキスト ファイル内のレコードを区切る文字を指定
します。
UNION 演算子
UNION 演算子を二つの SELECT 文の間に記述して、二つの問合せを一つの問合せ
にまとめることができます。UNION 演算子を使用すると、複数の SELECT 文が結
合されます。その際、対応する項目が同じ名前である必要はありません。
SQL 文
2-499
SELECT 文
結合 SELECT 文に関する制限事項
UNION 演算子を使用してまとめた問合せには、次のような制限事項があります。
IDS
E/C
■
各問合せの SELECT 節の項目数は同じでなければなりません。また、各
SELECT 節の対応する項目のデータ型には互換性がなければなりません。
■
各問合せのSELECT節の列をBYTE列またはTEXT列にすることはできませ
ん。この制限は、UNION ALL 操作には適用されません。
■
ORDER BY 節を使用する場合、最後に記述する SELECT 文で指定します。
その際、識別子ではなく整数によってソートされた項目を参照しなければ
なりません。ソートは設定操作の完了後に行われます。
■
■
Dynamic Serverでは副問合せ文の内部のUNION演算子は使用できません。♦
ESQL/C では問合せの中で INTO 節は使用できません。ただし、複合問合せ
が返す行が 1 行だけで、カーソルを使用していない場合には、INTO 節を
最初の SELECT 文の中だけで使用できます。♦
INTO TEMP 節を最後の SELECT 文の中に記述すると、UNION 演算子の結果を一時
表に格納できます。
2-500 Informix Guide to SQL:Syntax
SELECT 文
結合 SELECT 文での重複行
UNION 演算子を単独で使用すると、取り出されたすべての行から重複する行が削
除されます。複数の行で各列に同じ値が含まれる場合に、その中の 1 行だけが残り
ます。UNION ALL 演算子を使用すると、重複行は削除されずに、選択された行が
すべて返されます。次の例では、UNION ALL 演算子を使用して、重複行を削除せ
ずに二つの SELECT 文を結合しています。この問合せを実行すると、1997 年の第 1
四半期から 1998 年の第 4 四半期までの間に受けた顧客からの問合せが取り出され
ます。
SELECT customer_num, call_code FROM cust_calls
WHERE call_dtime BETWEEN
DATETIME (1997-1-1) YEAR TO DAY
AND DATETIME (1997-3-31) YEAR TO DAY
UNION ALL
SELECT customer_num, call_code FROM cust_calls
WHERE call_dtime BETWEEN
DATETIME (1998-1-1)YEAR TO DAY
AND DATETIME (1998-3-31) YEAR TO DAY
重複行を削除するには、問合せの中でキーワード ALL を付けずに UNION 演算子を
使用します。上の例で 101 B の組合わせが両方の SELECT 文に返される場合、
UNION 演算子だけを使用すると、この組合せは 1 回しか出力されません
( 各 SELECT 文の内部で重複値を削除する場合は、2-452 ページで説明したキーワー
ド DISTINCT を SELECT 節の中で使用してください )。
参照
タスク指向での SELECT 文の使用については、
『Informix Guide to SQL: Tutorial』を
参照してください。
SELECT 文に関する GLS 環境については、『Informix Guide to GLS Functionality』を
参照してください。
SQL 文
2-501
SET AUTOFREE 文
+
IDS
E/C
SET AUTOFREE 文
SET AUTOFREE 文を使用すると、カーソルがクローズされたらすぐに、データ
ベース サーバがそのカーソルに割り当てられたメモリを自動的に解放するように
指定できます。
この文は、Dynamic Server だけで使用できます。
この文は ESQL/C で使用してください。
構文
SET AUTOFREE
ENABLED
FOR
DISABLED
要素
< カーソル
ID>
< カーソル変
数>
目的
AUTOFREE 機能を有効または
無効にする時の対象カーソルの
名前です。
< カーソル ID> の値を保持する
ホスト変数です。
< カーソル ID>
< カーソル ID 変数 >
制限
カーソルはプログラムの中で宣
言されなければなりません。
構文
識別子、
4-112 ページ
ホスト変数は、プログラムの中
で宣言されたカーソルの名前を
格納しなければなりません。
変数名は、変数名に
適用される言語固有
の規則に従う必要が
あります。
説明
あるカーソルに対して AUTOFREE 機能を有効にした場合は、そのカーソルのク
ローズ時にデータベース サーバ内のカーソル メモリを解放するのに、FREE 文を明
示的に使用する必要はありません。
SET AUTOFREE 文にはオプション ENABLED または DISABLED を指定できます。
どちらのオプションも指定しない場合、デフォルトは ENABLED です。次の例は、
デフォルトによって、プログラム内の以降のカーソルすべてに対して AUTOFREE
機能を有効にする方法を示しています。
EXEC SQL set autofree;
2-502 Informix Guide to SQL:Syntax
SET AUTOFREE 文
制限
AUTOFREE 機能を有効にする SET AUTOFREE 文は、カーソルをオープンする
OPEN 文の前に指定する必要があります。カーソルがすでにオープンしている場合
は、SET AUTOFREE 文はその動作に影響を与えません。
あるカーソルに対して一度 AUTOFREE 機能を有効にすると、そのカーソルを再び
オープンすることはできません。
SET AUTOFREE によるカーソルへのグローバルな影響
< カーソル ID> も < カーソル ID 変数 > も指定しない場合は、プログラム内の以降
のカーソルすべてが SET AUTOFREE 文の影響を受けます。
次の例は、以降のカーソルすべてに対して AUTOFREE 機能を有効にする方法を示
しています。
EXEC SQL set autofree enabled;
FOR 節による特定カーソルの指定
< カーソル ID> や < カーソル ID 変数 > を指定した場合は、キーワード FOR の後に
指定したカーソルだけが SET AUTOFREE 文の影響を受けます。
このオプションを使用すると、すべてのカーソルのグローバル設定を無効にするこ
とができます。たとえば、SET AUTOFREE ENABLED 文を実行して、プログラム内
のすべてのカーソルに対して AUTOFREE 機能を有効にした場合は、以降に SET
AUTOFREE DISABLED FOR 文を実行して、特定カーソルの AUTOFREE 機能を無
効にできます。
次の例では、最初の文がすべてのカーソルに対して AUTOFREE 機能を有効にし、
二番目の文がカーソル x1 の AUTOFREE 機能を無効にしています。
EXEC SQL set autofree enabled;
EXEC SQL set autofree disabled for x1;
関連付けられた文と切り離された文
カーソルが自動的に解放される場合は、そのカーソルに関連する PREPARE 文で処
理された文 ( つまり関連付けられた文 ) も解放されます。
SQL 文
2-503
SET AUTOFREE 文
関連付けられた文という用語は、AUTOFREE 機能の文脈では、特殊な意味を持っ
ています。カーソルは、PREPARE 文で処理された文で宣言する最初のカーソルで
ある場合か、または PREPARE 文で処理された文が切り離された後にその文で宣言
する最初のカーソルである場合は、その PREPARE 文で処理された文に関連付けら
れます。
切り離された文という用語は、AUTOFREE 機能の文脈では、特殊な意味を持ってい
ます。PREPARE 文で処理された文は、その文でカーソルを宣言しない場合か、また
はその文が関連付けられているカーソルが解放された場合は、切り離されます。
あるカーソルに対して AUTOFREE 機能が有効になっていて、そのカーソルに関連
付けられた PREPARE 文で処理された文がある場合は、データベース サーバは、
カーソルに割り当てられたメモリだけでなく、PREPARE 文で処理された文に割り当
てられたメモリも解放します。次のカーソルに対して AUTOFREE 機能を有効にす
るとします。
/*Cursor associated with a prepared statement */
EXEC SQL prepare sel_stmt 'select * from customer';
EXEC SQL declare sel_curs2 cursor for sel_stmt;
データベース サーバは、カーソル sel_curs2 をクローズするとき、次の FREE 文と
同等の操作を自動的に実行します。
FREE sel_curs2;
FREE sel_stmt;
sel_stmt 文は自動的に解放されるので、この文を再び PREPARE 文で処理しない限
り、新しいカーソルをその文で宣言することはできません。
カーソルの暗黙的なクローズ
AUTOFREE 機能が有効になったカーソルには、潜在的な問題があります。ANSI 標
準準拠でないデータベースでは、あるカーソルを明示的にクローズしその後再び
オープンしない場合には、そのカーソルは暗黙的にクローズされます。このカーソ
ルの暗黙的なクローズによって、AUTOFREE 機能がトリガされます。次にこの
カーソルをオープンした場合、カーソルはすでに解放されているので、データベー
ス サーバはエラー メッセージ (cursor not found) を生成します。
参照
関連する文は、
「CLOSE 文」、
「DECLARE 文」、
「FETCH 文」、
「FREE 文」、
「OPEN
文」
、および「PREPARE 文」です。
『INFORMIX-ESQL/C Programmer’s Manual』を
AUTOFREE 機能の詳細については、
参照してください。
2-504 Informix Guide to SQL:Syntax
SET CONNECTION 文
E/C
SET CONNECTION 文
SET CONNECTION 文はアプリケーションとデータベース間の接続を再確立し、接
続を現行のものとします。また、SET CONNECTION 文でオプション DORMANT を
使用することで、現行接続を接続停止状態へ切替えることもできます。
ESQL/C で SET CONNECTION 文を使用します。
構文
' < 接続名 >'
SET CONNECTION
+
< 接続名変数 >
+
データベース
環境
2-82 ページ
+
DORMANT
DEFAULT
+
CURRENT DORMANT
SQL 文
2-505
SET CONNECTION 文
要素
< 接続名 >
目的
特定の接続に割り当てた
< 接続名 > を表す引用符付き文
字列です。
初期接続を確立したときに
CONNECT 文で割り当てた
< 接続名 > です。
< 接続名変数 > < 接続名 > の値を含むホスト変
数です。
制限
データベースは事前に存在して
いなければなりません。
構文
引用符付き文字列、
4-156 ページ
SET CONNECTION 文をオプ
ション DORMANT とともに使
用する場合は、< 接続名 > は現
行接続を表していなければなり
ません。
オプション DORMANT を指定
せずに SET CONNECTION 文を
使用する場合には、< 接続名 >
は停止する接続を表していなけ
ればなりません。
< 接続名 > の値を含むホスト変
数です。変数は文字
(CHARACTER) 型でなければな
りません。
変数名は、変数名に
適用される言語固有
の規則に従っている
必要があります。
説明
SET CONNECTION 文を使用して、停止状態の接続を現行接続にしたり、現行接続
を停止状態にしたりすることができます。
■
停止状態の接続を現行接続にする方法
■
現行接続を停止状態にする方法
PREPARE 文で処理された文のテキストで、SET CONNECTION 文を使用すること
はできません。
停止状態の接続を現行接続にする方法
SET CONNECTION 文によって停止状態の接続を現行接続に切り替えることができ
ます。再確立できるのは停止状態の接続だけです。文を実行するときに他の接続が
現行接続になっている場合には、その接続は停止状態になります。停止状態の接続
とは、いったん接続は確立されても、現行接続ではない接続のことをいいます。
2-506 Informix Guide to SQL:Syntax
SET CONNECTION 文
次に示す SET CONNECTION 文は、接続 con1 を現行接続にし、接続 con2 を停止状
態にします。
CONNECT TO 'stores7' AS 'con1'
...
CONNECT TO 'demo7' AS 'con2'
...
SET CONNECTION 'con1'
停止状態の接続は接続コンテキストを伴っています。アプリケーションは停止状態
の接続を現行状態にする場合、データベース環境への接続を再確立してその接続コ
ンテキストを復元します ( 接続コンテキストについての詳細は 2-79 ページを参照し
てください )。データベース環境への接続の再確立は、初期接続を確立するのと同
じです。ただし、ユーザのパーミッションを再度証明することは省略され、初期接
続に関連したリソースのコストが省かれます。たとえば、アプリケーションは接続
で事前に PREPARE 文で処理された文を再び PREPARE 文で処理したり、カーソル
を再度宣言する必要はありません。
現行接続を停止状態にする方法
現行接続を停止状態にしたい場合にはオプション DORMANT を使用します。たと
えば、次の SET CONNECTION 文は接続 con1 を停止状態にします。
SET CONNECTION 'con1' DORMANT
CONNECTION 文を実行するとエラーメッセージが返されます。たとえば、接続
con1 が現行接続で、接続 con2 が停止状態の接続の場合、次の SET CONNECTION
文を実行するとエラーが返されます。
SET CONNECTION 'con2' DORMANT
しかし、次の SET CONNECTION 文は正常に実行されます。
SET CONNECTION 'con1' DORMANT
SQL 文
2-507
SET CONNECTION 文
単一スレッド環境での停止接続
オプション DORMANT を使用して、単一スレッドのアプリケーション ( 複数のス
レッドを使用しない ESQL/C アプリケーション ) で現行接続を停止状態にすること
ができます。単一スレッドのアプリケーションでのオプション DORMANT の可用
性は、これらのアプリケーションのマルチスレッドアプリケーションとの上位互換
を可能にしています。
マルチスレッド ESQL/C 環境での停止接続
単一スレッドのアプリケーションと同様に、マルチスレッドアプリケーション ( 複
数のスレッドを使用する ESQL/C アプリケーション ) は一つまたは複数のデータ
ベースに対して複数の接続を確立することができます。しかし、単一スレッド環境
では、プログラムを実行する際に一つの接続しか実効状態でいられません。マルチ
スレッド環境では、一つの ESQL/C アプリケーションで複数のスレッドが存在する
ことができ ( それぞれが特定の機能を実行する並行した作業単位 )、そして各ス
レッドは実効状態の接続を確立することができます。
各スレッドは、実効状態の接続を一つ持つことができます。二つのスレッドは同じ
アクティブ接続を共有することはできません。いったんスレッドがアクティブ接続
を停止状態にすると、その接続は他のスレッドで使用可能になります。停止接続と
は、確立はされているが現在どのスレッドにも関連付けられていない接続です。た
とえば、con1 という接続が、thread_1 というスレッドで実効状態にある場合には、
thread_1 が接続 con1 を停止状態にしない限り、thread_2 というスレッドはアク
ティブ接続として接続 con1 を使用することはできません。
次の ESQL/C プログラムの例では、マルチスレッドアプリケーション内の特定のス
レッドが接続を実効状態にし、この接続を介して表で作業を行い、その後他のス
レッドが接続を使用できるよう接続を停止状態にしています。
thread_2()
{
/* Make con2 an active connection */
EXEC SQL connect to 'db2' as 'con2';
/*Do insert on table t2 in db2*/
EXEC SQL insert into table t2 values(10);
/* make con2 available to other threads */
EXEC SQL set connection 'con2' dormant;
}
.
.
.
2-508 Informix Guide to SQL:Syntax
SET CONNECTION 文
データベース環境との接続が CONNECT 文の WITH CONCURRENT TRANSACTION
節のよって開始されている場合、それ以降のそのデータベース環境と接続するすべ
てのスレッドが実行中のトランザクションを使用することができます。さらに、こ
のような接続に OPEN カーソルが関連付けらていると、接続が停止状態になっても
このカーソルはオープンされたままとなります。接続をしようで着るスレッドはい
つの場合も一つですが、マルチスレッド ESQL/C アプリケーション内のスレッド
は、関連する接続を現行にすることで同じカーソルを使用することができます。
マルチスレッド ESQL/C アプリケーションの詳細とこれらのアプリケーションでの
SET CONNENCTION 文の使用方法については、『INFORMIX-ESQL/C Programmer’s
Manual』を参照してください。
接続の識別
アプリケーションが最初の CONNECT 文で接続名を使用しなかった場合、接続名と
してデータベース名やデータベースパス名などのデータベース環境を使用しなけれ
ばなりません。たとえば、次の CONNECTION 文は接続名を使用しないため、SET
CONNECTION 文は接続名にデータベース環境を使用します。データベース環境を
含んでいる引用符付き文字についての詳細は、2-82 ページの「データベース環境」
を参照してください。
CONNECT TO 'stores7'
.
.
.
CONNECT TO 'demo7'
.
.
.
SET CONNECTION 'stores7'
ただし、データベース サーバとの接続に接続名が割り当てられている場合は、データ
ベース サーバとの再接続を行うのに接続を使用しなければなりません。接続名が存在
する場合に接続名ではなくてデータベース環境を使用すると、エラーが返ります。
SQL 文
2-509
SET CONNECTION 文
DEFAULT オプション
DEFAULT オプションを使用して、SET CONNECTION 文の DEFAULT 接続を指定
することができます。DEFAULT 接続とは以下のいずれかの接続です。
■
明示的な DEFAULT 接続
(CONNECT TO DEFAULT 文によって確立された接続 )
■
暗黙的な接続 (DATABASE 文、CREATE DATABASE 文、または
STARTDATABASE 文を使用して確立された接続 )
オプション DORMANT を指定しない SET CONNECTION 文を使用してデフォルト
接続を再確立したり、オプション DORMANT を指定してデフォルト接続を停止状
態にすることができます。詳細は 2-79 ページの「DEFAULT オプション」と 2-80
ページの「DATABASE 文による暗黙的な接続」を参照してください。
キーワード CURRENT
SET CONNECTION 文のオプション DORMANT とともに、現行接続を簡単に表す方
法としてキーワード CURRENT を使用します。この接続を接続名で指定する代りに
キーワード CURRENT で指定することができます。現行接続が con1 の場合、次の
二つの文は同じように機能します。
SET CONNECTION 'con1' DORMANT;
SET CONNECTION CURRENT DORMANT;
トランザクションが実効状態の場合
オプション DORMANT を指定しないで SET CONNECTION 文を実行すると、文で
指定されている接続が実効状態になり、現行接続であった接続が暗黙的に停止状態
になります。オプション DORMANT を指定して SET CONNECTION 文を実効する
と、文で指定されている接続が明示的に現行接続になります。どちらの場合にも、
停止状態になる接続に確定されていないトランザクションがある場合には SET
CONNECTION 文は失敗します。
2-510 Informix Guide to SQL:Syntax
SET CONNECTION 文
停止状態になる接続に確定されていないトランザクションがある場合には、次の条
件が適用されます。
■
接続が CONNECT 文の WITH CONCURRENT TRANSACTION 節を使用して
確立されている場合には、SET CONNECTION 文は成功し、接続が停止状
態になります。
■
接続が CONNECT 文の WITH CONCURRENT TRANSACTION 節を使用しな
いで確立されている場合には、SET CONNECTION 文は失敗して接続を停
止状態にすることができず、現行接続のトランザクションは引き続き実効
状態になります。この場合エラーが表示され、アプリケーションは実効状
態のトランザクションを確定、またはロールバックしなければなりません。
現行の接続がバージョン 6.0 より前の Dynamic Server の場合
現行接続がバージョン 6.0 より前の Dynamic Server と確立されている場合、オプ
ション DORMANT が指定されているかどうかにかかわらず、SET CONNECTION 文
が実効されると次の条件が適用されます。
■
停止状態にする接続が CONNECT 文の WITH CONCURRENT
TRANSACTION 節を使用して確立されている場合には、アプリケーション
は別の接続に切り替えることができます。
■
停止状態にする接続が、CONNECT 文の WITH CONCURRENT TRANSACTION 節を使用しないで確立されている場合には、アプリケーションは
別の接続に切り替えることができず、SET CONNECTION 文はエラーを返
します。アプリケーションは、CLOSE DATABASE 文を使用してデータ
ベースをクローズし、接続を解除しなければなりません。
参照
関連する文は、このマニュアルの「CONNECT 文」、
「DISCONNECT 文」、
「DATABASE 文」です。
SET CONNECTION 文とマルチスレッドアプリケーションの説明については、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。
SQL 文
2-511
SET Database Object Mode 文
SET Database Object Mode 文
+
IDS
制約、インデックス、およびトリガのモードを変更するには、SET Database Object
Mode 文を使用します。
この文は、Dynamic Server でのみ使用できます。
構文
表モードフォー
マット
2-513 ページ
SET
一覧モード
フォーマット
2-514 ページ
説明
制約、インデックス、またはトリガのモードを変更すると、その変更は持続します。
この設定は、再びデータベース オブジェクトのモードを変更するまで有効です。
システム カタログ表 sysobjstate は、データベースのすべてのデータベース オブジェ
クトと、各データベース オブジェクトの現行のモードを一覧表示します。システム
カタログ表 sysobjstate の詳細については、
『Informix Guide to SQL: Reference』を参照
してください。
データベース オブジェクト モードを変更するために必要な
アクセス権
制約、インデックス、またはトリガのモードを変更するには、必要なアクセス権を
持っていなければなりません。特に、次のいずれかの条件を満たす必要があります。
■
データベースで DBA アクセス権を持っていること
■
データベース オブジェクトが定義された表の所有者でり、かつデータベー
スで Resource アクセス権を持っていること
■
データベース オブジェクトが定義された表で Alter アクセス権を持ってお
り、かつデータベースで Resource アクセス権を持っていること
2-512 Informix Guide to SQL:Syntax
SET Database Object Mode 文
表モードフォーマット
特定の表で定義されたある種類に属するすべてのデータベース オブジェクトのモー
ドを変更するには、表モード フォーマットを使用します。
表モード フォーマット
SET Database Object Mode 文へ戻る
2-512 ページ
,
CONSTRAINTS
FOR
<表>
制約と一意性インデッ
クスのモード
2-515 ページ
INDEXES
TRIGGERS
要素
<表>
トリガと重複インデッ
クスのモード
2-518 ページ
目的
制限
データベース オブジェクトが格 表はローカル表でなければなり
納されている表の名前です。
ません。
一時表に定義されたデータベー
ス オブジェクトを、無効モード
またはフィルタ モードに設定す
ることはできません。
構文
データベース オブ
ジェクト名、
4-25 ページ
たとえば、表 cust_subset で定義されているすべての制約を無効にするには、次の文
を入力します。
SET CONSTRAINTS FOR cust_subset DISABLED
表モード フォーマットを使用すると、一つの SET Database Object Mode 文で、複数
のデータベース オブジェクト タイプのモードを変更できます。たとえば、表
cust_subset に定義されたすべての制約、インデックス、およびトリガを有効にする
には、次の文を入力します。
SET CONSTRAINTS, INDEXES, TRIGGERS FOR cust_subset
ENABLED
SQL 文
2-513
SET Database Object Mode 文
一覧モード フォーマット
特定の制約、インデックス、またはトリガのモードを変更するには、一覧モード
フォーマットを使用します。
SET Database Object Mode 文へ戻る
2-512 ページ
一覧モード フォーマット
,
CONSTRAINTS
< 制約 >
制約と一意性インデッ
クスのモード
2-515 ページ
,
INDEXES
< インデックス >
制約と一意性インデッ
クスのモード
2-515 ページ
トリガと重複インデッ
クスのモード
2-518 ページ
,
TRIGGERS
要素
< 制約 >
目的
モードを設定する制約の名
前です。
< トリガ >
トリガと重複インデッ
クスのモード
2-518 ページ
制限
一覧の各制約は、ローカル制約でなけ
ればなりません。
構文
データベース
オブジェクト名、
4-25 ページ
< インデックス > モードを設定するインデッ
クスの名前です。
一覧のすべての制約は、同じ表で定義
されてなければなりません。
一覧の各制約は、ローカル インデック データベース
スでなければなりません。
オブジェクト名、
一覧のすべてのインデックスは、同じ 4-25 ページ
モードを設定するトリガの
名前です。
表で定義されてなければなりません。
一覧の各トリガは、ローカル トリガで データベース
オブジェクト名、
なければなりません。
一覧のすべてのトリガは、同じ表で定 4-25 ページ
< トリガ >
義されてなければなりません。
2-514 Informix Guide to SQL:Syntax
SET Database Object Mode 文
たとえば、表 cust_subset の一意性インデックス unq_ssn のモードをフィルタ モード
に変更するには、次の文を入力します。
SET INDEXES unq_ssn FILTERING
一覧モード フォーマットを使用して、同じ表に定義されている制約、インデックス、
またはトリガの一覧のモードを変更することもできます。たとえば、表 cust_subset
に insert_trig、update_trig、delete_trig、および execute_trig の 4 つのトリガが定義され
ているとします。また、この 4 つのトリガが有効モードになっているとします。
execute_trig を除いてすべてのトリガを無効にするには、次の文を入力します。
SET TRIGGERS insert_trig, update_trig, delete_trig DISABLED
制約と一意性インデックスのモード
制約または一意性インデックスに対して、無効モード、有効モード、またはフィル
タ モードを指定できます。
制約と一意性インデックスの
モード
表モード フォーマットへ戻る 2-513 ページ
一覧モード フォーマットへ戻る 2-514 ページ
DISABLED
ENABLED
FILTERING
WITHOUT ERROR
WITH ERROR
CREATE TABLE 文、ALTER TABLE 文、または SET Database Object Mode 文で、
制約のモードを指定しないと、制約はデフォルトとして有効モードになります。
CREATE INDEX 文または SET Database Object Mode 文で、一意性インデックスの
モードを指定しないと、一意性インデックスはデフォルトとして有効モードになり
ます。
SQL 文
2-515
SET Database Object Mode 文
無効モード、有効モード、およびフィルタ モードの定義については、2-518 ページ
の「データ操作文によるデータベース オブジェクト モードの使用」を参照してく
ださい。各モードの利点については、2-531 ページの「データベース オブジェクト
モードの利点」を参照してください。
フィルタ モードのエラー
オプション制約または一意性インデックスのモードをフィルタ モードに変更する場
合には、WITHOUT ERROR または WITH ERROR のエラー オプションを指定できま
す。これらのエラー オプションは、データベース サーバが文を実行した後に、整
合性違反エラー メッセージを表示するかどうかを制御します。
オプション WITHOUT ERROR
オプション WITHOUT ERROR は、データベース サーバが INSERT 文、DELETE 文、
または UPDATE 文を実行したときに、一つ以上のターゲット行に制約違反または一
意性インデックス違反が生じても、ユーザに対して整合性違反エラー メッセージを
返さないことを指定します。オプション WITHOUT ERROR は、デフォルトのエ
ラー オプションです。
オプション WITH ERROR
オプション WITH ERROR は、データベース サーバが INSERT 文、DELETE 文、また
は UPDATE 文を実行して、一つ以上のターゲット行に制約違反または一意性インデッ
クス違反が生じた場合に、整合性違反エラー メッセージを返すことを指定します。
エラーオプションの範囲
オプション WITH ERROR とオプション WITHOUT ERROR は、データベース サーバ
が INSERT 文、DELETE 文、または UPDATE 文を実行して、一つ以上のターゲット
行に制約違反または一意性インデックス違反が生じた場合にだけ適用されます。
2-516 Informix Guide to SQL:Syntax
SET Database Object Mode 文
これらのエラー オプションは、無効モードの制約または一意性インデックスを有効
モードまたはフィルタ モードに変更しようとしたときに、ターゲット表の一つ以上
の行が制約条件または一意性インデックス条件に違反しているために SET Database
Object Mode 文が失敗した場合には適用されません。このような場合に、一貫して
いないデータを含む表に対して違反表が起動されていれば、データベース サーバ
は、エラー オプションが SET Database Object Mode 文でどのように指定されていて
も、整合性違反エラー メッセージを返します。
フィルタ モードの違反表と診断表
データベース オブジェクトをフィルタ モードに設定する場合には、フィルタ モー
ドのデータベース オブジェクトが定義されたターゲット表に対して、必ず違反表と
診断表を起動してください。違反表は、整合性条件を満たしていない行を検出しま
す。診断表は、整合性条件を満たしていない各行についての情報を取得します。
違反表と診断表を起動する時期
データベース オブジェクトをフィルタ モードに設定した表に対して、違反表と診
断表を起動していない場合には、データベース サーバは、最初の INSERT 文、
DELETE 文、または UPDATE 文が、表の整合性条件を満たさなかったときに、エ
ラーを返します。
このエラーを防ぐには、次のいずれかの時点で START VIOLATIONS TABLE 文を使
用して、ターゲット表に対して違反表と診断表を起動します。
■
表に定義されているデータベース オブジェクトをフィルタ モードに
設定する前
■
データベース オブジェクトをフィルタ モードに設定してから、ユーザが
ターゲット表で整合性条件に違反するおそれのある INSERT 文、DELETE
文、または UPDATE 文を発行するまでの間
SQL 文
2-517
SET Database Object Mode 文
トリガと重複インデックスのモード
トリガまたは重複インデックスに対して、無効モードまたは有効モードを指定でき
ます。
トリガと重複インデックスの
モード
表モード フォーマットへ戻る 2-513 ページ
一覧モード フォーマットへ戻る 2-514 ページ
DISABLED
ENABLED
CREATE TRIGGER 文または SET Database Object Mode 文でトリガのモードを指定し
ないと、トリガはデフォルトとして有効モードになります。
CREATE INDEX 文または SET Database Object Mode 文で重複インデックスのモード
を指定しないと、重複インデックスはデフォルトとして有効モードになります。
無効モードと有効モードの定義については、2-518 ページの「データ操作文による
データベース オブジェクト モードの使用」を参照してください。各モードの利点
の説明は、2-531 ページの「データベース オブジェクト モードの利点」を参照して
ください。
データ操作文によるデータベース オブジェクト モードの使用
データベース オブジェクト モードを使用して、INSERT 文、DELETE 文、および
UPDATE 文の効果を制御することができます。選択したモードは、データを操作す
る表、その表で定義されたデータベース オブジェクトの動作、およびデータ操作文
自体の動作に影響を与えます。
2-518 Informix Guide to SQL:Syntax
SET Database Object Mode 文
有効モードの定義
特に指定しない限り ( デフォルトとして )、制約、インデックス、およびトリガは
有効モードになります。データベース オブジェクトが有効モードになっている場合
には、データベース サーバはデータベース オブジェクトが存在していることを認
識して、データ操作文を実行するときに、そのデータベース オブジェクトを考慮に
入れます。たとえば、制約が有効モードになっている場合には、制約に違反してい
る INSERT 文、UPDATE 文、または DELETE 文は失敗し、ターゲット行は変更され
ません。また、ユーザに対してエラー メッセージが返されます。
無効モードの定義
データベース オブジェクトが無効モードになっている場合には、データベース
サーバは、そのデータベース オブジェクトが存在しないかのように動作し、データ
操作文の実行中にそのデータベース オブジェクトを考慮に入れません。たとえば、
制約が無効モードになっている場合には、制約に違反している INSERT 文、
UPDATE 文、または DELETE 文は正常に終了し、ターゲット行は変更されます。
ユーザに対してエラー メッセージは返されません。
フィルタ モードの定義
データベース オブジェクトがフィルタ モードになっている場合には、データベー
ス オブジェクトは有効モードの場合と同様に動作し、データベース サーバは
INSERT 文、UPDATE 文、および DELETE 文の実行中に、データベース オブジェク
トが存在していることを認識します。たとえば、制約がフィルタ モードで INSERT
文、DELETE 文、または UPDATE 文が実行された場合には、制約に違反している
ターゲット行は変更されません。
SQL 文
2-519
SET Database Object Mode 文
ただし、データベース サーバは、次に示すように有効モードとフィルタ モードの
データベース オブジェクトに対して、異なる方法でデータ操作文を処理します。
■
制約または一意性インデックスが有効モードになっている場合には、デー
タベース サーバは影響を受けるすべてのターゲット行が制約条件または一
意性インデックス条件を満たしている場合にだけ、INSERT 文、UPDATE
文、または DELETE 文を実行します。データベース サーバは、表のすべ
てのターゲット行を更新します。
■
制約または一意性インデックスがフィルタ モードになっている場合には、
データベース サーバは、一つ以上のターゲット行が制約条件または一意性
インデックス条件を満たしていなくても、INSERT 文、UPDATE 文、また
は DELETE 文を実行します。データベース サーバは、表の有効な行 ( 制約
条件または一意性インデックス条件を満たしているターゲット行 ) を更新
しますが、表の不正な行 ( 制約条件または一意性インデックス条件を満た
していないターゲット行 ) は更新しません。その代わりに、データベース
サーバは各不正行を違反表という特別の表に渡します。データベース サー
バは、診断表というもう一つの特別な表に、各不正行の違反の性質に関す
る情報を格納します。
データ操作文によるモードの例
INSERT 文の例によって、有効モード、無効モード、およびフィルタ モード間の違
いを示してみます。ユーザが、INSERT 文で表の整合性条件を満たしていない行を
追加しようとしたとします。たとえば、ユーザ joe が cust_subset という表を作成し
て、この表は ssn ( 顧客の社会保障番号 )、fname ( 顧客の名 )、lname ( 顧客の姓 )、
および city ( 顧客が住んでいる都市 ) の列から構成されるとします。列 ssn は、整数
(INT) データ型、ほかの 3 つの列は、文字 (CHAR) データ型をとります。
ユーザ joe は、列 lname を NULL 値不可として定義しましたが、NULL 値不可制約に
対して名前を割り当てていないために、データベース サーバがこの制約に名前、
n104_7 を黙示的に割り当てたとします。最後に、ユーザ joe は、列 ssn に unq_ssn と
いう名前の一意のインデックスを作成したと仮定します。
2-520 Informix Guide to SQL:Syntax
SET Database Object Mode 文
ここで、表 cust_subset の Insert アクセス権を持っているユーザ linda が、この表で次
の INSERT 文を入力するとします。
INSERT INTO cust_subset (ssn, fname, city)
VALUES (973824499, "jane", "los altos")
ユーザ linda は、列 lname が NULL 値不可列として定義されているにも関わらず、列
lname を除いて、新しい行のすべての列に値を入力しました。データベース サーバ
は、制約のモードによって、次のように動作します。
■
制約が無効モードになっている場合には、行はターゲット表に挿入され、
ユーザに対してエラーは返されません。
■
制約が有効モードになっている場合には、ターゲット表に行は挿入されま
せん。ユーザに対して制約違反エラーが返され、( データベースにログ機
能がある場合には ) 文の効果はロールバックされます。
■
制約がフィルタ モードになっている場合には、ターゲット表に行は挿入さ
れません。その代わりに、その行は違反表に挿入されます。その行によっ
て生じた整合性違反についての情報は、診断表に書き込まれます。
INSERT 文の効果はロールバックされません。フィルタ モード制約に対し
て オプション WITH ERROR を指定した場合には、エラー メッセージが返
されます。違反表と診断表の内容を分析して失敗の原因を特定し、修正す
るか、操作をロールバックすることができます。
前の例で示した INSERT 文の実際の結果を見れば、無効モード、有効モード、およ
びフィルタ モード間の違いをより明確に理解できます。
制約が無効モードになっている場合の Insert 操作の結果
表 cust_subset の NULL 値不可制約が無効モードになっている場合には、ユーザ linda
が発行した INSERT 文は、表に新しい行を正常に挿入します。表 cust_subset の新し
い行は、次の列値を持ちます。
ssn
fname
lname
city
973824499
jane
NULL
los altos
SQL 文
2-521
SET Database Object Mode 文
制約が有効モードの場合の Insert 操作の結果
表 cust_subset の NULL 値不可制約が有効モードになっている場合には、INSERT 文
は表に新しい行を挿入できません。ユーザ linda が INSERT 文を入力したときに、次
のエラー メッセージが返されます。
-292 An implied insert column lname does not accept NULLs.
制約がフィルタ モードの場合の Insert 操作の結果
表 cust_subset の NULL 値不可制約がフィルタ モードに設定されている場合には、
ユーザ linda が発行した INSERT 文は、この表に新しい行を挿入できません。その代
わりに、新しい行は違反表に挿入され、整合性違反について説明する診断行が診断
表に追加されます。
ユーザ joe が、表 cust_subset に対して違反表と診断表を起動したとします。違反表
の名前は cust_subset_vio で、診断表の名前は cust_subset_dia です。ユーザ linda が
ターゲット表 cust_subset に INSERT 文を発行した場合に、違反表 cust_subset_vio に
追加される新しい行は、次の列値を持ちます。
ssn
fname
lname
city
informix_tupleid
informix_optype informix_recowner
973824499
jane
NULL
los altos
1
I
linda
違反表 cust_subset_vio の新しい行には、次の特性があります。
■
違反表の最初の 4 列は、ターゲット表の列と正確に一致します。この 4 列
は、ターゲット表の対応する列と同じ名前と同じデータ型を持ち、ユーザ
linda が入力した INSERT 文が指定する列値を持ちます。
■
列 informix_tupleid の値 1 は、違反行に割り当てられる一意のシリアル識別
子です。
■
列 informix_optype の値 I は、この違反行が作成される原因となった操作の
種類を特定するコードです。この場合、I は挿入操作を意味します。
■
列 informix_recowner の値 linda は、この違反行が作成される原因となった
文を発行したユーザを特定します。
2-522 Informix Guide to SQL:Syntax
SET Database Object Mode 文
ユーザ linda が、ターゲット表 cust_subset に発行した INSERT 文によって、診断表
cust_subset_dia に診断行も追加されます。診断表に追加される新しい診断行は、次
の列値を持ちます。
informix_tupleid
objtype
objowner
objname
1
C
joe
n104_7
診断表 cust_subset_dia の新しい診断行には、次の特性があります。
■
診断表の行は、両表に表示される列 informix_tupleid によって違反表の対応
する行にリンクされます。値 1 は、両表のこの列に表示されます。
■
列 objtype の値 C は、違反表の対応する行を発生させた整合性違反の種類
を特定します。この場合、値 C は制約違反を意味します。
■
列 objowner の値 joe は、整合性違反が検出された制約の所有者を特定
します。
■
列 objname の値 n104_7 は、整合性違反が検出された制約の名前を
示します。
違反表と診断表を結合することによって、ユーザ joe ( ターゲット表 cust_subset とそ
れに関連付けられた特別な表の所有者 ) または DBA は、informix_tupleid 値が 1 の違
反表の行が、INSERT 文の後に作成され、この行が制約に違反していることを知る
ことができます。表の所有者または DBA は、システム カタログ表 sysconstrains に
問い合わせて、この制約が NULL 値不可制約であることを確認できます。これで、
INSERT 文が失敗した理由が分かるため、ユーザ joe または DBA は、修正操作を行
うことができます。
SQL 文
2-523
SET Database Object Mode 文
一つの違反行に対応する複数の診断行
前の例では、診断表の一行だけが、違反表の新しい行に対応しています。しかし、
新しい一行が違反表に追加されたときに、複数の診断行が診断表に追加されること
があります。たとえば、ユーザ linda により INSERT 文で入力された ssn の値
(973824499) が、ターゲット表 cust_subset の列 ssn にすでに存在する値と同じであっ
た場合には、違反表には一つの新しい行しか表示されませんが、診断表
cust_subset_dia には次の二つの診断行が表示されます。
informix_tupleid
objtype
objowner
objname
1
C
joe
n104_7
1
I
joe
unq_ssn
診断表の二つの行は、どちらも列 informix_tupleid で値 1 を持っているため、違反表
の同じ行に対応しています。ただし、一番目の診断行は、ユーザ linda が発行した
INSERT 文によって生じた制約違反を特定し、二番目の診断行は、同じ INSERT 文
によって生じた一意性インデックス違反を特定しています。この二番目の診断行で
列 objtype の値 I は、一意性インデックス違反を意味し、列 objname の値 unq_ssn
は、整合性違反が検出されたインデックスの名前を示しています。
ターゲット表に対して違反表と診断表を起動する時期と方法については、2-517
ページの「フィルタ モードの違反表と診断表」を参照してください。違反表と診断
表の構成の詳細は、2-594 ページの START VIOLATIONS TABLE 文を参照してくだ
さい。
データ整合性を保つためのモードの使用
データ操作文によってモードを使用するだけでなく、ターゲット表に新しい制約ま
たは一意性インデックスを追加するときにもモードを使用できます。正しいモード
を選択すると、ターゲット表の既存の行が新しい整合性条件に違反していても、簡
単にターゲット表に制約またはインデックスを追加できます。
2-524 Informix Guide to SQL:Syntax
SET Database Object Mode 文
次の手順を実行すれば、新しい制約またはインデックスを簡単に追加できます。こ
の手順に従えば、制約条件または一意性インデックス条件を満たしていない行を特
定するために、ターゲット表全体を検査する必要はありません。
■
有効モードで制約またはインデックスを追加します。表にあるすべての既
存の行が、制約条件または一意性インデックス条件を満たしている場合に
は、ALTER TABLE 文または CREATE INDEX 文が正常に実行され、ほか
の手順を行う必要はありません。ただし、表にある既存の行が制約条件ま
たは一意性インデックス条件を満たしていない場合には、ALTER TABLE
文または CREATE INDEX 文はエラー メッセージを返し、ユーザは次の手
順を行う必要があります。
■
無効モードで制約またはインデックスを追加します。ALTER TABLE 文を
再び発行して、ADD CONSTRAINT 節または MODIFY 節でキーワード
DISABLED を指定するか、CREATE INDEX 文を再び発行して、キーワー
ド DISABLED を指定します。
■
START VIOLATIONS TABLE 文を使用して、ターゲット表に対して違反表
と診断表を起動します。
■
SET Database Object Mode 文を発行して、制約またはインデックスのモード
を有効モードに切り替えます。発行すると、SET Database Object Mode 文は
失敗し、制約条件または一意性インデックス条件に違反しているターゲッ
ト表の既存の行は、違反表にコピーされます。制約またはインデックスは
無効モードのままで、整合性違反エラー メッセージが返されます。
■
違反表に SELECT 文を発行して、ターゲット表からコピーされた違反行を
取り出します。すべての必要な情報を得るために、違反表と診断表を結合
する必要が生じることがあります。
■
制約に違反しているターゲット表の行を修正します。
■
ターゲット表のすべての違反行を修正した後に、再び SET Database Object
Mode 文を発行して、無効モードの制約またはインデックスを有効モード
に切り替えます。今回は、制約またはインデックスは有効になり、整合性
違反エラー メッセージは返されません。これは、ターゲット表のすべての
行が、新しい制約条件または一意性インデックス条件を満たしているため
です。
SQL 文
2-525
SET Database Object Mode 文
データ整合性を保つためにモードを使用する例
次の例は、データベース オブジェクト モードを使用して、ターゲット表に対して
制約または一意性インデックスを簡単に追加する方法を示しています。ユーザ joe
が cust_subset という表を作成し、この表は ssn ( 顧客の社会保障番号 )、fname ( 顧客
の名 )、lname ( 顧客の姓 )、および city ( 顧客が住んでいる都市 ) の列から構成され
るとします。
また、表 cust_subset に制約または一意性インデックスは定義されず、列 fname が主
キーであるとします。加えて、このターゲット表に対して違反表と診断表はまだ存
在していないとします。最後に、現在この表は次の列値を持つ 4 つの行を含んでい
ると仮定します。
ssn
fname
lname
city
111763227
mark
jackson
sunnyvale
222781244
rhonda
NULL
palo alto
111763227
steve
NULL
san mateo
333992276
tammy
jones
san jose
有効モードでのデータベース オブジェクトの追加
表 cust_subset の所有者であるユーザ joe は、次の文を入力して、列 ssn に一意性イン
デックスを追加し、列 lname に NULL 値不可制約を追加します。
CREATE UNIQUE INDEX unq_ssn ON cust_subset (ssn) ENABLED;
ALTER TABLE cust_subset MODIFY (lname CHAR(15)
NOT NULL CONSTRAINT lname_notblank ENABLED);
表 cust_subset にある既存の行は、整合性条件に違反しているため、どちらの文も失
敗します。fname 値が rhonda の行は、列 lname で NULL 値不可制約に違反していま
す。fname 値が steve の行は、列 lname で NULL 値不可制約に違反し、列 ssn で一意
性インデックス条件に違反しています。
2-526 Informix Guide to SQL:Syntax
SET Database Object Mode 文
無効モードでのデータベース オブジェクトの追加
前のエラーから回復するために、ユーザ joe は、次のように CREATE INDEX 文と
ALTER TABLE 文を再入力して、両方の文で無効モードを指定します。
CREATE UNIQUE INDEX unq_ssn ON cust_subset (ssn) DISABLED;
ALTER TABLE cust_subset MODIFY (lname CHAR(15)
NOT NULL CONSTRAINT lname_notblank DISABLED);
データベース サーバは、データベース オブジェクトが無効モードになっている場
合には、一意性インデックス条件または制約条件を強制しないため、どちらの文も
正常に実行されます。
違反表と診断表の起動
表 cust_subset に対して新しい制約とインデックスが追加されたので、ユーザ joe は
表 cust_subset で、どの既存の行が制約条件とインデックス条件に違反しているのか
を確かめるために、次の手順を行います。
最初に、ユーザ joe は次の文を入力して、表 cust_subset に対して違反表と診断表を
起動します。
START VIOLATIONS TABLE FOR cust_subset
ユーザ joe は、この文で違反表と診断表に名前を割り当てていないため、各表には
デフォルトの cust_subset_vio と cust_subset_dia という名前が付けられます。
違反を検出するための SET Database Object Mode 文の使用
ターゲット表に対して違反表と診断表が起動されたので、ユーザ joe は次の SET
Database Object Mode 文を発行して、新しいインデックスと制約のモードを無効モー
ドから有効モードに切り替えます。
SET CONSTRAINTS, INDEXES FOR cust_subset ENABLED
この SET Database Object Mode 文を実行すると、制約条件と一意性インデックス条
件に違反している表 cust_subset の既存の行は、違反表 cust_subset_vio にコピーされ、
違反行についての診断情報は診断表 cust_subset_dia に追加されます。SET Database
Object Mode 文は失敗し、制約とインデックスは無効モードのままです。
SQL 文
2-527
SET Database Object Mode 文
次の表は、ユーザ joe が SET Database Object Mode 文を発行した後の違反表
cust_subset_vio の内容を示しています。
ssn
fname
lname
city
informix_tupleid
informix_optype
informix_recowner
222781244 rhonda
NULL
palo alto
1
S
joe
111763227 steve
NULL
san mateo
2
S
joe
違反表 cust_subset_vio の二つの行には、次の特性があります。
■
ターゲット表 cust_subset の fname の値が rhonda の行は、違反表
cust_subset_vio にコピーされます。これは、この行が列 lname の NULL 値
不可制約に違反しているためです。
■
ターゲット表 cust_subset の fname の値が steve の行は、違反表
cust_subset_vio にコピーされます。これは、この行が列 lname の NULL 値
不可制約と、列 ssn の一意性インデックス条件に違反しているためです。
■
一番目の行の列 informix_tupleid の値 1 と二番目の行の列 informix_tupleid の
値 2 は、違反行に割り当てられる一意のシリアル識別子です。
■
列 informix_optype の各行にある値 S は、この違反行が違反表に格納される
原因となった操作の種類を特定するコードです。この場合、S は SET
Database Object Mode 文を意味します。
■
列 informix_recowner の各行にある値 joe は、この違反行が違反表に格納さ
れる原因となった文を発行したユーザを特定します。
2-528 Informix Guide to SQL:Syntax
SET Database Object Mode 文
次の表は、ユーザ joe が SET Database Object Mode 文を発行した後の診断表
cust_subset_dia の内容を示しています。
informix_tupleid
objtype
objowner
objname
1
C
joe
lname_notblank
2
C
joe
lname_notblank
2
I
joe
unq_ssn
診断表 cust_subset_dia の 3 つの行には、次の特性があります。
■
診断表の各行と、違反表の対応する行は、両方の表にある列
informix_tupleid によって結合されます。
■
診断表の一番目の行の informix_tupleid の値は、1 になっています。これは、
informix_tupleid の値が 1 の違反表の行に結合されます。この診断行の列
objtype にある値 C は、違反表の対応する行によって生じた整合性違反の種
類を特定しています。この場合、値 C は制約違反を意味します。この診断
行の列 objname にある値 lname_notblank は、整合性違反が検出された制約
の名前を示しています。
■
診断表の二番目の行の informix_tupleid の値は、2 になっています。これは、
informix_tupleid の値が 2 の違反表の行に結合されます。診断表の二番目の
行の列 objtype にある値 C は、違反表の対応する行によって制約違反が生
じたことを示しています。この診断行の列 objname にある値
lname_notblank は、整合性違反が検出された制約の名前を示しています。
SQL 文
2-529
SET Database Object Mode 文
■
診断表の 3 番目の行の informix_tupleid の値は、2 になっています。これは、
informix_tupleid の値が 2 の違反表の行に結合されます。診断表の 3 番目の
行の列 objtype にある値 I は、違反表の対応する行によって一意性インデッ
クス違反が生じたことを示しています。この診断行の列 objname にある値
unq_ssn は、整合性違反が検出されたインデックスの名前を示しています。
■
列 objowner の 3 つの診断行すべてにある値 joe は、整合性違反が検出され
たデータベース オブジェクトの所有者を特定しています。ユーザ joe が表
cust_subset で制約とインデックスを作成したため、joe の名前は 3 つの行す
べてに表示されています。 情報を取得するための違反行の特定
ユーザ joe は、違反表の内容を確認するために、SELECT 文を入力して、表からす
べての行を取り出します。次に、違反行についての完全な診断情報を取得するため
に、もう一つの SELECT 文によって違反表と診断表を結合します。ユーザの joe は、
対話的に、またはプログラムを通じて、このような操作を行うことができます。
違反行の修正
表 cust_subset で違反行を特定したら、ユーザ joe はその行を修正することができま
す。たとえば、対話的に、またはプログラムを通じて、表 cust_subset に UPDATE 文
を入力することができます。
無効なデータベース オブジェクトの有効化
表 cust_subset のすべての違反行を修正したら、ユーザ joe は次の SET Database Object
Mode 文を発行して、新しい制約とインデックスを有効モードに設定します。
SET CONSTRAINTS, INDEXES FOR cust_subset ENABLED
今回は、SET Database Object Mode 文が正常に実行されます。新しい制約と新しい一
意性インデックス 有効になり、ユーザ joe に対してエラー メッセージは返されませ
ん。これは、表 cust_subset のすべての行が新しい制約条件と一意性インデックス条
件を満たしているためです。
2-530 Informix Guide to SQL:Syntax
SET Database Object Mode 文
データベース オブジェクト モードの利点
前の例は、ユーザがターゲット表にデータ操作文を実行したり、新しい制約とイン
デックスを追加したときに、データベース オブジェクト モードがどのように作用
するかを示しました。また、さまざまなモードの利点の一部も示唆しました。次の
節では、この利点について明示的に説明します。
無効モードの利点
無効モードには次の利点があります。
■
無効モードを使用して、ターゲット表に多数の行をすばやく挿入すること
ができます。特に、ロード操作中には、既存のインデックスの更新と参照
制約の強制が、操作にかかるコストの大部分を占めています。ロード操作
中にインデックスと参照制約を無効にすると、ロードのパフォーマンスと
効率が向上します。
■
既存の表に新しい制約または新しい一意性インデックスを追加する場合、
その表にある一部の行が、新しい整合性条件を満たしていなくても、デー
タベース オブジェクトを追加することができます。無効モードで制約また
はインデックスが表に追加されると、ALTER TABLE 文または CREATE
INDEX 文は、どれだけ既存の行が新しい整合性条件に違反していても、失
敗することはありません。
違反表を起動すると、無効データベース オブジェクトを有効モードまたは
フィルタ モードに切り替える SET Database Object Mode 文は失敗します。
ただし、ターゲット表の違反行は違反表にコピーされるので、違反行を特
定して、修正することができるようになります。ターゲット表で違反行を
修正したら、SET Database Object Mode 文を再発行して、無効モードのデー
タベース オブジェクトを有効モードまたはフィルタ モードに切り替える
ことができます。
SQL 文
2-531
SET Database Object Mode 文
有効モードの利点
次に、各種のデータベース オブジェクトに関して、有効モードの利点を要約します。
■
制約に関して、有効モードの利点は、データベース サーバが制約を強制す
るため、データベース内でデータの一貫性が確保されることです。
■
インデックス関して、有効モードの利点は、データベース サーバが挿入、
削除、および更新の操作の後に、インデックスを更新することです。この
ため、インデックスは最新の状態に維持され、データベースの問合せ中に
オプティマイザによって使用されます。
■
トリガに関して、有効モードの利点は、トリガ イベントが常にトリガされ
たアクションを実行することです。このため、実際のデータ操作中に、ト
リガの目的は常に実現されます。
フィルタ モードの利点
次に、制約または一意性インデックスをフィルタ モードに設定することの利点を示
します。
■
ロード操作中に、フィルタ モードの制約または一意性インデックスに違反
する行を挿入しても、ロード操作は失敗しません。その代わりに、データ
ベース サーバは不正な行を違反表にコピーして、ロード操作を続けます。
■
複数の行に影響を与える INSERT 文、DELETE 文、または UPDATE 文に
よって、一つ以上の特定の行でフィルタ モードの制約または一意性イン
デックスの違反が生じる場合にも、その文は失敗しません。その代わり
に、データベース サーバは、不正な行を違反表にコピーして、その文の実
行を続けます。
■
INSERT 文、DELETE 文、または UPDATE 文がフィルタ モードの制約また
は一意性インデックスに違反する場合に、ユーザは不正な行を特定して、
修正することができます。違反表と診断表は、必要な情報を取得します。
ユーザは、この情報を分析して、修正を行うことができます。
2-532 Informix Guide to SQL:Syntax
SET Database Object Mode 文
参照
関連する文は、
「 START VIOLATIONS TABLE 文」と「STOP VIOLATIONS TABLE
文」です。
モード違反検出については、
『Informix Guide to SQL : Tutorial』を参照してください。
SET Database Object Mode 文と関連付けられたシステム カタログ表については、
『Informix Guide to SQL: Reference』の表 sysobjstate と表 sysviolations を参照してくだ
さい。
SQL 文
2-533
SET DATASKIP 文
SET DATASKIP 文
+
SET DATASKIP 文によって、トランザクション処理中に使用できない ( たとえば、
媒体障害などで )DB 領域を Universal Server がスキップするかどうかを制御するこ
とができます。
構文
SET DATASKIP
ON
,
<DB 領域 >
OFF
DEFAULT
要素
<DB 領域 >
目的
制限
構文
スキップする DB 領域名です。 DB 領域は、文が実行される時に 識別子、
存在していなければなりません。 4-112 ページ
説明
SET DATASKIP 文は、トランザクション処理中に使用できない DB 領域を、データ
ベースサーバがスキップするかどうかを指定するために使用します。
E/C
ESQL/C では、DB 領域がスキップされると警告が返されます。この場合、警告フラ
グ sqlca.sqlwarn.sqlwarn6 は W にセットされます。詳細は、
『INFORMIX-ESQL/C
Programmer’s Manual』を参照してください。♦
DB 領域を指定しないで SET DATASKIP ON を実行した場合には、フラグメントリ
スト内の使用不能なあらゆる DB 領域をスキップするよう、データベースサーバに
指示したことになります。ユーティリティ onstat のオプション -d または -D を使用
して、DB 領域がダウン状態にあるかどうかを確認することができます。
2-534 Informix Guide to SQL:Syntax
SET DATASKIP 文
DB 領域を指定して SET DATASKIP ON を実行した場合には、指定した DB 領域が使
用不能な場合スキップするよう、データベースサーバに指示したことになります。
SET DATASKIP OFF 文は、データスキップ機能をオフにするために使用します。
設定が DEFAULT の場合には、データベースサーバは ONCONFIG ファイルのデー
タスキップ機能の設定を使用します。Universal Server 管理責任者は、データスキッ
プ機能の設定を実行時に変更することができます。
DB 領域がスキップされる状況
データベース サーバは、SET DATASKIP 文で ON がセットされ、DB 領域が使用不
能の場合に、DB 領域をスキップします。
ただし、ある状況ではデータベース サーバは DB 領域をスキップできません。以下
に、それらの状況の概要を説明します。
■
参照制約検査
親行を削除する場合には、子行も削除できる状況になければなりません。
子行は使用可能なフラグメントに存在していなければなりません。
新しい子表を挿入したい場合には、親表は使用可能なフラグメントになけ
ればなりません。
■
更新
あるフラグメントから他のフラグメントへレコードを移動するような更新
を実行する場合には、どちらのフラグメントも使用可能でなければなりま
せん。
■
挿入
式ベースの断片化戦略でレコードを挿入しようとしていて、DB 領域が使
用不能な場合、エラーが返されます。ラウンドロビンアルゴリズムベース
の断片化戦略でレコードを挿入しようとしていて、DB 領域がダウン状態
の場合、データベースサーバは使用可能な DB 領域に行を挿入します。使
用可能な DB 領域がない場合には、エラーが返されます。
SQL 文
2-535
SET DATASKIP 文
■
インデックス付け
レコードの挿入や削除などのように、インデックスに影響する更新を実行
しようとしている場合、またはインデックス付けされたフィールドを更新
するような場合、インデックスは使用可能でなければなりません。
インデックスを作成しようとする場合、使用したい DB 領域は使用可能で
なければなりません。
■
シリアルキー
最初のフラグメントは、現行シリアルキー値を内部に格納するために使用
されます。これは、INSERT 文を実行している最中に、最初のフラグメン
トが使用不能になって、新しいシリアルキー値が要求されるまで認識され
ません。
参照
ONCONFIG ファイルでのデータスキップ機能の設定方法と、ユーティリティ onspaces
の使用方法についての詳細は、
『Administrator’s Guide』を参照してください。
2-536 Informix Guide to SQL:Syntax
SET DEBUG FILE TO 文
SET DEBUG FILE TO 文
+
SET DEBUG FILE TO 文は、ストアドプロシジャの実行時のトレース出力を保持す
るファイルの名前を付けるために使用します。
構文
SET DEBUG FILE TO
' < ファイル名 >'
< ファイル名変数 >
WITH APPEND
<式>
要素
<式>
目的
ファイル名を評価する式です。
< ファイル名 > TRACE 文の出力を含むファイ
ルの、パス名とファイル名を識
別する引用符付き文字列です。
パス名を省略した場合のデフォ
ルトの動作については、2-539
ページの「出力ファイルの格納
場所」を参照してください。
< ファイル名
変数 >
< ファイル名 > の値を持つホス
ト変数です。
制限
式から得られるファイル名は使
用可能でなければなりません。
得られるファイル名と同じ制限
が、< ファイル名 > パラメータ
にも適用されます。
新規または既存のファイルを指
定することができます。既存の
ファイルを指定し、ファイル全
体の現在の内容を保存したい場
合にはキーワード WITH APPEND を含めなければなりま
せん。詳細は 2-538 ページの
「オプション WITH APPEND の
使用」を参照してください。
ホスト変数は文字
(CHARACTER) データ型でなけ
ればなりません。
構文
式、4-33 ページ
引用符付き文字列、
4-156 ページ。
名前は、オペレー
ティングシステムの
規約に従っている必
要があります。
名前は変数名に適用
される言語固有の規
則に従っている必要
があります。
SQL 文
2-537
SET DEBUG FILE TO 文
説明
この文は、ストアドプロシジャ内の TRACE 文の出力がファイル名で指定したファ
イルに格納されることを表しています。TRACE 文が実行される毎に、トレース
データがこの出力ファイルに追加されます。
オプション WITH APPEND の使用
SET DEBUG TO FILE 文で指定する出力ファイルは、新規ファイルまたは既存ファ
イルのどちらであってもかまいません。
既存ファイルを指定した場合には、SET DEBUG TO FILE 文を実行した時点でファ
イルの現行内容はパージされます。また、最初の TRACE コマンドによって、ト
レース出力はファイルの最初に送られます。
しかしオプション WITH APPEND を含む場合、ファイルの現行内容は、SET
DEBUG TO FILE 文を実行した時点で保存されます。最初の TRACE コマンドによっ
て、トレース出力はファイルの最後に追加されます。
SET DEBUG TO FILE 文に新しいファイルを指定すると、オプション WITH
APPEND を含んだのと同じことになります。オプション WITH APPEND を指定した
かどうかにかかわらず、最初の TRACE コマンドによって、トレース出力が新しい
ファイルの最初に送られます。
出力ファイルのクローズ
SET DEBUG FILE TO 文によってオープンされたファイルをクローズするには、SET
DEBUG FILE TO 文を他のファイル名とともに実行します。その後最初のファイル
の内容を編集することができます。
トレース出力の出力先の変更
SET DEBUG FILE TO 文をプロシジャの外から使用して、プロシジャのトレース出
力をファイルに導くことができます。また、この文を使用して、プロシジャ内部か
らそれ自身の出力先を変更することができます。
2-538 Informix Guide to SQL:Syntax
SET DEBUG FILE TO 文
出力ファイルの格納場所
SET DEBUG FILE TO 文を、ローカルデータベースのファイル名とともに実行する
と、出力ファイルは現行ディレクトリに格納されます。現行データベースが遠隔
データベースサーバにある場合には、出力ファイルは遠隔データベースサーバの
ホームディレクトリに格納されます。デバッグファイルのフルパス名を指定する
と、そのファイルは遠隔データベースサーバの指定したディレクトリのファイルに
格納されます。そのディレクトリに対して書込み許可を持っていない場合には、エ
ラーが返されます。
SET DEBUG FILE TO 文の例
次の例は、SET DEBUG FILE TO 文の出力を debugging.out というファイルに送ります。
SET DEBUG FILE TO 'debug' || '.out'
参照
関連する文は「TRACE 文」です。
ストアドプロシジャの説明については『Informix Guide to SQL: Tutorial』を参照して
ください。
SQL 文
2-539
SET DEFERRED_PREPARE 文
+
IDS
E/C
SET DEFERRED_PREPARE 文
SET DEFERRED_PREPARE 文を使用すると、OPEN 文、または EXECUTE 文が送信
されるまで、データベース サーバへの PREPARE 文送信が据え置かれるようになり
ます。
この文は、Dynamic Server でのみ使用が可能です。
この文は、ESQL/C で使用します。
構文
SET DEFERRED_PREPARE
ENABLED
DISABLED
説明
SET DEFERRED_PREPARE 文を使用すると、アプリケーション プログラムは、
OPEN 文、または EXECUTE 文が実行されるまで、データベース サーバへの
PREPARE 文送信を据え置きます。実際には、PREPARE 文はその他の文にバンドル
されるため、2 往復ではなく 1 往復のメッセージがクライアント / サーバ間に送信
されます。
据置き PREPARE 機能は、次のようなシーケンスで有効です。
■
PREPARE 文、DECLARE 文、OPEN 文のブロックが、FETCH 文、または
PUT 文で機能する場合
■
PREPARE 文、EXECUTE 文のブロック、または EXECUTE IMMEDIATE 文
環境変数 IFX_DEFERRED_PREPARE を設定して、PREPARE 文で処理されたプログ
ラム内の文すべてで、据置き PREPAER 機能を有効にすることもできます。
2-540 Informix Guide to SQL:Syntax
SET DEFERRED_PREPARE 文
オプション SET DEFERRED_PREPARE
SET DEFERRED_PREPARE 文に対して、オプション ENABLED、またはオプション
DISABLED を指定することができます。どちらのオプションも指定しない場合、デ
フォルトではオプション ENABLED になっています。デフォルトで据置き
PREPAER 機能を有効にする方法の例を次に示します。
EXEC SQL set deferred_prepare;
オプション ENABLED
オプション ENABLED は、アプリケーション内で据置き PREPARE 機能を有効にし
ます。次の例は、オプション ENABLED の使い方を示しています。
EXEC SQL set deferred_prepare enabled;
SET DEFERRED_PREPARE ENABLED 文を入力すると、PREPARE 文で処理された
アプリケーション内の文すべてで据置き PREPAER 機能が有効になります。この場
合、アプリケーションは次のように動作します。
■
シーケンス PREPARE、DECLARE、OPEN では、OPEN 文によって
PREPARE 文がデータベース サーバに送信されます。
■
PREPARE 文で処理された文に構文エラーがあっても、アプリケーション
がその文のカーソルを宣言してこれをオープンしなければ、データベース
サーバはアプリケーションにエラー メッセージを返しません。
■
シーケンス PREPARE、EXECUTE では、EXECUTE 文によって PREPARE 文
がデータベース サーバに送信されます。PREPARE 文で処理された文に構
文エラーがあっても、アプリケーションがその文の実行を試行しなけれ
ば、データベース サーバはアプリケーションにエラー メッセージを返し
ません。
オプション ENABLED 使用時の DESCRIBE 規則
PREPARE、DECLARE、OPEN 文ブロックで、据置き PREPAER 機能を使用する場
合、ここで使用する DESCRIBE 文は、PREPARE 文ではなく OPEN 文に従っていな
ければなりません。PREPARE 文に従っていると、その DESCRIBE 文はエラーとな
ります。
SQL 文
2-541
SET DEFERRED_PREPARE 文
オプション DISABLED
オプション DISABLED は、アプリケーション内で据置き PREPARE 機能を無効にし
ます。次の 例はオプション DISABLED の使い方を示しています。
EXEC SQL set deferred_prepare disabled;
据置き PREPAER 機能を無効にすると、アプリケーションは、PREPARE 文が実行
されるたびにその文をデータベース サーバに送信します。
SET_DEFERRED_PREPARE の例
次のコード フラグメントは、PREPARE、EXECUTE 文ブロック付きの SET
DEFERRED PREPARE 文を示したものです。この場合、データベース サーバは、
PREPARE 文と EXECUTE 文すべてを同時に実行します。
EXEC SQL
int a;
EXEC SQL
EXEC SQL
EXEC SQL
EXEC SQL
BEGIN DECLARE SECTION;
END DECLARE SECTION;
allocate descriptor 'desc';
create database test;
create table x (a int);
/* Enable Deferred-Prepare feature */
EXEC SQL set deferred_prepare enabled;
/* Prepare an INSERT statement */
EXEC SQL prepare ins_stmt from 'insert into x values(?)';
a = 2;
EXEC SQL EXECUTE ins_stmt using :a;
if (SQLCODE)
printf("EXECUTE : SQLCODE is %d¥n", SQLCODE);
据置き PREPAER 機能と OPTOFC の併用
据置き PREPAER 機能と、OPTOFC(Open-Fetch-Close Optimization) 機能の両方をア
プリケーションで使用することができます。OPTOFC 機能は、FETCH メッセージ
が送信されるまで、データベース サーバへの OPEN メッセージ送信を据え置くもの
です。
2-542 Informix Guide to SQL:Syntax
SET DEFERRED_PREPARE 文
据置き PREPAER 機能と OPTOFC 機能を同時に有効にすると、次のような状況が発
生します。
■
PREPARE 文で処理された文のテキストに構文エラーがあっても、最初の
FETCH 文が実行されるまではアプリケーションにエラーメッセージが返
されません。
■
DESCRIBE 文は、FETCH 文の前に実行することができません。
■
ALLOCATE DESCRIPTOR 文を発行しないと、DESCRIBE 文や GET
DESCRIPTOR 文を実行することができません。
データベース サーバは、SET DESCRIPTOR 文を内部で実行し、TYPE、
LENGTH、DATA、そしてその他のフィールドを、システム記述子領域に
設定します。FETCH 文の後に DESCRIPTOR 文を指定すると、データが返
されていることが分かります。
参照
関連する文は、
「DECLARE 文」、
「DESCRIBE 文」、
「EXECUTE 文」、
「OPEN 文」、
「PREPARE 文」です。
タスクに重点を置いた PREPARE 文や動的 SQL についての説明は、『Informix Guide
to SQL: Tutorial』を参照してください。
SET DEFERRED_PREPARE 文関連のコンセプトについての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』を参照してください。
環境変数 IFX_DEFERRED_PREPARE についての詳細は、
『Informix Guide to SQL:
Reference』を参照してください。
SQL 文
2-543
SET DESCRIPTOR 文
+
E/C
SET DESCRIPTOR 文
次のような場合で、システム記述子領域に値を割り当てるには、SET DESCRIPTOR
文を使用します。
■
システム記述子領域にフィールド COUNT を設定し、記述を行う同領域内
の項目 (WHERE 節に含まれるのが普通です ) の数を合致させる場合
■
記述を行うシステム記述子領域内の各値に対し、項目 (WHERE 節に含まれ
るのが普通です ) 記述子を設定する場合
■
DESCRIBE 文を使用して、
SELECT 文や INSERT 文のフィールドを充てんし
たあとに、項目記述子フィールドの内容を修正する場合
この文は、ESQL/C とともに使用します。
2-544 Informix Guide to SQL:Syntax
SET DESCRIPTOR 文
構文
SET DESCRIPTOR
' < 記述子 >'
COUNT
=
< 項目の合計 >
< 記述子変数 >
< 項目の合計変数 >
,
VALUE
< 項目番号 >
< 項目番号変数 >
項目記述子
情報
項目記述子
情報
TYPE
=
< リテラル整数 >
< 整数ホスト変数 >
LENGTH
PRECISION
SCALE
NULLABLE
INDICATOR
ITYPE
ILENGTH
DATA
IDATA
NAME
=
リテラル番号
4-138 ページ
リテラル日時
4-132 ページ
リテラル時間隔
4-135 ページ
引用符付き文字列
4-156 ページ
< 入力変数 >
SQL 文
2-545
SET DESCRIPTOR 文
要素
< 記述子 >
目的
制限
値が割り当てられるシステム記 システム記述子領域は、事前に
述子領域を識別する文字列です。 ALLOCATE DESCRIPTOR 文で
割り当てられていなければなり
ません。
< 記述子変数 > < 記述子 > の値を保持する
< 記述子 > に適用される制限と
ホスト変数です。
同じ制限が、< 記述子変数 > に
も適用されます。
< 入力変数 >
< 項目番号 >
指定した項目記述子の、指定し
たフィールド (DATA、IDATA、
NAME のいずれか ) の情報を
含んでいるホスト変数です。
システム記述子領域のオカレン
ス ( 項目記述子 ) の一つを指定
する、符号なし整数です。
< 項目番号
変数 >
< 項目番号 > の値を保持する
整数ホスト変数の名前です。
< リテラル
整数 >
指定した項目記述子の指定した
フィールドに値を割り当てる、
正の非ゼロ (0) 整数です。
指定するフィールドは、次の
キーワードのいずれかでなけれ
ばなりません。
TYPE、LENGTH、PRECISION、
SCALE、NULLABLE、
INDICATOR、ITYPE、
ILENGTH。
構文
引用符付き文字列、
4-156 ページ
ホスト変数の名前
は、変数名に適用さ
れる言語固有の規則
に従っている必要が
あります。
名前は、変数名に
適用される言語固有
の規則に従っている
必要があります。
リテラル番号、
4-138 ページ
< 入力変数 > に含まれる情報
は、指定したフィールドに対し
て適切なものでなければなりま
せん。
< 項目番号 > の値はゼロ (0) よ
り大きく、ALLOCATE
DESCRIPTOR 文でシステム記
述子領域が割り当てられた時に
指定されたオカレンス数以下で
なければなりません。
< 項目番号 > に適用される制限 ホスト変数の名前
と同じ制限が、< 項目番号変数 > は、変数名に適用さ
にも適用されます。
れる言語固有の規則
に従っている必要が
あります。
< リテラル整数 > に適用される リテラル番号、
制限は、オプション VALUE で 4-138 ページ
指定するフィールドのタイプ
(TYPE、LENGTH など ) によっ
て異なります。フィールド
TYPE で使用できるコードとそ
の意味については 2-548 ページ
の「フィールド TYPE の設定」
を参照してください。他の
フィールドの適用される制限に
ついては 2-548 ページの
「VALUE 節の使用」にある各
フィールドタイプの説明を参照
してください。
(1/2)
2-546 Informix Guide to SQL:Syntax
SET DESCRIPTOR 文
要素
< リテラル
整数変数 >
目的
< リテラル整数 > の値を含んで
いるホスト変数です。
制限
< リテラル整数変数 > に適用さ
れる制限は、< リテラル整数 >
の場合と同じです。
構文
名前は、変数名に
適用される言語固有
の規則に従っている
必要があります。
< 項目の合計 > システム記述子領域に、いくつ < 項目の合計 > で指定する整数 リテラル番号、
の項目を実際に記述するかを指 は、0 より大きく、ALLOCATE 4-138 ページ
定するためのリテラル整数です。 DESCRIPTOR 文を使用してシ
ステム記述子を割り当てた際指
定した項目記述子の数より小さ
く ( または同じで ) なければな
りません。
システム記述子領域にいくつの
項目の合計
<
< 項目の合計変数 > に適用され 名前は、変数名に
項目を実際に記述するかを指定 る制限は、< 項目の合計 > の
適用される言語固有
変数 >
するリテラル整数が、このホス 場合と同じです。
の規則に従っている
ト変数に保持されています。
必要があります。
(2/2)
説明
システム記述子領域に値を割り当てるには、SET DESCRIPTOR 文を使用します。
システム記述子領域内のフィールドの割当てを行っている最中にエラーが発生した
場合には、すべての指定したフィールドの内容は、変数によってゼロ (0) または
NULL に設定されます。
キーワード COUNT の使用
キーワード COUNT を使用して、システム記述子領域で使用する項目数を設定します。
SQL 文
2-547
SET DESCRIPTOR 文
使用予定数より多い項目をシステム記述子領域に割り当てる場合は、フィールド
COUNT を実際に使用する項目数に設定する必要があります。次の例は、プログラ
ム中で使用することができる INFORMIX-ESQL/C の一連の文を示しています。
EXEC SQL BEGIN DECLARE SECTION;
int count;
EXEC SQL END DECLARE SECTION;
EXEC SQL allocate descriptor 'desc_100'; /*allocates for 100 items*/
count = 2;
EXEC SQL set descriptor 'desc_100' count = :count;
VALUE 節の使用
VALUE 節を使用して、システム記述子領域の特定の項目のためのフィールドに、
ホスト変数から値を割り当てます。(WHERE 節のパラメータのような ) 記述の提供
が必要な項目について、値を割り当てることができます。または、DESCRIBE 文を
使用した後、項目用の値を変更することができます。
フィールド TYPE の設定
次のコードを使用して、各項目の TYPE の値を設定します。
SQL データ型
文字 (CHAR) 型
小桁整数 (SMALLINT) 型
整数 (INTEGER) 型
実数 (FLOAT) 型
小桁実数 (SMALLFLOAT) 型
10 進数 (DECIMAL) 型
シリアル (SERIAL) 型
日付 (DATE) 型
金額 (MONEY) 型
日時 (DATETIME) 型
バイト (BYTE) 型
テキスト (TEXT) 型
可変長文字 (VARCHAR) 型
時間隔 (INTERVAL) 型
各国語文字 (NCHAR) 型
各国語可変長文字
(NVARCHAR) 型
2-548 Informix Guide to SQL:Syntax
整数値
0
1
2
3
4
5
6
7
8
10
11
12
13
14
15
16
SET DESCRIPTOR 文
コードを管理しやすくするために、これらの SQL データ型には、実際の整数値では
なく定義済みの定数を使用してください。これらの定数はヘッダ ファイル
sqltypes.h で定義されています。
次の例は、ESQL/C でのフィールド TYPE の設定方法を示しています。
main()
{
EXEC SQL BEGIN DECLARE SECTION;
int itemno, type;
EXEC SQL END DECLARE SECTION;
...
EXEC SQL allocate descriptor 'desc1' with max 5;
...
EXEC SQL set descriptor 'desc1' value 2 type = 5;
type = 2; itemno = 3;
EXEC SQL set descriptor 'desc1' value :itemno type = :type;
}
オプション -xopen を指定しないコンパイル
オプション -xopen を使用しないでコンパイルした場合には、TYPE には標準
の InformixSQL コードが割り当てられます。標準モードと X/Open モードを混ぜな
いように注意してください。エラーが発生する可能性があります。たとえば、ある
タイプが標準モードでは定義されていて、X/Open モードでは定義されていない場
合、SET DESCRIPTOR 文を実行するとエラーが発生します。
X/O
X/Open プログラムでのフィールド TYPE の設定
X/Open モードでは、フィールド TYPE のデータ型として X/Open の整数コードセット
を使用しなければなりません。次の表は X/Open コードのデータ型を示しています。
SQL データ型
文字 (CHAR) 型
小桁整数 (SMALLINT) 型
整数 (INTEGER) 型
実数 (FLOAT) 型
10 進数 (DECIMAL) 型
整数値
1
4
5
6
3
SET DESCRIPTOR 文でフィールド ILENGTH、IDATA、または ITYPE を使用する
と、警告メッセージが表示されます。この警告は、システム記述子領域にとって、
これらのフィールドが標準の X/Open フィールドではないことを示しています。
SQL 文
2-549
SET DESCRIPTOR 文
コードを管理しやすくするために、これらの X/Open SQL データ型には、実際の整
数値ではなく定義済みの定数を使用してください。これらの定数はヘッダ ファイル
sqlxtype.h で定義されています。
フィールド DATA およびフィールド IDATA の設定
フィールド DATA およびフィールド IDATA を設定する場合、適切な型のデータ
( 文字列には文字 (CHAR) 型または可変長文字 (VARCHAR) 型、整数には整数
(INTEGER) 型など ) を指定しなければなりません。
DATA で指定されている値以外の値が設定されたとき、DATA の値は未定義となり
ます。項目に対して TYPE を設定しない限り、フィールド DATA およびフィールド
IDATA を設定することはできません。項目のフィールド TYPE に文字型を設定す
ると、フィールド LENGTH も設定しなければなりません。文字項目のフィールド
LENGTH を設定しないと、エラーが返されます。
LENGTH または ILENGTH の使用
フィールド DATA または IDATA が文字列を含んでいる場合、LENGTH の値を指定
しなければなりません。LENGTH=0 を設定すると、LENGTH は自動的に文字列の
最大長に設定されます。フィールド DATA または IDATA は、368 個のリテラル文
字列、または文字 (CHAR) 型や可変長文字 (VARCHAR) 型の文字変数から得られる
文字列を含むことができます。これによって、フィールド DATA または IDATA 内
の文字列の長さは動的に決定されます。
DESCRIBE 文の後に SET DESCRIPTOR 文がある場合には、LENGTH は、表で指定
されている文字 (CHAR) 型フィールドの最大長に自動的に LENGTH を設定します。
このことは ILENGTH でも同様です。
10 進数 (DECIMAL) 型または金額 (MONEY) 型の使用
フィールド TYPE を 10 進数 (DECIMAL) 型や金額 (MONEY) 型に設定し、デフォル
ト値以外の小数点以下桁数、有効桁を使用したい場合には、フィールド SCALE お
よび PRECISION を設定します。10 進数 (DECIMAL) 型や金額 (MONEY) 型に対し
ては、フィールド LENGTH を設定する必要はありません。フィールド LENGTH
は、フィールド SCALE または PRECISION の値に従って設定されます。
2-550 Informix Guide to SQL:Syntax
SET DESCRIPTOR 文
日時 (DATETIME) 型または時間隔 (INTERVAL) 型の使用
日時 (DATETIME) 型や時間隔 (INTERVAL) 型でフィールド TYPE を設定した場合、
フィールド DATA をリテラル日時 (DATETIME) 型や時間隔 (INTERVAL) 型として、
または文字列として設定することができます。文字列を使用する場合には、フィー
ルド LENGTH は符号化された修飾子の値に設定しなければなりません。
日時 (DATETIME) 型や時間隔 (INTERVAL) 型の文字列で使用する、符号化された
修飾子を決定するには、ヘッダファイル datetime.h の日時型と時間隔型用のマクロ
を使用してください。
DATA を日時 (DATETIME) 型や時間隔 (INTERVAL) 型のホスト変数に設定した場合
には、明示的に符号化された修飾子整数を LENGTH に設定する必要はありません。
フィールド INDICATOR の設定
システム記述子領域で NULL 値を使用したい場合は、フィールド INDICATOR に -1
を設定し、フィールド DATA は設定しないでください。
データが NULL でないことを示すためにフィールド INDICATOR にゼロ (0) をセッ
トする場合は、フィールド DATA を設定する必要があります。
フィールド ITYE の設定
フィールド ITYPE には、標識変数のデータ型を示す整数の定数を設定します。
フィールド TYPE で使用したのと同じ定数のセットを使用してください。
定数は 2-548 ページで一覧しています。
参照
関連する文は「ALLOCATE DESCRIPTOR 文」、
「DEALLOCATE DESCRIPTOR 文」
、
「DECLARE 文」、
「DESCRIBE 文」、
「EXECUTE 文」、
「FETCH 文」、
「GET DESCRIPTOR 文」、
「OPEN 文」、
「PREPARE 文」、
「PUT 文」です。
システム記述子領域についての詳細は、
『INFORMIX-ESQL/C Programmer’s Manual』
を参照してください。
SQL 文
2-551
SET EXPLAIN 文
SET EXPLAIN 文
オプティマイザが選択する問合せ予定、返される行数の見積り、問合せの相対的な
コストを表示するには SET EXPLAIN 文を使用します。
構文
SET EXPLAIN
ON
OFF
説明
SET EXPLAIN 文は、問合せ実行の際に発生する作業について、様々な測定値を提
供するものです。オプション ON を使うと、以後の問合せそれぞれにつき測定値が
生成され、出力ファイルに書き込まれます。オプション OFF は、SET EXPLAIN 文
を終了させるものです。このオプションを使うと、以後の問合せの測定値が生成さ
れたり出力ファイルに書き込まれたりすることがなくなります。
SET EXPLAIN ON 文は、SET EXPLAIN OFF 文を実行したり、プログラムを終了す
るまで有効です。
SET EXPLAIN ON 文が実行されたときに出力ファイルが存在しない場合、データ
ベース サーバが出力ファイルを作成します。SET EXPLAIN ON 文が実行されたとき
に出力ファイルが存在する場合は、以後の出力は同ファイルに追加されます。
SET EXPLAIN 文を入力しない場合のデフォルト動作は OFF です。この場合、デー
タベース サーバは問合せの測定値を生成しません。
SET EXPLAIN 文の実行
問合せを開始すると、データベース サーバの最適化が行われますが、SET
EXPLAIN ON 文はこの段階で実行されます。カーソルに関連付けられた問合せが
PREPARE 文で処理されます。この問合せにホスト変数が含まれていない場合、最
適化はその問合せを PREPARE 文で処理する時に行われます。ホスト変数が含まれ
ている場合、最適化はカーソルのオープン時に行われます。
2-552 Informix Guide to SQL:Syntax
SET EXPLAIN 文
出力ファイルの名前と配置
UNIX
UNIX 上では、SET EXPLAIN ON 文を実行すると、オプティマイザが以後の問合せ
それぞれに選択したプランはファイル sqexplain.out に書き込まれます。所有者名
( たとえば、< 所有者名 >.< 顧客名 >) はファイル sqexplain.out のテーブル名を修飾
します。
クライアント アプリケーションとデータベース サーバが同じコンピュータ上に存
在する場合、ファイル sqexplain.out は現行ディレクトリに格納されます。バージョ
ン 5.x 以前のクライアント アプリケーションを使用している場合で、ファイル
sqexplain.out が現行ディレクトリに見当たらないときは、同ファイルのホーム ディ
レクトリをチェックしてください。
現行ディレクトリが他のマシン上にある場合には、ファイル sqexplain.out は遠隔ホ
ストのホームディレクトリに格納されます。♦
WIN NT
Windows NT 上では、SET EXPLAIN ON 文を出すと、オプティマイザが以後の問合せ
それぞれに選択したプランは %INFORMIXDIR%¥sqexpln¥< ユーザ名 >.out ファイル
に書き込まれます。所有者名 ( たとえば、< 所有者名 >.< 顧客名 >) はファイル
sqexplain.out のテーブル名を修飾します。♦
SET EXPLAIN 文による出力
SET EXPLAIN 文による出力ファイルには、問合せのコピー、データベースサーバ
のオプティマイザが選択した問合せ予定、作業量の見積りが含まれます。オプティ
マイザは、問合せが最も効率の良い方法で実行されるよう、インデックスの有無や
そのタイプ、各表の行数などに基づいて計画を選択します。
オプティマイザは見積りを使用して、それぞれの方法のコストを比較します。見積り
コストはそのまま時間に換算することはできません。しかし、データ分散が使用され
ている場合は、通常、見積りが高い問合せの方が低いものより時間がかかります。
問合せの見積りコストは、SET EXPLAIN 文による出力に含まれます。問合せと副
問合せでは、二つの見積りコストが数値化され、返されます。問合せ数値には副問
合せのコストも含まれます。副問合せのコストは、副問合せに関連付けられている
コストを確認するだけのために表示されます。
SQL 文
2-553
SET EXPLAIN 文
SET EXPLAIN 出力で最適化を指示した場合の効果
オプティマイザ ディレクティブや SET OPTIMIZATION 文を使って問合せ予定を変
更すると、その変更は SET EXPLAIN 文の出力に記録されます。たとえば、SET
OPTIMIZATION を LOW にすると、SET EXPLAIN の出力の先頭行には次のような
大文字の文字列が示されます。
QUERY:{LOW}
SET OPTIMIZATION を HIGH にすると、SET EXPLAIN の出力の先頭行には次のよ
うな大文字の文字列が示されます。
QUERY:
IDS
Dynamic Server の場合、問合せにオプティマイザ ディレクティブを付加すると、
SET EXPLAIN の出力には、その問合せのすぐ後に、次のような行が示されます。
DIRECTIVES FOLLOWED:
[List of dierctives specified]
♦
参照
関連する文は、
「SET OPTIMIZATION 文」
、「UPDATE STATISTICS 文」です。
SET EXPLAIN についての説明、およびオプティマイザの出力の分析についての説
明は、
『Performance Guide』を参照してください。
2-554 Informix Guide to SQL:Syntax
SET ISOLATION 文
+
SET ISOLATION 文
SET ISOLATION 文は、同じ行へ同時にアクセスを試行するプロセス間の並行度を
定義するために使用します。
SET ISOLATION 文は ANSI SQL-92 標準に対する Informix の拡張機能です。排他レ
ベルを ANSI 標準準拠の文で設定したい場合には、SET TRANSACTION 文を使用し
てください。これら二つの文の比較については 2-584 ページの「SET
TRANSACTION 文」を参照してください。
構文
SET ISOLATION TO
DIRTY READ
COMMITTED READ
CURSOR STABILITY
REPEATABLE READ
説明
データベースの排他レベルは、データベースから行が抽出された場合に、読込みの
並行度に影響を与えます。データベースサーバは共有ロックを使用し、プロセス間
でのデータアクセスに対して 4 つの排他レベルをサポートしています。
更新処理または削除処理は、変更された行に対して常に排他ロックを取得します。
排他のレベルは更新または削除しようとしている行に影響を与えません。繰返し読
込みの排他レベルを使用して行を読み込んでいる場合に、他のプロセスが行を更新
または削除しようとした場合、それらの行に対するアクセスは拒否されます。
SQL 文
2-555
SET ISOLATION 文
E/C
ESQL/C では、SET ISOLATION 文を実行したときにオープンされているカーソルは、
行が抽出された後で新しい排他レベルを使用するかもしれません。カーソルがオー
プンされてからアプリケーションが実際に行を取り出すまでの間有効な排他レベル
は、どのようなレベルのものであってもかまいません。データベースサーバは、そ
の時有効であった排他レベルを使用して内部バッファまたは内部の一時表に行を読
み込みます。一貫性と再現性を保つために、SET ISOLATION 文を実行する前に
オープンされているカーソルをクローズしてください。♦
Informix の排他レベル
以下に各排他レベルの重要な特性を、排他レベルの低い方から順に説明しています。
排他レベル
特性
単純読込み
排他性を提供しません。問合せに使用される静的な表に対し
て単純読込みは適切です。単純読込みの排他レベルでは、幻
行が返されることがあります。幻行とは、トランザクション
中に挿入または変更された確定されていない行で、後にロー
ルバックされるものです。他の排他レベルでは、幻行にアク
セスすることはできません。単純読込みはトランザクション
を持っていないデータベースで使用可能なただ一つの排他レ
ベルです。
確定読込み
抽出されたすべての行が、抽出されるまでに表内で確定され
ていることを保証します。しかしロックを取得することはで
きません。あるプロセスが行を抽出した後、行にロックがか
けられていないため、他のプロセスが同じ行に対して排他
ロックを取得して、行のデータを変更したり削除したりする
ことができます。確定読込みは、ANSI 標準に準拠していない
ログ機能を持つデータベースのデフォルトの排他レベルです。
(1/2)
2-556 Informix Guide to SQL:Syntax
SET ISOLATION 文
排他レベル
特性
カーソル安定性
選択行に対して共有ロックを取得します。他のプロセスも同
じ行に対して共有ロックを取得することができます。しか
し、どのプロセスも行のデータを変更するための排他ロック
を取得することはできません。別の行を取り出したり、カー
ソルをクローズしたりすると共有ロックは解放されます。
排他レベルをカーソル安定性に設定したときにトランザク
ションを使用していない場合、カーソル安定性に設定した排
他レベルは確定読込みに設定した排他レベルと同様の働きを
します。トランザクションの外で排他レベルがカーソル安定
性に設定されている場合にはロックが取得されますが、行を
読み出す文の終了直後に解放されます。
繰返し読込み
トランザクション中に選択されたすべての行に対して共有
ロックを取得します。他のプロセスも選択されている行に対
して共有ロックを取得することができますが、トランザク
ション中はどの選択行も変更することはできません。トラン
ザクション中に問合せを繰り返すと、同じ情報を再読込みす
ることができます。共有ロックはトランザクションが確定さ
れるか、ロールバックされた場合のみ解放されます。繰り返
し読込みは ANSI 標準準拠のデータベースでデフォルトの排
他レベルです。
(2/2)
次の例では、ユーザが排他レベルを繰返し読込みにしたことを示しています。した
がって、トランザクション中に問合せが繰り返された場合、その問合せは同じ情報
を再度読み込むことになります。
SET ISOLATION TO REPEATABLE READ
SQL 文
2-557
SET ISOLATION 文
デフォルトの排他レベル
データベースのデフォルトの排他レベルは、データベースが作成された時点でデー
タベース型によって設定されます。次のリストは、各データベース型のデフォルト
の排他レベルを示しています。
排他レベル
データベース型
単純読込み
ログ機能なしのデータベースでのデフォルトの排他レベルです。
確定読込み
ANSI 標準に準拠していない、ログ機能付きデータベースのデ
フォルトの排他レベルです。
繰返し読込み
ANSI 標準準拠のデータベースでのデフォルトの排他レベルです。
デフォルトの排他レベルは、SET ISOLATION 文を実行するまで有効です。SET
ISOLATION 文を実行した後、新しい排他レベルは、次のいずれかのイベントが発
生するまで有効です。
■
再度 SET ISOLATION 文を実行する。
■
SET ISOLATION 文で最後に指定したレベルとは異なる、デフォルトの排他
レベルを持つ別のデータベースをオープンする。
■
プログラムが終了する。
排他レベルの効果
ログ機能を持っていないデータベースでデータベースの排他レベルを設定すること
はできません。そのようなデータベースからの抽出は、すべて単純読込みで行われ
ます。
データベースがオープンされた直後に、クライアントコンピュータから SET
ISOLATION 文を実行することができます。
BYTE 列および TEXT 列の抽出中に取得されるデータは、データベースの排他レベ
ルによって異なります。単純読込みまたは確定読込みの排他レベルでは、プロセス
は、削除された BYTE 列および TEXT 列 ( 削除が確定されていない場合 ) または削
除中の BYTE 列および TEXT 列を読み込むことができます。これらの排他レベルで
は、アプリケーションは、ある特定の状況で削除された BYTE 列および TEXT 列を
読み込むことができます。これらの条件については、
『Administrator’s Guide』を参
照してください。
2-558 Informix Guide to SQL:Syntax
SET ISOLATION 文
DB
E/C
DB-Access を使用している場合には、高い排他レベルによるさらに多くのロックの
競合が発生します。たとえば、カーソル安定性を使用すると、確定読込みを使用す
るときよりも多くの競合が発生します。♦
ESQL/C ではトランザクションでスクロールカーソルを使用すると、一時表とデー
タベース表の間の一貫性を強制することができます。この場合、どちらの表にも繰
り返し読込みの排他レベルを設定するか、トランザクション中は表全体にロックを
かけます。
トランザクションでキーワード WITH HOLD を指定したスクロールカーソルを使用
すると、一時表とデータベース表の間に一貫性を強制することができません。表レ
ベルのロック、または繰返し読込みによって設定されたロックはトランザクション
が完了した時点で解放されます。しかしキーワード WITH HOLD を指定したスク
ロールカーソルは、トランザクション終了までオープンしたままになります。トラ
ンザクションが終了した時点で、解放された行を変更することができます。しか
し、一時表の抽出されたデータは、実際のデータと異なる場合があります。♦
参照
関連する文は「CREATE DATABASE 文」、
「SET LOCK MODE 文」
、「SET
TRANSACTION 文」です。
排他レベルの説明については『Informix Guide to SQL: Tutorial』を参照してください。
SQL 文
2-559
SET LOCK MODE 文
+
SET LOCK MODE 文
SET LOCK MODE 文は、ロックされている行と表にアクセスしようとするプロセス
を、データベースサーバがどのように取り扱うかを定義するために使用します。
構文
SET LOCK MODE TO
WAIT
<秒>
NOT WAIT
要素
<秒>
目的
ロックが解放されるまでプロセ
スが待機する最大時間です。
待機時間が経過してもロックさ
れたままになっている場合に
は、データベースサーバは操作
を終了し、プロセスに対してエ
ラーコードを返します。
2-560 Informix Guide to SQL:Syntax
制限
構文
ネットワーク環境では、DBA
リテラル番号、
( データベース管理者 ) はパラ
4-138 ページ
メータ ONCONFIG の
DEADLOCK_TIMEOUT を使用
して待機時間のデフォルト値を
設定することができます。指定
した < 秒 > の値が適用されるの
は、待機時間がシステムのデ
フォルト値よりも短い場合のみ
です。
SET LOCK MODE 文
説明
ロックがかけられている行や表に対してプロセスがアクセスを試みている場合、
データベースの対応を次の方法によって指示することができます。
ロックモード
効果
NOT WAIT
データベースサーバの操作を即時終了し、エラーコードを返
します。この状態がデフォルトです。
WAIT
データベースサーバのロックが解放されるまでプロセスを
サスペンドします。
WAIT < 秒 >
データベースサーバのロックが解放されるまで、または秒で
指定した待機期間が終了するまでプロセスをサスペンドしま
す。待機期間後もロックがかかっている状態が続く場合に
は、操作を終了し、エラーコードを返します。
次の例では、ロックが解放されるまで、プロセスを一時停止するようユーザが指定
したことを示しています。
SET LOCK MODE TO WAIT
次の例では、プロセスがロックされた行を要求すると、直ちに動作が停止し、エ
ラー コードが返されるようユーザが指定したことを示しています。
SET LOCK MODE TO NOT WAIT
次の例では、ユーザが、待機時間の長さに 17 秒の上限を設けたことを示しています。
SET LOCK MODE TO WAIT 17
WAIT 節
WAIT 節は、ロックが解除されるまで、またはロックが解除されないまま指定した
秒数が経過した場合、データベース サーバにプロセスを一時停止させるものです。
オプション WAIT を要求すると、データベースサーバはデッドロックの可能性に備
えます。データベースサーバはプロセスをサスペンドする前に、プロセスをサスペ
ンドすることによってデッドロックが発生するかどうかを検査します。デッドロッ
クが発生することをデータベースサーバが認識すると、待機指示を無視して操作を
終了し、エラーコードを返します。サスペンドが発生したとき、または実際にデッ
ドロックが発生したとき、データベースサーバはエラーを返します。
SQL 文
2-561
SET LOCK MODE 文
< 秒 > なしのオプション WAIT を指定した場合、無制限待機時間が作成されます。
期限以上に指定した場合またはロックの解放に失敗した場合は、プロセスを無期限
の待機状態にサスペンドします。真のデッドロック状態は存在しないのでデータ
ベース サーバは正しく動作しません。
ネットワーク環境では、DBA( データベース管理者 ) は ONCONFIG パラメータの
DEADLOCK_TIMEOUT を使用して待機時間のデフォルト値を設定することができ
ます。SET LOCK MODE 文で最大待機時間を設定する場合、その値がシステムのデ
フォルト値より小さい場合のみ有効です。プロセスが待機する秒数は、同じトラン
ザクション内で現行データベースと遠隔データベースの間でのみ適用されます。
参照
関連する文は「LOCK TABLE 文」、
「UNLOCK TABLE 文」、
「SET ISOLATION 文」、
「SET TRANSACTION 文」です。
また SET LOCK MODE 文の説明については、『Informix Guide to SQL: Tutorial』を
参照してください。
2-562 Informix Guide to SQL:Syntax
SET LOG 文
SET LOG 文
+
SET LOG 文は、データベースのログ機能モードを、バッファありトランザクション
からバッファなしトランザクションへ、またはその逆へ変更するために使用します。
構文
SET
LOG
BUFFERED
説明
データベースを作成した場合や、既存のデータベースのログ機能を追加した場合
に、トランザクションのログ機能を有効にすることができます。これらのトランザ
クションはバッファあり、またはバッファなしにすることができます。
バッファ付きログ機能とは、トランザクションの確定のタイミング、またはロール
バックのタイミングに関わらず、そのトランザクションを満杯になるまでメモリ
バッファに保持しておくログ型です。データベース サーバは、このオプションを提
供することにより、ディスクへの書込み回数を減少させ、動作をスピードアップさ
せます。バッファ付きログ機能を使用すると、わずかながらも効率の改善が見込め
る反面、ある程度のリスクも伴います。システム障害が万一発生した場合、データ
ベース サーバは、メモリにバッファされたトランザクションを完全には復旧できま
せん。
次の例に示した SET LOG 文は、トランザクションのログ機能モードを、バッファ
付きログ機能に変更するものです。
SET BUFFERED LOG
バッファなしログ機能とは、メモリ バッファにトランザクションを保持しないログ
型です。トランザクションが終了すると、データベース サーバは直ちにトランザク
ションをディスクに書込みます。バッファなしログ機能を使用しているときは、シ
ステム障害が発生しても、すべてのトランザクションが完全に復旧されます。トラ
ンザクションのログのデフォルト状態は、バッファなしログ機能になっています。
SQL 文
2-563
SET LOG 文
次の例に示した SET LOG 文は、トランザクションのログ機能モードを、バッファ
なしログ機能に変更するものです。
SET LOG
SET LOG 文では現行セッションのモードのみを再定義することができます。
Universal Server 責任者が、ondblog ユーティリティを使用して設定したデフォルト
のモードは、変更されずにそのまま残ります。
バッファオプションは外部表からの抽出には何の影響も与えません。分散問合せで
は、ログ機能付きデータベースは、ログ機能付きデータベースからしか抽出作業が
行えません。しかし、データベースがバッファ付きログ機能、またはバッファなし
ログ機能を使用しているかは関係ありません。
ANSI
ANSI 標準準拠のデータベースでは、バッファ付きログ機能を使用することはできま
せん。
ANSI 標準準拠のデータベースの場合は、ログ機能モードを変更することができま
せん。キーワード WITH LOG MODE ANSI を使ってデータベースを作成していた場
合、SET LOG 文を使用してログ機能モードをバッファ付きトランザクション ログ
機能に変更したり、バッファなしトランザクション ログ機能に変更したりすること
はできません。♦
参照
関連する文は「CREATE DATABASE 文」です。
2-564 Informix Guide to SQL:Syntax
SET OPTIMIZATION 文
+
SET OPTIMIZATION 文
オプティマイザが問合せ予定を決定するまでの時間を指定したり、問合せの最適化
目標を指定したりするには SET OPTIMIZATION 文を使用します。
構文
HIGH
SET OPTIMIZATION
LOW
IDS
FIRST_ROWS
ALL_ROWS
説明
SET OPTIMIZATION 文はいつでも実行することができます。最適化レベルは各デー
タベース共通ですが、適用範囲は現行のデータベース サーバとなります。
SET OPTIMIZATION 文を実行すると、指定したオプションが持続します。言い換
えると、新しい最適化レベルは、再度 SET OPTIMIZATION 文を実行したり、プロ
グラムが終了するまでは有効になります。
オプティマイザが問合せ予定を決定しているときの、データベース サーバのデフォ
ルトの最適化レベルは HIGH となっています。
IDS
Dynamic Server の場合、問合せの最適化目標を指定するときの、データベース サー
バのデフォルトの最適化レベルは ALL_ROWS となっています。
1 回につきオプションを一つだけ設定することも可能ですが、二つの SET
OPTIMIZATION 文を実行することもできます。つまり、一つはオプティマイザが
問合せ予定を決定するまでの時間を指定するために、もう一方は問合せの最適化目
標を指定するために使用することができます。♦
SQL 文
2-565
SET OPTIMIZATION 文
オプション HIGH とオプション LOW
オプション HIGH およびオプション LOW は、オプティマイザが問合せ予定を決定
するまでの時間を左右するものです。
■
HIGH
適切な問合せ予定の選択肢をすべて検索するような、高度なコストベース
のアルゴリズムを使用するようオプティマイザに指示し、総体的に最良の
選択肢を選ぶオプションです。
大規模な結合の場合、このオプションを使用すると必要以上のオーバー
ヘッドを伴うことがあります。極端なケースでは、メモリ不足になること
もあります。
■
LOW
あまり高度でなくても、速度の速い最適化アルゴリズムを使用するようオ
プティマイザに指示するオプションです。このオプションを使用すると、
使用される可能性の少ない結合ストラテジを、最適化の早い段階で削除し
てしまうため、最適化に要する時間とリソースが削減されます。
低レベルの最適化を指定すると、データベース サーバは最適なストラテジ
を選択しなくなる場合があります。このアルゴリズムの早い段階で、最適
なストラテジが選択肢から削除されることがあるためです。
IDS
オプション FIRST_ROWS とオプション ALL_ROWS
Dynamic Server において、オプション FIRST_ROWS およびオプション ALL_ROWS
は、問合せの最適化目標を左右します。
■
FIRST_ROWS
最初の結果レコードを、極力早く返す問合せ予定を選択するようオプティ
マイザに指示するオプションです。
✮
ALL_ROWS
全レコードを、極力速く返す問合せ予定を選択するようオプティマイザに
指示するオプションです。
最適化目標ディレクティブを使用して、特定の問合せの最適化目標を指定すること
もできます。問合せの最適化目標を指定するディレクティブの使用方法についての
詳細いは、4-140 ページの「オプティマイザ ディレクティブ」を参照してください。
2-566 Informix Guide to SQL:Syntax
SET OPTIMIZATION 文
ストアド プロシジャの最適化
変更しないストアド プロシジャや、変更してもその程度がわずかなストアド プロ
シジャを作成する場合は、SET OPTIMIZATION 文を HIGH に設定してください。
これを行うことにより、そのプロシジャに対する最適な問合せ予定が格納されま
す。そして、そのプロシジャを実行する前には、SET OPTIMIZATION LOW 文を実
行します。この結果、そのプロシジャは格納された最適な問合せ予定を使用し、
もっとも高率の良い方法で実行されます。
例
次にネットワークの最適化の例を示します。この場合、データベース central( デー
タベース サーバ midstate にあります ) の最適化レベルは LOW となります。一方、
データベース western( データベース サーバ rockies にあります ) の最適化レベルは
HIGH となります。
CONNECT TO 'central@midstate';
SET OPTIMIZATION LOW;
SELECT * FROM customer;
CLOSE DATABASE;
CONNECT TO 'western@rockies';
SET OPTIMIZATION HIGH;
SELECT * FROM customer;
CLOSE DATABASE;
CONNECT TO 'wyoming@rockies';
SELECT * FROM customer;
データベース wyoming は、データベース western と同じデータベース サーバにある
ため、その最適化レベルは HIGH となります。コードは、データベース wyoming の
最適化レベルに対し、最適化レベルを再指定する必要はありません。データベース
wyoming は、データベース western と同じく、データベース サーバ rockies にあるた
めです。
IDS
Dynamic Server では、次に示した例により、問合せ予定の決定に時間のほとんどを使
用すること、そして得られた結果から極力早く最初の行を返すことが指示されます。
SET OPTIMIZATION LOW;
SET OPTIMIZATION FIRST_ROWS;
SELECT lname, fname, bonus
FROM sales_emp, sales
WHERE sales.empid = sales_emp.empid AND bonus > 5,000
ORDER BY bonus DESC
♦
SQL 文
2-567
SET OPTIMIZATION 文
参照
関連する文は、
「SET EXPLAIN 文」、
「UPDATE STATISTICS 文」です。
IDS
Dynamic Server を使用している場合は、4-140 ページの「オプティマイザ ディレク
ティブ」を参照してください。オプティマイザの問合せ予定を変更するその他のメ
ソッドの説明があります。♦
問合せの最適化についての詳細は、
『Performance Guide』を参照してください。
2-568 Informix Guide to SQL:Syntax
SET PDQPRIORITY 文
SET PDQPRIORITY 文
+
W/D
SET PDQPRIORITY 文によって、問合せの優先順位をアプリケーション内で動的に
設定することができます。
この文は、Dynamic Server Workgroup Edition および Developer Editions では使用する
ことができません。♦
構文
SET PDQPRIORITY
DEFAULT
LOW
IDS
OFF
HIGH
< リソース >
AD/XP
LOW
要素
< 高い >
目的
希望のリソース配分を指定する
整数値です。
< 低い >
受け入れ可能なリソース配分の
うち、最小のものを指定する整
数値です。
問合せ優先順位のレベル、およ
びデータベース サーバがその問
合せを処理するために使用する
リソースのパーセンテージを指
定する整数値です。
< リソース >
< 低い >
HIGH
< 高い >
制限
1 ∼ 100 の範囲で値を指定する
必要があります。< 高い > 値は
< 低い > 値と同じかそれ以上で
なければなりません。
1 ∼ 100 の範囲で値を指定する
必要があります。
構文
リテラル番号、
4-138 ページ
値は -1 ∼ 100 の範囲になけれ
ばなりません。
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
ある値の特定の意味について
は、2-571 ページの「データ
ベース サーバ リソースの配分」
を参照してください。
SQL 文
2-569
SET PDQPRIORITY 文
説明
SET PDQPRIORITY 文で設定した優先順位は、環境変数 PDQPRIORITY の値を無効
にします。しかし、SET PDQPRIORITY 文でどのような値を設定したかにかかわら
ず、データベースサーバが問合せに使用する実際の優先順位の値は、ONCONFIG
構成パラメータ MAX_PDQPRIORITY によって決定されます。
たとえば、DBA( データベース管理者 ) が、パラメータ MAX_PDQPRIORITY の値
を 50 に設定したとします。そしてユーザが、次の SET PDQPRIORITY 文入力して、
問合せの優先順位をリソースの割合の 80 パーセントにしたとします。
SET PDQPRIORITY 80
ユーザの問合せが処理される場合、データベースサーバはパラメータ
MAX_PDQPRIORITY の値を、ユーザが設定した問合せ優先順位の値の係数として
使用します。つまり、データベースサーバは優先順位 40 で問合せを処理します。
この優先順位は、ユーザによって指定されたリソースの 80% という値の 50% を表
しています。
IDS
Dynamic Server の場合は、PDQ 優先順位の値を設定するとき、100 を PREPARE 文で
処理された文の最大数で割った数をその値が超えないようにします。たとえば、
PREPARE 文で処理された文が二つアクティブである場合は、PDQ 優先順位を 50
未満に設定します。♦
AD/XP
Dynamic Server with AD and XP Options の場合、ソート、グループ、インデックス作
成などのデータベース操作を行うにあたってメモリを多く必要とするときは、PDQ
優先順位の値を 0 より大きくします。どの値を使用するかについてのガイドライン
は、
『Performance Guide』を参照してください。♦
2-570 Informix Guide to SQL:Syntax
SET PDQPRIORITY 文
キーワード SET PDQPRIORITY
SET PDQPRIORITY 文の場合に入力できるキーワードを次の表に示します。
キーワード
意味
DEFAULT
環境変数 PDQPRIORITY で指定された値を使用します。
LOW
並列処理で断片化された表からデータが取り出されたことを表し
ています。
Dynamic Server の場合、LOW を指定すると、データベース サー
バは他の並列フォームを使用しなくなります。
OFF
PDQ がオフにされたことを示します (Dynamic Server のみ )。
データベース サーバは並列処理を行いません。OFF は環境変数
PDQPRIORITY、SET PDQPRIORITY 文のいずれも使用しない場
合のデフォルトです。
HIGH
PDQPRIORITY で使用するための適切な値をデータベース サーバ
が決定することを示します。
この決定は複数の要素、すなわち使用可能なプロセッサ数、問合
せが行われている表の断片化、問合せの複雑さなどに基づいてな
されます。Informix は、HIGH が指定された場合の問合せのパ
フォーマンスについて、今後のリリースで変更する権利を留保し
ます。
データベース サーバ リソースの配分
-1 から 100 の範囲にある整数を指定して、問合せの優先順位レベルを、データベー
ス サーバが問合せを処理する際に使用するリソースのパーセンテージで表示するこ
とができます。
リソースにはメモリの大きさ、プロセッサの数が含まれます。このパラメータに指
定した数が大きいほど、データベース サーバが使用するリソースが多くなります。
データベース サーバがリソースを多く使用すると、与えられた問合せのパフォーマ
ンスが通常は改善されますが、あまり多くのリソースを使用すると、リソース間で
競合が発生して他の問合せからリソースを奪うことになり、パフォーマンスの低下
を招きます。
SQL 文
2-571
SET PDQPRIORITY 文
< リソース > オプションでは、次に示した数値による値が、問合せの優先順位を示
すキーワードに相当します。
IDS
値
相当するキーワードの優先順位レベル
-1
DEFAULT
0
OFF (Dynamic Server のみ )
1
LOW (Dynamic Server のみ )
Dynamic Server では、次に示した文が相当します。最初の文では、問合せ優先順位を
低く設定するために、キーワード LOW を使用しています。次の文では、問合せ優
先順位を低く設定するために、< リソース > パラメータの値 1 を使用しています。
SET PDQPRIORITY LOW;
SET PDQPRIORITY 1;
AD/XP
一定の範囲の値の使用
Dynamic Server with AD and XP Options で、SET PDQPRIORITY の値の範囲を指定す
る場合、資源付与マネージャ (RGM) にリソース配分をある程度任せることができ
ます。範囲の中で、最も大きい値は、希望するリソース配分であり、最も小さい値
は、その問合せに対して許容できる最小限のリソース配分となります。最小限の
PDQ 優先順位が利用可能なシステム リソースを超過した場合、RGM はその問合せ
をブロックします。そうでない場合、RGM は、SET PDQPRIORITY で指定した範
囲の中から、最も大きく、かつ利用可能なリソースの超過しない PDQ 優先順位を
選択します。
参照
構成パラメータ、および資源付与マネージャについては、
『Administrator’s Guide』、
『Performance Guide』を参照してください。
環境変数 PDQPRIORITY については、
『Informix Guide to SQL: Reference』を参照して
ください。
2-572 Informix Guide to SQL:Syntax
SET PLOAD FILE 文
SET PLOAD FILE 文
+
AD/XP
外部表からデータをロードしたり、ここからデータをアンロードしたりするセッ
ションのログ ファイルを作成するには、SET PLOAD FILE を使用します。このログ
ファイルには、各ロード ジョブ、アンロード ジョブ統計の概要が記録されます。
ここにはさらに、ロード ジョブの際に作成された、あらゆるリジェクト ファイル
も列挙されます。
この文は、Dynamic Server with AD and XP Options でのみ使用することができます。
SET PLOAD FILE TO
< ファイル名 >
WITH APPEND
要素
< ファイル
名>
目的
ログ ファイルの名前です。
ログ ファイル名を指定しな
い場合、ログ情報は
/dev/null に書込まれます。
制限
書込み時ファイルがオープンできない
とエラーとなります。
構文
識別子、
4-112 ページ
説明
オプション WITH APPEND を使用すると、新しいログ情報を、既存のログ ファイ
ルに追加することができます。
セッションがクローズするたびに、そのセッションのログ ファイルも同様にクロー
ズします。1 回のセッションで、SET PLOAD FILE 文を二つ以上出した場合、新し
い文はそれぞれ、前にオープンされていたログ ファイルをクローズし、新しいログ
ファイルをオープンします。
SQL 文
2-573
SET PLOAD FILE 文
ローカル データベースの SET PLOAD FILE 文を、単純なファイル名を使用して起動
した場合、その出力ファイルは現行ディレクトリに配置されます。現行データベー
スが、リモート データベース サーバにある場合、その出力ファイルはリモート
データベース サーバのホーム ディレクトリに配置されます。ここでリモート デー
タベース サーバとは、接続が最初に確立したコサーバのことを指します。フルパス
名を付与したファイルは、リモート サーバ上の指定したディレクトリ、およびファ
イルに配置されます。
参照
関連する文は「CREATE EXTERNAL TABLE 文」です。
2-574 Informix Guide to SQL:Syntax
SET Residency 文
+
IDS
SET Residency 文
表やインデックスの一つ以上のフラグメントを、極力長く共有メモリに配置してお
くよう指定するには、SET Residency 文を使用します。
この文は、Dynamic Server でのみ使用することができます。
構文
SET
TABLE
INDEX
< 名前 >
MEMORY_RESIDENT
,
(
<DB 領域 >
)
NON_RESIDENT
要素
< 名前 >
目的
常駐状態を変更したい表やイン
デックスの名前です。
制限
該当する表やインデックスが存
在していなければなりません。
<DB 領域 >
フラグメントが常駐する DB 領
域の名前です。
該当する DB 領域が存在してい
なければなりません。
構文
データベース オブ
ジェクト、
4-25 ページ
識別子、
4-112 ページ
説明
SET Residency 文を使用すると、できるだけ長くバッファに配置しておきたい表や
インデックス、データのフラグメントを指定することができます。未使用バッファ
が要求された場合、MEMORY_RESIDENT が宣言されたページは、ページ置換えが
行われるのは最後になります。
データベース オブジェクトのデフォルトの常駐状態は、
「非常駐」です。指定した
常駐状態は、データベース サーバが作動している間保たれます。逆に言うと、デー
タベース サーバが起動するたびに、共有メモリに留めておくデータベース オブ
ジェクトを指定しなければならないことになります。
SQL 文
2-575
SET Residency 文
表やインデックス、データのフラグメントが MEMORY_RESIDENT に設定される
と、次に示したイベントが発生しない限り、この常駐状態が保たれます。
■
SET Residency 文を使用してデータベース オブジェクトを NON_RESIDENT
に設定した。
■
データベース オブジェクトを削除した。
■
データベース サーバが停止した。
ユーザ informix でなければデータベース オブジェクトの常駐状態を設定したり変更
したりすることができません。
常駐状態とフラグメントのステータス変更
常駐表に追加される新しいフラグメントには、自動では常駐のマークが付されませ
ん。したがって、新しいフラグメントそれぞれに対し、SET Residency 文を出した
り、表全体に対して SET Residency 文を再度実行する必要があります。
同様に、表から切り離された常駐フラグメントも状態が変更されません。常駐状態
を非常駐に変更したい場合は、SET Residency 文を出して指定したフラグメント ( ま
たは表全体 ) が非常駐は非常駐であると宣言しなければなりません。
例
表全体の常駐状態の設定方法を次の例に示します。
SET TABLE tab1 MEMORY_RESIDENT
断片化された表やインデックスの場合は、フラグメントごとに常駐状態の指定を行
うことができます。次にその例を示します。
SET INDEX index1 (dbspace1, dbspace2) MEMORY_RESIDENT;
SET TABLE tab1 (dbspace1) NON_RESIDENT
2-576 Informix Guide to SQL:Syntax
SET Residency 文
この例では、dbspace1 のフラグメント tab1 が共有メモリに残らなくなるように指定
し、dbspace1 および 2 のフラグメント index1 が共有メモリにできるだけ長く残るよ
うに指定しています。
参照
関連する文は、
「ALTER FRAGMENT 文」です。
表やインデックス、フラグメントの常駐状態を監視する方法については、
『Administrator’s Guide』を参照してください。
SQL 文
2-577
SET ROLE 文
SET ROLE 文
+
IDS
SET ROLE 文は、ロールのアクセス権を有効化するために使用します。
SET ROLE 文は、Dynamic Server でのみ使用します。
構文
< ロール名 >
SET ROLE
NULL
NONE
要素
< ロール名 >
目的
制限
構文
有効化したいロールの名前です。 ロールは、CREATE ROLE 文で作 識別子、
成されていなければなりません。 4-112 ページ
説明
ロールが付与されたユーザであれば、SET ROLE 文を使用してロールを有効化する
ことができます。1 回に一つのロールしか有効化できません。ロールがすでに設定
された後に SET ROLE 文を実行すると、古いロールは新しいロールに置き換えられ
ます。
デフォルトで、すべてのユーザに NULL または NONE のロールが割り当てられて
います (NULL と NONE はシノニムです )。ロール NULL と NONE にはアクセス権
がありません。ロールを NULL または NONE に設定すると、現行ロールは無効に
なります。
ユーザがロールを設定すると、ユーザは、アクセス権 PUBLIC と個人のアクセス権
のほかにロールのアクセス権を得ることになります。ロールが他のロールに付与さ
れた場合には、ユーザは、アクセス権 PUBLIC と個人のアクセス権のほかに両方の
ロールのアクセス権を得ることになります。SET ROLE 文が実行された後、現行
データベースがクローズされるか、ユーザが他の SET ROLE 文を実行するまでロー
ルは有効なままです。さらに、セッション中に作成された表などのすべてのオブ
ジェクトに対する所有権は、ロールではなくユーザが持ち続けます。
2-578 Informix Guide to SQL:Syntax
SET ROLE 文
ロールの範囲は現行データベース内に止まります。ユーザは、ロールから取得した
アクセス権を使用して、その他のデータベースのデータにアクセスすることはでき
ません。たとえば、データベース acctg のロールのアクセス権を持っているユーザ
が、データベース acctg と inventory で分散問合せを実行しても、データベース
inventory でアクセス権を付与されていなければ、同データベースのデータにはアク
セスすることはできません。
ユーザは、トランザクション中に SET ROLE 文を実行することはできません。トラ
ンザクションが実効状態にある時に SET ROLE 文が実行された場合には、エラーが
発生します。
SET ROLE 文がトリガまたはストアドプロシジャの一部として実行され、トリガま
たはストアドプロシジャの所有者が WITH GRANT OPTION によってロールを付与
されると、ユーザにロールが付与されなくてもロールは有効化されます。
次の例はロール engineer を設定しています。
SET ROLE engineer
次の例は、ロールを設定して、SELECT 操作を実行した後ロールを放棄しています。
EXEC SQL set role engineer;
EXEC SQL select fname, lname, project
into :efname, :elname, :eproject
from projects
where project_num > 100 and lname = 'Larkin';
printf ("%s is working on %s¥n", efname, eproject);
EXEC SQL set role null;
参照
関連する文は「CREATE ROLE 文」、
「DROP ROLE 文」
、「GRANT 文」
、「REVOKE
文」です。
ロールの使い方の説明について、
『Informix Guide to SQL: Tutorial』を参照してくだ
さい。
SQL 文
2-579
SET SCHEDULE LEVEL 文
+
AD/XP
SET SCHEDULE LEVEL 文
SET SCHEDULE LEVEL 文は、処理待機中の問合せのスケジューリング レベルを指
定します。
この文は、Dynamic Server with AD and XP Options でのみ使用することができます。
構文
SET SCHEDULE LEVEL
要素
< レベル >
< レベル >
目的
制限
構文
問合せのスケジューリング レベ 値は 1 ∼ 100 の範囲で設定しな リテラル番号、
ルを決定する整数値です。
ければなりません。設定した値 4-138 ページ
が 1 ∼ 100 の範囲外にあるとき
は、データベース サーバはデ
フォルトの値である 50 を使用
します。
説明
最も高い優先順位は 100 となります。つまり、レベル 100 の問合せはレベル 1 の
問合せより重要ということになります。資源付与マネージャ (RGM) は概して、ス
ケジューリング レベルの高い問合せを処理してから、スケジューリング レベルの
低い問合せを処理します。構成パラメータ DS_ADM_POLICY の設定が、RGM の作
動方法に直接影響を与えます。
参照
関連する文は、
「SET PDQPRIORITY 文」です。
資源付与マネージャや DS_ADM_POLICY については、『Administrator’s Guide』を
参照してください。
2-580 Informix Guide to SQL:Syntax
SET SESSION AUTHORIZATION 文
SET SESSION AUTHORIZATION 文
SET SESSION AUTHORIZATION 文によって、現行の Universal Server セッションで
実行されているデータベース操作でのユーザ名を変更することができます。この文
はデータベースアクセス権 DBA によって実行可能で、このアクセス権は現行セッ
ションの開始前に DBA( データベース管理者 ) から取得していなければなりません。
新しい名前は、他の SET SESSION AUTHORIZATION 文を実行するか、現行データ
ベースをクローズするまで現行データベースで有効です。
構文
SET SESSION AUTHORIZATION TO
要素
< ユーザ >
目的
現行セッションで実行されてい
るデータベース操作でのユーザ
名です。
' < ユーザ >'
制限
有効なユーザ名を指定します。
ユーザ名は引用符で囲みます。
構文
識別子、
4-112 ページ
説明
データベースアクセス権 DBA を持つユーザは、SET SESSION AUTHORIZATION 文
によって、データベースオブジェクトを保護するアクセス権をバイパスすることが
できます。この文を使用して表へアクセスし、表の所有者名を使用して、アクセス
権を付与します。この文を使用するセッションを開始する前に、データベースアク
セス権 DBA を取得しておく必要があります。事前にデータベースアクセス権 DBA
を取得しないでこの文を実行すると、エラーが返されます。
この文を使用する場合には、許可が設定されているユーザ名は、現行データベース
に対して接続アクセス権を持っている必要があります。さらに、DBA( データベー
ス管理者 ) は、PUBLIC または現行データベースの定義済みのロールに許可を設定
することはできません。
SQL 文
2-581
SET SESSION AUTHORIZATION 文
他のユーザにセッションを設定することで、実効状態にある現行データベースサー
バのユーザ名が変更されます。つまり、このデータベースサーバのプロセスが関係
している限り、これらのユーザは、管理ユーティリティを通してデータベースサー
バにアクセスしていたときに持っていたかも知れないすべてのアクセス権を完全に
失うことになります。さらに、新しいセッションのユーザは獲得した名前であるた
め、ユーティリティの実行など管理操作を実行することはできません。
SET SESSION AUTHORIZATION 文の実行が成功した後で、ユーザは SET ROLE 文
を使用して現行ユーザに付与されたロールを取得します。以前のユーザによって有
効化されたロールはすべて放棄されます。
SET SESSION AUTHORIZATION 文の範囲の制限
SET SESSION AUTHORIZATION 文を実行して、他のユーザを装っても、操作が可
能なのは現行データベース内のみです。リモート表など、現行データベース外では
データベース オブジェクトの操作を行うことはできません。また、そのデータベー
スが、本来のユーザや効力を持つユーザが所有するものであっても、DROP
DATABASE 文や RENAME DATABASE 文を実行することはできません。
アクセス権取得のための SET SESSION AUTHORIZATION 文の使用
SET SESSION AUTHORIZATION 文を使用して、データへ直接アクセスするか、
データベース操作を継続するために必要なデータベースレベル、または表レベルの
アクセス権を付与することができます。次の例は、表レベルアクセス権を取得する
ための SET SESSION AUTHORIZATION 文の使用方法を示しています。
SET SESSION AUTHORIZATION TO 'cathl';
GRANT ALL ON customer TO mary;
SET SESSION AUTHORIZATION TO 'mary';
UPDATE customer
SET fname = 'Carl'
WHERE lname = 'Pauli';
2-582 Informix Guide to SQL:Syntax
SET SESSION AUTHORIZATION 文
SET SESSION AUTHORIZATION 文とトランザクション
ご使用のデータベースが ANSI 標準準拠のものでない場合、トランザクション外で
SET SESSION 文を発行しなければなりません。トランザクション内で SET
SESSION 文を発行すると、エラー メッセージが表示されます。
ANSI
ANSI 標準準拠のデータベースの場合は、暗黙的なトランザクションを開始する文を
実行していない限り SET SESSION 文の実行が可能です。暗黙的なトランザクショ
ンを開始する文とは、ロックを取得したりデータのログを取ったりする文 ( たとえ
ば、CREATE TABLE 文や SELECT 文 ) のことを指します。暗黙的なトランザク
ションを開始しない文とは、ロックを取得したりデータのログを取ったりしない文
( たとえば、SET EXPLAIN 文や SET ISOLATION 文 ) のことを指します。
COMMIT WORK 文や DATABASE 文は暗黙的なトランザクションを開始しません。
したがって、ANSI 標準準拠のデータベースでは、DATABASE 文や COMMIT
WORK 文のすぐ後で、SET AUTHORIZATION 文を実行することができます。♦
参照
関連する文は、
「CONNECT 文」
、「DATABASE 文」
、「GRANT 文」
、
「SET ROLE 文」です。
SQL 文
2-583
SET TRANSACTION 文
+
SET TRANSACTION 文
SET TRANSACTION 文は、排他レベルとトランザクションのアクセスモード
( 読込み専用、または読込み / 書込み可 ) を定義するために使用します。
構文
,
1
SET TRANSACTION
READ WRITE
READ ONLY
1
ISOLATION LEVEL
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
READ UNCOMMITTED
説明
SET TRANSACTION 文は、ログ機能付きデータベースでのみ使用できます。
SET TRANSACTION 文は、データベースがオープンされた後、クライアントコン
ピュータから実行することができます。
データベース排他レベルは、データベースの同じ行を同時にアクセスするプロセス
間の並列度に影響を与えます。データベースサーバは共有ロックを使用し、プロセ
ス間でのデータアクセスに対して異った排他レベルをサポートします。
■
不確定読込み
■
確定読込み
■
(ANSI) 繰り返し読込み
■
直列化可能
2-584 Informix Guide to SQL:Syntax
SET TRANSACTION 文
更新や削除のプロセスは、変更される行に対して常に排他ロックを取得します。排
他レベルは、更新または削除対象の行に影響を与えません。しかし、アクセスモー
ドは行の更新と削除に影響を与えます。直列化可能または (ANSI) 繰返し読込みの
排他レベルを使用して行を読み込んでいる場合に、他のプロセスが行を更新または
削除しようとした場合、それらの行に対するアクセスは拒否されます。
SET TRANSACTION 文と SET ISOLATION 文の比較
この文は Informix の SET
SET TRANSACTION 文は ANSI SQL-92 に準拠しています。
ISOLATION 文に似ています。ただし、SET ISOLATION 文は ANSI 標準準拠ではな
く、アクセスモードを提供していません。実際には、次の表でも示しているよう
に、SETTRANSACTION 文で設定できる排他レベルは、SET ISOLATION 文で設定
できる排他レベルとほとんど同じです。
SET TRANSACTION 文
比較
SET ISOLATION 文
不確定読込み
単純読込み
確定読込み
確定読込み
サポートしていません。
カーソル安定性
(ANSI) 繰返し読込み
(Informix) 繰り返し読込み
直列化可能
(Informix) 繰り返し読込み
SET TRANSACTION 文と SET ISOLATION 文とのその他の違いは、トランザクショ
ン内の排他レベルの動作です。SET TRANSACTION 文は、一つのトランザクション
に対して 1 回しか実行することができません。トランザクション中にオープンされ
たカーソルは、その排他レベル ( アクセスモードを定義している場合にはアクセス
モード ) を取得することを保証されます。SET ISOLATION 文では、トランザク
ションが開始された後、そのトランザクション内で排他レベルを 1 回以上変更する
ことができます。次の例は、それぞれ SET ISOLATION 文と SET TRANSACTION 文
の動作の違いを示しています。
SQL 文
2-585
SET TRANSACTION 文
SET ISOLATION
EXEC SQL BEGIN WORK;
EXEC SQL SET ISOLATION TO DIRTY READ;
EXEC SQL SELECT ... ;
EXEC SQL SET ISOLATION TO REPEATABLE READ;
EXEC SQL INSERT ... ;
EXEC SQL COMMIT WORK;
-- Executes without error
SET TRANSACTION
EXEC SQL BEGIN WORK;
EXEC SQL SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
EXEC SQL SELECT ... ;
EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- Produces error 876: Cannot issue SET TRANSACTION
-- in an active transaction.
SET ISOLATION と SET TRANSACTION のもう一つの違いは、排他レベルの期間に
あります。SET ISOLATION で設定された排他レベルは、別の SET ISOLATION 文が
実行されるまで有効です。これに対して、SET TRANSACTION で設定された排他レ
ベルは、トランザクションが終了すると無効になります。その後は、データベース
型のデフォルトにリセットされます。
2-586 Informix Guide to SQL:Syntax
SET TRANSACTION 文
排他レベル
以下に各排他レベルの重要な特性を、排他レベルの低い方から順に説明しています。
排他レベル
特性
不確定読込み
排他性を提供しません。問合せに使用される静的な表に
対して不確定読込みは適切です。不確定読込みの排他レ
ベルでは、幻行が返されることがあります。幻行とは、
トランザクション中に挿入または変更された確定されて
いない行で、後にロールバックされるものです。不確定
読込みは、トランザクションを持っていないデータベー
スで唯一使うことのできる排他レベルです。
確定読込み
抽出されたすべての行が、抽出されるまでに表内で確定
されていることを保証します。しかしロックを取得する
ことはできません。あるプロセスが行を抽出した後、行
にロックがかけられていないため、他のプロセスが同じ
行に対して排他ロックを取得して、行のデータを変更し
たり削除したりすることができます。確定読込みは、
ANSI 標準に準拠していないログ機能付きデータベースの
デフォルトのできる排他レベルです。
(ANSI) 繰返し読込み
Informix で実装している ANSI 繰返し読込みで、直可能と同
様です。繰り返し読込みは SQL-92 要求を満たしています。
直列化可能
トランザクション中に選択されたすべての行に対して共
有ロックを取得します。他のプロセスも選択されている
行に対して共有ロックを取得することができますが、選
択された行の修正、および問合せの探索条件に合致して
いる行の挿入はいずれもトランザクション中は不可能で
す。トランザクション中に問合せを繰り返すと、同じ情
報を再読込みすることができます。共有ロックはトラン
ザクションが確定されるか、ロールバックされた場合の
み解放されます。直列化可能は、ANSI 標準準拠データ
ベースの、デフォルトの排他レベルです。
次の例では、ユーザが排他レベルを直列化可能に設定した結果、問合せがトランザ
クション中に繰り返される場合、同じ情報を読み込むことを示しています。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
SQL 文
2-587
SET TRANSACTION 文
デフォルトの排他レベル
データベースのデフォルトの排他レベルは、データベースが作成された時点でデー
タベース型によって設定されます。各データベース型のデフォルトの排他レベル
は、次の表で説明しています。
Informix
ANSI
説明
単純読込み
不確定読込み
ログ機能なしのデータベースでの
デフォルトの排他レベルです。
確定読込み
確定読込み
ANSI 標準に準拠していないログ機
能付きデータベースのデフォルトの
排他レベルです。
繰返し読込み
直列化可能
ANSI 標準準拠のデータベースでの
デフォルトの排他レベルです。
デフォルトの排他レベルは、トランザクションで次に SET TRANSACTION 文を実
行するまで有効です。COMMIT WORK 文がトランザクションを完了した後、また
は ROLLBACK WORK 文がトランザクションをキャンセルした後で、排他レベルは
デフォルトにリセットされます。
アクセスモード
Informix のデータベースサーバは、アクセスモードをサポートしています。アクセ
スモードはトランザクション内の行の読込みと書込みの並列度に影響を与えます。
アクセスモードはデータ変更を制御するために使用します。
SET TRANSACTION 文を使用して、トランザクションを読込み専用、または読込み
と書込みが可能に指定することができます。デフォルトでは、トランザクションは
読込みと書込みが可能です。トランザクションを読込み専用に設定すると、ある種
の制限が適用されます。読込み専用のトランザクションでは次のことが実行できま
せん。
■
表の行の挿入、削除、更新
■
スキーマ、表、一時表、インデックス、ストアドプロシジャなどのデータ
ベースオブジェクトの作成、変更、削除
■
アクセス権の付与と取消し
■
統計情報の更新
2-588 Informix Guide to SQL:Syntax
SET TRANSACTION 文
■
列名および表名の変更
プロシジャが制限付きの文を実行しようとしない限り、ストアドプロシジャは読込
み専用トランザクションで実行できます。
排他レベルの効果
ログ機能を持っていないデータベースで、データベースの排他レベルを設定するこ
とはできません。そのようなデータベースからの抽出は、すべて不確定読込みで行
われます。
バイト (BYTE) データおよびテキスト (TEXT) データの抽出中に取得されるデータ
は、データベースの排他レベルによって異なります。不確定読込みまたは確定読込
みの排他レベルでは、プロセスは、削除されたバイト (BYTE) 列およびテキスト
(TEXT) 列 ( 削除が確定されていない場合 ) または削除中のバイト (BYTE) 列および
テキスト (TEXT) 列を読み込むことができます。これらの排他レベルでは、アプリ
ケーションは、ある特定の状況で削除されたバイト (BYTE) 列およびテキスト
『Administrator’s
(TEXT) 列を読み込むことができます。これらの条件については、
Guide』を参照してください。
E/C
ESQL/C ではトランザクションでスクロールカーソルを使用すると、一時表とデー
タベース表の間の一貫性を強制することができます。この場合、直列化可能の排他
レベルを設定するか、トランザクション中は表全体にロックをかけます。
トランザクションでキーワード WITH HOLD を指定したスクロールカーソルを使用
すると、一時表とデータベース表の間に一貫性を強制することができません。表レ
ベルのロック、または直列化可能によって設定されたロックはトランザクションが
完了した時点で解放されます。しかしキーワード WITH HOLD を指定したスクロー
ルカーソルはトランザクション終了までオープンしたままになります。トランザク
ションが終了した時点で、解放された行を変更することができます。しかし、一時
表の抽出されたデータは、実際のデータと異なる場合があります。♦
参照
間連する文は「CREATE DATABASE 文」、
「SET ISOLATION 文」、
「SET LOCK
MODE 文」です。
排他レベルと並列度の説明については、
『Informix Guide to SQL: Tutorial』を参照し
てください。
SQL 文
2-589
SET Transaction Mode 文
SET Transaction Mode 文
制約のトランザクション モードを指定するには、SET Transaction Mode 文を使用し
ます。
構文
,
SET CONSTRAINTS
要素
< 制約 >
< 制約 >
IMMEDIATE
ALL
DEFERRED
目的
トランザクション モードが変更さ
れる制約、または制約名のリスト
です。
制限
指定した制約が、ログ機能付き
データベースに存在していなけ
ればなりません。
デフォルトの値は存在しません。
制約が現段階で有効化モードに
なっていない限り、制約のトラ
ンザクション モードを据え置き
モードに変更することはできま
せん。
構文
データベース オブ
ジェクト、
4-25 ページ
制約リストの全制約が、同じ
データベースに存在していなけ
ればなりません。
説明
制約のトランザクション モードを設定するには、制約が文レベルで検査されるように
するか、あるいはトランザクション レベルで検査されるようにするかを指定します。
制約のトランザクション モードを設定した場合、SET Transaction Mode 文の効力は、
同文が実行されるトランザクション内に限定されます。SET Transaction Mode 文に
よって行われた設定は、トランザクションの間のみ有効です。
2-590 Informix Guide to SQL:Syntax
SET Transaction Mode 文
制約のトランザクション モードを、文レベル検査に設定するには、キーワード
IMMEDIATE を使用します。トランザクション レベル検査に設定するには、キー
ワード DEFERRED を使用します。
制約のトランザクション モードの設定は、ログ機能付きデータベースでのみ可能です。
文レベルの検査
トランザクション モードを即時に設定すると、文レベルの検査が有効となります。
その結果、指定したすべての制約が、各 INSERT 文、UPDATE 文、DELETE 文の最
後で検査されるようになります。制約違反が発生すると、これらの文は実行されま
せん。即時が、制約のデフォルトのトランザクション モードです。
トランザクション レベルの検査
制約のトランザクション モードを「据置き」に設定すると、文レベルの検査が無効
となります。その結果、指定したすべての制約は、トランザクションが確定される
まで検査されなくなります。トランザクションの登録中に制約違反が発生した場
合、このトランザクションはロールバックされます。
ヒント : 主キー制約の検査を据え置くと、その列 ( またはその列セット ) の NULL
値不可制約の検査も据え置かれます。
トランザクション モードの期間
SET Transaction Mode 文で指定したトランザクションの期間とは、SET Transaction
Mode 文が実行されるトランザクションのことを指します。この文を、トランザク
ション外で実行することはできません。COMMIT WORK 文、または ROLLBACK
WORK 文の実行が成功すると、全制約のトランザクション モードが IMMEDIATE
に戻ります。
トランザクション モードの切り換え
トランザクション レベルの検査を文レベルの検査に切り換えるには、SET
Transaction Mode 文を使用してトランザクション モードを即時に設定します。トラ
ンザクション時に COMMIT WORK 文、または ROLLBACK WORK 文を使用しても
同様の結果が得られます。
SQL 文
2-591
SET Transaction Mode 文
全制約の指定および制約リストの指定
SET Transaction Mode 文内で、データベース内のすべての制約を指定することがで
きます。また、一つの制約を指定することも、制約のリストを指定することも可能
です。
全制約の指定
キーワード ALL を指定すると、SET Transaction Mode 文はそのトランザクション
モードをデータベース内のすべての制約に設定します。データベース内の制約や表
について、検査を要求する文がトランザクション内にあれば、データベース サーバ
は文レベル、またはトランザクション レベルでこの検査を行います。いずれのレベ
ルになるかは、SET Transaction Mode 文内で指定した設定によって変わります。
制約リストの指定
制約名を一つ指定したり、制約リストを指定したりする場合、SET Transaction Mode
文はそのトランザクション モードを指定した制約にのみ設定します。SET
Transaction Mode 文で指定していない制約について、検査を要求する文がトランザク
ション内にあれば、その制約は文レベルで検査されます。SET Transaction Mode 文で
その他の制約に対して指定した設定にかかわらず、文レベルでの検査となります。
制約リストを指定する場合、このリストの各制約が同じ表に定義されている必要は
ありませんが、同じデータベースに存在していなければなりません。
リモート制約の指定
ローカル制約のトランザクション モードやリモート制約のトランザクション モー
ドを設定することができます。つまり、SET Transaction Mode 文で指定された制約
を、ローカル表に定義したり、リモート表に定義したりすることが可能です。
2-592 Informix Guide to SQL:Syntax
SET Transaction Mode 文
制約に対するトランザクション モード設定の実例
トランザクション内の制約検査を、トランザクション完了まで据置く方法の例を次
に示します。例に示した SET Transaction Mode 文は、データベースにある表のどの制
約も、COMMIT WORK 文を発行されるまでは検査されないように指定しています。
BEGIN WORK
SET CONSTRAINTS ALL DEFERRED
.
.
.
COMMIT WORK
次の例は、トランザクション完了まで、制約リストが検査されないようにすること
を示しています。
BEGIN WORK
SET CONSTRAINTS update_const, insert_const DEFERRED
.
.
.
COMMIT WORK
参照
関連する文は、
「ALTER TABLE 文」、
「CREATE TABLE 文」です。
SQL 文
2-593
START VIOLATIONS TABLE 文
START VIOLATIONS TABLE 文
+
START VIOLATIONS TABLE 文は指定したターゲット表に対して違反表と診断表を
作成します。データベースサーバは、これら 3 つの表の関係をシステムカタログ表
sysviolations に記録することによって、違反表と診断表をターゲット表に関連付け
ます。
Dynamic Server with AD and XP Options においては、START VIOLATIONS TABLE 文
は違反表を作成しますが、診断表は作成しません。診断表に格納された情報は、違
反表に統合されます。♦
AD/XP
構文
START VIOLATIONS TABLE FOR
USING
< 違反 >
< 表名 >
,
< 診断 >
要素
目的
<診断>
ターゲット表に関連付けられる
診断表の名前です。
<行数>
MAX ROWS
< 行数 >
制限
診断表の名前を明示的に指定す
るか、またはデータベースサー
デフォルト名では、ターゲット バが名前を暗黙的に生成するか
表の名前の後に _dia という文字 にかかわらず、この名前はデー
タベースの中の既存の表と同じ
が付きます。
名前であってはなりません。
ターゲット表で INSERT 文また 整数 (INTEGER) 型の 1 から最
は SET Database Object Mode 文 大値までの範囲の値で、整数値
などの一つの文が実行される
を指定しなければなりません。
とき、診断表の挿入できる最
<行数>に値を指定しないと、
大行数。
ターゲット表で一つの文が実行
構文
データベース オブ
ジェクト名、
4-25 ページ
リテラル番号、
4-138 ページ
されるとき挿入できる最大行数
の上限はありません。
(1/2)
2-594 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
要素
目的
制限
構文
<表名>
違反表と診断表が作成される
ターゲット表の名前です。
文の中に USING 節を含めない
場合、ターゲット表の名前は
14 文字以下でなければなりま
せん。
データベース オブ
ジェクト名、
4-25 ページ
文を実行する前に、ターゲッ
ト表は、関連付けられた違反
表と診断表を持つことはでき
ません。
ターゲット表はシステムカタロ
グ表であってはなりません。
<違反>
ターゲット表はローカル表でな
ければなりません。
ターゲット表に関連付けられる 違反表の名前を明示的に指定す
違反表の名前です。
るか、またはデータベースサー
デフォルト名では、ターゲット バが名前を暗黙的に生成するか
表の名前の後に _vio という文字 にかかわらず、この名前はデー
タベースの中の既存の表と同じ
が付きます。
名前であってはなりません。
データベース オブ
ジェクト名、
4-25 ページ
(2/2)
説明
START VIOLATIONS TABLE 文は、ターゲット表に対して挿入、更新、削除操作を
実行中に制約に一致しない行を保持する特殊な違反表と一意性インデックスを作成
します。また、この文は違反表の各行による整合性違反について情報を保持する特
殊な診断表も作成します。
SQL 文
2-595
START VIOLATIONS TABLE 文
START VIOLATIONS TABLE 文と SET Database Object Mode 文の関係
START VIOLATIONS TABLE 文は SET Database Object Mode 文と密接に関連しま
す。SET Database Object Mode 文を使用して、表に対して定義される制約と一意性
インデックスをフィルタデータベース オブジェクトモードに設定しても、START
VIOLATIONS TABLE 文で、このターゲット表に対して違反表と診断表を開始しな
い場合は、挿入、更新、削除操作中に制約や一意性インデックス要求に違反する
行があってもそれらの行はフィルタされて違反表に送られません。その代わりに
ターゲット表に対して違反表を開始する必要性を示したエラーメッセージが表示
されます。
同様に、SET Database Object Mode 文を使用して、中止された制約や一意性インデッ
クスを有効化データベース オブジェクトモードまたはフィルタデータベース オブ
ジェクトモードに設定しても、START VIOLATIONS TABLE 文で、オブジェクトが
定義されるこの表に対して違反表と診断表を開始しない場合は、制約や一意性イン
デックス要求に違反する行があってもそれらの行はフィルタされて違反表に送られ
ません。このような場合に制約や一意性インデックス要求に一致しない既存の行を
識別できるようにするには、SET Database Object Mode 文を実行してオブジェクトを
有効化データベース オブジェクトモードまたはフィルタデータベース オブジェク
トモードに設定する前に START VIOLATIONS TABLE 文を実行して違反表と診断表
を開始しなければなりません。
違反表と診断表の開始と停止
START VIOLATIONS TABLE 文を使用してターゲット表と違反表および診断表の関
連付けを行った後、関連付けを削除する唯一の方法は、ターゲット表に対して
STOP VIOLATIONS TABLE 文を発行することです。詳細は、2-613 ページの「STOP
VIOLATIONS TABLE 文」を参照してください。
2-596 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
START VIOLATIONS TABLE 文の例
以降の例は、START VIOLATIONS TABLE 文を実行するさまざまな方法を示してい
ます。
名前を指定せずに違反表と診断表を開始する方法
次の文は、cust_subset というターゲット表に対して違反表と診断表を開始します。
違反表はデフォルトで cust_subset_vio と命名され、診断表はデフォルトで
cust_subset_dia と命名されます。
START VIOLATIONS TABLE FOR cust_subset
違反表と診断表の開始およびその名前の指定
次の文は items というターゲット表に対して違反表と診断表を開始します。USING
節は明示的な名前を違反表と診断表に割り当てます。違反表は exceptions と命名さ
れ、診断表は reasons と命名されます。
START VIOLATIONS TABLE FOR items
USING exceptions, reasons
診断表での行の最大数の指定
次の文は orders というターゲット表に対して違反表と診断表を開始します。MAX
ROWS 節は、INSERT 文や SET Database Object Mode 文などの単一文をターゲット
表に対して実行するときに診断表に挿入できる行の最大数を指定します。
START VIOLATIONS TABLE FOR orders MAX ROWS 50000
SQL 文
2-597
START VIOLATIONS TABLE 文
違反表を開始するために必要なアクセス権
ターゲット表に対して違反表と診断表を開始するには、次の条件のどれかを満たし
ていなければなりません。
■
データベースに対する DBA( データベース管理者 ) としてのアクセス権を
持っている。
■
ターゲット表の所有者でありしかもデータベースに対してリソースアクセ
ス権を持っている。
■
ターゲット表に対する変更アクセス権とデータベースに対するリソースア
クセス権を持っている。
違反表の構造
ターゲット表に対して START VIOLATIONS TABLE 文を実行するときは、その文が
作成する違反表に事前定義された構造が伴います。この構造はターゲット表の列と
3 つの追加列で構成されます。
次の表は違反表の構造を示しています。
列名
データ型
説明
ターゲット表での順序と
同じ順序によるターゲッ
ト表のすべての列
違反表のこれらの列は
ターゲット表の中の対応
する列のデータ型に一致
します。ただし、ター
ゲット表の中のシリアル
(SERIAL) 型は違反表では
整数 (INTEGER) 型に変換
されます。
ターゲット表の表定義は違反表にコピーされる
ので、挿入、更新、削除の操作中に、制約また
は一意性インデックス条件に違反する行をフィ
ルタして違反表に入れることができます。ユー
ザは、不正な行を違反表で調査し、診断情報を
含む関連する行を分析して、訂正処置をとるこ
とができます。
informix_tupleid
シリアル (SERIAL) 型
この列は、条件に従わない行に割り当てられた
一意のシリアル識別子を含んでいます。
(1/2)
2-598 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
列名
データ型
説明
informix_optype
文字 (CHAR)(1) 型
この列は、不正な行の原因となった操作のタイプ
を示します。この列には、次の値が含まれます。
I = 挿入
D = 削除
O = 更新 ( 元の値を含むこの行を持つ )
N = 更新 ( 新しい値を含むこの行を持つ )
S = SET Database Object Mode 文
informix_recowner
文字 (CHAR)(8) 型
この列は、この不正な行を作成した文を発行し
たユーザを示します。
(2/2)
違反表と診断表の関係
ターゲット表、違反表および診断表の関係を生かして、INSERT 文、DELETE 文、
および UPDATE 文の実行中のデータ整合性違反の原因となった行について完全な
診断情報を獲得することができます。
違反表のそれぞれの行は、診断表の中に少なくとも一つの対応行を持っています。
違反表内の行には、データ整合性違反が検出されたターゲット表内の行のコピーが
含まれます。診断表内の行には、違反表内の不正な行が引き起こすデータ整合性違
反の特性を示す情報が含まれます。違反表内の行は、列 informix_tupleid に一意のシ
リアル識別子を持っています。診断表内の行はその列 informix_tupleid に同じシリア
ル識別子を持っています。
違反表内の行は、診断表内に対応する複数の行を持っている場合があります。診断
表内の複数行はすべてその列 informix_tupleid に同じシリアル識別子を持っているの
で、違反表内の同じ行にリンクすることができます。違反表内の同じ行に対して診
断表に複数行が存在できます。違反表内の不正な行は二つ以上のデータ整合性違反
を引き起こす可能性があるからです。
たとえば、不正な行が一つの列での一意性インデックス要求、別の列での非 NULL
制約、さらに別の列での検査制約に違反している場合があります。この場合は、診
断表に違反表内の単一の不正行に対応する 3 つの行が含まれることになります。こ
のようなそれぞれの診断行は、違反表内の不正行が原因となって起こる個別のデー
タ整合性違反を識別します。
SQL 文
2-599
START VIOLATIONS TABLE 文
違反表と診断表を結合することにより、DBA( データベース管理者 ) またはター
ゲット表所有者は、違反表内のあらゆる不正行について完全な診断情報を獲得する
ことができます。SELECT 文を使用してこれらの結合を対話的に実行するか、トラ
ンザクション内で実行するためのプログラムを書くことができます。
違反表に対する初期アクセス権
START VIOLATIONS TABLE 文を実行して違反表を作成すると、データベースサー
バはターゲット表に付与される一連のアクセス権を、違反表にアクセス権を付与す
るための基準として使用します。ただし、データベースサーバは各タイプのアクセ
ス権を付与するときに異なるルールに従います。
次の表は、違反表に対するアクセス権の初期セットを示しています。アクセス権列
はアクセス権を一覧表示します。条件列はデータベースサーバがユーザにアクセス
権を付与する場合の条件を説明します。
アクセス権
条件
挿入
ユーザがターゲット表の任意の列に対する挿入アクセス権、削除
アクセス権、または更新アクセス権のいずれかを持っている場
合、このユーザは違反表に対する挿入アクセス権を持ちます。
削除
ユーザがターゲット表の任意の列に対する挿入アクセス権、削除
アクセス権、または更新アクセス権のいずれかを持っている場
合、このユーザは違反表に対する削除アクセス権を持ちます。
選択
ユーザがターゲット表の任意の列に対する選択アクセス権を持っ
ている場合このユーザは違反表の列 informix_tupleid、
informix_optype、informix_recowner に対する選択アクセス権を持
ちます。
ユーザがターゲット表の同じ列に対する選択アクセス権を持って
いる場合、このユーザは違反表のその他のすべての列に対する選
択アクセス権を持ちます。
更新
ユーザがターゲット表の任意の列に対する更新アクセス権を持っ
ている場合このユーザは違反表の列 informix_tupleid、
informix_optype、informix_recowner に対する更新アクセス権を持
ちます。
ユーザがターゲット表の同じ列に対する更新アクセス権を持って
いる場合、このユーザは違反表のその他すべての列に対する更新
アクセス権を持ちます。
(1/2)
2-600 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
アクセス権
条件
インデックス
ユーザがターゲット表に対するインデックスアクセス権を持って
いる場合、このユーザは違反表に対するインデックスアクセス権
を持ちます。
変更
変更アクセス権は違反表に付与されていません ( ユーザは違反表
を変更できません )。
参照
参照アクセス権は違反表に付与されていません ( ユーザは違反表
に参照制約を追加できません )。
(2/2)
次のルールは違反表の所有者と違反表に対するアクセス権に適用されます。
■
違反表を作成すると、ターゲット表の所有者が違反表の所有者になります。
■
違反表の所有者は変更アクセス権や参照アクセス権などの、違反表に対す
るあらゆる表レベルのアクセス権を自動的に受け取ります。ただし、デー
タベースサーバは違反表の所有者が違反表を変更したり、参照制約を違反
表に追加したりできないようにします。
■
GRANT 文と REVOKE 文を使用して、違反表に対するアクセス権の初期
セットを変更することができます。
SQL 文
2-601
START VIOLATIONS TABLE 文
■
フィルタモードの一意性インデックスや制約が定義されているターゲット
表に対して INSERT 文、DELETE 文または UPDATE 文を実行するときは、
違反表と診断表に対して挿入アクセス権を持っていなければなりません。
違反表と診断表に対して挿入アクセス権を持っていない場合に、データ
ベースサーバはターゲット表に対して必要なアクセス権を持っているとい
う前提で INSERT 文、DELETE 文または UPDATE 文をターゲット表に対
して実行します。データベースサーバは INSERT 文、DELETE 文、
UPDATE 文の実行中に整合性違反が検出されない限り、違反表と診断表に
対する挿入アクセス権の欠如についてエラーを返しません。
同様に、SET Database Object Mode 文を実行して中止された制約や一意性イ
ンデックスを有効化モードやフィルタモードに設定するときにターゲット
表に対応する違反表と診断表が存在している場合は、違反表と診断表に対
して挿入アクセス権が設定されていなければなりません。
違反表と診断表に対して挿入アクセス権を設定していない場合に、データ
ベースサーバはターゲット表に対して必要なアクセス権を持っているとい
う前提で SET Database Object Mode 文を実行します。データベースサーバは
SET Database Object Mode 文の実行中に整合性違反が検出されない限り、違
反表と診断表に対する挿入アクセス権の欠如についてエラーを返しません。
■
違反表に対するアクセス権の初期セットの権限授与者は、ターゲット表に
対するアクセス権の権限授与者と同じです。たとえば、ユーザ henry に
ユーザ jill と albert がターゲット表に対する挿入アクセス権を付与してい
る場合は、違反表に対する挿入アクセス権はユーザ jill と albert によって
ユーザ henry に付与されます。
■
違反表をターゲット表に対していったん開始すると、そのユーザからの
ターゲット表に対するアクセス権を取り消しても、そのユーザからの違反
表に対する同じアクセス権が自動的に取り消されるわけではありません。
その代わりにユーザからの違反表に対するアクセス権を明示的に取り消さ
なければなりません。
■
ターゲット表に対してフラグメントレベルのアクセス権を持っている場合
は、違反表に対しても対応するフラグメントレベルのアクセス権を持って
いることになります。
2-602 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
違反表に対するアクセス権の例
次の例は、違反表に対するアクセス権の初期セットがどのようにターゲット表に対
するアクセス権の現行セットから導出されるかを示しています。
たとえば、cust_subset という表を作成して、この表に列 ssn( 顧客の社会保障番号 )、
fname( 顧客の名前 )、lname( 顧客の名字 )、city( 顧客が住んでいる都市名 ) が含まれ
ているとします。
表 cust_subset に対して次のアクセス権のセットが存在しています。
■
ユーザ alvin は表の所有者です。
■
ユーザ barbara は、表に対して挿入アクセス権とインデックスアクセス権を
持っています。また、列 ssn と lname に対して選択アクセス権を持ってい
ます。
■
ユーザ carrie は列 city に対して更新アクセス権を持っています。また、列 ssn
に対して選択アクセス権を持っています。
■
ユーザ danny は表に対して変更アクセス権を持っています。
ここで、ユーザ alvin は、次のように表 cust_subset に対して cust_subset_viols という
違反表と cust_subset_diags という診断表を開始します。
START VIOLATIONS TABLE FOR cust_subset
USING cust_subset_viols, cust_subset_diags
データベースサーバは違反表 cust_subset_viols に対して次のセットの初期アクセス
権を付与します。
■
ユーザ alvin は違反表の所有者なので、表に対してあらゆる表レベルのアク
セス権を持っています。
■
ユーザ barbara は、違反表に対して挿入アクセス権、削除アクセス権および
インデックスアクセス権を持っています。また、違反表の列 ssn、列
lname、列 informix_tupleid、列 informix_optype、列 informix_recowner に対
して選択アクセス権を持っています。
SQL 文
2-603
START VIOLATIONS TABLE 文
■
ユーザ carrie は、違反表に対して挿入アクセス権と削除アクセス権を持って
います。また、違反表の列 city、列 informix_tupleid、列 informix_optype、
列 informix_recowner に対して更新アクセス権を持っています。さらに、違
反表の列 ssn、列 informix_tupleid、列 informix_optype、列
informix_recowner に対して選択アクセス権を持っています。
■
ユーザ danny は違反表に対してアクセス権を持っていません。
違反表の使用法
次のルールは違反表の構造と使用法に関するものです。
■
違反表の更新行の各対は、列 informix_tupleid 内で同じ値を持ち、両方の行
がターゲット表内の同じ行を参照することを示します。
■
ターゲット表に informix_tupleid、
informix_optype または informix_recowner と
いう列がある場合に、データベースサーバは列名の終りに一桁の数字を追
加して ( たとえば、informix_tupleid1) 違反表内でこれらの列の代替名を生
成しようとします。この試行に失敗すると、データベースサーバはエラー
を返し、違反表はターゲット表に対して開始されません。
■
表が違反表として機能する場合は、その表にトリガや制約を定義すること
はできません。
■
表が違反表として機能する場合は、インデックスの存在が性能に影響を与
える場合でも、ユーザはその表に対してインデックスを作成することがで
きます。違反表に対する一意性インデックスをフィルタデータベースオブ
ジェクトモードに設定することはできません。
■
ターゲット表に違反表と診断表が関連付けられている場合は、カスケード
モード ( デフォルトモード ) でターゲット表を削除すると、違反表と診断
表も削除されます。ターゲット表を制限モードで削除すると、違反表と診
断表が存在している場合は DROP TABLE 文が失敗します。
2-604 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
■
ターゲット表に対していったん違反表を開始した後は、ターゲット表、違
反表、または診断表で ALTER TABLE 文を使用して、列の追加、変更、削
除を行うことはできません。これらの表を変更するには、ターゲット表に
対して STOP TABLE VIOLATIONS 文を実行しなければなりません。
■
データベースサーバは、挿入操作、更新操作、削除操作または設定動作の
実行中に違反表を使用する前後に違反表の内容を消去しません。
■
ターゲット表にフィルタモード制約または一意性インデックスが定義され
ていて、違反表がそれに関連付けられている場合は、違反表から選択して
ターゲット表に挿入することはできません。違反表から選択してターゲッ
ト表に行を挿入するには、その前に次のいずれかの手順を実行しなければ
なりません。
❑
制約または一意性インデックスのデータベースオブジェクトモードを
有効化オブジェクトモードまたは中止されたデータベースオブジェク
トモードに設定することができます。
❑
ターゲット表に対して STOP VIOLATIONS TABLE 文を実行することが
できます。
上記の手順を実行しにくいという状況でレコードを違反表からターゲット
表にコピーしたい場合は、3 番目のオプションとして、違反表を一時表に
移してから、その一時表の内容をターゲット表に挿入します。
■
START VIOLATIONS TABLE 文で指定したターゲット表が断片化されてい
る場合は、違反表にもターゲット表の場合と同じ断片化戦略が適用されま
す。違反表のそれぞれのフラグメントは、ターゲット表の対応フラグメン
トと同じ DB 領域に格納されます。
■
START VIOLATIONS TABLE 文で指定したターゲット表が断片化されてい
ない場合は、データベースサーバによって違反表がターゲット表と同じ
DB 領域に配置されます。
■
ターゲット表にバイト(BYTE)列またはテキスト(TEXT)列がある場合
は、違反表内のバイト(BYTE)データまたはテキスト(TEXT)データが
ターゲット表内のバイト(BYTE)データまたはテキスト(TEXT)データ
と同じ BLOB 領域に作成されます。
SQL 文
2-605
START VIOLATIONS TABLE 文
違反表の例
デモンストレーションデータベース内の customer というターゲット表に対して違反
表と診断表を開始するには、次の文を入力します。
START VIOLATIONS TABLE FOR customer
START VIOLATIONS 文には USING 節がないので、デフォルトで違反表は
customer_vio と命名されます。表 customer_vio には次の列が含まれます。
customer_num
fname
lname
company
address1
address2
city
state
zipcode
phone
informix_tupleid
informix_optype
informix_recowner
表 customer_vio は表 customer と同じ表の定義を持っていますが、表 customer_vio に
は不正行の原因になった操作に関する情報を含んだ 3 つの追加列があります。
診断表の構造
ターゲット表に対して START VIOLATIONS TABLE 文を実行すると、この文が作成
する診断表に事前定義された構造が伴います。この構造はターゲット表の構造から
は独立しています。
2-606 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
次の表は診断表の構造を示しています。
列名
データ型
説明
informix_tupleid
整数
診断表の中のこの列は、違反表の中の列
(INTEGER) informix_tupleid 内の値を暗黙的に参照します。
型
しかし、この関係は外部キー対主キーの関係と
して宣言されません。
objtype
文字
(CHAR)
(1) 型
この列は違反のタイプを示します。この列には
次の値が入ります。
C = 制約違反
I = 一意性インデックス違反
objowner
文字
(CHAR)
(8) 型
この列は、整合性違反が検出された制約または
インデックスの所有者を示します。
objname
文字
(CHAR)
(18) 型
この列は、整合性違反が検出された制約または
インデックスの名前を示します。
診断表に対する初期アクセス権
START VIOLATIONS TABLE 文を実行して、診断表を作成すると、データベース
サーバはターゲット表に付与されるアクセス権のセットを診断表に付与するための
基準として使用します。ただし、データベースサーバは各タイプのアクセス権を付
与するときに異なるルールに従います。
SQL 文
2-607
START VIOLATIONS TABLE 文
次の表は診断表に対するアクセス権の初期セットを示しています。アクセス権列は
アクセス権を一覧表示します。条件列はデータベースサーバがアクセス権をユーザ
に付与する場合の条件を説明します。
アクセス
権
条件
挿入
ユーザがターゲット表の任意の列に対する挿入アクセス権、削除ア
クセス権、または更新アクセス権を持っている場合、このユーザは
診断表に対する挿入アクセス権を持ちます。
削除
ユーザがターゲット表の任意の列に対する挿入アクセス権、削除ア
クセス権、または更新アクセス権を持っている場合、このユーザは
診断表に対する削除アクセス権を持ちます。
選択
ユーザがターゲット表の中の任意の列に対する選択アクセス権を
持っている場合、このユーザは診断表に対する選択アクセス権を持
ちます。
更新
ユーザがターゲット表の中の任意の列に対する更新アクセス権を
持っている場合、このユーザは診断表に対する更新アクセス権を持
ちます。
インデッ
クス
ユーザがターゲット表に対するインデックスアクセス権を持ってい
る場合、このユーザは診断表に対するインデックスアクセス権を持
ちます。
変更
変更アクセス権は診断表に付与されていません ( ユーザは診断表を
変更できません )。
参照
参照アクセス権は診断表に付与されていません ( ユーザは診断表に
参照制約を追加できません )。
次のルールは診断表に対するアクセス権に関するものです。
■
診断表を作成すると、ターゲット表の所有者が診断表の所有者になります。
■
診断表の所有者は、変更アクセス権や参照アクセス権などの診断表に対す
るあらゆる表レベルのアクセス権を自動的に受け取ります。ただし、デー
タベースサーバは診断表の所有者が診断表を変更したり、診断表に参照制
約を追加したりできないようにします。
■
GRANT 文と REVOKE 文を使用して、診断表に対するアクセス権の初期
セットを変更することができます。
2-608 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
■
フィルタモードの一意性インデックスや制約が定義されているターゲット
表に対して INSERT 文、DELETE 文、UPDATE 文を実行するときは、違反
表と診断表に対する挿入アクセス権を持っていなければなりません。
違反表と診断表に対して挿入アクセス権を持っていない場合に、データ
ベースサーバはターゲット表に対して必要なアクセス権を持っているとい
う前提で、ターゲット表に対して INSERT 文、DELETE 文、UPDATE 文を
実行します。データベースサーバは INSERT 文、DELETE 文、UPDATE 文
の実行中に整合性違反が検出されない限り、違反表と診断表に対する挿入
アクセス権の欠如についてエラーを返しません。
同様に、SET Database Object Mode 文を実行して中止された制約や一意性イ
ンデックスを有効化モードやフィルタモードに設定するときにターゲット
表に対応する違反表と診断表が存在している場合は、違反表と診断表に対
して挿入アクセス権が設定されていなければなりません。
違反表と診断表に対して挿入アクセス権を設定していない場合に、データ
ベースサーバはターゲット表に対して必要なアクセス権を持っているとい
う前提で SET Database Object Mode 文を実行します。データベースサーバは
SET Database Object Mode 文の実行中に整合性違反が検出されない限り、違
反表と診断表に対する挿入アクセス権の欠如についてエラーを返しません。
■
診断表に対するアクセス権の初期セットの権限授与者は、ターゲット表に
対するアクセス権の権限授与者と同じです。たとえば、ユーザ jenny に
ユーザ wayne と laurie がターゲット表に対する挿入アクセス権を付与して
いる場合は、診断表に対する挿入アクセス権はユーザ wayne と laurie に
よってユーザ jenny に付与されます。
■
診断表をターゲット表に対していったん開始すると、ユーザからのター
ゲット表に対するアクセス権を取り消しても、そのユーザからの診断表に
対する同じアクセス権が自動的に取り消されるわけではありません。その
代わりに、そのユーザからの診断表に対するアクセス権を明示的に取り消
さなければなりません。
■
ターゲット表に対してフラグメントレベルのアクセス権を持っている場合
は、診断表に対しても対応する表レベルのアクセス権を持っていることに
なります。
SQL 文
2-609
START VIOLATIONS TABLE 文
診断表に対するアクセス権の例
次の例は、診断表に対するアクセス権の初期セットがどのようにターゲット表に対
するアクセス権の現行セットから導出されるかを示しています。
たとえば cust_subset という表があって、この表に列 ssn( 顧客の社会保障番号 )、
fname( 顧客の名前 )、lname( 顧客の名字 )、city( 顧客が住んでいる都市名 ) が含まれ
ているとします。
次のアクセス権のセットが表 cust_subset に対して存在しています。
■
ユーザ alvin は表の所有者です。
■
ユーザ barbara は表に対して挿入アクセス権とインデックスアクセス権を
持っています。また、列 ssn と列 lname に対して選択アクセス権を持って
います。
■
ユーザ carrie は列 city に対して更新アクセス権を持っています。また、列 ssn
に対して選択アクセス権を持っています。
■
ユーザ danny は表に対して変更アクセス権を持っています。
ここで、ユーザ alvin は、次のように表 cust_subset に対して cust_subset_viols という
違反表と cust_subset_diags という診断表を開始します。
START VIOLATIONS TABLE FOR cust_subset
USING cust_subset_viols, cust_subset_diags
データベースサーバは診断表 cust_subset_diags に対して次のセットの初期アクセス
権を付与します。
■
ユーザ alvin は診断表の所有者なので、表に対してあらゆる表レベルのアク
セス権を持っています。
■
ユーザ barbara は、診断表に対して挿入アクセス権、削除アクセス権、選択
アクセス権およびインデックスアクセス権を持っています。
■
ユーザ carrie は、診断表に対して挿入アクセス権、削除アクセス権、選択ア
クセス権および更新アクセス権を持っています。
■
ユーザ danny は診断表に対してアクセス権を持っていません。
2-610 Informix Guide to SQL:Syntax
START VIOLATIONS TABLE 文
診断表の使用
診断表と違反表の関係についての詳細は、2-599 ページの「違反表と診断表の関係」
を参照してください。
次の問題は診断表の構造と使用法に関連しています。
■
START VIOLATIONS TABLE 文の MAX ROWS 節は、ターゲット表に対して
INSERT 文や SET Database Object Mode 文などの単一の文を実行するときに
診断表に挿入できる行の最大数の制限を設定します。
■
MAX ROWS 節は、表が診断表として機能する操作に対してのみ行の数を
制限します。
■
表が診断表として動作するときはその表にトリガや制約を定義することは
できません。
■
表が診断表として機能する場合は、インデックスの存在が性能に影響を与
える場合でも、ユーザはその表に対してインデックスを作成することがで
きます。診断表の一意性インデックスをフィルタデータベースオブジェク
トモードに設定することはできません。
■
ターゲット表に違反表と診断表が関連付けられている場合は、カスケード
モード ( デフォルトモード ) でターゲット表を削除すると、違反表と診断
表も削除されます。ターゲット表を制限モードで削除すると、違反表と診
断表が存在している場合は DROP TABLE 文が失敗します。
■
ターゲット表に対していったん違反表を開始した後は、ターゲット表、違反
表、または診断表で ALTER TABLE 文を使用して、列の追加、変更、削除
を行うことはできません。これらの表を変更するには、その前に STOP
TABLE VIOLATIONS 文をターゲット表に対して実行しなければなりませ
ん。
■
データベースサーバは、挿入操作、更新操作、削除操作、設定動作の実行
中に診断表を使用する前後に診断表の内容を消去しません。
■
START VIOLATIONS TABLE 文で指定したターゲット表が断片化されてい
る場合は、診断表もターゲット表が断片化されている同じ DB 領域に対す
るラウンドロビン方式で断片化されます。
SQL 文
2-611
START VIOLATIONS TABLE 文
診断表の例
デモンストレーションデータベース内の stock というターゲット表に対して違反表
と診断表を開始するには、次の文を入力します。
START VIOLATIONS TABLE FOR stock
START VIOLATIONS 文には USING 節がないので、デフォルトで診断表は stock_dia
と命名されます。表 stock_dia には次の列が含まれます。
informix_tupleid
objtype
objowner
objname
この列のリストは、ターゲット表に対する診断表と違反表の重要な違いを示してい
ます。違反表にはターゲット表内の各列に一致する列がありますが、診断表の列は
ターゲット表のどの列にも一致しません。START VIOLATIONS TABLE 文で作成し
た診断表には必ず同じ列名とデータ型を持つ同じ列があります。
参照
関連する文は「SET Database Object Mode 文」と「STOP VIOLATIONS TABLE 文」
です。
START VIOLATIONS TABLE 文に関連付けられるシステムカタログ表についての詳
細は、
『Informix Guide to SQL: Reference』の表 sysobjstate および表 sysviolations を参
照してください。
2-612 Informix Guide to SQL:Syntax
STOP VIOLATIONS TABLE 文
STOP VIOLATIONS TABLE 文
+
STOP VIOLATIONS TABLE 文はターゲット表と特殊な違反表および診断表との関連
付けを削除します。
構文
<表>
STOP VIOLATIONS TABLE FOR
要素
目的
制限
構文
<表>
違反表および診断表との関連
付けを削除するターゲット表
の名前です。
ターゲット表は、この文を実行
する前に関連付けられた違反表
と診断表を持っていなければな
りません。
データベース オブ
ジェクト名、
4-25 ページ
デフォルト値はありません。
ターゲット表はローカル表でな
ければなりません。
説明
STOP VIOLATIONS TABLE 文はターゲット表と特殊な違反表および診断表との関連
付けを削除します。この文を実行すると、前の違反表と診断表は存続しますが、
ターゲット表に対する違反表および診断表として動作しなくなります。つまりター
ゲット表に対する違反表および診断表ではなく、通常のデータベース表としての状
態になります。この二つの表を明示的に削除するには DROP TABLE 文を実行しな
ければなりません。
挿入操作、削除操作、更新操作などによってターゲット表の行に対するデータ整合
性違反が生じても、不正行は前の違反表の中にフィルタされず、データ整合性違反
に関する診断情報も前の診断表に配置されません。
AD/XP
Dynamic Server with AD and XP Options においては、診断表は存在しません。ただし、
違反表には診断表の機能が統合されています。STOP VIOLATIONS TABLE 文はター
ゲット表と違反表の関連付けを削除させます。♦
SQL 文
2-613
STOP VIOLATIONS TABLE 文
違反表と診断表の停止例
cust_subset というターゲット表に cust_subset_vio という違反表と、cust_subset_dia と
いう診断表が関連付けられているとします。このターゲット表と違反表および診断
表との関連付けを削除するには、次の文を入力します。
STOP VIOLATIONS TABLE FOR cust_subset
違反表と診断表の削除例
前の例で STOP VIOLATIONS TABLE 文を実行すると、表 cust_subset_vio と表
cust_subset_dia は存続しますが、表 cust_subset との関連付けはなくなります。つま
り、通常のデータベース表としての状態になります。この二つの表を削除するには
次の文を入力します。
DROP TABLE cust_subset_vio;
DROP TABLE cust_subset_dia;
違反表を停止するために必要なアクセス権
ターゲット表に対する違反表と診断表を停止するには、次のいずれかの条件を満た
していなければなりません。
■
データベースに対して DBA( データベース管理者 ) としてのアクセス権を
持っている。
■
ターゲット表の所有者であり、しかもデータベースに対するリソースアク
セス権を持っている。
■
ターゲット表に対する変更アクセス権とデータベースに対するリソースア
クセス権を持っている。
参照
関連する文は、
「SET Database Object Mode 文」と「START VIOLATIONS TABLE 文」
です。
データベース オブジェクト モードおよび違反検出についての詳細は、『Informix
Guide to SQL: Tutorial』を参照してください。
STOP VIOLATIONS TABLE 文と関連付けられるシステムカタログ表についての詳細
は『Informix Guide to SQL: Reference』の表 sysobjstate と表 sysviolations を参照してく
ださい。
2-614 Informix Guide to SQL:Syntax
UNLOAD 文
UNLOAD 文
+
DB
UNLOAD 文を使用し、SELECT 文で抽出した行をオペレーティングシステムファ
イルに書き込みます。
SQLE
UNLOAD 文は DB-Access と SQL Editor で使用します
構文
SELECT 文
2-450
ページ
‘< ファイル名 >‘
UNLOAD TO
DELIMITER
要素
<区切り
記号>
<ファイル
名>
‘< 区切り記号 >‘
目的
制限
出力ファイルの中で区切り記号
として使用する文字を示す引用
符付き文字列です。
バックスラッシュ (\ または¥)、 引用符付き文字列、
復帰改行文字 (=CNTRL-J)、16 4-156 ページ
進数 (0-9、a-f、A-F) を区切り
文字として使用することはでき
ません。
区切り文字を指定しないと、
データベースサーバは環境変数
DBDELIMITER の中の設定を使
用します。DBDELIMITER が設
定されていない場合、デフォル
トの区切り記号は縦棒 ( | ) に
なります。
ASCII オペレーティングシステ
ムファイルのパス名とファイル
名を指定する引用符付き文字列
です。
バイト(BYTE)型、テキスト
(TEXT)型または可変長文字
(VARCHAR) 型を含む表データ
を出力ファイルにアンロードす
この出力ファイルは、アンロー ることはできますが、どのよう
ド操作中に表から選択された行 な結果になるかを知っていなけ
を受け取ります。出力ファイル ればなりません。詳細は、2-616
ページの「UNLOAD TO ファイ
のデフォルトのパス名は現行
ル」を参照してください。
ディレクトリです。
構文
引用符付き文字列、
4-156 ページ
パス名とファイル名
は、使用しているオ
ペレーティングシス
テムの規約に従わな
ければなりません。
SQL 文
2-615
UNLOAD 文
説明
UNLOAD 文を使用するには、SELECT 文で選択したすべての列に対して選択アク
セス権を持っていなければなりません。データベースレベルと表レベルのアクセス
権についての詳細は、2-342 ページの「GRANT 文」を参照してください。
SELECT 文はリテラル SELECT 文または SELECT 文を含んでいる文字変数の名前
で構成することができます ( 詳細は、2-450 ページの「SELECT 文」を参照してく
ださい )。
UNLOAD TO ファイル
UNLOAD TO ファイルには表から抽出した選択済み行が格納されます。
次の表は DB-Access での UNLOAD 文に使用されるデータ型とその出力フォーマッ
トを示しています (DB-Access がデフォルトロケールであるアメリカ英語を使用す
る場合 )。
データ型
出力フォーマット
文字
(CHARACTER) 型
文字フィールドに区切り記号文字が記述されている場
合 Informix 製品はその文字を自動的にバックスラッシュ (\ ま
たは¥) でエスケープし、特殊文字として解釈されないよう
にします。LOAD 文を使用して行を表に挿入する場合はバッ
クスラッシュまたは¥は自動的に取り除かれます。後書きの
空白も自動的に取り除かれます。
日付 (DATE) 型
日付 (DATE) 型は <mm/dd/yyyy> と表現されます。<mm> が
月 (1 月 =1 以下同様 )、<dd> が日、<yyyy> が年です。環境変
数 GL_DATE または環境変数 DBDATE を使用して異なる日
付型フォーマットを指定することができます。
金額 (MONEY) 型
金額 (MONEY) 型値は、先行の通貨記号なしでアンロードさ
れます。カンマ (,) を 3 桁区切り記号、ピリオド (.) を小数点
記号として使用します。環境変数 DBMONEY を設定すると、
UNLOAD 文は金額 (MONEY) 型値に指定された通貨フォー
マットを使用します。
(1/2)
2-616 Informix Guide to SQL:Syntax
UNLOAD 文
データ型
出力フォーマット
NULL
NULL 列は、区切り記号の間に文字がない形でアンロードさ
れます。
数値
数値型は先行の空白なしで表示されます。整数 (INTEGER)
型、または小桁整数 (SMALLINT) 型のゼロは 0 として示さ
れ、小桁実数 (SMALLFLOAT) 型、10 進数 (DECIMAL) 型ま
たは金額 (MONEY) 型のゼロは 0.00 として示されます。
時刻
日時 (DATETIME) 型値と時間隔 (INTERVAL) 型値は、文字の
形で表され、フィールドの桁と区切り記号のみが示されま
す。出力に型指定や修飾子は含まれません。<yyyy-mm-dd
hh:mm:ss:fff> の書式が使用され、データの一部でないフィー
ルドは省略されます。環境変数 GL_DATETIME または環境変
数 DBTIME を設定すると、UNLOAD 文は日時型値に指定さ
れたフォーマットを使用します。
(2/2)
環境変数 DB についての詳細は、
『Informix Guide to SQL: Reference』を参照してくだ
さい。環境変数 GL についての詳細は、『Informix Guide to GLS Functionality』を参照
してください。
GLS
デフォルト以外のロケールを使用している場合、UNLOAD TO ファイルの中の日付
(DATE) 型列、日時 (DATETIME) 型列、金額 (MONEY) 型列、数値型列の値は、こ
れらのデータ型をサポートするロケールのフォーマットにより決まります。詳細は
『Informix Guide to GLS Functionality』を参照してください。♦
バックスラッシュ (\)、または円記号 (¥) をフィールド分離記号として使用したり、
UNLOAD 区切り記号として使用したりしないでください。同記号には、次の文字
がデータの一部として解釈されることを、UNLOAD コマンドに伝達するエスケー
プ文字としての役割があります。
バイト (BYTE)、テキスト (TEXT)、可変長文字 (VARCHAR) データ型が含まれる
ファイルをアンロードする場合、次の事柄に留意してください。
■
BYTE 項目は、16 進数ダンプ フォーマットに書き込まれ、スペースや新た
な行は追加されません。この結果、BYTE 項目が含まれるアンロード ファ
イルの論理長が非常に長くなり、印刷や編集が極めて困難になる場合があ
ります。
■
後書きの空白は、フィールド VARCHAR に保持されます。
■
0 ∼ 9、a ∼ f、復帰改行文字、円記号を UNLOAD TO ファイルの区切り記号
として使用しないでください。
SQL 文
2-617
UNLOAD 文
データ型を含むファイルをアンロードする場合、10 キロバイトより小さい BYTE
列や TEXT 列は一時的にメモリに格納されます。環境変数 DBBLOBBUF を使用す
ると、この 10 キロバイトという設定をさらに大きくすることができます。デフォ
ルト、または環境変数 DBBLOBBUF の設定よりも大きな BYTE 列や TEXT 列は一
時ファイルに格納されます。環境変数 DBBLOBBUF についての詳細は、
『Informix
Guide to SQL: Reference』を参照してください。
次に示す文で、customer_num の値が 138 以上である場合に表 customer から行をアン
ロードし、cust_file というファイルに入れます。
UNLOAD TO 'cust_file' DELIMITER '!'
SELECT * FROM customer WHERE customer_num> = 138
出力ファイル cust_file は、次のようになります。
138!Jeffery!Padgett!Wheel Thrills!3450 El Camino!Suite 10!Palo
Alto!CA!94306!!
139!Linda!Lane!Palo Alto Bicycles!2344 University!!Palo
Alto!CA!94301!(415)323-5400
DELIMITER 節
DELIMITER 節を使用して、出力ファイル内の行の各列のデータを区切る区切り記
号を識別します。この節を省略すると DB-Access は環境変数 DBDELIMITER を検査
します。
区切り記号としてタブ (= CTRL-I) や < 空白 >(= ASCII 32) を指定することができま
す。次の文字は区切り記号として使用することはできません。
■
バックスラッシュ (\) または円記号 (¥)
■
復帰改行文字 (= CTRL-J)
■
16 進文字 (0 ∼ 9、a ∼ f、A ∼ F)
次の文は区切り記号としてセミコロン (;) を指定しています。
UNLOAD TO 'cust.out' DELIMITER ';'
SELECT fname, lname, company, city
FROM customer
2-618 Informix Guide to SQL:Syntax
UNLOAD 文
参照
関連する文は、
「LOAD 文」と「SELECT 文」です。
環境変数 DBDELIMITER 設定についての詳細は、
『Informix Guide to SQL: Reference』
を参照してください。
『Informix Guide to GLS
GLS の観点から見た UNLOAD 文の説明については、
Functionality』を参照してください。
UNLOAD 文のタスク関連の項とデータを移動させる他のユーティリティについて
は、
『Informix Migration Guide』を参照してください。
SQL 文
2-619
UNLOCK TABLE 文
UNLOCK TABLE 文
+
トランザクションなしのデータベースで UNLOCK TABLE 文を使用して、LOCK
TABLE 文で設定した表のロックを解除します。UNLOCK TABLE 文は、使用してい
るトランザクションのデータベースのロックは解除できません。
構文
UNLOCK TABLE
< 表¥>
< シノニム >
要素
< シノニム >
目的
制限
構文
ロックを解除したい表のシノニ
ムの名前です。
<表>
ロックを解除したい表の名前
です。
該当するシノニム、およびこの
シノニムを指している表が存在
していなければなりません。
該当する表が、トランザクショ
ンなしのデータベースに存在し
ていなければなりません。
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
該当する表は、以前に LOCK
TABLE 文でロックしたことの
あるものでなければなりませ
ん。その他の処理でロックされ
た表のロックを解除することは
できません。
説明
表の所有者であるか、表に対して直接またはパブリックに付与された選択アクセス
権を持っている場合は表をロックすることができます。ロック解除できるのは自分
でロックした表だけです。他のプロセスでロックした表のロックは解除できませ
ん。一度に表に適用できるロックは一つだけです。
ロックを解除する表の名前またはその表のシノニムを指定します。ビューまたは
ビューのシノニムを指定することはできません。
2-620 Informix Guide to SQL:Syntax
UNLOCK TABLE 文
トランザクションなしのデータベースにある、表のロックモードを変更する場合
は、UNLOCK TABLE 文を使用してまずその表のロックを解除し、その後で新しい
LOCK TABLE 文を実行ます。トランザクションなしで作成されたデータベースに
ある表の、ロックモードを変更する方法を次の例に示します。
LOCK TABLE items IN EXCLUSIVE MODE
.
.
.
UNLOCK TABLE items
.
.
.
LOCK TABLE items IN SHARE MODE
UNLOCK TABLE 文をトランザクション内で実行すると失敗します。トランザク
ション内で設定された表ロックは、そのトランザクションが完了すると自動的に解
除されます。
ANSI
ANSI 標準準拠のデータベースを使用している場合は、UNLOCK TABLE 文を実行
しないでください。UNLOCK TABLE 文はトランザクション内で実行すると失敗し
ます。ANSI 標準準拠のデータベースでは常にトランザクションが有効です。♦
参照
関連する文は、
「BEGIN WORK 文」、
「COMMIT WORK 文」
、「LOCK TABLE 文」、
「ROLLBACK WORK 文」、です。
同時実行とロックの説明については、
『Informix Guide to SQL: Tutorial』を参照して
ください。
SQL 文
2-621
UPDATE 文
UPDATE 文
UPDATE 文を使用して、表またはビューの一つ以上の列もしくは一つ以上の行の値
を変更します。
構文
UPDATE
<表>
SET 節
2-627
ページ
< ビュー >
+
IDS
AD/XP
< シノニム >
オプティマイザ
ディレクティブ
4-140 ページ
E/C
SPL
FROM 節の
サブセット
2-631
ページ
WHERE
WHERE CURRENT OF
2-622 Informix Guide to SQL:Syntax
条件セグメント
4-5 ページ
< カーソル名 >
UPDATE 文
要素
<カーソル
名>
目的
制限
構文
使用するカーソルの名前です。
行に集計値が含まれているとき 識別子、
UPDATE 文が実行されるとき、 カーソル付きの行を更新するこ 4-112 ページ
このカーソルのアクティブセッ とはできません。
トの現行行が更新されます。こ 指定されたカーソル (DECLARE
文の中の FOR UPDATE 節が設
のパラメータについての詳細
定された SELECT 文で定義 ) に
は、2-632 ページの「WHERE
は、列名だけを含めることがで
CURRENT OF 節」を参照して
きます。
ください。
< シノニム >
更新する行を含んでいるシノニ
ムの名前です。
<表>
更新する行を含んでいる表の名
前です。
カーソルが更新する特定の列を
指定せずに作成された場合、後
続の WHERE CURRENT OF 節が
設定された UPDATE 文で任意の
列を更新することができます。
しかし、カーソルを作成した
DECLARE 文が FOR UPDATE
節の中の一つまたは複数の列を
指定した場合、後続の WHERE
CURRENT OF 節が設定された
UPDATE 文でこれらの列だけを
更新することができます。
該当するシノニムと、このシノ
ニムが指している表が存在して
いなければなりません。
該当する表が存在していなけれ
ばなりません。
< ビュー >
更新する行を含んでいるビュー
の名前です。
該当するビューが存在していな
ければなりません。
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
説明
表内のデータを更新するには、表の所有者であるか、または表に対して更新アクセ
ス権を持っていなければなりません (2-342 ページの「GRANT 文」を参照してくだ
さい )。ビュー内のデータを更新するには、更新アクセス権を持っていて、しかも
ビューが 2-624 ページの「ビューによる行の更新」で説明されている条件を満たし
ていなければなりません。
SQL 文
2-623
UPDATE 文
WHERE 節を省略すると、ターゲット表のすべての行が更新されます。
実効確認を使用するときに、検査モードが IMMEDIATE に設定されていると、指定
したすべての制約がそれぞれの UPDATE 文の終りの部分で検査されます。検査
モードが DEFERRED に設定されていると、指定されたすべての制約はトランザク
ションが確定されるまで検査されません。
AD/XP
Dynamic Server with AD and XP Options の場合、一つの行が 2 回以上更新されるよう
に UPDATE 文が構築されていると、データベース サーバはエラーを返します。た
だし、新しい値が毎回の更新で同じ値となっていれば、データベース サーバはこの
更新操作を受け入れ、エラーは返しません。♦
DB
WHERE 節を省略し、しかも対話型モードになっていると、DB-Access はすべての
行を変更するかどうかを確認するまで UPDATE 文を実行しません。ただし、文が
コマンドファイル内にあって、しかもコマンド行から実行する場合は、文がすぐに
実行されます。♦
ビューによる行の更新
ビューに対する更新アクセス権を持っていれば、その単一の表ビューを使用して
データを更新することができます (2-342 ページの「GRANT 文」を参照してくださ
い )。この動作を実行する場合は、定義する SELECT 文で一つの表だけから選択で
きますが、次のいずれかの要素が含まれていてはなりません。
■
キーワード DISTINCT
■
GROUP BY 節
■
導出値 ( 仮想列とも呼ばれる )
■
集計値
データ整合性制約を使用して、ビューを定義している SELECT 文に更新値が適合し
ないときに、基礎表の値がユーザによって更新されないようにすることができま
す。詳細は、2-230 ページの「CREATE VIEW 文」の WITH CHECK OPTION の説明
を参照してください。
2-624 Informix Guide to SQL:Syntax
UPDATE 文
基礎表に一意の行がある場合でも重複行がビューに置かれる可能性があるので
ビューによって表を更新するときは注意が必要です。たとえば、あるビューが表
items に基づいて定義され、列 order_num と列 total_price だけで構成されているとし
ます。このとき同じ注文からの二つの品目が同じ合計金額になると、ビューには重
複行が含まれます。この場合は、二つの重複合計金額値の一つを更新すると、どち
らの品目の価格が更新されるのかが分からなくなります。
重要 : 検査オプション付きのビューを使用している場合、遠隔表に対して行を更新
することはできません。
トランザクションなしのデータベースでの行の更新
トランザクションなしのデータベース内で行を更新した場合は、明示的な措置をと
らない限り更新した行を復元することはできません。たとえば、いくつかの行を更
新した後で UPDATE 文が失敗した場合は、更新できた行が表に残ります。失敗し
た更新から自動的に復旧することはできません。
トランザクション付きのデータベースでの行の更新
トランザクション付きのデータベースで行を更新し、しかもトランザクションを使
用している場合は、ROLLBACK WORK 文を使用すれば更新を取り消すことができ
ます。更新の前に BEGIN WORK 文を実行せずに更新に失敗すると、データベース
サーバは自動的に更新開始後に行われたデータベースの変更をロールバックします。
オプション WITH NO LOG を使うと一時表を作成することができます。一時表は、
ログも取られず復旧もできません。
AD/XP
Dynamic Server with AD and XP Options の場合、RAW 表型を使用して作成した表のロ
グは取られません。したがって、データベースがログ機能を使用している場合で
も、RAW 表の復旧はできません。RAW 表についての詳細は、
『Informix Guide to
SQL: Reference』を参照してください。♦
SQL 文
2-625
UPDATE 文
ANSI
ANSI 標準準拠のデータベースで行を更新する場合は、トランザクションが暗黙的
に作成され、データベースに対するあらゆる変更がトランザクション内で行われま
す。この場合は UPDATE 文が失敗しても、ROLLBACK WORK 文を使用して、更新
を取り消すことができます。
INFORMIX-Universal Server を使用し、明示的なトランザクションの中で更新に失敗し
た場合は、データベースサーバによって自動的に更新の効果が取り消されます。♦
ロックに関する検討事項
行を更新の目的で選択すると、更新プロセスによって更新ロックが獲得されます。
この更新ロックは、更新する行が他のプロセスによって読み込まれたり共有された
りすることを許容しますが、更新や削除は禁止します。更新が行われる直前に、更
新プロセスによって共有ロックが排他ロックに変更されます。排他ロックでは、
ロックが解除されるまで、他のプロセスによる行の内容の読込みや変更が禁止され
ます。
更新プロセスは、他のプロセスとの共有ロックを保持している行またはページに対
して更新ロックを獲得できますが、そのロックが他のプロセスによって解除される
までは、更新ロックを共有ロックから排他ロックに変更することができません ( し
たがって更新を実行できません )。
1 回の更新に影響される行数が非常に多い場合は、同時ロックの最大数に設定され
ている制限を超えてしまうことがあります。そのような場合は、一つの UPDATE
文あたりのトランザクション数を減らすか、または文を実行する前にページか表全
体をロックしてください。
2-626 Informix Guide to SQL:Syntax
UPDATE 文
SET 節
SET 節は、更新する列を識別して、それぞれに値を割り当てるものです。この節に
より、単一の列が単一の式組み合わせるか、複数の列を並べて、対応する式と一致
するように設定されます。
UPDATE 文へ戻る
2-622 ページ
SET 節
,
<列>
SET
式の
サブセット
2-628 ページ
=
(
SELECT 文の
サブセット
2-629 ページ
)
+
NULL
,
,
(
<列>
)
=
式の
サブセット
2-628 ページ
(
)
*
(
SELECT 文の
サブセット
2-629 ページ
)
NULL
SQL 文
2-627
UPDATE 文
要素
*
目的
制限
構文
指定した表のすべての列を示す
文字、または更新することにな
るビューです。
<列>
更新したい一つの列、あるいは
複数の列の名前です。
< 列 > で説明される「複数の列
を複数の式の一致」フォーマッ
トに適用される制限は、アスタ
リスク (*) にも適用されます。
SERIAL 列を更新することはで
きません。
アスタリスク (*) は、
この文の中で特別な
意味を持つリテラル
値です。
識別子、
4-112 ページ
二つのフォーマットのいずれか
を使用して、複数の列を指定す
ることができます。ここで言う
二つのフォーマットとは、「単
一式に対する単一列」フォー
マットと「複数の列を複数の式
の一致」フォーマットです。こ
れらのフォーマットについての
詳細は、2-629 ページの「単一
の式に対する単一の列」および
2-630 ページの「複数の列と複
数の式の一致」を参照してくだ
さい。
単一の列を単一の式に組み合わ
せるフォーマットを使用する場
合は、単一の列に対する単一の
式のどの番号でも UPDATE 文
に含めることができます。
複数の列を並べてこれらを対応
する式と一致するように設定す
るフォーマットを使用する場合
は、列の並びの列の個数と式の
並びの式の個数が等しくなけれ
ばなりません。ただし、式の並
びに SQL 副問合せが含まれて
いる場合を除きます。
複数の値が含まれている単一の
行を返す SQL 副問合せを、式
の並びに含めることができま
す。ただしこの場合、列の並び
で指定された列の個数が、式の
並びの式が生成する値の個数と
等しくなければなりません。
SET 節で可能な式のサブセット
SET 節で集計関数から成る式を使用できません。構文と使用法についての詳細な説
明は、4-33 ページの「式」の説明を参照してください。
2-628 Informix Guide to SQL:Syntax
UPDATE 文
SET 節で可能な SELECT 文のサブセット
SET 節で使用される SELECT 文は、一行で二列以上の情報を戻すことができます。
ただし、SELECT 文は、一つの表の中から二行以上の情報を戻すことができませ
ん。構文と使用法についての詳細な説明は、2-450 ページの「SELECT 文」を参照
してください。
単一の式に対する単一の列
UPDATE 文では、単一の列に対する単一の式をいくつでも記述することができます。
次の例は、SET 節での単一の式に対する単一の列フォームを示しています。
UPDATE customer
SET address1 = '1111 Alder Court',
city = 'Palo Alto',
zipcode = '94301'
WHERE customer_num = 103
UPDATE orders
SET ship_charge =
(SELECT SUM(total_price) * .07
FROM items
WHERE orders.order_num = items.order_num)
WHERE orders.order_num = 1001
UPDATE stock
SET unit_price = unit_price * 1.07
列の NULL 値への更新
UPDATE 文の使用時にキーワード NULL を使用して列値を変更することができま
す。以前は住所に 2 行が必要だった顧客が 1 行だけで足りるようになった場合は
UPDATE 文を次のように指定します。
UPDATE customer
SET address1 = '123 New Street',
SET address2 = null,
city = 'Palo Alto',
zipcode = '94303'
WHERE customer_num = 134
SQL 文
2-629
UPDATE 文
複数の列と複数の式の一致
SET 節では、次のオプションを使用して、更新する一連の列を記述することができ
ます。
■
各列をカンマで区切り、全体をカッコで囲んで、明示的に記述する。
■
アスタリスク (*) 表記を使用して、< 表名 > 内のすべての列を暗黙的に記述
する。
SET 節を完成させるには、それぞれの式をカンマで区切り、全体をカッコで囲ん
で、明示的に記述しなければなりません。式の並びには、複数の値で構成された単
一の行を返す SQL 副問合せ文を記述することができます。ただし、明示的、暗黙
的の区別を問わず、指定された列の個数は、等号の後の式によって生成される値の
個数と等しくなければなりません。
SET 節の複数の列に対する複数の式フォームを次の例で説明します。
UPDATE customer
SET (fname, lname) = ('John', 'Doe')
WHERE customer_num = 101
UPDATE manufact
SET * = ('HNT', 'Hunter')
WHERE manu_code = 'ANZ'
UPDATE items
SET (stock_num, manu_code, quantity) =
( (SELECT stock_num, manu_code FROM stock
WHERE description = 'baseball'), 2)
WHERE item_num = 1 AND order_num = 1001
UPDATE table1
SET (col1, col2, col3) =
((SELECT MIN (ship_charge),
MAX (ship_charge) FROM orders),
'07/01/1997')
WHERE col4 = 1001
2-630 Informix Guide to SQL:Syntax
UPDATE 文
同じ列の 2 回の更新
SET 節では、同じ列を 2 回以上指定することができます。このようにした場合、指
定した最後の値にその列が設定されます。次の例では、ユーザが SET 節で列 fname
を 2 回指定したことを示しています。顧客番号が 101 の行の場合、ユーザはまず
fname を gary に設定し、続いて harry に設定しています。UPDATE 文の実行後は、
fname の値が harry になります。
UPDATE customer
SET fname = "gary", fname = "harry"
WHERE customer_num = 101
AD/XP
FROM 節のサブセット
Dynamic Server with AD and XP Options では、FROM 節が提供されれば、結合を使用
して、更新を行う列の値をどれにするか決定することができます。更新する列や行
に値を付与する場合、SET 節の FROM 節に列挙されている表であれば、いずれの
表の列も使用することができます。
キーワード LOCAL や、FROM 節の SAMPLES OF セグメントは UPDATE 文ととも
に使用することができません。
FROM 節の全構文については、2-466 ページを参照してください。
WHERE 節
WHERE 節を使用して、更新したい行を制限することができます。WHERE 節を省
略すると表内のすべての行が更新されます。
WHERE 節には標準的な探索条件を記述することができます ( 詳細は 2-450 ページ
の「SELECT 文」を参照してください )。次の例は UPDATE 文内の WHERE 条件を
示しています。この例の文では、new_address という新しい住所の表に対応するエ
ントリを持っている表 customer の各行の中の 3 つの列 (state、zipcode、phone) が更
新されます。
UPDATE customer
SET (state, zipcode, phone) =
((SELECT state, zipcode, phone FROM new_address N
WHERE N.cust_num =
customer.customer_num))
WHERE customer_num IN
(SELECT cust_num FROM new_address)
SQL 文
2-631
UPDATE 文
WHERE 節を指定して UPDATE 文を使用しているときに、更新された行がなかった
場合、ANSI 標準準拠のデータベースでは SQLNOTFOUND の値は 100 に設定され、
ANSI 標準準拠でないデータベースではこの値が 0 に設定されます。WHERE 節を
指定した UPDATE 文が PREPARE 文で処理する文の一部であるときに、返された行
がなかった場合、ANSI 標準準拠のデータベースと ANSI 標準準拠でないデータ
ベースとも SQLNOTFOUND の値は、100 に設定されます。
WHERE CURRENT OF 節
E/C
ESQL/C では、キーワード CURRENT OF を使用して、カーソルのアクティブ セッ
トの現行行を更新することができます。ただし、集計値を含んでいる行をカーソル
で更新することはできません。CURRENT OF 節で指定したカーソルには、列名を
指定できます。UPDATE 文を実行してもカーソルを次の行に進まないので、現行行
の位置は変わりません。
UPDATE 文を、キーワード FOR UPDATE で作成したカーソルと関連付けると、
キーワード CURRENT OF の効力を制限することができます (2-241 ページの
「DECLARE 文」を参照してください )。更新する列を指定せずにカーソルを作成し
ていた場合は、後続の WHERE CURRENT OF 節を指定した UPDATE 文でどの列で
も更新することができます。ただし、カーソルを作成した DECLARE 文が、FOR
UPDATE 節の中で一つ以上の列を指定していた場合は、指定された列だけが、後続
の WHERE CURRENT OF 節を指定した UPDATE 文での更新対象となります。
DECLARE 文の FOR UPDATE 節に列を指定すると処理速度が向上します。通常
データベース サーバは、DECLARE 文に列が指定されているときよりもより速く更
新を実行することができます。♦
WHERE 節の WHERE CURRENT OF フォームを次の ESQL/C の例で説明します。こ
の例では、10 パーセントの割引を受ける顧客に対してのみ更新が実行されるます
( 新しい列 discount が、表 customer に追加されると仮定します )。UPDATE 文は
WHILE ループの外で PREPARE 文によって処理されるので、構文解析は 1 回しか
行われません ( 詳細は、2-403 ページの「PREPARE 文」を参照してください )。
char answer [1] = 'y';
EXEC SQL BEGIN DECLARE SECTION;
char fname[32],lname[32];
int low,high;
EXEC SQL END DECLARE SECTION;
main()
{
EXEC SQL connect to 'stores7';
EXEC SQL prepare sel_stmt from
'select fname, lname from customer ¥
2-632 Informix Guide to SQL:Syntax
UPDATE 文
where cust_num between ? and ? for update';
EXEC SQL declare x cursor for sel_stmt;
printf("¥nEnter lower limit customer number: ");
scanf("%d", &low);
printf("¥nEnter upper limit customer number: ");
scanf("%d", &high);
EXEC SQL open x using :low, :high;
EXEC SQL prepare u from
'update customer set discount = 0.1 ¥
where current of x';
while (1)
{
EXEC SQL fetch x into :fname, :lname;
if ( SQLCODE == SQLNOTFOUND)
break;
}
printf("¥nUpdate %.10s %.10s (y/n)?", fname, lname);
if (answer = getch() == 'y')
EXEC SQL execute u;
EXEC SQL close x;
}
ヒント : UPDATE カーソルを使用すると、UPDATE 文では不可能な更新も実行す
ることができます。UPDATE カーソルとは SELECT 文に関連付けられる順カーソ
ルで、キーワード FOR UPDATE で宣言されます。UPDATE カーソルについての詳
細は、2-245 ページを参照してください。
参照
関連する文は、
「DECLARE 文」、
「INSERT 文」、
「OPEN 文」
、「SELECT 文」です。
『Informix Guide to SQL: Tutorial』を参照し
UPDATE 文のタスクについての説明は、
てください。
『Informix Guide to GLS Functionality』を参照して
UPDATE 文の GLS 関連の説明は、
ください。
SQL 文
2-633
UPDATE STATISTICS 文
UPDATE STATISTICS 文
+
UPDATE STATISTICS 文を使用して、最適な問合せ予定を決定するために使用する
情報に基づいて、システム カタログ表を更新します。UPDATE STATISTICS 文を使
用して、ストアド プロシジャを強制的に再最適化することもできます。データベー
ス サーバを新しいバージョンにアップグレードする場合、UPDATE STATISTICS 文
を使用して、表インデックスを、新しいデータベース サーバが使用するフォーマッ
トに変換することができます。
構文
UPDATE STATISTICS
FOR PROCEDURE
< プロシジャ >
LOW
FOR TABLE
<表>
DROP DISTRIBUTIONS
,
< シノニム >
(
)
<列>
MEDIUM
モードの
RESOLUTION 節、
2-642 ページ
MEDIUM
FOR TABLE
<表>
,
< シノニム >
(
<列>
)
HIGH
モードの
RESOLUTION 節、
2-641 ページ
HIGH
FOR TABLE
<表>
,
< シノニム >
(
2-634 Informix Guide to SQL:Syntax
<列>
)
UPDATE STATISTICS 文
要素
<列>
目的
指定した表の列の名前です。
制限
該当する表が存在していなけれ
ばなりません。
構文
識別子、
4-112 ページ
キーワード LOW を使用する場
合で、UPDATE STATISTICS 文
に最小限の作業を行わせたいと
きは、インデックスの一部でな
い列名を指定します。
< プロシジャ > 統計情報を更新するプロシジャ
の名前です。
< シノニム >
<表>
キーワード MEDIUM または
HIGH を使用する場合、
< 列名 > をバイト (BYTE) 列や
テキスト (TEXT) 列にすること
はできません。
該当するストアド プロシジャ
が、現行のデータベースになけ
ればなりません。
キーワード FOR PROCEDURE
の後のプロシジャ名を省略する
と、現行データベースにある全
ストアド プロシジャの統計情報
が更新されます。
統計情報を更新する表のシノニ 該当するシノニムと、このシノ
ムの名前です。
ニムが指している表が、現行
データベースになければなりま
キーワード FOR TABLE の後の せん。
表名、またはシノニム名を省略
すると、現行データベースにあ
るすべての表 ( 一時表も含む )
の統計情報が更新されます。
統計情報を更新する表の名前
該当する表が現行データベース
です。
になければなりません。
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
キーワード FOR TABLE の後の
表名、またはシノニム名を省略
すると、現行データベースにあ
るすべての表 ( 一時表も含む )
の統計情報が更新されます。
SQL 文
2-635
UPDATE STATISTICS 文
説明
ある表に対して UPDATE STATISTICS 文を実行すると、データベース サーバはシ
ステム カタログ表 systables、syscolumns、sysindexes、sysdistrib のデータが再計算さ
れます。オプティマイザはこのデータを使用して、問合せに対する最良の実行パス
を決定します。データベース サーバはこの統計データを自動では更新しません。統
計情報は UPDATE STATISTICS 文を実行したときだけ更新されます。
また、UPDATE STATISTICS 文を実行すると、システム カタログ表 sysproplan のプ
ロシジャの最適化された実行計画を更新することもできます。プロシジャが実行さ
れたときに、そのプロシジャで参照されるオブジェクトに変更があれば、そのたび
にデータベース サーバはその実行計画の再最適化を行います。
UPDATE STATISTICS 文には、現行データベースが不可欠です。現行データベース
の外にある表やプロシジャのオプティマイザが使用した、統計情報を更新すること
はできません。この制限は UPDATE STATISTICS 文のすべてのモード (LOW、
MEDIUM、HIGH) に適用されます。
FOR TABLE 節や FOR PROCEDURE 節を省略すると、現行データベースのすべての
表 ( システム カタログ表を含む ) の統計情報、およびすべてのプロシジャの統計情
報が更新されます。FOR TABLE 節や FOR PROCEDURE 節を使用する場合で表名や
プロシジャ名を指定しないときも同様に、データベース サーバは現行データベース
のすべての表 ( 一時表を含む ) の統計情報、およびすべてのプロシジャの統計情報
を更新します。
AD/XP
Dynamic Server with AD and XP Options では、UPDATE STATISTICS 文は統計情報お
よびインデックスの更新、管理、収集を行いません。また、表 syscolumns および
sysindexes の更新も行いません。さらに、ストアド プロシジャの再最適化も行いま
せん。以降のページに書かれているインデックスやストアド プロシジャの説明は、
Dynamic Server with AD and XP Options には適用されません。♦
2-636 Informix Guide to SQL:Syntax
UPDATE STATISTICS 文
IDS
インデックス ページの検査
Dynamic Server では、UPDATE STATISTICS 文が、データベース サーバに、イン
デックス ページを読み取り、問合せオプティマイザの統計情報を計算するよう指示
します。この場合、データベース サーバは、削除フラグが 1 とマークされている
ページの探索も行います。削除フラグが 1 とマークされているページが見つかった
ときは、対応するキーが B ツリー クリーナ リストから削除されます。
システムのクラッシュによって、B ツリー クリーナ リスト ( 共有メモリにあります )
が失われたとき、この動作は特に有効です。削除のマークが付されているものの、
B ツリーからまだ削除されていない項目を削除するには、UPDATE STATISTICS 文
を実行します。B ツリー クリーナ リストについての詳細は、
『Administrator’s Guide』
を参照してください。
表修正時の統計情報更新
次に示す状況においては、統計情報の更新を行います。
■
表に対して広範囲にわたる修正をするとき
■
一つ以上のプロシジャによって使用される表を変更するが、実行時にデー
タベース サーバにプロシジャの再最適化を行わせたくない場合
使用しているアプリケーションで、ある表のデータに多数の修正行う場合、
UPDATE STATISTICS 文を使用して、その表のシステム カタログ表データを定期的
に更新すると、問合せの効率が向上します。ここで言う、
「多数の修正」は、その
分布の分析に関係します。そのデータ変更によって列の値の分布が変わらない場合
は、UPDATE STATISTICS 文を再度実行する必要はありません。
SQL 文
2-637
UPDATE STATISTICS 文
IDS
データベース サーバのアップグレード時の統計情報更新
Dynamic Server では、新しいデータベース サーバで使用できるようにデータベース
をアップグレードする場合、UPDATE STATISTICS 文を使用して、新しいデータ
ベース サーバが使用するフォームにインデックスを変換することができます。この
場合、インデックスを表ごとに変換するか、データベース全体のインデックスを一
度に変換することができます。
『Informix Migration Guide』で説明されている変換の
ガイドラインに従ってください。UPDATE STATISTICS 文を使用して、新しいデー
タベース サーバで使用するインデックスを変換すると、そのインデックスは明示的
に削除され、再作成されます。UPDATE STATISTICS 文が表インデックスを明示的
に削除し、再作成するのは、新しいデータベース サーバで使用するデータベースを
アップグレードする場合のみです。
UPDATE STATISTICS のモード
UPDATE STATISTICS 実行のモードを 3 つ指定することができます。LOW、
MEDIUM、HIGH のモードがあります。これらのモードを指定するには、キーワー
ド LOW、MEDIUM、HIGH を使用します。UPDATE STATISTICS の各モード、そ
してそれぞれの目的について、次の表に示します。
モード
目的
LOW
データベース サーバは、システム カタログ表 systables、
syscolumns、sysindexes の統計データを更新します。この
モードでは最小限の情報しか収集されません。このモード
の実行速度は HIGH や MEDIUM より速くなっています。
HIGH
データベース サーバは、LOW モードの機能を実行するほ
か、システム カタログ表 sysdistrib のデータ分布統計情報
の更新も行います。構築された分布は完全なものとなり
ます。HIGH モードは、この情報収集に時間を要するた
め、LOW モードや MEDIUM モードよりも実行速度が遅
くなります。
MEDIUM
データベース サーバは、LOW モードの機能を実行するほ
か、システム カタログ表 sysdistrib のデータ分布統計情報
の更新も行います。データベース サーバは、すべての行
を走査するのではなく、サンプリングを行うことによっ
て分布のためのデータを収集します。このモードの実行
速度は HIGH よりは速く LOW よりは遅くなっています。
2-638 Informix Guide to SQL:Syntax
UPDATE STATISTICS 文
キーワード LOW の指定
キーワード LOW を使用する場合、またはキーワードをまったく指定しない場合、
データベース サーバは、列についての最小限の情報を収集します。また、指定した
列のインデックス統計情報、列統計情報のほか、表、行、ページ数を更新します。
LOW モードを使用する場合、表 sysdistrib に与えられる情報はありません。表
sysdistrib に分布データがすでに存在する場合、オプション DROP DISTRIBUTIONS
を使用しなければ、この分布データは変更されません。オプション DROP
DISTRIBUTIONS を指定しても、表名を指定しなければ、すべての分布情報が削除
されます。
次に示した例は、表 customer にある列 customer_num の統計情報を更新するものです。
表 customer に関連付けられた分布は変更されません。これらが列 customer_num にす
でに存在している場合も同様です。
UPDATE STATISTICS LOW FOR TABLE customer (customer_num)
UPDATE STATISTICS 文に最小限の作業を行いたい場合は、インデックスの一部で
はない列を指定します。
DROP DISTRIBUTIONS 節によるデータの削除
表 sysdistrib にすでに定義されているすべて列の分布データ、または一部の列の分布
データを削除したいが、同表のその他の列の統計情報をオプション LOW で更新し
たくないという場合には、DROP DISTRIBUITIONS 文を使用します。キーワード
DROP DISTRIBUTIONS を指定すると、UPDATE STATISTICS 文で指定した列に存
在するすべての分布情報が削除されます。列を指定しない場合は、その表のすべて
の分布が削除されます。
DBA アクセス権を持っているか、その表の所有者でなければ、分布を削除するこ
とはできません。
SQL 文
2-639
UPDATE STATISTICS 文
表 customer の列 customer_num の分布を削除する方法の例を次に示します。
UPDATE STATISTICS LOW
FOR TABLE customer (customer_num) DROP DISTRIBUTIONS
列の分布の作成
HIGH モード、または MEDIUM モードで UPDATE STATISTICS 文を実行すると、
データベース サーバは指定した列の内容を検査し、これをデータのバーセンテージ
を示すビンに分割します。たとえば、一つのビンはデータの 2% を保持します。し
たがって、50 のビンでデータ全体を保持することになります。このビンのサイズ
は、RESOLUTION パラメータ < パーセント > で設定することができます。
列の値をビンに編成することを、( その列の ) 分布と呼びます。オプティマイザは
WHERE 節で参照される列の分布を検査し、問合せに対する WHERE 節のコスト効
果を見積もります。
キーワード MEDIUM、または HIGH を使用して、特定の列のデータ分布のモード
を指定することができます。これらのキーワードによって、データベース サーバ
が、指定された列それぞれのデータ値の分布に関する統計情報を生成し、その情報
をシステムカタログ表 sysdistrib に配置することが示されます。
バイト (BYTE) 列やテキスト (TEXT) 列に分布を作成することはできません。
MEDIUM または HIGH モードの分布を指定している UPDATE STATISTICS 文にバ
イト (BYTE) 列やテキスト (TEXT) 列を含めた場合、これらの列に対して分布は作
成されません。並び中のその他の列に対しては分布が構築されます。この場合、
UPDATE STATISTICS 文はエラーを返しません。
DBA アクセス権を持っているか、その表の所有者でなければ、MEDIUM または
HIGH モードの分布を作成することはできません。
2-640 Informix Guide to SQL:Syntax
UPDATE STATISTICS 文
HIGH モードの RESOLUTION 節
HIGH モードの
RESOLUTION 節
RESOLUTION
UPDATE STATISTICS 文へ戻る、
2-634 ページ
< パーセント >
IDS
DISTRIBUTIONS ONLY
要素
目的
< パーセント > 希望する分析をパーセント単位
で示します。0.1 という数値は、
列のデータがビンに分割され、
そのビンの一つに平均 0.1 パー
セントのデータが含まれている
ことを示します。
制限
構文
表の最小の分析は 1/nrows です。 リテラル番号、
nrow とは、表に含まれる行の数 4-138 ページ
を示します。
デフォルト値は 0.5 です。
キーワード HIGH を使用すると、構築された分布は、統計的に重要なものとなるの
ではなく、正確なものとなります。この情報を収集するには時間がかかるため、
HIGH モードの分布はデータベース全体に使用するのではなく、特定の表や列に使
用します。大きな表の場合、データベース サーバは、列ごとにそのデータを1回走
査することがあります。環境変数 DBUPSPACE が指定する領域の量により、表が走
査される回数は異なります。環境変数 DBUPSPACE についての詳細は、『Informix
Guide to SQL: Reference』を参照してください。
RESOLUTION 節を指定しない場合のデフォルトの値は 0.5 パーセントになります。
SQL 文
2-641
UPDATE STATISTICS 文
Medium RESOLUTION 節
MEDIUM モードの
RESOLUTION 節
RESOLUTION
UPDATE STATISTICS へ戻る、
2-634 ページ
< パーセント >
< 確信値レベル >
IDS
DISTRIBUTIONS ONLY
要素
< 確信値
レベル >
目的
キーワード MEDIUM によるサ
ンプリングが、キーワード
HIGH による正確な方法と同じ
結果をもたらす回数の予想割合
です。
制限
確信値レベルの最低値は 0.80
です。最高値は 0.99 です。
構文
リテラル番号、
4-138 ページ
デフォルトの確信値レベルは
0.95 です。これは、95 パーセ
ント ( キーワード MEDIUM が
算出した見積り ) の確率で
HIGH モードの分布を使用した
場合と同じ結果が得られると解
釈できます。
< パーセント > 希望する分析をパーセント単位 表の最小の分析は 1/nrows です。 リテラル番号、
で示します。0.1 という数値は、 nrow とは、表に含まれる行の数 4-138 ページ
列のデータがビンに分割され、 を示します。
そのビンの一つに平均 0.1 パー
セントのデータが入っているこ
とを示します。
デフォルトの値は 2.5 です。
キーワード MEDIUM を使用する場合、分布のデータはサンプリングによって得ら
れます。サンプリングによって得られるデータは、実際の行数よりもかなり小さい
ため、MEDUM モードの分布の構築に要する時間は、HIGH モードの場合に要する
時間よりも短くなります。MEDUM モードの分布では、少なくとも 1 回は表を走査
しなければなりません。したがって、MEDUM モードの分布作成時の実行速度は、
LOW モードの分布作成の場合よりも遅くなります。
2-642 Informix Guide to SQL:Syntax
UPDATE STATISTICS 文
RESOLUTION 節を指定しない場合のデフォルト値は 2.5 パーセントです。また、
< 確信値レベル > の値を指定しない場合のデフォルトの確信値は 0.95 です。この
値は、95 パーセント ( 見積り ) の確率で、HIGH モードの分析を使用した場合と
同じ結果が得られると解釈できます。
IDS
DISTRIBUTIONS ONLY 指定によるインデックス情報の抑止
Dynamic Server では、キーワード MEDIUM、または HIGH を指定すると、UPDATE
STATISTICS 文はキーワード LOW の機能も実行します。キーワード LOW により、
指定したオブジェクトの表情報、およびインデックス情報が構築されます。キー
ワード MEDIUM、または HIGH でオプション DISTRIBUTIONS ONLY を指定する
と、既存のインデックス情報がそのまま残されます。ただし、オプション
DISTRIBUTIONS ONLY を指定した場合でも、表情報、および列情報は構築されま
す。これらの情報には、使用されるページ数、行数、フラグメント情報などが含ま
れます。
次の例では、UPDATE STATISTICS 文が、表 customer の分布情報、インデックス情
報、表情報を収集することを示しています。
UPDATE STATISTICS MEDIUM FOR TABLE customer
しかし、次の例では、表 customer に対して、分布情報と表情報しか収集されないこ
とを示しています。オプション DISTRIBUTIONS ONLY により、既存のインデック
ス情報はそのまま残されます。
UPDATE STATISTICS MEDIUM FOR TABLE customer
DISTRIBUTIONS ONLY
UPDATE STATISTICS 文と一時表
UPDATE STATISTICS 文を、一時表で使用することができます。表の名前を指定し
て、一時表の統計情報を明示的に更新するか、一時表の分布を作成します。特定の
表名がない FOR TABLE 節を使用してデータベース内のすべての表に分布を作成す
ると、セッション内のすべての一時表にも分布が作成されます。
SQL 文
2-643
UPDATE STATISTICS 文
参照
関連する文は、
「SET EXPLAIN 文」、
「SET OPTIMIZATION 文」です。
UPDATE STATISTICS 文の性能については、『Performance Guide』を参照してくだ
さい。
ユーティリティ dbschema を使用して、UPDATE STATISTICS 文で作成された分布
を表示する方法については、
『Informix Migration Guide』を参照してください。
2-644 Informix Guide to SQL:Syntax
WHENEVER 文
E/C
WHENEVER 文
WHENEVER 文を使用して、他の SQL 文の実行中に発生する例外 ( エラーや警告 )
を監視します。
WHENEVER 文は ESQL/C で使用します。
構文
WHENEVER
SQLERROR
NOT FOUND
+
CONTINUE
+
GO TO
:
GOTO
< ラベル >
< ラベル >
SQLWARNING
STOP
CALL
要素
< 関数 >
< ラベル >
目的
例外条件が発生したとき呼び出
される関数またはプロシジャの
名前です。
例外条件が発生したときにプ
ログラムの制御が移る文のラ
ベル名です。
制限
関数またはプロシジャがコンパ
イル時に存在していなければな
りません。
ラベルは、パラグラフ名または
プロシジャ名でなければなりま
せん。
< 関数 >
構文
名前は、ラベルの言
語固有の規則に従わ
なければなりません。
ラベルは、文ラベル
の言語固有の規則に
従わなければなりま
せん。
SQL 文
2-645
WHENEVER 文
説明
WHENEVER 文を使用することは、それぞれの SQL 文の後にエラーチェックルーチ
ンを置くことに相当します。次の表は、WHENEVER 文で検査できる例外のタイプ
をまとめたものです。
例外のタイプ
WHENEVER 節
参照
エラー
SQLERROR
2-648 ページ
警告
SQLWARNING
2-648 ページ
見つからない条件
データの終わり条件
NOT FOUND
2-649 ページ
WHENEVER 文をプログラムで使用しない場合は、エラーが発生してもプログラム
による自動的なアボートは行われません。エラーがないか明示的に検査して、必要
に応じて訂正措置をとらなければなりません。エラーの検査を行わないと、プログ
ラムは単に処理を続行します。ただし、エラーが発生すると、結果的にプログラム
は目的の動作を実行できなくなる場合があります。
WHENEVER 文は、検査する例外のタイプを指定するほかに、指定された例外が発
生したときとる動作についても指定します。次の表に、WHENEVER 文で指定でき
る動作をまとめます。
動作のタイプ
キーワード
WHENEVER
参照
プログラムの実行を続ける。
CONTINUE
2-649 ページ
プログラムの実行を停止する。
STOP
2-649 ページ
制御を指定されたラベルに移す。
GOTO
GO TO
2-650 ページ
制御を指定された関数またはプロシ
ジャに移す。
CALL
2-651 ページ
2-646 Informix Guide to SQL:Syntax
WHENEVER 文
WHENEVER 文の有効範囲
データベースサーバではなく ESQL/C プリプロセッサが、WHENEVER 文の解釈を
処理します。プリプロセッサは、ESQL/C ソースファイルで WHENEVER 文を検出
すると、WHENEVER 文がリストする例外とそれに対する動作に基づいて、各 SQL
文の後のプリプロセッサにかけられたコードに適切なコードを挿入します。プリプ
ロセッサは、ソースモジュールで WHENEVER 文を検出した時点から、次の条件の
いずれかを検出するまでを WHENEVER 文の有効範囲として定義します。
■
同じソースモジュール内の同じ例外条件 (SQLERROR、SQLWARNING、お
よび NOT FOUND) を持つ次の WHENEVER 文
■
ソースモジュールの終わり
プリプロセッサがソースモジュールを順次処理する間に最初に検出されたどちらか
の条件により、WHENEVER 文の有効範囲は終了します。
次の ESQL/C サンプルプログラムには、3 つの WHENEVER 文があり、そのうちの
二つは WHENEVER SQLERROR 文となっています。4 行目には SQLERROR ととも
に STOP が使用され、デフォルトのエラーの場合動作を続行するという動作を無効
にしています。8 行目には、デフォルト動作に対するエラー処理を返すため、キー
ワード CONTINUE が指定されています。4 行目∼ 8 行目のすべての SQL 文につい
て、プリプロセッサは、エラーが発生した場合、エラーを検査しプログラム実行を
停止するコードを挿入します。したがって、6 行目の INSERT 文がエラーを生成す
ると、プログラムは停止します。
9 行目からは、プリプロセッサは SQL 文の後のエラーを検査するためのコードを挿
入しません。したがって、10 行目の INSERT 文、11 行目の SELECT 文、12 行目の
DISCONNECT 文がエラーを生成しても、無視されます。ただし、何か行を見つけ
ないかぎり、SELECT 文はプログラムの実行を停止しません。7 行目の
WHENEVER 文は、このような例外が発生した場合にプログラムに処理を続行する
よう指示します。
1
2
main()
{
3
EXEC SQL connect to 'test';
4
EXEC SQL WHENEVER SQLERROR STOP;
5
6
printf("¥n¥nGoing to try first insert¥n¥n");
EXEC SQL insert into test_color values ('green');
SQL 文
2-647
WHENEVER 文
7
8
EXEC SQL WHENEVER NOT FOUND CONTINUE;
EXEC SQL WHENEVER SQLERROR CONTINUE;
9
10
11
12
13
14
printf("¥n¥nGoing to try second insert¥n¥n");
EXEC SQL insert into test_color values ('blue');
EXEC SQL select paint_type from paint where color='red';
EXEC SQL disconnect all;
printf("¥n¥nProgram over¥n¥n");
}
キーワード SQLERROR
キーワード SQLERROR を使用すると、エラーを検出した SQL 文は WHENEVER
SQLERROR 文で指示されているとおりに処理されます。変数 SQLCODE
(sqlca.sqlcode) にゼロより小さい値が設定され、変数 SQLSTATE のクラス コードの
値が 02 より大きい場合、エラーが発生します。
次の文を記述すると、SQL エラーが発生した場合、プログラムの実行が停止します。
WHENEVER SQLERROR STOP
WHENEVER SQLERROR 文をプログラム内で使用しない場合、WHENEVER
SQLERROR のデフォルトは CONTINUE になります。
キーワード SQLWARNING
キーワード SQLWARNING を使用すると、警告を生成する SQL 文は、WHENEVER
SQLWARNING 文によって指示されている処理を実行します。警告が発生すると、
SQLCA (sqlca.sqlwarn.sqlwarn0) 内の警告構造体の最初のフィールドに W が設定さ
れ、変数 SQLSTATE のクラスコードは 01 になります。
警告構造体の最初のフィールドの設定のほかに、警告により追加のフィールドも W
に設定されます。設定されたフィールドは、発生した警告の種類を示します。
次の文を記述すると、警告条件が存在する場合プログラムの実行が停止します。
WHENEVER SQLWARNING STOP
プログラムで WHENEVER SQLWARNING 文をまったく使用しない場合、
WHENEVER SQLWARNING のデフォルトは CONTINUE になります。
2-648 Informix Guide to SQL:Syntax
WHENEVER 文
キーワード NOT FOUND
キーワード NOT FOUND を使用すると、SELECT 文と FETCH 文は他の SQL 文とは
別に扱われます。この二つの文の実行時に NOT FOUND 条件が発生するのは、次の
ような場合です。
■
データの終わり条件:FETCH 文で、アクティブセットの先頭行よりも前の
行または最終行よりも後の行を取り出そうとした。
■
見つからない条件:SELECT 文で行が 1 行も返されなかった。
いずれの場合も、変数 sqlcode は 100 に設定され、変数 SQLSTATE のクラス コー
ドは 02 となります。各 Informix 製品における変数 sqlcode の名前は、2-648 ページ
の「キーワード SQLERROR」にある表を参照してください。
次の文は、NOT FOUND 条件が発生するたびに no_rows 関数を呼び出します。
WHENEVER NOT FOUND CALL no_rows
プログラムで WHENEVER NOT FOUND 文をまったく使用しない場合、WHENEVER
NOT FOUND のデフォルトは CONTINUE になります。
キーワード CONTINUE
キーワード CONTINUE を使用して、SQL 文の後の次の文で例外を無視し、実行を
続けるようプログラムに指示します。すべての例外のデフォルト動作は
CONITNUE です。このキーワードを使用すると、以前に指定したオプションを無
効にすることができます。
キーワード STOP
キーワード STOP を使用して、指定された例外が発生したとき実行を停止するよう
プログラムに指示します。次の文は、SQL 文が警告を生成するたびに ESQL/C プロ
グラムの実行を停止します。
EXEC SQL WHENEVER SQLWARNING STOP;
SQL 文
2-649
WHENEVER 文
キーワード GOTO
GOTO 節は、特定の例外が発生したとき、ラベルが識別する文に制御を移す場合に
使用します。キーワード GO TO は GOTO の ANSI に標準準拠しないシノニムです。
次の例は、ESQL/C コード内の WHENEVER 文によって NOT FOUND 条件が発生す
るたびに missing というラベルに制御が移されるプロセスを示しています。
query_data()
.
.
.
EXEC SQL WHENEVER NOT FOUND GO TO missing;
.
.
.
EXEC SQL fetch lname into :lname;
.
.
.
missing:
printf("No Customers Found¥n");
.
.
.
SQL 文を含むプログラムブロックごとに、ラベル付けされた文を定義する必要があ
ります。プログラムに複数の関数が記述されている場合、関数ごとにラベル付けさ
れた文とそのコードを記述する必要があるかもしれません。プリプロセッサは、ラ
ベル付けされた文を含まない関数に達すると、ラベル付けされた文に関連付けられ
たコードを挿入しようとします。この関数の中でラベル付けされた文を定義してい
ないと、プリプロセッサはエラーを生成します。
このエラーを訂正するには、関数ごとに同じラベル名を持つラベル付き文を記述す
るか、別の WHENEVER 文を実行してエラー状態をリセットするか、または CALL
節を使って関数を分離します。
2-650 Informix Guide to SQL:Syntax
WHENEVER 文
CALL 節
CALL 節を使用して、特定の例外が発生した場合に、指定した関数またはプロシ
ジャにプログラムの制御を移します。関数名またはプロシジャ名の後にはカッコを
付けません。次の WHENEVER 文を使用すると、プログラムによってエラー条件が
検出された場合に、error_recovery 関数が呼び出されます。
EXEC SQL WHENEVER SQLERROR CALL error_recovery;
指定した関数が実行されると、エラーを発生させた行の後の次の文で実行が再開さ
れます。エラーが発生したときに実行を停止したい場合は、指定した関数の一部と
してプログラムを終了する文を記述します。
指定した関数には次の制限があります。
■
指定した関数に引数を渡すことはできません。また指定した関数から値を
返すこともできません。指定した関数に外部情報が必要な場合は、広域変
数または WHENEVER 文の GOTO 節を使用して、指定した関数を呼び出
すラベルに制御を移します。
■
ストアドプロシジャの名前を、指定した関数として指定することはできま
せん。ストアドプロシジャを呼び出すには、CALL 節を使用して
EXECUTE PROCEDURE 文の含まれている関数を実行します。
■
CALL 節が記述された WHENEVER 文が影響を及ぼすすべての関数が、指定
された関数の宣言を検索できることを確認してください。
参照
関連する文は、
「EXECUTE PROCEDURE 文」、
「FETCH 文」です。
エラー検査の詳細については、
『INFORMIX-ESQL/C Programmer’s Manual』を参照
してください。
SQL 文
2-651
第3章
SPL 文
CALL 文 . . . . .
CONTINUE 文 . . .
DEFINE 文 . . . .
EXIT 文 . . . . .
FOR 文 . . . . .
FOREACH 文. . . .
IF 文 . . . . . .
LET 文 . . . . . . .
ON EXCEPTION 文 . .
RAISE EXCEPTION 文 .
RETURN 文 . . . .
SYSTEM 文 . . . . .
TRACE 文 . . . . . .
WHILE 文 . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
.
.
.
. .
. .
.
.
3-4
3-7
3-8
3-16
3-18
3-23
3-27
3-31
3-34
3-39
3-41
3-44
3-47
3-50
3-2
Informix Guide to SQL:Syntax
SQL 文およびストアドプロシジャ言語 (SPL) を使用してプロシジャを作成すること
ができます。また、作成したストアドプロシジャをデータベースに格納することも
できます。このストアドプロシジャは、SQL 文の動作の制御に有効なツールです。
この章には、SPL 文の説明が掲載されています。各 SPL 文の説明には、次のような
情報が含まれています。
■
文の用途の簡単な説明
■
文の正しい入力方法を示す構文ダイヤグラム
■
構文ダイヤグラムの各入力パラメータを説明する構文表
■
使用法のルールおよびそのルールを説明する例
一つの文が複数の節で構成されている場合、その文の説明にはそれぞれの節の情報
と同じものが提供されています。
ストアドプロシジャの使用に関する実践的な情報については、
『Informix Guide to
SQL: Tutorial』を参照してください。
SPL 文
3-3
CALL 文
CALL 文
CALL 文によって、ストアドプロシジャの中からプロシジャを実行することができ
ます。
構文
CALL
< プロシジャ >
(
)
,
,
引数
RETURNING
;
< プロシジャ変数 >
引数
式
4-33 ページ
< パラメータ >
=
SELECT 文の
サブセット
3-6 ページ
要素
目的
< パラメータ > CREATE PROCEDURE 文によっ
て定義される呼び出されたプロ
シジャのパラメータ名です。
< プロシジャ > 呼び出されるプロシジャの名前
です。
< プロシジャ
変数 >
3-4
戻り値を受け取る変数名です。
Informix Guide to SQL:Syntax
制限
名前また配置のいずれか ( 両方
は不可 ) は、プロシジャ引数を
プロシジャ パラメータにバイン
ドします。つまり、CALL 文で
指定されたすべての引数または
0 個の引数に対して、< パラメー
タ >= の構文を使用できます。
プロシジャは、存在していなけ
ればなりません。
< プロシジャ変数 > のデータ型
は、戻り値のデータ型と一致し
なければなりません。
構文
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
識別子、
4-112 ページ
CALL 文
説明
CALL 文は、プロシジャを起動します。CALL 文は、SPL ルーチンの中でしか使用
することができないことを除けば、EXECUTE PROCEDURE 文と動作は同じです
が、それは、プロシジャ内から使用した場合に限ります。
引数の指定
CALL 文が、呼び出されたプロシジャが要求するよりも多い引数を含んでいる場合
には、エラーが返されます。
CALL 文が、呼び出されたプロシジャが要求するよりも少ない引数を指定している
場合は、引数が欠落していると言います。データベース サーバは、欠落している引
数を対応するデフォルト値に初期化します (2-134 ページの「CREATE PROCEDURE
文」を参照してください )。この初期化は、プロシジャの本文で、最初の実行可能
文の前に発生します。
欠落している引数のデフォルト値がない場合には、データベース サーバはその引数
を UNDEFINED の値に初期化します。UNDEFINED の値を持つ変数を使用すると、
エラーが生じます。
名前また配置のいずれか ( 両方は不可 ) は、プロシジャ引数をプロシジャ パラメー
タにバインドします。つまり、CALL 文で指定されたすべての引数または 0 個の引
数に対して、< パラメータ >= の構文を使用できます。
次の例の各プロシジャ呼出しは、文字引数を t、n、および d の順番で要求するプロ
シジャに対して有効です。
CALL add_col (t='customer', n = 'newint', d ='integer');
CALL add_col('customer','newint','integer');
SPL 文
3-5
CALL 文
プロシジャ引数で使用できる SELECT 文のサブセット
適切なデータ型と長さを持つ一つの値だけを返す場合には、プロシジャの引数とし
て SELECT 文を使用できます。詳細は、2-450 ページの SELECT 文の説明を参照し
てください。
呼び出されたルーチンからの値の受取り
RETURNING 節は、プロシジャ呼出しからの戻り値を受け取るプロシジャ変数を指定
します。RETURNING 節を省略すると、呼び出されたプロシジャは値を返しません。
次の例は、戻り値を必要としないプロシジャ呼出し (no_args) と、3 つの戻り値を必
要とするプロシジャ呼出し (yes_args) を示しています。このプロシジャの作成者は、
yes_args から戻り値を受け取るために、3 つの整数変数を定義しています。
CREATE PROCEDURE not_much()
DEFINE i, j, k INT;
CALL no_args (10,20);
CALL yes_args (5) RETURNING i, j, k;
END PROCEDURE
3-6
Informix Guide to SQL:Syntax
CONTINUE 文
CONTINUE 文
CONTINUE 文によって、FOR、WHILE、FOREACH ループのうち、最も内側の
ループの次の繰り返しを開始します。
構文
CONTINUE
FOR
;
WHILE
FOREACH
説明
CONTINUE 文があると、そのプロシジャでは、指定された種類のループのうちの最
も内側のループにある残りの文がスキップされ、次の繰返しのループの先頭から続
けて実行されます。次の例に示すプロシジャでは、表 testtable に 3 から 15 までの奇
数の値が挿入されます。このプロシジャでは、3 から 9 までと 13 から 15 までの処
理においては 値が返されますが、値が 11 のときには、キーワード FOR を指定した
CONTINUE 文になるので、値が返されません。つまり、キーワード FOR を指定し
た CONTINUE 文によって、プロシジャの RETURN i WITH RESUME 文がスキップ
されてしまいます。
CREATE PROCEDURE loop_skip()
RETURNING INT;
DEFINE i INT;
.
.
.
FOR i IN (3 TO 15 STEP 2)
INSERT INTO testtable values(i, null, null);
IF i = 11
CONTINUE FOR;
END IF;
RETURN i WITH RESUME;
END FOR;
END PROCEDURE;
指定されたループが見つからない場合には、CONTINUE 文でエラーになります。
SPL 文
3-7
DEFINE 文
DEFINE 文
DEFINE 文によって、プロシジャで使用する変数の宣言と変数へのデータ型の割り
当てを行うことができます。
構文
,
DEFINE
GLOBAL
SQL データ型の
サブセット
3-9 ページ
< プロシジャ変数 >
REFERENCES
DEFAULT
BYTE
デフォルト値
3-12 ページ
DEFAULT NULL
TEXT
,
SQL データ型の
サブセット
3-9 ページ
< プロシジャ変数 >
BYTE
REFERENCES
TEXT
LIKE
<表>
< シノニム >
< ビュー >
PROCEDURE
3-8
Informix Guide to SQL:Syntax
.
<列>
;
DEFINE 文
要素
<列>
目的
表の列の名前です。
制限
列は、あらかじめ表に存在して
いなければなりません。
表は、存在していなければなり
ません。
<表>
新しい変数に適用するデータ型
を含む表の名前です。
< シノニム >
新しい変数に適用するデータ型
を含むシノニムの名前です。
< ビュー >
新しい変数に適用するデータ型
を含むビューの名前です。
シノニムが指し示すシノニムお
よび表は、存在していなければ
なりません。
ビューは、存在していなければ
なりません。
< プロシジャ
変数 >
定義されているプロシジャ変数
の名前です。
名前は文ブロックで一意でなけ
ればなりません。
構文
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
識別子、
4-112 ページ
説明
DEFINE 文は、実行可能な文ではありません。DEFINE 文は、プロシジャのヘッダ
とほかの文との間に記述しなければなりません。変数は、それが定義されている文
ブロック内であれば、どこでも使用することができます。つまり、定義された変数
の有効範囲は、それが定義されている文ブロック内です。
SQL データ型のサブセット
SQL データ型のサブセットには、バイト (BYTE) 型、テキスト (TEXT) 型、および
シリアル (SERIAL) 型を除く SQL データがすべて含まれています。
バイト (BYTE) 型およびテキスト (TEXT) 型の変数の参照
キーワード REFERENCES によって、バイト (BYTE) 型およびテキスト (TEXT) 型の
変数を使用することができるようになります。バイト (BYTE) 型およびテキスト
(TEXT) 型の変数は、実際のデータが入るのではなく、データへのポインタになる
だけです。キーワード REFERENCES により、そのプロシジャ変数が単なるポイン
タであることがわかります。バイト (BYTE) 型とテキスト (TEXT) 型のプロシジャ
変数についても、ほかの変数と同様に正しく参照してください。
SPL 文
3-9
DEFINE 文
再宣言または再定義
同じ文ブロック内で同じ変数を 2 回定義すると、エラーが返されます。ただしネス
トされたブロックでは、変数を再定義できます。この場合に、外側の宣言は、一時
的に隠されます。次の例では、エラーが発生します。
CREATE PROCEDURE example1()
DEFINE n INT; DEFINE j INT;
DEFINE n CHAR (1); -- redefinition produces an error
.
.
.
次の例では、再宣言を行うことができます。ネストされた文ブロック内にある n は
文字変数です。ブロックの外にある n は、整数変数です。
CREATE PROCEDURE example2()
DEFINE n INT; DEFINE j INT;
.
.
.
BEGIN
DEFINE n CHAR (1); -- character n masks integer variable
-- locally
.
.
.
END
広域変数の定義
GLOBAL 修飾子は、キーワード GLOBAL に続く変数の並びが、ほかのプロシジャ
でも使用できることを示します。これらの変数のデータ型は、広域環境内の変数の
データ型と一致しなければなりません。広域環境は、所定のセッション (DB-Access
セッションまたは ESQL/C セッション ) 内で実行されるすべてのプロシジャが使用
するメモリです。グローバル変数の値は、このメモリに格納されます。
現行セッションで実行しているプロシジャによって、広域変数が共有されます。広
域変数はデータベース サーバによってデータベースに保存されないので、現行セッ
ションが終了するとき広域変数は消えてしまいます。
データベース全体で広域変数が共有されることはありません。データベースサーバ
およびアプリケーション開発支援ツールでも広域変数は共有されません。
3-10
Informix Guide to SQL:Syntax
DEFINE 文
広域変数を初めて宣言すると、広域環境においてその変数が確立されます。した
がって、それ以降は広域宣言しても、その変数を広域環境にバインドし、その時点
での変数の値を設定するだけです。次の例に、二つのプロシジャ proc1 および proc2
を示していますが、それぞれのプロシジャに広域変数 gl_out が定義されています。
ストアドプロシジャ プロセス 1
CREATE PROCEDURE proc1()
.
.
.
DEFINE GLOBAL gl_out INT DEFAULT 13;
.
.
.
LET gl_out = gl_out + 1;
END PROCEDURE;
ストアドプロシジャ プロセス 2
CREATE PROCEDURE proc2()
.
.
.
DEFINE GLOBAL gl_out INT DEFAULT 23;
DEFINE tmp INT;
.
.
.
LET tmp = gl_out
.
.
.
END PROCEDURE;
proc1 が最初に呼び出されると、gl_out は 13 に設定された後に 14 になります。次
に proc2 が最初に呼び出されると、gl_out の値は既に定義されているので、デフォ
ルト値の 23 は適用されません。その後で、proc2 により既存の値 14 が tmp に代入
されます。proc2 が最初に呼び出されていれば、gl_out は 23 に設定されるので、
tmp には 23 が代入されます。後から proc1 を呼び出してもデフォルト値の 13 は適
用されません。
SPL 文
3-11
DEFINE 文
デフォルト値節
デフォルト節
DEFINE 文へ戻る
3-8 ページ
リテラル番号
4-138 ページ
引用符付き文字列
4-153 ページ
リテラル時間隔
4-135 ページ
リテラル日時隔
4-132 ページ
CURRENT
DATETIME
フィールド修飾子
4-31 ページ
USER
TODAY
NULL
DBSERVERNAME
SITENAME
広域変数のデフォルトとして定数値または NULL を設定することができます。SQL
関数を呼び出してデフォルト値を設定することもできます。次の例では、
SITENAME 関数を使用してデフォルト値を設定しています。また、バイト (BYTE)
型の広域変数の定義も行っています。
CREATE PROCEDURE gl_def()
DEFINE GLOBAL gl_site CHAR(18) DEFAULT SITENAME;
DEFINE GLOBAL gl_byte REFERENCES BYTE DEFAULT NULL;
.
.
.
END PROCEDURE
3-12
Informix Guide to SQL:Syntax
DEFINE 文
SITENAME 関数または DBSERVERNAME 関数
SITENAME 関数または DBSERVERNAME 関数の返す値をデフォルトとして使用す
る場合には、その変数は 18 バイト以上の長さの文字 (CHAR) 型、可変長文字
(VARCHAR) 型、各国語文字 (NCHAR) 型、各国語可変長文字 (NVARCHAR) 型のい
ずれかの値でなければなりません。
USER 関数
USER 関数をデフォルトとして使用する場合には、その変数は 8 バイト以上の長さ
の文字 (CHAR) 型、可変長文字 (VARCHAR) 型、各国語文字 (NCHAR) 型、各国語
可変長文字 (NVARCHAR) 型のいずれかの値でなければなりません。
CURRENT 関数
CURRENT 関数をデフォルトとして使用する場合には、その変数は日時
(DATETIME) 型の値でなければなりません。キーワード YEAR TO FRACTION で変
数を修飾している場合には、修飾子なしで CURRENT 関数を使用することができま
す。変数にほかの修飾子を使用している場合に、デフォルト値として CURRENT 関
数を使用するときには、同じ修飾子を設定しなければなりません。次の例では、修
飾子付きの日時 (DATETIME) 型変数を定義し、同じ修飾子で CURRENT 関数を使
用しています。
DEFINE GLOBAL d_var DATETIME YEAR TO MONTH
DEFAULT CURRENT YEAR TO MONTH;
TODAY 関数
TODAY 関数をデフォルトとして使用する場合は、その変数は日付 (DATE) 型の値
でなければなりません。
バイト (BYTE) 型とテキスト (TEXT) 型
バイト (BYTE) 型およびテキスト (TEXT) 型の変数のデフォルト値には、NULL し
か設定することはできません。次の例では、l_text というテキスト (TEXT) 型の広域
変数を定義しています。
CREATE PROCEDURE use_text()
DEFINE i INT;
DEFINE GLOBAL l_text REFERENCES TEXT DEFAULT NULL;
END PROCEDURE
SPL 文
3-13
DEFINE 文
局所変数の宣言
局所変数 ( 広域でない変数 ) については、デフォルト値を設定することはできませ
ん。次の例では、局所変数の定義の代表的なものを示しています。
CREATE PROCEDURE def_ex()
DEFINE i INT;
DEFINE word CHAR(15);
DEFINE b_day DATE;
DEFINE c_name LIKE customer.fname;
DEFINE b_text REFERENCES TEXT ;
END PROCEDURE
LIKE 節での変数宣言
LIKE 節を使用すると、データベース サーバは、表の列と同じデータ型を < プロシ
ジャ変数 > に与えます。データベースの列として定義された変数のデータ型は、実
行時に決まります。したがって、< 列 > や < 表 > がコンパイル時に存在している必
要はありません。
LIKE a SERIAL 列としての変数宣言
キーワード LIKE を使用して、変数が LIKE a SERIAL 列であることを宣言できます。
たとえば、表 mytab の列 serialcol のデータ型がシリアル (SERIAL) 型の場合には、次
のプロシジャを作成できます。
CREATE PROCEDURE proc1()
DEFINE local_var LIKE mytab.serialcol;
RETURN;
END PROCEDURE;
変数 local_var は、整数 (INTEGER) 型変数として扱われます。
ただし、変数をシリアル (SERIAL) 型変数として定義することはできません。次の
例では、エラーが発生します。
CREATE PROCEDURE proc2()
DEFINE local_var SERIAL;
RETURN;
END PROCEDURE;
3-14
Informix Guide to SQL:Syntax
DEFINE 文
PROCEDURE 型としての変数宣言
PROCEDURE 型は、現行の範囲内では、< プロシジャ変数 > はユーザ定義プロシ
ジャ呼出しであって、SQL 関数やシステム関数呼出しではないことを示していま
す。たとえば、次の文はストアド プロシジャとして長さを定義しており、SQL
LENGTH 関数としては定義していません。この定義は文ブロック内の SQL
LENGTH 関数を無効にします。次の例に示すように、別のプロシジャ内で定義し使
用する前に length という名前でプロシジャを作成してしまった場合にこのような定
義を使用できます。
DEFINE length PROCEDURE;
.
.
.
LET x = length (a,b,c)
集計関数 (SUM、MAX、MIN、AVG、COUNT) と同じ名前、または extend という
名前でプロシジャを作成する場合には、プロシジャ名を所有者名で修飾する必要が
あります。
バイト (BYTE) 型およびテキスト (TEXT) 型データの変数宣言
キーワード REFERENCES は、< プロシジャ変数 > がバイト (BYTE) 型やテキスト
(TEXT) 型の値ではなく、バイト (BYTE) 型やテキスト (TEXT) 型の値へのポインタ
であることを示します。この変数にデータが格納されているかのように使用するこ
とができます。
次の例では、バイト (BYTE) 型の局所変数を定義しています。
CREATE PROCEDURE use_byte()
DEFINE i INT;
DEFINE l_byte REFERENCES BYTE;
END PROCEDURE --use_byte
バイト (BYTE) 型やテキスト (TEXT) 型の変数をプロシジャに渡す場合には、デー
タはデータベースサーバに渡され、ルート DB 領域または環境変数 DBSPACETEMP
が設定されていればそれによって指定された DB 領域に格納されます。データを格
納するファイルの名前や格納場所を知っている必要はありません。バイト (BYTE)
型やテキスト (TEXT) 型の変数を操作するときには、プロシジャで定義されたバイ
ト (BYTE) 型やテキスト (TEXT) 型の変数の名前しか必要ありません。
SPL 文
3-15
EXIT 文
EXIT 文
EXIT 文によって、FOR、WHILE または FOREACH ループの実行を停止させること
ができます。
構文
EXIT
FOR
;
WHILE
FOREACH
説明
EXIT 文によって、指定された種類のループ (FOR、WHILE または FOREACH) の最
も内側のループが終了し、その外側のループの先頭の文から実行が再開されます。
指定されたループが見つからない場合には、EXIT 文でエラーになります。
すべてのループの外側で EXIT 文を使用するとエラーになります。
3-16
Informix Guide to SQL:Syntax
EXIT 文
次の例では、キーワード FOR を指定した EXIT 文が使用されています。FOR ルー
プ内で、j が 6 になると、WHILE ループ内の IF 文の条件 i=5 が TRUE( 真 ) になり
ます。ここで、FOR ループの実行が停止され、FOR ループの外側の次の文 ( この場
合では END PROCEDURE 文 ) が実行されます。この例では、プロシジャは j が 6 に
なったときに終了します。
CREATE PROCEDURE ex_cont_ex()
DEFINE i,s,j, INT;
FOR j = 1 TO 20
IF j > 10 THEN
CONTINUE FOR;
END IF
LET i,s = j,0;
WHILE i > 0
LET i = i -1;
IF i = 5 THEN
EXIT FOR;
END IF
END WHILE
END FOR
END PROCEDURE
SPL 文
3-17
FOR 文
FOR 文
FOR 文によって、ループを確実に終了させる必要のある ( 限定した ) 制御ループを
開始することができます。FOR 文では、ループの繰り返し回数を限定するために式
また範囲演算子が使用されます。
構文
,
FOR
< ループ変数 >
IN
(
式の範囲
)
文ブロック
2-140 ページ
END FOR
;
,
<式>
=
式の範囲
式の範囲
< 左側の式 >
TO
< 右側の式 >
STEP
要素
<式>
< 増分式 >
目的
数値または文字値と < ループ変
数 > との比較で、ループを実行
すべきかどうかを決定します。
< 増分式 >
制限
構文
< 式 > と < ループ変数 > のデー 式、4-33 ページ
タ型は一致していなければなり
ません。SELECT 文の結果を
< 式 > として使用することがで
きます。
< ループ変数 > に増分する正ま 増分式は 0 を評価することはで 式、4-33 ページ
たは負の値です。デフォルト値 きません。
は +1 または -1 で、これらは
左側の式と右側の式のどちらが
大きいかによって決まります。
(1/2)
3-18
Informix Guide to SQL:Syntax
FOR 文
要素
< 左側の式 >
目的
範囲の最初の式です。
< 右側の式 >
範囲の最後の式です。左側の式
と右側の式の大きさの関係が増
分に正の値を取るか負の値を取
るかを決定します。
< ループ変数 >
この変数の値がループを何回実
行するか決定します。
制限
構文
左側の式の値は < ループ変数 > 式、4-33 ページ
のデータ型に一致していなけれ
ばなりません。また、整数
(INT) 型または小桁整数
(SMALLINT) 型でなければなり
ません。
右側の式の値は < ループ変数 > 式、4-33 ページ
のデータ型に一致していなけれ
ばなりません。また、整数
(INT) 型または小桁整数
(SMALLINT) 型でなければなり
ません。
変数はあらかじめ定義されてい 識別子、
る必要があり、また文ブロック 4-112 ページ
内で有効でなければなりません。
< ループ変数 > を繰り返し回数
の値とキーワード TO とともに
使用する場合には、< ループ変
数 > を明示的に整数 (INT) 型ま
たは小桁整数 (SMALLINT) 型で
指定しなければなりません。
(2/2)
説明
データベースサーバによってすべての式の計算が行われてから、FOR 文が実行され
ます。少なくとも一つの式が変数で、その値がループの途中で変化する場合でも、
その変化によってループの繰り返しに影響が及ぶことはありません。
FOR ループが終了するのは、< ループ変数 > に指定した変数の値が式の並びの中の
要素の値に等しくなったか、繰り返し回数に達した場合、あるいはキーワード FOR
を指定した EXIT 文が実行された場合です。
FOR 文のループ内で < ループ変数 > に指定した変数にほかの値を代入してその変数
の値を変更しようとすると、データベースサーバではエラーになります。
SPL 文
3-19
FOR 文
キーワード TO による範囲の定義
キーワード TO は範囲演算子です。範囲は左側の式と右側の式によって定義され
STEP 増分式オプションによって増分値が暗黙のうちに設定されます。キーワード
TO を使用する場合、変数名に指定した変数は、整数 (INT) 型または小桁整数
(SMALLINT) 型でなければなりません。次の例には、動作が同じになる FOR 文を
二つ示しています。どちらもキーワード TO で範囲を定義しています。最初の文で
は、キーワード IN を使用し、二番目の文では等号 (=) を使用しています。どちらの
文も 5 回のループを実行します。
FOR index_var IN (12 TO 21 STEP 2)
-- statement block
END FOR
FOR index_var = 12 TO 21 STEP 2
-- statement block
END FOR
STEP オプションを省略した場合、データベースサーバによって、< 右側の式 > が
< 左側の式 > よりも小さければ -1、大きければ +1 の値が < 増分式 > に設定されま
す。< 増分式 > が指定されている場合には、< 右側の式 > が < 左側の式 > よりも小
さければ負、大きければ正でなければなりません。次の例の二つの文の動作は同じ
になります。最初の文では、STEP による増分値が明示的に設定されています。二
番目の文では、STEP による増分値は暗黙のうちに 1 になります。
FOR index IN (12 TO 21 STEP 1)
-- statement block
END FOR
FOR index = 12 TO 21
-- statement block
END FOR
< ループ変数 > に指定した変数の値は、データベースサーバによって < 左側の式 >
の値で初期化されます。それ以降の繰返しでは、サーバによって < ループ変数 > に
指定した変数の値に < 増分式 > の値が加えられ、< ループ変数 > に指定した変数の
値がまだ < 左側の式 > と < 右側の式 > の範囲内にあるかどうかが調べられます。範
囲内にあれば、次の繰返しが行われます。範囲内になければループから抜け出ま
す。あるいは、ほかの範囲が指定されている場合には、この変数の値は次の範囲の
最初の要素の値になります。
3-20
Informix Guide to SQL:Syntax
FOR 文
単一の FOR 文での複数の範囲指定
次の例では、増加方向のループと減少方向のループでそれぞれ異なる増分値を使用
する文を示しています。
FOR index_var IN (15 to 21 STEP 2, 21 to 15 STEP -3)
-- statement body
END FOR
範囲としての式の並びの使用
データベースサーバによって、< ループ変数 > に指定した変数の値が、指定された
最初の式の値で初期化されます。それ以降の繰返しでは、< ループ変数 > に指定し
た変数の値はその隣の式の値になります。サーバによってリストの最後の式が評価
され、使用されると、そのループは終了します。
IN 節の並びの中の式は、この並びにおいて範囲演算子を使用しない限り、数値であ
る必要はありません。次の例では、文字式の並びを使用しています。
FOR c IN ('hello', (SELECT name FROM t), 'world', v1, v2)
INSERT INTO t VALUES (c);
END FOR
次の FOR 文では、数値式の並びを使用した場合を示しています。
FOR index IN (15,16,17,18,19,20,21)
-- statement block
END FOR
SPL 文
3-21
FOR 文
同一の FOR 文における範囲と式の並びの混在
< ループ変数 > に指定した変数の値が、整数 (INT) 型または小桁整数 (SMALLINT)
型の値の場合には、同一の FOR 文において範囲と式の並びとを混在させることが
できます。次に示す例では、整数型の変数を使用して混在させています。式の並び
における値には、SELECT 文から返される値、整数型の変数や定数の合計、
p_get_int という名前のプロシジャから返される値、整数型の定数があります。
CREATE PROCEDURE for_ex ()
DEFINE i, j INT;
LET j = 10;
FOR i IN (1 TO 20, (SELECT c1 FROM tab WHERE id = 1),
j+20 to j-20, p_get_int(99),98,90 to 80 step -2)
INSERT INTO tab VALUES (i);
END FOR
END PROCEDURE
3-22
Informix Guide to SQL:Syntax
FOREACH 文
FOREACH 文
FOREACH ループは、1 行以上を選択して処理するのに使用します。
構文
文ブロック
2-140
ページ
SELECT...INTO 文
3-26 ページ
FOREACH
END FOREACH
;
WITH HOLD
< カーソル >
FOR
WITH HOLD
EXECUTE PROCEDURE
< プロシジャ >
(
)
,
INTO
< プロシジャ変数 >
,
式の
サブセット
3-26 ページ
< パラメータ >
=
SPL 文
3-23
FOREACH 文
要素
< カーソル >
目的
制限
SELECT...INTO 文の名前として プロシジャ内の各カーソル名は
それぞれ一意でなければなりま
提供する識別子です。
せん。
< パラメータ > CREATE PROCEDURE 文の定義 名前また配置のいずれか ( 両方
に従って実行されているプロシ は不可 ) は、プロシジャ引数を
プロシジャ パラメータにバイン
ジャのパラメータ名です。
ドします。つまり、FOREACH
EXECUTE PROCEDURE 文で指
定されたすべての引数または 0
個の引数に対して、< パラメー
タ >= の構文を使用できます。
< プロシジャ > 実行するプロシジャの名前です。 プロシジャは、存在していなけ
ればなりません。
< プロシジャ
変数 >
呼出しプロシジャまたは実行プ
ロシジャのプロシジャ変数の名
前です。
< プロシジャ変数 > のデータ型
は、戻り値のデータ型に適して
いなければなりません。
構文
識別子、
4-112 ページ
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
識別子、
4-112 ページ
説明
FOREACH 文によるループは、カーソルを使用するプロシジャに相当します。
FOREACH 文を実行すると、データベースサーバは次のように動作します。
3-24
1.
カーソルが宣言され、暗黙のうちにオープンされます。
2.
FOREACH ループに含まれている問合せから最初の行が得られます。また
は呼び出さされたプロシジャから、戻り値の最初の値の組が得られます。
3.
変数の並びの各変数に、SELECT 文や呼び出されたプロシジャの作成する
アクティブセットから対応する値が代入されます。
4.
文ブロックが実行されます。
5.
SELECT 文または呼び出されたプロシジャから次の行が取り出され、手順
3. が繰り返されます。
6.
SELECT 文または呼び出されたプロシジャを満たす行がそれ以上見つから
ない場合には、このループは終了します。ループが終了すると、暗黙的な
カーソルはクローズされます。
Informix Guide to SQL:Syntax
FOREACH 文
文ブロックにはさらに FOREACH 文を記述することができるので、カーソルが入れ
子になることがありますが、その個数に制限はありません。
複数の行または値の組を返すプロシジャをカーソル プロシジャと呼びます。
次の SPL プロシジャでは、INTO 節を含む SELECT 文のある FOREACH 文、明示的
に指定されたカーソルのある FOREACH 文、プロシジャ呼出しを使用する
FOREACH 文の 3 つを示しています。
CREATE PROCEDURE foreach_ex()
DEFINE i, j INT;
FOREACH SELECT c1 INTO i FROM tab ORDER BY 1
INSERT INTO tab2 VALUES (i);
END FOREACH
FOREACH cur1 FOR SELECT c2, c3 INTO i, j FROM tab
IF j > 100 THEN
DELETE FROM tab WHERE CURRENT OF cur1;
CONTINUE FOREACH;
END IF
UPDATE tab SET c2 = c2 + 10 WHERE CURRENT OF cur1;
END FOREACH
FOREACH EXECUTE PROCEDURE bar(10,20) INTO i
INSERT INTO tab2 VALUES (i);
END FOREACH
END PROCEDURE -- foreach_ex
次のいずれかの場合には、SELECT カーソルがクローズされます。
■
カーソルによって返される行がなくなった場合
■
カーソルが、WITHHOLD 節を指定していない SELECT カーソルで、
COMMIT 文または ROLLBACK 文によりトランザクションが完了した場合
■
EXIT 文が実行され、制御が FOREACH 文の外に移った場合
■
FOREACH 文本体の内部でトラップされない例外が発生した場合 (3-34 ペー
ジの「ONEXCEPTION 文」を参照してください )
■
FOREACH 文のループ内でカーソル的なプロシジャを実行している呼び出
し側のプロシジャのカーソルが、何らかの理由でクローズされた場合
SPL 文
3-25
FOREACH 文
INTO 節を含む SELECT 文の使用
FOREACH 文中の SELECT 文には、INTO 節を組み込まなければなりません。この
SELECT 文に UNION 節および ORDER BY 節を組み込むことはできますが、INTO
TEMP 節は使用できません。SELECT 文の構文については、2-450 ページに示してい
ます。
変数の並びの各変数のデータ型および個数は、INTO 節を含む SELECT 文の返す値
とそれぞれ一致していなければなりません。
HOLD カーソル
キーワード WITH HOLD によって、トランザクションが ( 確定やロールバックによ
り ) クローズされてもオープンされたままにしておくカーソルを指定することがで
きます。
カーソル名で識別される行の更新または削除
WHERE CURRENT OF カーソル名の節によって、カーソルに指定したカーソルの現
行行の更新や削除を行うことができます。
FOREACH ループ内でのプロシジャの呼出し
呼び出されたプロシジャは、何も返さないか、あるいは少なくとも一行を返すこと
ができます。
変数の並びの各変数のデータ型の個数は、呼び出されるプロシジャの返す値とそれ
ぞれ一致していなければなりません。
プロシジャパラメータの中で許される式のサブセット
集計式をのぞけば、どんな式もプロシジャパラメータとして使用することができま
す。ただし、副問合せ文やプロシジャ呼出しを使用する場合には、その文やプロシ
ジャが適切なデータ型およびサイズの単一の値を返すようにしなければなりませ
ん。式の構文についての詳細は、4-33 ページを参照してください。
3-26
Informix Guide to SQL:Syntax
IF 文
IF 文
IF 文によって、SPL ルーチン内で処理を分岐させることができます。
構文
IF
条件
4-5 ページ
END IF
THEN
;
IF 文の並び
3-29 ページ
ELIF
条件
4-5 ページ
THEN
ELSE
IF 文の並び
3-29 ページ
IF 文の並び
3-29 ページ
説明
IF 節に記述された条件が評価されます。評価した結果が TRUE( 真 ) の場合には、
キーワード THEN に続く文が実行されます。評価した結果が FALSE( 偽 ) で、かつ
ELIF 節がある場合には、ELIF 節に続く文が実行されます。また、ELIF 節がないあ
るいは ELIF 節の条件が FALSE( 偽 ) の場合には、キーワード ELSE に続く文が実行
されます。
次の例のプロシジャ関数では、IF 文で ELIF 節と ELSE 節のどちらも使用していま
す。IF 文で二つの文字列が比較され、最初の文字列の方が二番目の文字列よりも照
合順序が先になる場合には 1 が出力され、二番目の方が照合順序が先になる場合に
は -1 が出力されます。二つの文字列が同一の場合は、0 が返されます。
CREATE PROCEDURE str_compare (str1 CHAR(20), str2 CHAR(20))
RETURNING INT;
DEFINE result INT;
IF str1 > str2 then
result =1;
ELIF str2 > str1 THEN
SPL 文
3-27
IF 文
result = -1;
ELSE
result = 0;
END IF
RETURN result;
END PROCEDURE -- str_compare
ELIF 節
ELIF 節によって、評価する条件をさらにいくつか指定することができます。
ELIF 節を指定した場合には、IF 文の条件が FALSE( 偽 ) のときに、ELIF 節の条件
が評価されます。このとき ELIF 節の条件が TRUE( 真 ) の場合は、ELIF 節に続く文
が実行されます。
ELSE 節
ELSE 節は、その前にある IF 節の条件や ELIF 節の条件が TRUE( 真 ) でない場合に
実行されます。
IF 文中の条件
IF 文中の条件は、WHILE 文中の条件と同様の方法で評価されます。
条件に記述されている式で NULL と評価された場合、結果は無条件に FALSE( 偽 )
になります。次の点に注意してください。
1.
式 x が NULL と評価した場合には、定義では式 x の結果は FALSE( 偽 ) に
なります。さらに、not(x) も FALSE( 偽 ) になります。
2.
ISNULL 演算子は、式 x の評価結果が TRUE( 真 ) になる唯一の演算子で
す。つまり、x IS NULL は TRUE( 真 ) で、x IS NOT NULL は FALSE( 偽 )
になります。
条件内の式に ( 初期化されていない変数の使用による )UNKNOWN( 未知 ) 値が含ま
れている場合は、即時エラーになり、この文は終了して例外が発生します。
3-28
Informix Guide to SQL:Syntax
IF 文
IF 文の並び
IF 文の並び
IF 文へ戻る
3-27 ページ
BEGIN
文ブロック
2-140 ページ
END
SPL 文の
サブセット
3-29 ページ
SQL 文の
サブセット
3-30 ページ
;
IF 文の中で許される SPL 文のサブセット
IF 文の中では次に挙げる SPL 文を使用することができます。
CALL 文
CONTINUE 文
EXIT 文
FOR 文
FOREACH 文
IF 文
LET 文
RAISE EXCEPTION 文
RETURN 文
SYSTEM 文
TRACE 文
WHILE 文
SPL 文
3-29
IF 文
IF 文の中で許される SQL 文のサブセット
文ブロックには、次に挙げる文を除いて、あらゆる SQL 文を使用することができ
ます。
ALLOCATE DESCRIPTOR 文
CLOSE DATABASE 文
CONNECT 文
CREATE DATABASE 文
CREATE PROCEDURE 文
DATABASE 文
DEALLOCATE DESCRIPTOR 文
DECLARE 文
DESCRIBE 文
DISCONNECT 文
EXECUTE 文
EXECUTE IMMEDIATE 文
FETCH 文
FLUSH 文
FREE 文
GET DESCRIPTOR 文
GET DIAGNOSTICS 文
INFO 文
LOAD 文
OPEN 文
OUTPUT 文
PREPARE 文
PUT 文
SET CONNECTION 文
SET DESCRIPTOR 文
UNLOAD 文
WHENEVER 文
SELECT 文を使用することができるのは、INTOTEMP 節を使用して一時表に結果を
格納する場合だけです。
3-30
Informix Guide to SQL:Syntax
LET 文
LET 文
LET 文は、変数に値を割り当てるために使用します。プロシジャからプロシジャ変
数を呼び出して変数に戻り値 ( 複数の場合もあります ) を割り当てるためにも使用
します。
構文
,
,
,
LET
< プロシジャ変数 >
=
< プロシジャ >
式
4-33 ページ
(
< 呼び出される
変数 >
)
;
=
,
式
4-33 ページ
要素
< 呼び出され
る変数 >
制限
名前また配置のいずれか ( 両方
は不可 ) は、プロシジャ引数を
プロシジャ パラメータにバイン
ドします。つまり、LET 文で指
定されたすべての引数または 0
個の引数に対して、< 呼び出さ
れる変数 >= の構文を使用でき
ます。
< プロシジャ > ストアド プロシジャの名前です。 ストアド プロシジャは、存在し
ていなければなりません。
< プロシジャ
変数 >
目的
呼び出されたプロシジャのプロ
シジャ変数です。
プロシジャ変数です。
プロシジャ変数は、プロシジャ
で定義され、文ブロックで有効
でなければなりません。
構文
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
識別子、
4-112 ページ
SPL 文
3-31
LET 文
説明
単一変数に値を割り当てる場合は、単純代入を行います。複数の変数に値を割り当
てる場合は、複合代入を行います。
実行時には、SPL 式の値が最初に計算されます。< プロシジャ変数 > に指定した
データ型に変換可能であれば、変換されてから、変数に代入されます。変換できな
い場合はエラーになり、< プロシジャ変数 > の値は未定義になります。
複合代入によって複数の式を複数の変数に割り当てることができます。式の並びの
式の数とデータ型は、変数の並びの対応する変数の数とデータ型に一致している必
要はありません。
次の例では、プロシジャ変数に値を代入する LET 文をいくつか示しています。
LET
LET
LET
LET
LET
LET
a = c+ d;
a,b = c,d ;
expire_dt = end_dt + 7 UNITS DAY;
name = 'Brunhilda';
sname = DBSERVERNAME;
this_day = TODAY;
複数の値を用いて他の複数の値に対する演算を行うことはできません。たとえば、
次の文は正しくありません。
LET a,b = (c,d) + (10,15); -- ILLEGAL EXPRESSION
LET 文中での SELECT 文の使用
LET 文中で SELECT 文を使用することは、プロシジャ内の SELECT 文で INTO < プ
ロシジャ変数 > を指定することに相当します。この節の例は、LET 文中で SELECT
文を使用しています。次の例に示すように、SELECT 文を使用して = 演算子の左側
にある一つ以上の変数に、値を代入することができます。
LET a,b = (SELECT c1,c2 FROM t WHERE id = 1);
LET a,b,c = (SELECT c1,c2 FROM t WHERE id = 1), 15;
SELECT 文を使用して、複数の値による他の値に対する演算を行うことはできませ
ん。次の例の記述は正しくありません。
LET a,b = (SELECT c1,c2 FROM t) + (10,15); -- ILLEGAL CODE
3-32
Informix Guide to SQL:Syntax
LET 文
LET 文は INTO 節を指定した SELECT 文と同じなので、次の例における二つの文で
は、a=c および b=d という同じ結果になります。
CREATE PROCEDURE proof()
DEFINE a, b, c, d INT;
LET a,b = (SELECT c1,c2 FROM t WHERE id = 1);
SELECT c1, c2 INTO c, d FROM t WHERE id = 1
END PROCEDURE
SELECT 文によって複数行が返される場合には、該当の SELECT 文を FOREACH 文
のループの中に入れる必要があります。
LET 文中での関数の呼出し
LET 文でプロシジャを呼び出して、戻り値を変数に割り当てることができます。
LET 文にプロシジャ呼出しが含まれる場合には、その LET 文 は、名前付きプロシ
ジャを呼び出します。プロシジャの引数にデフォルト値がない場合には、LET 文内
のプロシジャに必要な引数をすべて指定しなければなりません。
呼び出されるプロシジャのパラメータの一つに対して、< 呼び出される変数 >= の
構文を使用する場合には、この構文をすべてのパラメータに対して使用しなければ
なりません。
< プロシジャ変数 > は、プロシジャ呼出しからの戻り値を受け取ります。プロシ
ジャを用いれば、変数名の並びで指定した変数に、複数の値を返すことができま
す。ただし、複数の値を返すプロシジャは、FOREACH 文のループの中に入れる必
要があります。
次の例では、LET 文をいくつか示しています。最初の二つは、プロシジャ呼出しが
正しく記述されている LET 文です。3 番目の LET 文は、二つの出力の合計を二つ
のプロシジャ <a> と <b> に代入しようとしているので、正しくありません。ただ
し、この LET 文については、簡単に二つの LET 文に分けることができます。
LET a, b, c = proc1(name = 'grok', age = 17);
LET a, b, c = 7, proc ('orange', 'green');
LET a, b = proc1() + proc2(); -- ILLEGAL CODE
SPL 文
3-33
ON EXCEPTION 文
ON EXCEPTION 文
ON EXCEPTION 文によって、特定のエラーや一組のエラーへの対応措置を指定す
ることができます。
構文
文ブロック
2-140
ページ
ON EXCEPTION
END EXCEPTION
,
IN
(
< エラー番号 >
;
)
WITH RESUME
<SQL エラー変数 >
SET
,
<ISAM エラー変数 >
,
要素
< エラーデー
タ変数 >
制限
エラー情報を受け取るには文字
(CHARACTER) 型でなければな
りません。また現行文ブロック
で有効でなければなりません。
整数 (INTEGER) 型でなければな
< エラー番号 > トラップされる SQL エラー番
号、または RAISE EXCEPTION りません。また現行文ブロック
文で作成されたエラー番号です。 で有効でなければなりません。
<ISAM エラー 発生した例外の ISAM エラー番 整数 (INTEGER) 型でなければな
号を受け取る変数です。
りません。また現行文ブロック
変数 >
で有効でなければなりません。
発生した例外の SQL エラー番
文字 (CHARACTER) 型でなけれ
<SQL エラー
号を受け取る変数です。
ばなりません。また現行文ブ
変数 >
ロックで有効でなければなりま
せん。
3-34
目的
SQL エラー、またはユーザ定義
の例外から戻された文字列を含
むプロシジャ変数です。
< エラーデータ変数 >
Informix Guide to SQL:Syntax
構文
識別子、
4-112 ページ
リテラル番号、
4-138 ページ
識別子、
4-112 ページ
識別子、
4-112 ページ
ON EXCEPTION 文
説明
ON EXCEPTION 文を RAISE EXCEPTION 文と併用することによって、SPL にエ
ラートラップやエラー復旧の機能が設定されます。ON EXCEPTION 文では、スト
アドプロシジャの実行時におけるトラップ対象のエラーの並びを指定し、またト
ラップ発生時の対応措置を ( 文ブロック内に ) 指定します。IN 節が省略された場合
は、エラーはすべてトラップされます。
所定の文ブロックでは、複数の ON EXCEPTION 文を使用することができます。
ON EXCEPTION 文の有効範囲は、ON EXCEPTION 文に続く文ブロック、ON
EXCEPTION 文に続く文ブロック内で入れ子になっているすべての文ブロック、お
よび ON EXCEPTION 文に続くすべての文ブロックとなります。
トラップされる例外は、システム定義またはユーザ定義のどちらの例外でもかまい
ません。
例外がトラップされると、エラー状態が消去されます。
ISAM エラーを受け取る変数を指定しても、ISAM エラーのないトラップの場合には
その変数には 0 が返されます。エラーテキストを受け取るための変数を指定しても
エラーテキストのないトラップの場合には、その変数には空の文字列が入ります。
ON EXCEPTION 文の記述位置
ON EXCEPTION 文は宣言文であり、実行可能な文ではありません。このため、ON
EXCEPTION 文は、プロシジャ中の実行可能な文と DEFINE 文との間に記述しなけ
ればなりません。
次の例では、ON EXCEPTION 文の正しい記述位置を示しています。ON
EXCEPTION 文は、DEFINE 文とルーチン本体との間で使用してください。次の例
のプロシジャでは、一組の値を表に挿入しています。表が存在しない場合には、表
が作成され、そこに値が挿入されます。この SPL 関数では、挿入後にその表の行の
総数も返されます。
SPL 文
3-35
ON EXCEPTION 文
CREATE PROCEDURE add_salesperson(last CHAR(15),
first CHAR(15))
RETURNING INT;
DEFINE x INT;
ON EXCEPTION IN (-206) -- If no table was found, create one
CREATE TABLE emp_list
(lname CHAR(15),fname CHAR(15), tele CHAR(12));
INSERT INTO emp_list VALUES -- and insert values
(last, first, '800-555-1234');
END EXCEPTION WITH RESUME
INSERT INTO emp_list VALUES (last, first, '800-555-1234')
LET x = SELECT count(*) FROM emp_list;
RETURN x;
END PROCEDURE
エラーが発生すると最後に宣言され特定のエラー番号をトラップし ON
EXCEPTION 文がデータベースサーバによって探されます。ON EXCEPTION 文で
は、IN 節でエラー番号を設定する場合もあれば、IN 節がない場合もあります。
データベースサーバによって該当する ON EXCEPTION 文が見つからなかった場合
には、エラー番号は呼出し側 ( プロシジャ、アプリケーションあるいは対話操作中
のユーザ ) に返され、実行が打ち切られます。
次の例では、二つの入れ子になった ON EXCEPTION 文で、それぞれエラー番号
691 をトラップすることができるように、同じエラー番号を指定した二つの ON
EXCEPTION 文を使用しています。
CREATE PROCEDURE delete_cust (cnum INT)
ON EXCEPTION IN (-691) -- children exist
BEGIN -- Begin-end is necessary so that other DELETEs
-- don't get caught in here.
ON EXCEPTION IN (-691)
DELETE FROM another_child WHERE num = cnum;
DELETE FROM orders WHERE customer_num = cnum;
END EXCEPTION -- for 691
DELETE FROM orders WHERE customer_num = cnum;
END
DELETE FROM cust_calls WHERE customer_num = cnum;
DELETE FROM customer WHERE customer_num = cnum;
END EXCEPTION
DELETE FROM customer WHERE customer_num = cnum;
END PROCEDURE
3-36
Informix Guide to SQL:Syntax
ON EXCEPTION 文
特定の例外のトラップのための IN 節の使用
SQL エラー番号または ISAM エラー番号が、エラー番号の並びの例外コードと一致
する場合に、トラップが発生します。検索は並びの左から始まり、最初に一致した
ところで終わります。
IN 節を含まない ONEXCEPTION 文と IN 節を含む ONEXCEPTION 文をいくつか組
み合せて、デフォルトのトラップ条件を設定することができます。エラーが発生す
ると、データベースサーバは特定のエラーコードをトラップする ON EXCEPTION
文の最後の宣言を探索します。
CREATE PROCEDURE ex_test ()
DEFINE error_num INT;
.
.
.
ON EXCEPTION
SET error_num
-- action C
END EXCEPTION
ON EXCEPTION IN (-300)
-- action B
END EXCEPTION
ON EXCEPTION IN (-210, -211, -212)
SET error_num
-- action A
END EXCEPTION
.
.
.
前の例に示した一連の文をまとめると、次のようになります。エラーの検査を行い
ます。エラー -210、エラー -211、またはエラー -212 が発生した場合には、A の処
理を行います。エラー -300 が発生した場合には、B の処理を行います。その他のエ
ラーが発生した場合には、C の処理を行います。
SET 節でのエラー情報の受取り
SET 節を使用すると、例外が発生したときに、SET 節で指定した変数に SQL エラー
番号と ( オプションで )ISAM エラー番号が設定されます。< エラーデータ変数 > が用
意されている場合には、データベースサーバの返すあらゆるエラーテキストがその <
エラーデータ変数 > に格納されます。エラーテキストには、エラーになった表名や列
名などの情報が含まれています。
SPL 文
3-37
ON EXCEPTION 文
プロシジャの強制続行
3-36 ページの例では、キーワード WITH RESUME を使用することによって、ON
EXCEPTION 文の文ブロックが実行された後に、エラーになった行の、次の行の
LETx=SELECT COUNT(*)FROMemp_list という文から実行が続けられるようにし
ています。このプロシジャでは、エラーが発生しても雇用リストの件数が結果とし
て返されます。
例外発生後のルーチンの続行
ON EXCEPTION 文にキーワード WITH RESUME を記述していない場合、例外発生
後にその次に実行される文は、以下に説明するように、ON EXCEPTION 文を記述
する位置によって変わります。
■
キーワードBEGINとENDを伴う文ブロック内にON EXCEPTION文がある場
合は、その BEGIN...END ブロックの後に先頭の文があれば、そこから実
行が再開されます。つまり、ON EXCEPTION 文の有効範囲の次から実行
が再開されるということです。
■
ON EXCEPTION 文がループ (FOR、WHILE、FOREACH) 内にある場合には、
ループの残りの部分はスキップされ、次のループの繰返しの先頭から実行
が再開されます。
■
文または文ブロック内に ON EXCEPTION 文が含まれず、プロシジャだけ
に含まれている場合には、そのプロシジャは引数を指定しない RETURN
文を実行して、終了します。つまり、そのプロシジャは、正常終了します
が、戻り値は返しません。
ONEXCEPTION 文ブロック内でのエラー
無限ループを防止するために、エラートラップを行う文ブロックの実行中にエラー
が発生した場合は、その新たなトラップの検索に現行のトラップは含まれません。
3-38
Informix Guide to SQL:Syntax
RAISE EXCEPTION 文
RAISE EXCEPTION 文
RAISE EXCEPTION 文によって、エラーを擬似的に発生させることができます。
構文
RAISE EXCEPTION
;
<SQL エラー変数 >
,
<ISAM エラー変数 >
,
要素
< エラーテキ
スト変数 >
目的
エラーテキストを含むプロシ
ジャ変数です。
< エラーテキスト変数 >
制限
プロシジャ変数は、文字
(CHARACTER) 型でなければな
りません。また現行文ブロック
で有効でなければなりません。
<ISAM エラー ISAM エラー番号を表す変数ま 変数または式は SMALLINT 値
を評価していなければなりませ
変数 >
たは式です。
ん。エラー番号の前にマイナス
デフォルト値は 0 です。
記号 (-) が必要です。
変数または式は SMALLINT 値
エラー
エラー番号を表す変数また
<SQL
SQL
を評価していなければなりませ
変数 >
は式です。
ん。エラー番号の前にマイナス
記号 (-) が必要です。
構文
識別子、
4-112 ページ
式、4-33 ページ
式、4-33 ページ
説明
RAISE EXCEPTION 文を使用してエラーを擬似的に発生させたり、カスタム メッ
セージを伴うエラーを発生させることができます。発生させたエラーは、ON
EXCEPTION 文でトラップすることができます。
ISAM エラー変数のパラメータが省略された場合、例外が発生すると、データベー
スサーバが ISAM エラー変数を 0 に設定します。エラーテキスト変数パラメータを
使用する必要があり、ISAM エラー変数の値を指定する必要がない場合には、ISAM
エラーの値を 0 に指定できます。
この文によって、システムが生成した例外またはユーザが生成した例外のどちらで
も発生させることができます。
SPL 文
3-39
RAISE EXCEPTION 文
たとえば、次の文ではエラー番号 -208 を発生させ、システム生成エラー メッセー
ジの変数に、a missing file というテキストを挿入します。
RAISE EXCEPTION -208, 0, 'a missing file';
特別エラー番号
特別エラー番号 -746 を使用すると、カスタマイズしたメッセージを生成すること
ができます。たとえば、次の文は、エラー番号 -746 を発生させ、指定したテキス
トを返します。
RAISE EXCEPTION -746, 0, 'You broke the rules';
次の例では、alpha が負の値のときに例外 -746 を発生させ、問題について説明する
特別なメッセージを表示します。このコードには、例外 -746 をトラップする ON
EXCEPTION 文を記述する必要があります。
FOREACH SELECT c1 INTO alpha FROM sometable
IF alpha < 0 THEN
RAISE EXCEPTION -746, 0, ‘a < 0 found’ -- emergency exit
END IF
END FOREACH
例外の有効範囲および互換性についての詳細は、ON EXCEPTION 文を参照してく
ださい。
3-40
Informix Guide to SQL:Syntax
RETURN 文
RETURN 文
RETURN 文によって、ルーチンが呼び出し側のモジュールに返す値を指定すること
ができます。
構文
;
RETURN
,
式
4-33 ページ
WITH RESUME
説明
RETURN 文は、0 または呼出しプロセスに値を返します。
プロシジャ内の RETURN 文はすべて、そのプロシジャで定義した CREATE
PROCEDURE 文の RETURNING 節と一致していなければなりません。RETURN 文
で値を指定する場合には、その個数およびデータ型が、CREATE PROCEDURE 文の
RETURNING 節で指定する値の個数およびデータ型と一致していなければなりませ
ん。RETURNING 節に値を指定した場合であっても、値を返さないようにすること
ができます。式を指定せずに RETURN 文を使用しているにもかかわらず、呼出し
側のプロシジャやプログラムでは複数の戻り値を求めている場合には、呼出し側の
プログラムに必要な数だけ NULL を返すのと同じ結果になります。
SPL 文
3-41
RETURN 文
次の例のプロシジャには、有効な RETURN 文が二つ記述されています。このプロ
シジャを呼び出すプログラムでは、戻り値があるかどうかを確認し、その結果に応
じた処理を行う必要があります。
CREATE PROCEDURE two_returns (stockno INT)
RETURNING CHAR (15);
DEFINE des CHAR(15);
ON EXCEPTION (-272) -- if user doesn’t have select privs...
RETURN;
-- return no values.
END EXCEPTION;
SELECT DISTINCT descript INTO des FROM stock
WHERE stocknum = stockno;
RETURN des;
END PROCEDURE
式を指定していない RETURN 文では、プロシジャにおいて値を返さないように宣
言されている場合には、値を返さずに終了するだけですが、値を返すように宣言さ
れている場合は、NULL が返されます。
キーワード WITH RESUME
実行する RETURN 文の後にキーワード WITH RESUME を使用している場合、この
プロシジャが ( 次の FETCH 文や FOREACH 文によって ) 次に実行されるときは、
RETURN 文に続く文から開始されます。プロシジャがキーワード WITH RESUME
を指定した RETURN 文を実行するようになっている場合、このプロシジャは、呼
出し側のプロシジャまたはプログラム中の FOREACH ループ内で呼び出さなければ
なりません。
E/C
3-42
プロシジャが、RETURN WITH RESUME 文を実行するようになっている場合、
ESQL/C アプリケーションの FETCH 文によってこの SPL ルーチンを呼び出すこと
ができます。♦
Informix Guide to SQL:Syntax
RETURN 文
次の例では、ほかのプロシジャから呼び出すことのできるカーソル プロシジャを示
しています。RETURN i WITH RESUME 文によって呼出し側のプロシジャまたはプ
ログラムに値が返された後、この次の sequence で指定された行は、次にこの
sequence が呼び出されたときに実行されます。backwards が 0 の場合は、呼出し側の
プロシジャまたはプログラムに値は返されず、この sequence の実行は終了します。
CREATE PROCEDURE sequence (limit INT, backwards INT)
RETURNING INT;
DEFINE i INT;
FOR i IN (1 TO limit)
RETURN i WITH RESUME;
END FOR
IF backwards = 0 THEN
RETURN;
END IF
FOR i IN (limit TO 1)
RETURN i WITH RESUME;
END IF
END PROCEDURE -- sequence
SPL 文
3-43
SYSTEM 文
SYSTEM 文
SYSTEM 文によって、プロシジャの中からオペレーティングシステムのコマンドを
実行させることができます。
構文
<式>
SYSTEM
;
< コマンド変数 >
要素
< コマンド変
数>
<式>
目的
オペレーティング システムの有
効なコマンドを含むプロシジャ
変数です。
ユーザが実行可能なオペレー
ティング システムのコマンドの
式です。
制限
プロシジャ変数は、文ブロック
で有効な文字 (CHAR) データ型
でなければなりません。
コマンドがバックグランドで実
行されるよう指定することはで
きません。
構文
識別子、
4-112 ページ
オペレーティング シ
ステムに依存
説明
指定された式が文字式でない場合には、その式は、オペレーティングシステムのコ
マンドになる前に文字式に変換されます。完成した文字式がオペレーティングシス
テムに渡され、オペレーティングシステムのコマンドとして実行されます。
SYSTEM 文で指定されたオペレーティングシステムのコマンドについては、バック
グラウンドで実行することはできません。データベースサーバは、そのコマンドの
実行が完了するまでオペレーティングシステムを待機した後、次のプロシジャ文を
続行します。
プロシジャでは、コマンドから返される値を使用することはできません。
3-44
Informix Guide to SQL:Syntax
SYSTEM 文
オペレーティングシステムのコマンドの実行に失敗した場合 ( つまり、オペレー
ティングシステムからコマンドに対する 0 以外の状態コードが返された場合 ) には、
例外が発生し、オペレーティングシステムからの状態コードがこの例外の ISAM エ
ラー番号や SQL エラー番号となります。
SYSTEM 文が記述されている DBA アクセス権付きおよび所有者アクセス権付きス
トアドプロシジャでは、オペレーティングシステムのコマンドは、そのプロシジャ
を実行しているユーザのパーミッションで実行されます。
SYSTEM 文での環境変数の指定
SYSTEM 文が指定するオペレーティングシステムのコマンドが実行されると、ユー
ザアプリケーションが設定する環境変数がオペレーティングシステムに必ず渡され
るという保証はありません。アプリケーションが設定する環境変数がオペレーティ
ングシステムに確実に渡されるようにするには、環境変数を設定する SYSTEM コ
マンドを入力してから、オペレーティングシステムのコマンドを実行する SYSTEM
コマンドを入力します。
環境変数を設定するオペレーティングシステムのコマンドについては『Informix
Guide to SQL: Reference』を参照してください。
UNIX
UNIX 上の SYSTEM 文の例
次の例は、ストアド プロシジャ内の SYSTEM 文の使用法です。ここでは、
SYSTEM 文によって、UNIX のオペレーティングシステムがシステム管理者への
メールメッセージを送ります。
CREATE PROCEDURE sensitive_update()
.
.
.
LET mailcall = 'mail headhoncho < alert';
-- code that evaluates if operator tries to execute a
-- certain command, then sends email to system
-- administrator
SYSTEM mailcall;
.
.
.
END PROCEDURE; -- sensitive_update
SPL 文
3-45
SYSTEM 文
次の例に示すように、連結演算子 (||) を使用して式と SYSTEM 文とを連結すること
ができます。
CREATE PROCEDURE sensitive_update2()
DEFINE user1 char(15);
DEFINE user2 char(15);
LET user1 = 'joe';
LET user2 = 'mary';
.
.
.
-- code that evaluates if operator tries to execute a
-- certain command, then sends email to system
-- administrator
SYSTEM 'mail -s violation' ||user1 || ' ' || user2
|| '< violation_file';
.
.
.
END PROCEDURE; --sensitive_update2
WIN NT
Windows NT での SYSTEM 文の例
次の例は、ストアド プロシジャ内の SYSTEM 文を示しています。プロシジャ内の
最初の SYSTEM 文によって、Windows NT オペレーティング システムは、一時ファ
イルに対してエラー メッセージを送信し、アルファベット順にソートされるシステ
ム ログにそのメッセージを書き込みます。ストアド プロシジャ内の二番目の
SYSTEM 文は、オペレーティング システムに、一時ファイルを削除させます。
CREATE PROCEDURE test_proc()
.
.
.
SYSTEM 'type errormess101 > %tmp%tmpfile.txt |
sort >> %SystemRoot%systemlog.txt';
SYSTEM 'del %tmp%tmpfile.txt';
.
.
.
END PROCEDURE; --test_proc
この例で、SYSTEM 文に続く式には、%tmp% と %SystemRoot% の二つの変数が含
まれています。どちらの変数も、Windows NT オペレーティング システムで定義さ
れています。
3-46
Informix Guide to SQL:Syntax
TRACE 文
TRACE 文
TRACE 文によって、デバッグ出力の生成を制御することができます。
構文
ON
TRACE
;
OFF
PROCEDURE
式
4-33 ページ
説明
TRACE 文によって、SET DEBUG FILE TO 文で指定したファイルに書き込むトレー
ス出力を生成することができます。
トレースを行うと、次の項目の現行値が出力されます。
■
変数
■
プロシジャ引数
■
戻り値
■
SQL エラー番号
■
ISAM エラー番号
実行された各 TRACE 文の結果は、行単位に出力されます。
出力結果を格納するデバッグファイルを指定せずに TRACE 文を使用した場合は、
エラーになります。
トレース状態は、呼び出されたプロシジャに引き継がれます。つまり、呼び出され
たプロシジャのトレース状態 (ON、OFF、PROCEDURE) は、呼出し側のプロシ
ジャと同じと見なされます。呼び出されたプロシジャで独自のトレース状態を設定
することができますが、そのトレース状態が呼出し側のプロシジャに引き継がれる
ことはありません。
SPL 文
3-47
TRACE 文
トレース状態が、遠隔のデータベースサーバで実行されているプロシジャによって
引き継がれることはありません。
TRACE ON
キーワード ON を指定すると、すべての文がトレースされます。変数の値 ( 式やそ
れ以外で使用されているもの ) については、使用される前に出力されます。トレー
スを有効にすると、プロシジャ本体に記述されているプロシジャ呼出しおよび文の
どちらもトレースされます。
TRACE OFF
キーワード OFF を指定すると、すべてのトレースが停止します。
TRACE PROCEDURE
キーワード PROCEDURE を指定すると、プロシジャ本体ではなく、プロシジャ呼
出しおよび戻り値だけがトレースされます。
式の出力
TRACE 文で引用符付き文字列や式を指定すると、出力ファイルに値やコメントを
書き込むことができます。式が定数式でない場合には、その式は評価された後で出
力ファイルに書き込まれます。
プロシジャの始めの方で TRACEOFF 文を使用した場合でも、式を指定した TRACE
文を使用することができます。ただし、最初に SETDEBUG 文でトレース結果の出
力ファイルを設定しなければなりません。
次の例では、TRACEOFF 文を使用した後に、式を指定した TRACE 文を使用してい
ます。ここでは、UNIX のファイル名変換に使用しています。
CREATE PROCEDURE tracing ()
DEFINE i INT;
BEGIN
ON EXCEPTION IN (1)
END EXCEPTION; -- do nothing
SET DEBUG FILE TO '/tmp/foo.trace';
TRACE OFF;
TRACE 'Forloop starts';
FOR i IN (1 TO 1000)
BEGIN
TRACE 'FOREACH starts';
3-48
Informix Guide to SQL:Syntax
TRACE 文
FOREACH SELECT...INTO a FROM t
IF <some condition> THEN
RAISE EXCEPTION 1 -- emergency exit
END IF
END FOREACH
-- return some value
END
END FOR
-- do something
END;
END PROCEDURE
TRACE のさまざまな形式の例
次の例は、さまざまな形式の TRACE 文を示しています。この例は、Windows NT の
ファイル命名規則を使用しています。
CREATE PROCEDURE testproc()
DEFINE i INT;
SET DEBUG FILE TO 'C:¥tmp¥test.trace';
TRACE OFF;
TRACE 'Entering foo';
TRACE PROCEDURE;
LET i = testtoo();
TRACE ON;
LET i = i + 1;
TRACE OFF;
TRACE 'i+1 = ' || i+1;
TRACE 'Exiting testproc';
SET DEBUG FILE TO 'C:¥tmp¥test2.trace';
END PROCEDURE
トレース出力の見方
トレース出力を調べるには、エディタやユーティリティを使用してファイルの内容
の表示や読込みを行います。
SPL 文
3-49
WHILE 文
WHILE 文
WHILE 文によって、プロシジャ内に不確定なループを設定します。
構文
WHILE
条件
4-5 ページ
文ブロック
2-140 ページ
END WHILE
;
説明
条件はループの開始時に一度評価され、それ以降は繰返しの開始ごとに評価されま
す。条件が TRUE( 真 ) の間は、文ブロックが実行されます。条件が FALSE( 偽 ) と
評価されると、ループは終了します。
条件に記述されている式が NULL と評価された場合には、明示的に IS NULL 条件
を検査していない限り、この条件は自動的に FALSE( 偽 ) と評価されます。
初期化されていないプロシジャ変数を参照するため、条件に未知値が記述されて
いる場合には、即時エラーになります。この場合、ループは終了し、例外が発生
します。
3-50
Informix Guide to SQL:Syntax
WHILE 文
ストアド プロシジャの中の WHILE ループの例
次の例は、ストアド プロシジャの中の WHILE ループの例を示しています。初め
に、WHILE ループは DELETE 文を実行します。次に、INSERT 文を実行し、プロ
シジャ変数の値を増やします。
CREATE PROCEDURE simp_while()
DEFINE i INT;
WHILE EXISTS (SELECT fname FROM customer
WHERE customer_num > 400)
DELETE FROM customer WHERE id_2 = 2;
END WHILE;
LET i = 1;
WHILE i < 10
INSERT INTO tab_2 VALUES (i);
LET i = i + 1;
END WHILE;
END PROCEDURE
SPL 文
3-51
第4章
セグメント
条件セグメント . . . . . . . .
データベース名 . . . . . . . . . .
データベース オブジェクト名 . . . .
データ型 . . . . . . . . . .
日時 (DATETIME) 型フィールド修飾子 .
式 . . . . . . . . . . . .
識別子 . . . . . . . . . .
時間隔 (INTERVAL) 型フィールド修飾子
リテラル日時 (DATETIME) 型 . . . .
リテラル時間隔 (INTERVAL) 型 . . .
リテラル番号 . . . . . . . .
オプティマイザ ディレクティブ . . .
所有者名 . . . . . . . . . .
引用符付き文字列 . . . . . . .
関係演算子 . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
. .
4-5
4-22
4-25
4-27
4-31
4-33
4-112
4-129
4-132
4-135
4-138
4-140
4-153
4-156
4-160
4-2
Informix Guide to SQL:Syntax
セグメントとは、表名や式のような、SQL 文や SPL 文の構文ダイヤグラムに繰り
返し現れる言語要素です。これらの言語要素をよく理解して簡単に使用するため
に、この節で特に取り上げて説明します。
あるセグメントが SQL 文または SPL 文の構文ダイヤグラム内に現れた場合は、必
ずそのダイヤグラムはこの節の対応するセグメントの記述を指しています。
セグメントの説明範囲
各セグメントについて以下の情報を示しています。
■
セグメントの目的についての簡単な説明
■
セグメントを正しく入力する方法を示す構文ダイヤグラム
■
構文ダイヤグラム内の各入力パラメータについて説明する構文表
■
使用ルールとその図
セグメントが複数の部分で構成されている場合、各部分について同じ説明を繰り返
しています。各セグメントの説明の最後に、このマニュアルと他のマニュアルにお
ける関連情報の場所を示しています。
セグメントの説明の使い方
各セグメントの説明にある構文ダイヤグラムは、独立したダイヤグラムではなく、
SQL 文または SPL 文の構文ダイヤグラムに従属するサブダイヤグラムです。
セグメント
4-3
SQL 文または SPL 文の構文ダイヤグラムは、次の二つの方法でセグメントの説明を
参照します。
■
文の構文ダイヤグラム内のサブダイヤグラム参照ボックスは、セグメント
名と、セグメントの説明が開始されるページ番号を参照できます。
■
構文ダイヤグラムの下に記載されている表の構文列は、セグメント名と、
セグメントの説明が開始されるページ番号を参照できます。
まずその文の構文を見て、次にセグメントの完全な構文を知るために、そのセグメ
ントの説明のページを見てください。
例えば、ビュー名にデータベース名とデータベース サーバ名が指定された CREATE
VIEW 文を入力する場合には、まず、CREATE VIEW 文の構文ダイヤグラムを調べ
ます。その構文ダイヤグラムの下に記載されている表は、< ビュー > の構文として
データベース オブジェクト名セグメントを参照します。
データベース オブジェクト名セグメントのサブダイヤグラムには、データベース
名、またはデータベース名とデータベース サーバ名の両方が指定されたビューの単
純名を修飾する方法が示されています。サブダイヤグラムの構文を使用して、
ビュー名にデータベース名とデータベース サーバ名が指定されている CREATE
VIEW 文を入力してください。次の例では、データベース サーバ boston のデータ
ベース sales にビュー name_only を作成します。
CREATE VIEW sales@boston:name_only AS
SELECT customer_num, fname, lname FROM customer
この節のセグメント
この節では、次のセグメントについて説明します。
条件
データベース名
データベースオブジェクト名
データ型
日時 (DATETIME) 型フィールド修飾子
式
識別子
時間隔 (INTERVAL) 型フィールド修飾子
4-4
Informix Guide to SQL:Syntax
リテラル日時 (DATETIME) 型
リテラル時間隔 (INTERVAL) 型
リテラル番号
オプティマイザ命令
所有者名
引用符付き文字列
関係演算子
条件セグメント
条件セグメント
データが所定の条件を満足しているかどうか特定するときに、条件を使用します。
構文ダイヤグラムで条件を参照する場合には必ず、条件セグメントを使用します。
構文
AND
OR
比較条件
4-6 ページ
NOT
副問合わせにおける条件
4-15 ページ
説明
条件とは、一つまたは複数の探索条件の集まりです。オプションとして、それらを
論理演算子 AND あるいは OR でつなぐことができます。探索条件は次のようなカ
テゴリのどれかに該当します。
■
比較条件 ( フィルタあるいはブール式とも呼ばれます )
■
副問合せ文の条件
条件に対する制限
条件はそれが SELECT 文の HAVING 節あるいは副問合せの HAVING 節で使用され
る場合は、集計関数だけを含むことができます。集計関数を DELETE、SELECT ま
たは UPDATE 文の中の WHERE 節の一部である比較条件の中で使うことはできま
せん。ただしこの場合も、集計が親問合せに基づいている相関列に対するものであ
り、かつ WHERE 節が HAVING 節内の副問合せ内にあれば使用できます。
セグメント
4-5
条件セグメント
NOT 演算子オプション
条件の前に NOT を付けると、テストは NOT で修飾された条件が偽のときに真にな
ります。もし NOT が修飾している条件が未知の場合 ( 判定は NULL になります )
NOT 演算子は効力を持ちません。次の真理値表は NOT の効果を示しています。文
字 T は真の条件を表し、F は偽を表します。疑問符 (?) は未知の条件を表します。
算術演算子を使う式の一部が NULL のとき、未知の値が発生します。
NOT
T
F
F
T
?
?
比較条件 ( ブール式 )
5 種類の比較条件があります。関係演算子、BETWEEN、IN、IS NULL、および
LIKE と MATCHES です。比較条件は、単純な真偽を評価するのでしばしば論理式
( ブール式 ) とも呼ばれます。その構文を次のダイヤグラムに要約し、その後で詳
しく説明しています。
4-6
Informix Guide to SQL:Syntax
条件セグメント
比較条件
条件セグメントへ戻る
4-5 ページ
式
4-33 ページ
関係演算子
4-160 ページ
式
4-33 ページ
式
4-33 ページ
式
4-33 ページ
BETWEEN
NOT
+
式
4-33 ページ
AND
,
式
4-33 ページ
IN
(
NOT
)
リテラル番号
4-138 ページ
リテラル日時 (DATETIM)
型 4-132 ページ
リテラル時間隔
(INTERVAL) 型
4-135 ページ
引用符付き文字列
4-156 ページ
TODAY
USER
CURRENT
日時 (DATETIME) 型
フィールド修飾子
4-31 ページ
< 表 >.
SITENAME
< ビュー >.
< シノニム >.
DBSERVERNAME
< 別名 >.
<列>
IS
NULL
NOT
<列>
< 表 >.
< ビュー >.
< シノニム >.
< 別名 >.
LIKE
引用符付き
文字列
4-156 ページ
NOT
+
MATCHES
ESCAPE '< 文字 > '
<列>
セグメント
4-7
条件セグメント
要素
< 別名 >
< 文字 >
<列>
< シノニム >
<表>
< ビュー >
目的
制限
SELECT 文内でのみ使用でき
< 別名 > は SELECT 文の FROM
る、表とビュー用の一時的な代 節で定義されたはずです。
替名です。
LIKE 条件や MATCH 条件で、 4-14 ページの「LIKE における
引用符で囲んでエスケープ文字 ESCAPE」と 4-14 ページの
として使用する単一 ASCII 文字 「MATCHES における ESCAPE」
です。
を参照してください。
IS NULL 条件、または LIKE 条 列は、指定した表に存在してい
件か MATCHES 条件で使用する る必要があります。
列の名前です。
こうした条件での < 列名 > の意
味についての詳細は、4-11 ペー
ジの「IS NULL 条件」と 4-11
ページの「LIKE 条件と
MATCHES 条件」を参照してく
ださい。
指定の列があるシノニムの名前 シノニムが指し示すシノニムお
です。
よび表は存在していなければな
りません。
指定の列がある表の名前です。 表は存在していなければなりま
せん。
指定の列があるビューの名前
です。
ビューは存在していなければな
りません。
構文
識別子、
4-112 ページ
引用符付き文字列、
4-156 ページ
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
それぞれのタイプの比較条件の詳細については次を参照してください。
■
関係演算子条件については、4-9 ページの「関係演算子条件」を参照して
ください。
■
BETWEEN 条件については 4-10 ページを参照してください。
■
IN 条件については、4-11 ページを参照してください。
■
IS NULL 条件については、4-11 ページを参照してください。
■
LIKE 条件と MATCHES 条件については、4-11 ページを参照してください。
SELECT 文のコンテキストでの各種比較条件については、2-472 ページの「WHERE
節における条件の使用」を参照してください。
4-8
Informix Guide to SQL:Syntax
条件セグメント
警告 : 比較条件に日付値を指定する場合には、必ず 2 桁ではなく 4 桁の年を指定し
てください。4 桁の年を指定すると、環境変数 DBCENTURY が、データベース
サーバが比較条件を解釈する方法に影響を及ぼすことはありません。2 桁の年を指
定すると、環境変数 DBCENTURY は、データベース サーバが比較条件を解釈する
方法に影響を及ぼし、このため、比較条件が意図したとおりに動作しないことがあ
ります。環境変数 DBCENTURY についての詳細は、
『Informix Guide to SQL:
Reference』を参照してください。
条件内の引用符
列式をどのようなタイプの比較条件式内の定数式と比較するときも、次の規則を
守ってください。
■
列が数値のデータ型を持つときは、定数式を引用符 (“) で囲む必要はありま
せん。
■
列が文字 (CHARACTER) 型のデータ型を持っているときは、定数式を引用
符 (“) で囲んでください。
■
列が日付型データ型の場合は、定数式を引用符 (“) で囲まなければなりませ
ん。さもないと予測できない結果になります。
次の例は、比較条件での引用符 (‘) の正しい使用法を示しています。列 ship_instruct
は文字 (CHARACTER) 型のデータ型を持っています。列 order_date は日付型のデー
タ型を持っています。列 ship_weight は数値のデータ型を持っています。
SELECT * FROM orders
WHERE ship_instruct = 'express'
AND order_date > '05/01/98'
AND ship_weight < 30
関係演算子条件
いくつかの関係演算子条件が次の例に示されています。
city[1,3] = 'San'
o.order_date > '6/12/98'
WEEKDAY(paid_date) = WEEKDAY(CURRENT-31 UNITS day)
YEAR(ship_date) < YEAR (TODAY)
セグメント
4-9
条件セグメント
quantity <= 3
customer_num <> 105
customer_num != 105
どの式も、もし一つの行に対して NULL であれば、条件は偽となります。たとえ
ば、paid_date が NULL を持っていると、その行を抽出するのに次のどの文も使用で
きません。
SELECT customer_num, order_date FROM orders
WHERE paid_date = ''
SELECT customer_num, order_date FROM orders
WHERE NOT PAID !=''
次の例では、IS NULL 条件が NULL を見出します。IS NULL 条件については 4-11
ページの「IS NULL 条件」に詳しく説明されています。
SELECT customer_num, order_date FROM orders
WHERE paid_date IS NULL
BETWEEN 条件
BETWEEN テストが真になるためには、キーワード BETWEEN の左にある式の値が
キーワード BETWEEN の右にあるニつの式の値の範囲内 ( その値と同じ値でもよい
) になければなりません。NULL 値は条件を満たしません。範囲を定義するどちら
の式にも NULL を使用できません。
いくつかの BETWEEN 条件の例が次に示されています。
order_date BETWEEN '6/1/97' and '9/7/97'
zipcode NOT BETWEEN '94100' and '94199'
EXTEND(call_dtime, DAY TO DAY) BETWEEN
(CURRENT - INTERVAL(7) DAY TO DAY) AND CURRENT
lead_time BETWEEN INTERVAL (1) DAY TO DAY
AND INTERVAL (4) DAY TO DAY
unit_price BETWEEN loprice AND hiprice
4-10
Informix Guide to SQL:Syntax
条件セグメント
IN 条件
IN 条件は、語句 IN の左にある式が項目のリストに含まれていると満たされます。
NOT オプションを使用すると、式が項目のリストに含まれていないときに条件が満
たされる探索条件を作り出すことができます。NULL は条件を満たしません。
以下にいくつかの IN 条件の例を示さします。
WHERE state IN ('CA', 'WA', 'OR')
WHERE manu_code IN ('HRO', 'HSK')
WHERE user_id NOT IN (USER)
WHERE order_date NOT IN (TODAY)
E/C
ESQL/C では TODAY 関数は実行時に評価されます。CURRENT は、カーソルが
オープンされたとき、あるいは単一行 SELECT 文の場合は問合せが実行されたとき
に評価されます。♦
USER 関数は大文字と小文字を区別します。それは、minnie と Minnie を別の値とし
て認識します。
IS NULL 条件
IS NULL 条件は列が NULL を含んでいると満たされます。IS NOT NULL オプショ
ンを使用すると、列が NULL でない値を含んでいるときに条件が満たされます。次
は IS NULL 条件の例を示します。
WHERE paid_date IS NULL
LIKE 条件と MATCHES 条件
LIKE 条件または MATCHES 条件は文字列がマッチするかどうかをテストします。
以下のテストのどちらかが真ならば、条件は真、すなわち満たされています。
■
列の左側から調べた値が、引用符付き文字列のパターンと一致します。文
字列にワイルドカード文字を使用できます。NULL は条件を満たしません。
■
列の左側から調べた値が、列の右側で指定したパターンと一致します。列
の右側から調べた場合は、条件における一致パターンの役目を果たします。
セグメント
4-11
条件セグメント
単一の引用符 (‘) は、リテラルな引用符としてマッチさせるために引用符で囲んだ
場合のみ使用できます。キーワード ESCAPE を使用することはできません。’’’’ のよ
うな記述をすることにより、引用符を ESCAPE 文字として使用し、他のすべてのパ
ターンをマッチさせることができます。
NOT オプション
NOT オプションを使うと、列の値を左側から調べて値が NULL でなく、かつ引用
符付きの文字列で指定されたパターンと一致しないときに探索が成功するようにで
きます。たとえば次の条件は、列 lname にある Baxter で始まるすべての列を除外し
ます。
WHERE lname NOT LIKE 'Baxter%'
WHERE lname NOT MATCHES 'Baxter*'
LIKE オプション
キーワード LIKE を使用するときは、引用符付き文字列に次のようなワイルドカー
ド文字を使用できます。
ワイルドカード
意味
%
パーセント記号 (%) はあらゆる数 ( ゼロを含む ) の文字に一
致します。
_
アンダスコア (_) は単一の文字に一致します。
\
バックスラッシュ (\) は次の文字の特殊な意味を取り除きま
す (% や _ の一致には \% や \_ と記述します。使用している
端末の機種によっては、バックスラッシュは円記号 (¥) とし
て表示されます。
バックスラッシュ (\) をエスケープ文字として使用するのは、Informix を ANSI 標準
SQL に準拠させるために行った拡張です。
ANSI
4-12
ANSI 標準準拠のデータベースではエスケープ文字を、パーセント文字 (%)、アンダ
スコア文字 (_) あるいはエスケープ文字をエスケープするためにのみ使用すること
ができます。 ♦
Informix Guide to SQL:Syntax
条件セグメント
次の条件は文字列 tennis のみ、あるいはそれを含むより長い文字列たとえば tennis
ball あるいは table ness paddle に合致するかをテストします。
WHERE description LIKE '%tennis%'
次の条件は、アンダスコアを含んでいるすべての記述を調べます。バックスラッ
シュ (\) は、アンダスコア (_) 自身がワイルドカードなので必要なのです。
WHERE description LIKE '%\_%'
MATCHES オプション
キーワード MATCHES を使用すると、次のワイルドカード文字を引用符付き文字列
で使用できます。
ワイルドカード
意味
*
アスタリスク (*) はあらゆる数 ( ゼロを含む ) の文字に一致
します。
?
疑問符 (?) は単一の文字に一致します。
[...]
大かっこ ([...]) は、[a - z] のような文字範囲など、かっこで
囲まれた文字と一致します。大かっこの中の文字はエスケー
プできません。
^
大かっこ内の最初の文字としてカレット (^) を使用すると、
このカレットは、リストされていない任意の文字と一致しま
す。例えば、[^abc] は、a、b、または c 以外の任意の文字と
一致します。
\
バックスラッシュ (\) は、その次の文字の特殊な意味を取り
除きます (* または ? の一致には、\* または \? と記述します )。
使用している端末の機種によっては、バックスラッシュは円
記号 (¥) として表示されます。
次の条件は文字列 tennis のみ、あるいはそれを含むより長い文字列たとえば tennis
ball あるいは table ness paddle に合致するかをテストします。
WHERE description MATCHES '*tennis*'
次の条件は、名前が Frank であっても frank であっても真になります。
WHERE fname MATCHES '[Ff]rank'
セグメント
4-13
条件セグメント
次の条件は、F あるいは f で始まる名前はすべて真になります。
WHERE fname MATCHES '[Ff]*'
英字 a、b、c、または d で終わる名前なら、どの名前でも次の条件は真になります。
WHERE fname MATCHES '*[a-d]'
LIKE における ESCAPE
ESCAPE 節は、引用符付き文字列の中に含められたアンダスコア (_) やパーセント
記号 (%) をワイルドカードとして解釈しないようにします。もし z をエスケープ文
字として選んだ場合、文字列の中の文字 z_ は文字 _ と理解されます。同様に文字
z% はパーセント記号 (%) を表します。なお、文字列内の文字 zz は単一の文字 z で
あると理解されます。次の文は表顧客情報からアンダスコア文字を含んでいる列
company を抽出します。
SELECT * FROM customer
WHERE company LIKE '%z_%' ESCAPE 'z'
単一文字のホスト変数をエスケープ文字として使用することもできます。次の文は
エスケープ文字としてホスト変数を使用しています。
EXEC SQL BEGIN DECLARE SECTION;
char escp='z';
char fname[20];
EXEC SQL END DECLARE SECTION;
EXEC SQL select fname from customer
into :fname
where company like '%z_%' escape :escp;
MATCHES における ESCAPE
ESCAPE 節は、引用符付き文字列の中に含められた疑問符 (?) やアスタリスク (*) や
左または右大かっこ ([]) をワイルドカードとして解釈しないようにします。もし z
をエスケープ文字として選んだ場合、文字列の中の文字 z? は疑問符 (?) と理解され
ます。同様に文字 z* はアスタリスク (*) を表します。なお、文字列内の文字 zz は
単一の文字 z であると理解されます。
次の文は表 customer から疑問符 (?) を含んでいる列 company を抽出します。
SELECT * FROM customer
WHERE company MATCHES '*z?*' ESCAPE 'z'
4-14
Informix Guide to SQL:Syntax
条件セグメント
副問合せ文付き条件
問合わせ文
付条件
条件セグメントへ戻る
4-5 ページ
IN 副問合わせ
4-16 ページ
EXISTS 副問合わせ
4-17 ページ
ALL/ANY/SOME 副問合わせ
4-18 ページ
条件中に SELECT 文を使用できます。この組合せを副問合せと呼びます。次のよう
な機能を実行するために SELECT 文で副問合せを使用できます。
■
他の SELECT 文の結果をある式と比較する
■
ある式が他の SELECT 文の結果に含まれているかを判定する
■
他の SELECT 文が行を選択したかどうかを問い合せる
副問合せは外側にある SELECT 文によって評価されている現行の行に依存する場合
があります。このケースの場合、その副問合せは相関副問合わせになります。
以降の節では、副問合せ条件の種類と、その構文を示します。SELECT 文のコンテ
キストでの各種副問合せ条件については、2-472 ページの「WHERE 節における条件
の使用」を参照してください。
それが使用されるコンテキストにより、副問合わせは、単一値、あるいは値のセッ
トを返すか、値がないという結果を返します。副問合わせが値を返す場合は必ず単
一の列を選択します。副問合せが単に行 ( または複数の行 ) が存在するかどうかを
検査する場合は、それが選択する行数にも列数にも制限はありません。副問合せは
ORDER BY 節を含むことはできません。SELECT 文の構文については 2-450 ページ
で詳細に述べられています。
セグメント
4-15
条件セグメント
IN 副問合せ
副問合わせ文付き条件へ戻る
4-15 ページ
IN
副問合わせ
式
4-33 ページ
IN
(
副問合わせ文付き条件
4-15 ページ
)
NOT
IN 副問合せ条件は、副問合せが選択した値の一つまたは複数に式の値がマッチする
と真になります。副問合せは、列については必ず 1 列しか返しませんが、行数は一
つまたはそれ以上を返すことができます。キーワード IN はシーケンス ANY シーケ
ンスと同意語です。キーワード NOT IN は !=ALL シーケンスと同義語です。4-18
ページの「ALL/ANY/SOME 副問合わせ」を参照してください。
以下の IN 副問合せの例では baseball gloves(stock_num=1) を含まない orders の注文番
号 (order_num) を探索します。
WHERE order_num NOT IN
(SELECT order_num FROM items WHERE stock_num = 1)
IN 副問合せが行の存在のみをテストするので、副問合せの結果が重複した行であっ
ても主問合せの結果に影響を与えません。そのため、副問合せにキーワード
UNIQUE あるいは DISTINCT を加えても問合せの結果に対しては効果がありませ
ん。ただし、重複行をテストしないようにすると問合せに必要な時間を削減できる
という効果はあります。
4-16
Informix Guide to SQL:Syntax
条件セグメント
EXISTS 副問合せ
副問合わせ文付き条件へ戻る
4-15 ページ
EXISTS
副問合わせ
EXISTS
(
副問合わせ文付き条件
4-15 ページ
)
NOT
EXISTS 副問合せ条件は副問合せが一つの行を返すと真になります。EXISTS 副問合
せの場合一つまたはそれ以上の列を返すことができます。副問合せは常に主問合せ
にある表の列に対する参照を含んでいます。EXISTS 副問合せで集計関数を使用す
ると、少なくとも一つの行が必ず返されます。
次の EXISTS 副問合せ付きの SELECT 文の例は、注文されたことがない ( したがっ
て表 items にリストされていない ) 取扱品目番号とメーカーコードを返します。こ
こでは表 items 中の stock_num と manu_code をテストするために副問合せを使用し
ているので、この SELECT 文での EXISTS 副問合せの使い方は適切です。
SELECT stock_num, manu_code FROM stock
WHERE NOT EXISTS (SELECT stock_num, manu_code FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code)
前出の例は列名の代わりに SELECT* を使用しても、特定の列だけではなく行全体
に対し存在がテストされるので同様に適切に機能します。
セグメント
4-17
条件セグメント
ALL/ANY/SOME 副問合わせ
副問合わせ付き条件へ戻る
4-15 ページ
ALL/ANY/SOME
副問合わせ
式
4-33 ページ
(
関係演算子
4-160 ページ
副問合わせ付き条件
4-15 ページ
)
ALL
ANY
SOME
キーワード ALL、ANY、SOME は、何が条件を真または偽にするかを指定します。
キーワード ANY を使用したときに真となる探索条件がキーワード ALL を使用した
ときに真にならない場合があり、またその逆の場合もあります。
キーワード ALL の使用
キーワード ALL は、副問合せが返す値すべてで比較が真になっている場合に探索条
件が真になることを示します。副問合せが値を返さない場合にも、条件は真になり
ます。
ALL 副問合せの次の例では、最初の条件はそれぞれの total_price が注文番号 0123
にあるそれぞれの注文品目の合計金額よりも大きいかどうかをテストしています。
二番目の条件は同じ結果を生み出すのに MAX 集計関数を使用しています。
total_price > ALL (SELECT total_price FROM items
WHERE order_num = 1023)
total_price > (SELECT MAX(total_price) FROM items
WHERE order_num = 1023)
ALL 副問合せでキーワード NOT を使用すると、副問合せ値すべてで式が真でない
かどうかがテストされます。例えば、式 total_price が、どの選択値よりも大きくな
い場合、次の条件は真になります。すなわち、total_price が、注文番号 1023 の最大
合計金額より大きくない場合、次の条件は真になります。
NOT total_price > ALL (SELECT total_price FROM items
WHERE order_num = 1023)
4-18
Informix Guide to SQL:Syntax
条件セグメント
キーワード ANY または SOME の使用
キーワード ANY は、返される値の少なくとも一つで比較が真になっている場合に
探索条件が真になることを示します。副問合せが値を返さない場合には、探索条件
は偽になります。キーワード SOME は、ANY の別名です。
次の条件では、合計金額が注文番号 1023 にある注文品目の合計金額の少なくとも
どれか一つよりも大きいとき真になります。最初の条件はキーワード ANY を使用
しています。二番目では集計関数 MIN が使われています。
total_price > ANY (SELECT total_price FROM items
WHERE order_num = 1023)
total_price > (SELECT MIN(total_price) FROM items
WHERE order_num = 1023)
ANY 副問合せでキーワード NOT を使用すると、式が副問合せの値のどれに対して
も真でないことをテストします。次の例として条件は式 total_price が選択された値
のどれよりも大きくなければ真になります。すなわち、total_price が注文番号 1023
のどの合計金額よりも大きくなければ真になります。
NOT total_price > ANY (SELECT total_price FROM items
WHERE order_num = 1023)
キーワード ANY、ALL あるいは SOME の省略
副問合せが必ず一つの値だけを返すことが分かっている場合は、副問合せからキー
ワード ANY、ALL あるいは SOME を省略できます。もしキーワード ANY、ALL
あるいは SOME を省略し、副問合せが一つ以上の値を返すとエラーメッセージを受
け取ることになります。次の例の副問合せは、集計関数を使っているので一つの行
だけを返します。
SELECT order_num FROM items
WHERE stock_num = 9 AND quantity =
(SELECT MAX(quantity) FROM items WHERE stock_num = 9)
セグメント
4-19
条件セグメント
AND あるいは OR を持った条件
単純な条件を論理演算子 AND あるいは OR と結合して複雑な条件を作成すること
ができます。次の SELECT 文はその WHERE 節に複雑な条件の例を含んでいます。
SELECT customer_num, order_date FROM orders
WHERE paid_date > '1/1/97' OR paid_date IS NULL
SELECT order_num, total_price FROM items
WHERE total_price > 200.00 AND manu_code LIKE 'H%'
SELECT lname, customer_num FROM customer
WHERE zipcode BETWEEN '93500' AND '95700'
OR state NOT IN ('CA', 'WA', 'OR')
次の真理値表は演算子 AND と OR の効果を示しています。文字 T は真の条件を、F
は偽の条件を、疑問符 (?) は未知の条件を表します。論理演算子を使用する式の一
部が NULL であるとき、未知の値が発生します。
AND
T
F
?
OR
T
F
?
T
T
F
F
F
?
T
T
T
T
F
F
F
T
F
?
?
?
F
?
?
T
?
?
もしブール式の評価が UNKOWN( 未知 ) になると、条件は満たされません。
WHERE 節内の次の例を考えます。
WHERE ship_charge/ship_weight < 5
AND order_num = 1023
order_num=1023 の行は ship_weight が NULL です。ship_weight が NULL なので
ship_charge/ship_weight も NULL です。そのために ship_charge/ship_weight<5 の真理
値は UNKNOWN になります。order_num=1023 は真なので、真理値表の AND 表は
全体の条件の真理値は UNKNOWN になることを示しています。結果として、その
行は選択されません。条件に AND ではなく OR が使われていれば、条件は真にな
ります。
4-20
Informix Guide to SQL:Syntax
条件セグメント
参照
SELECT 文中の条件および副問合せ文付き条件についての説明は『Informix Guide to
SQL: Tutorial』を参照してください。
GLS の側面から見た SELECT 文の情報については、『Informix Guide to GLS
Functionality』を参照してください。
セグメント
4-21
データベース名
データベース名
データベース名構文は、構文ダイヤグラムのデータベース名を参照する場所で使用
します。データベース名は次の文で使用されます。
構文
< データ
ベース名 >
@<DB サーバ名 >
' //<DB サーバ名 >/< データベース名 > '
E/C
要素
< データベース名 >
<DB サーバ名 >
< データベース環境変数 >
目的
制限
データベースの名 データベース名は、同じデータベース サーバ
前です。
のデータベース名間で一意になっていなけれ
この名前はパス名 ばなりません。データベース名では、大文字
と小文字を区別しません。
やデータベース
構文
識別子、
4-112 ページ
サーバ名を含んで データベースサーバ を使用している場合、
データベース名には、最大 18 文字を使用でき
いません。
ます。
< データベース名 <DB サーバ名 > で指定したデータベース サー 識別子、
> のデータベース バは、ファイル sqlhosts のデータベース サー 4-112 ページ
が常駐するデータ バの名前と一致していなければなりません。
ベースサーバの名 < データベース名 > とアット記号 (@) 間には
前です。
空白を入れることも、空白を省略することも
できます。アット記号 (@) と <DB サーバ名 >
の間には空白を入れることができません。
< データベース環境 データベース環境 変数固定長の文字データ型でなければなりま 変数名は、変
を表すホスト変数 せん。
数名に適用さ
変数 >
です。
れる言語固有
の規則に従っ
ている必要が
あります。
4-22
Informix Guide to SQL:Syntax
データベース名
説明
データベース名は、大文字小文字を区別しません。データベース名に、区切り識別
子は使用できません。データベースを作成する場合、データベースに割り当てる名
前の長さは、最大 18 文字 ( を含む ) まで可能です。
GLS
デフォルト以外のロケールを使用する場合、データベース名に、ロケールのコード
セットの文字を使用できます。詳細は、
『Informix Guide to GLS Functionality』に記載
されているデータベースの命名方法を参照してください。 ♦
データベース サーバの指定
データベース サーバ名を指定すれば、現行のデータベースとして、別のデータベー
ス サーバ上のデータベースを選択することができます。<DB サーバ名 > で指定さ
れたデータベース サーバは、sqlhosts 情報にリストされているデータベース サーバ
名と一致する必要があります。
@ 記号の使用
@ 記号は、データベース サーバ名を導入するリテラル文字です。データベース
サーバ名を指定する場合には、@ 記号とデータベース サーバ名の間に空白を入れな
いでください。データベース名と @ 記号の間には、空白を入れることも、空白を省
略することもできます。
次の例に、有効なデータベース指定を示します。
empinfo@personnel
empinfo @personnel
上記例で、empinfo は、データベースの名前で、personnel は、データベース サーバ
の名前です。
セグメント
4-23
データベース名
パス型命名方法の使用
パス型命名方法を使用する場合には、次の例で示すように、引用符、スラッシュ、
および名前の間に空白を入れないでください。
'//personnel/empinfo'
上記例で、empinfo は、データベースの名前で、personnel は、データベース サーバ
の名前です。
<DB サーバ名 > を含むデータベース名とディレクトリ パスの最大長は 128 文字です。
E/C
ホスト変数の使用
ESQL/C アプリケーション内でホスト変数を使用すれば、データベース環境を表す
値を指定することができます。
4-24
Informix Guide to SQL:Syntax
データベース オブジェクト名
データベース オブジェクト名
制約、インデックス、プロシジャ、トリガ、表、シノニム、またはビューの名前を指
定するときには、データベース オブジェクト名セグメントを使用します。データベー
ス オブジェクト名を参照する場合には必ず、このセグメントを使用してください。
構文
< オブジェ
クト >
+
:
< データ
ベース >
所有者名
4-153 ページ
.
@<DB サーバ名 >
要素
< データベース >
<DB サーバ名 >
< オブジェクト >
目的
データベース オブジェクト
が存在しているデータベー
スの名前です。
データベースが存在してい
るデータベース サーバの名
前です。
制限
データベースは存在していなければな
りません。
構文
識別子、
4-112 ページ
データベース サーバは存在していなけ
ればなりません。
識別子、
4-112 ページ
@ 記号と <DB サーバ名 > の間に空白を
入れることはできません。
データベース内のデータ
データベース オブジェクトを作成する 識別子、
ベース オブジェクトの名前 場合には、文字制限があります。詳細
4-112 ページ
です。
は、4-112 ページの「識別子」を参照し
てください。
データベース オブジェクトにアクセス
する場合、データベース オブジェクト
は存在していなければなりません。
セグメント
4-25
データベース オブジェクト名
説明
データベース オブジェクトを作成したり、名前を変更したりする場合、指定する名
前は、データベース内の同タイプのほかのデータベース オブジェクトに関して一意
になっている必要があります。例えば、新規制約名は、データベース内にある制約
名間で一意になっている必要があります。
表、シノニム、またはビューの新規名前は、データベース内にすでに存在している
表、シノニム、ビュー、および一時表すべてで一意になっている必要があります。
ANSI
ANSI 標準準拠のデータベースでは、< 所有者名 >.< オブジェクト > の組み合わせ
は、任意のデータベース内で一意になっている必要があります。
ユーザは、自分が所有していないデータベース オブジェクトの場合、データベース
オブジェクト名に、その所有者名を指定する必要があります。例えば、自分が所有
していない表を指定する場合には、その表の所有者も指定する必要があります。シ
ステム カタログ表すべての所有者は Informix です。 ♦
GLS
デフォルト以外のロケールを使用する場合、データベース オブジェクト名で、ロ
ケールのコード セットの文字を使用できます。詳細は、
『Informix Guide to GLS
Functionality』を参照してください。 ♦
名前が同じプロシジャと SQL 関数
SQL 関数と名前が同じプロシジャを作成した後、その名前を明示的にプロシジャと
して定義すると、その名前による呼出しは、SQL 関数ではなく、該当するプロシ
ジャになります。すなわち、そのプロシジャが定義されている文ブロックのシステ
ム関数は使用できません。
完全修飾識別子
所有者、データベース名、およびデータベース サーバ名が指定されているデータ
ベース オブジェクト名は完全修飾識別子と呼ばれます。
次の例に、完全修飾表名を示します。
empinfo@personnel:markg.emp_names
この例で、empinfo はデータベース名で、personnel はデータベース サーバ名です。
markg は表の所有者の名前で、emp_names は表名です。
4-26
Informix Guide to SQL:Syntax
データ型
データ型
データ型セグメントは、列または値のデータ型を指定します。構文ダイヤグラムの
データ型を参照する場合は、必ずデータ型セグメントを使用してください。
構文
CHAR
(
CHARACTER
GLS
+
)
size
(1)
NCHAR
DATE
DATETIME
日時 (DATETIME) 型フィールド修飾子
4-31 ページ
DECIMAL
(
DEC
)
< 精度 >
, < スケール >
16
NUMERIC
FLOAT
(
<float 型精度 >
)
DOUBLE PRECISION
INTEGER
INT
時間隔 (INTERVAL) 型フィールド修飾子
4-129 ページ
INTERVAL
+
MONEY
(
)
< 精度 >
16
,2
, < スケール >
データ型の追加 4-28 ページ
セグメント
4-27
データ型
データ型の追加
追加の
データ型
データ型へ戻る
4-27 ページ
+
SERIAL
(1)
(
+
start
)
SMALLFLOAT
REAL
SMALLINT
+
TEXT
+
BYTE
TABLE
IN
IDS
<BLOB 領域 >
OPT
< ファミリ名 >
VARCHAR
GLS
NVARCHAR
(
)
< 最大 >
,
< 予約 >
,0
CHARACTER VARYING
4-28
Informix Guide to SQL:Syntax
データ型
要素
<BLOB 領域 >
< ファミリ名 >
目的
制限
既存の BLOB 領域の名前です。 BLOB 領域は存在していなければ
なりません。
引用符で囲んだ文字列定数で
ファミリ名または変数名は存在し
す。光ファミリ内のファミリ名 ていなければなりません。
または変数名を指定します。
光ファミリについての詳細は、
『Guide to the Optical Subsystem』を
参照してください。
<float 型の精度 > float 型の精度は無視されます。 正の整数を指定しなければなりま
せん。
可変文字 (CHARACTER
1 ∼ 255 バイト ( を含む ) の整数
< 最大 >
値を指定しなければなりません。
VARYING) 型列、可変長文字
(VARCHAR) 型列、または各国 列にインデックスを配置する場
語可変長文字 (NVARCHAR) 型 合、< 最大 > に指定できる最大値
列の最大サイズ ( 単位はバイト ) は 254 バイトです。
です。
< 精度 >
10 進数 (DECIMAL) データ型ま 1 ∼ 32( を含む ) の整数を指定し
たは金額 (MONEY) データ型の なければなりません。
最大有効桁数です。
列に格納される実際のバイト数 0 ∼ 255 バイトの整数を指定しな
< 予約 >
が < 予約 > より少ない場合で
ければなりません。ただし、< 予
も、可変文字 (CHARACTER
約 > に指定する値は、< 最大 > に
指定する値より小さくなければな
VARYING) 型列、可変長文字
(VARCHAR) 型列、または各国 りません。
語可変長文字 (NVARCHAR) 型
列用に予約される領域量 ( 単位
はバイト ) です。
< スケール >
< サイズ >
< 開始 >
< 予約 > のデフォルト値は 0
です。
小数点の右側の桁数です。
文字 (CHAR) 型列または各国語
文字 (NCHAR) 型列のバイト数
です。
シリアル (SERIAL) 型列の値の
開始番号です。
1 から < 精度 > までの整数を指定
しなければなりません。
1 ∼ 32,767 バイト ( を含む ) 整数
を指定しなければなりません。
構文
識別子、
4-112 ページ
引用符付き文字
列、4-156 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
0 より大きく、2,147,483,647 よ
り小さい整数を指定しなければな 4-138 ページ
りません。
詳細は、
『Informix Guide to SQL: Reference』に記載されているデータ型すべてを参照
してください。
セグメント
4-29
データ型
固定長データ型と可変長データ型
文字 (CHAR) 型データは、固定長文字データです。可変長文字データを指定するとき
には、ANSI 標準準拠の可変文字 (CHARACTER VARYING) データ型を使用します。
Informix の可変長文字 (VARCHAR) 型を使用しても、可変長データを指定できます。
各国語文字 (NCHAR) データ型と各国語可変長文字 (NVARCHAR)
データ型
GLS
各国語文字 (NCHAR) データ型と各国語可変長文字 (NVARCHAR) データ型につい
ては、
『Informix Guide to GLS Functionality』を参照してください。 ♦
参照
個々のデータ型については、
『Informix Guide to SQL: Reference』を参照してください。
データ型の概要については、
『Informix Guide to Database Design and Implementation』
を参照してください。
各国語文字 (NCHAR) データ型と各国語可変長文字 (NVARCHAR) データ型、およ
びほかの文字データ型の GLS に関する側面については、
『Informix Guide to GLS
Functionality』を参照してください。
4-30
Informix Guide to SQL:Syntax
日時 (DATETIME) 型フィールド修飾子
日時 (DATETIME) 型フィールド修飾子
日時 (DATETIME) 型フィールド修飾子は、日時 (DATETIME) 型の列または値内の
最大と最小の時間単位を指定します。構文ダイヤグラムの日時型フィールド修飾子
を参照する場合は、必ず日時型フィールド修飾子セグメントを使用してください。
構文
YEAR
MONTH
TO YEAR
DAY
TO MONTH
HOUR
MINUTE
TO DAY
TO HOUR
SECOND
TO MINUTE
FRACTION
TO SECOND
TO FRACTION
(3 )
< 数字 >
要素
< 数字 >
目的
秒の小数部の有効桁数を指定す
る単一の正数です。
制限
1 から 5 までの整数を指定しな
ければなりません。
Syntax
リテラル番号、
4-138 ページ
デフォルト値は 3 桁です
(1000 分の 1 秒 )。
セグメント
4-31
日時 (DATETIME) 型フィールド修飾子
説明
最初の日時 (DATETIME) 型値に最大単位を指定します。キーワード TO の後に、こ
の値の最小単位を指定します。このキーワードは、次の値が日時 (DATETIME) 型列
で使用されることを意味します。
時間の単位
意味
YEAR
A.D.1 から 9999 までの年数を指定します。
MONTH
1 から 12 までの月数を指定します。
DAY
特定の月で 1 から 31 までの日数を指定します。
HOUR
0( 真夜中 ) から 23 までの時間数を指定します。
MINUTE
0 から 59 までの分数を指定します。
SECOND
0 から 59 までの秒数を指定します。
FRACTION
小数点 5 桁までの秒端数を指定します。
デフォルトスケールは 3 桁(1/1000 秒)です。
次の例は、日時 (DATETIME) 型修飾子を示しています。
DAY TO MINUTE
YEAR TO MINUTE
DAY TO FRACTION(4)
MONTH TO MONTH
参照
日時 (DATETIME) 型フィールド修飾子の説明については、
『Informix Guide to SQL:
Reference』の日時 (DATETIME) 型を参照してください。
4-32
Informix Guide to SQL:Syntax
式
式
式は、データベースまたはデータベースサーバに含まれている、またはそこから導
出される一つまたは複数のデータです。構文ダイヤグラムの式を参照する場合は、
必ず式セグメントを使用してください。
構文
+
*
/
||
列式 4-35 ページ
+
条件式 4-38 ページ
定数式 4-47 ページ
関数式 4-54 ページ
集計式 4-96 ページ
プロシジャ呼出し式
4-110 ページ
< 変数 >
(
式
)
セグメント
4-33
式
要素
< 変数名 >
目的
プログラム変数またはホスト変
数の名前です。
変数に格納されている値は、構
文ダイヤグラムに示されている
式のタイプのひとつです。
制限
< 変数名 > に格納されている式
は、このタイプの式に適用され
る規則に従っていなければなり
ません。
構文
変数名は、変数名に
適用される言語固有
の規則に従っている
必要があります。
識別子、4-112 ページ
説明
式は、数多くの基本項目で構成されます。次のリストで、各項目について説明します。
式を組み合わすときには、こうした式を加算、減算、乗算、および除算に対応する
算術演算子で接続します。
連結演算子
連結演算子 (||) は、二つの式を連結するために使用します。次の例ではいくつかの
連結式の組合せを示しています。最初の例では、列 zipcode を列 lname の最初の三
文字に連結しています。2 番目の例では、suffix .dbg を file_variable という名前のホ
スト変数の内容に連結しています。3 番目の例では、TODAY 関数から戻された値
を文字列 Date に連結しています。
lname[1,3] || zipcode
:file_variable || '.dbg'
'Date:' || TODAY
4-34
Informix Guide to SQL:Syntax
式
E/C
連結演算子は、埋込み言語のみで使用できる文では使用できません。ESQL/C のみ
で使用できる文を次に示します。
ALLOCATE DESCRIPTOR 文
CLOSE 文
CREATE PROCEDURE FROM 文
DEALLOCATE DESCRIPTOR 文
DECLARE 文
DESCRIBE 文
EXECUTE 文
EXECUTE IMMEDIATE 文
FETCH 文
FLUSH 文
FREE 文
GET DESCRIPTOR 文
GET DIAGNOSTICS 文
OPEN 文
PREPARE 文
PUT 文
SET CONNECTION 文
SET DESCRIPTOR 文
WHENEVER 文
DECLARE 文内の SELECT、INSERT、または EXECUTE PROCEDURE の各文で、連
結演算子を使用することができます。
PREPARE 文内の SQL 文で連結演算子を使用することができます。♦
列式
次のダイヤグラムは列式の構文を示しています。
列式
式へ戻る 4-33 ページ
<列>
< 表 >.
+
[< 最初の位置 >、
< 最後の位置 >]
< ビュー >.
< シノニム >.
< 別名 >.
+
IDS
ROWID
セグメント
4-35
式
要素
< 別名 >
目的
SELECT 文の範囲内で使用でき
る表やビューの一時的な代替名
です。
この代替名は SELECT 文の
FROM 節で指定します。
指定する列の名前です。
<列>
< 最初の位置 > 選択している列での最初の文字
の位置です。
< 最後の位置 > 選択している列での最後の文字
の位置です。
制限
制限は、< 別名 > が指定される
SELECT 文の節に依存します。
構文
識別子、4-112 ページ
制限は、< 列 > が指定される文
によって違います。
列のタイプはバイト (BYTE) 型
文字 (CHAR) 型、各国語文字
(NCHAR) 型、各国語可変長文
字 (NVARCHAR) 型、テキスト
(TEXT) 型、または可変長文字
(VARCHAR) 型のいずれかのタ
イプでなければなりません。
列のタイプは、バイト (BYTE)
型、文字 (CHAR) 型、各国語文
字 (NCHAR) 型、各国語可変長
文字 (NVARCHAR) 型、テキス
ト (TEXT) 型、または可変長文
字 (VARCHAR) 型のいずれかの
タイプでなければなりません。
シノニムが指し示すシノニムお
よび表は存在していなければな
りません。
表は存在していなければなりま
せん。
識別子、4-112 ページ
< シノニム >
指定の列があるシノニムの名前
です。
<表>
指定の列がある表の名前です。
< ビュー >
指定の列があるビューの名前です。 ビューは存在していなければな
りません。
次の例は列式を示しています。
company
items.price
cat_advert [1,15]
4-36
Informix Guide to SQL:Syntax
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
式
列を、別の表にある同じ名前の列と識別する必要がある場合には、表名または別名
を使用します。次の SELECT 文の例では、表 customer および表 orders の列
customer_num を識別しています。最初の例では、列名の前に表名を指定していま
す。2 番目の例では、列名の前に表の別名を指定しています。
SELECT * FROM customer, orders
WHERE customer.customer_num = orders.customer_num
SELECT * FROM customer c, orders o
WHERE c.customer_num = o.customer_num
文字型列でサブスクリプトを使用する方法
文字 (CHAR) 型、可変長文字 (VARCHAR) 型、各国語文字 (NCHAR) 型、各国語可
変長文字 (NVARCHAR) 型、バイト (BYTE) 型、テキスト (TEXT) 型の列にサブスク
リプトを使用することができます。サブスクリプトは、式に含まれている文字の開
始位置と終了位置を示しています。列サブスクリプトは列副文字列を定義します。
列副文字列は式に含まれる列の一部です。
たとえば、表 customer の列 lname の値が Greenburg である場合、次の式は burg の
値を示します。
lname[6,9]
GLS
列サブスクリプトと副文字列の GLS 側面については、
『Informix Guide to GLS
Functionality』を参照してください。 ♦
IDS
行 ID の使用
Dynamic Server では表の行に関連付けられた行 ID 列を、行のプロパティとして使用
することができます。行 ID 列は WITH ROWIDS 節を使用して作成された列で、断
片化されていない表、あるいは断片化されている表のどちらにおいても本質的には
隠れた列です。行 ID 列は各行に対して一意である必要がありますが、順次になっ
ている必要はありません。Informix は、アクセス方法として行 ID 列を利用するより
も主キーを使用することをお勧めします。
セグメント
4-37
式
次の例では、SELECT 文でのキーワード ROWID の使用方法を示しています。
SELECT *, ROWID FROM customer
SELECT fname, ROWID FROM customer
ORDER BY ROWID
SELECT HEX(rowid) FROM customer
WHERE customer_num = 106
最後の SELECT 文の例は、行の格納場所のページ番号 (0x の後の最初の 6 桁 ) とス
ロット番号 ( 最後の 2 桁 ) の抽出方法を示しています。
キーワード ROWID は、集計関数を含む問合せの選択対象の並びでは使用できません。
条件式
条件式が返す値は、条件テストの結果によって違ってきます。次のダイヤグラム
に、条件式の構文を示します。
条件式
式へ戻る 4-33
CASE 式
4-39 ページ
NVL 関 数
4-43 ページ
DECODE 関数
4-44 ページ
4-38
Informix Guide to SQL:Syntax
式
CASE 式
CASE 式を使用すれば、SELECT 文などの SQL 文は、複数の条件テストのどれが真
と評価されるかによって、複数の結果のうちの一つを返すことができます。CASE
式 には、次のダイヤグラムに示されているように、汎用 CASE 式と線形 CASE 式の
2 種類のフォームがあります。
条件式へ戻る 4-33 ページ
CASE 式
汎用 CASE 式
4-40 ページ
IDS
線形 CASE 式
4-41 ページ
CASE 式の使用
SQL 文 ( 例えば、SELECT 文の選択リスト ) で列式を使用できる場合には必ず、汎用
CASE 式または線形 CASE 式を使用できます。CASE 式には、WHEN 節を少なくとも
一つ指定する必要があります。それ以降の WHEN 節と ELSE 節はオプションです。
探索条件内の式、または結果値式には、副問合せを指定することができます。
CASE 式は、別の CASE 式に入れ子にすることができます。
集計式内に CASE 式が指定されている場合、その CASE 式内では集計関数を使用で
きません。
セグメント
4-39
式
汎用 CASE 式
汎用 CASE 式は、WHEN 節内の条件が真かどうかテストします。また、条件が真で
あることがわかると、THEN 節に指定された結果を返します。
CASE 式へ戻る 4-39 ページ
汎用 CASE 式
CASE
WHEN
条件
4-5 ページ
THEN
<式>
NULL
END
ELSE
<式>
NULL
要素
<式>
目的
所定のデータ型の結果値を返す
式です。
制限
構文
式、4-33 ページ
THEN 節の < 式 > のデータ型
は、ほかの THEN 節のほかの値
式のデータ型と互換性がなくて
はなりません。
データベース サーバは、文に指定されている順に WHEN 節を処理します。探索条
件が真と評価される WHEN 節を検出すると直ちに、対応する結果値式を、CASE 式
の全体の結果とし、その CASE 式の処理を停止します。
どの WHEN 条件も真でない場合、データベース サーバは、ELSE 節の結果を全体の
結果とします。どの WHEN 条件も真でなく、ELSE 節も指定されていない場合は、
結果の値は NULL になります。IS NULL 条件を使用すれば、NULL 値を処理するこ
とができます。NULL 値の処理方法については、4-11 ページ「IS NULL 条件」を参
照してください。
4-40
Informix Guide to SQL:Syntax
式
次の例では、SELECT 文の選択リストでの汎用 CASE 式の使用を示します。この例
では、ユーザは、各顧客の名前と住所だけでなく、該当する顧客に存在する問題数
に基づく計算結果も検索します。
SELECT cust_name,
CASE
WHEN number_of_problems = 0
THEN 100
WHEN number_of_problems > 0 AND number_of_problems < 4
THEN number_of_problems * 500
WHEN number_of_problems >= 4 and number_of_problems <= 9
THEN number_of_problems * 400
ELSE
(number_of_problems * 300) + 250
END,
cust_address
FROM custtab
汎用 CASE 式では、結果はすべて同型であるか、共通互換型と評価されなければな
りません。一部の WHEN 節の結果が、同型でないか、相互に互換性のある型の値
と評価されない場合には、エラーが発生します。
線形 CASE 式
IDS
Dynamic Server では、線形 CASE 式は、キーワード CASE の直後に指定された値式
と、WHEN 節に指定された値式が一致するかどうかテストします。
線形 CASE 式
CASE
式へ戻る 4-39 ページ
<式>
WHEN
<式>
THEN
<式>
NULL
END
ELSE
<式>
NULL
セグメント
4-41
式
要素
<式>
目的
所定のデータ型の値と評価する
式、または所定のデータ型の結
果値を返す式です。
制限
WHEN 節のキーワード WHEN
の直後に指定された < 式 > の
データ型は、キーワード CASE
の直後に指定された値式のデー
タ型と互換性がなくてはなりま
せん。
構文
式、4-33 ページ
THEN 節の < 式 > のデータ型
は、ほかの THEN 節のほかの値
式のデータ型と互換性がなくて
はなりません。
まず、データベース サーバは、キーワード CASE の直後に指定された値式を評価し
ます。次に、CASE 式に指定されている順に WHEN 節を処理します。データベース
サーバは、キーワード WHEN の後の値式が、キーワード CASE の直後に指定されて
いる値式と同値と評価される WHEN 節を検出すると直ちに、キーワード THEN の
直後の値式を、CASE 式の全体の結果とし、その CASE 式の処理を停止します。
どのキーワード WHEN の直後の値式も、キーワード CASE の直後の値式と同値と評
価されない場合、データベース サーバは、ELSE 節の結果値式を、CASE 式の全体
の結果とします。どの WHEN 節のキーワード WHEN の直後の値式も、キーワード
CASE の直後の値式と同値と評価されず、ユーザが ELSE 節を指定していない場合
は、結果の値は NULL になります。
4-42
Informix Guide to SQL:Syntax
式
次の例では、SELECT 文の選択リストでの線形 CASE 式を示します。映画タイトル
表内の映画ごとに、SELECT 文により、映画のタイトル、映画の費用、および映画
の種類が表示されます。この文では、CASE 式 を使用して、各映画の種類を導出し
ます。
SELECT title,
CASE movie_type
WHEN 1 THEN 'HORROR'
WHEN 2 THEN 'COMEDY'
WHEN 3 THEN 'ROMANCE'
WHEN 4 THEN 'WESTERN'
ELSE 'UNCLASSIFIED'
END,
our_cost
FROM movie_titles
線形 CASE 式では、全 WHEN 節内の値式の型は、キーワード CASE の直後に指定さ
れている値式の型と互換性がなければなりません。
NVL 関数
IDS
Dynamic Server では、NVL 式は、その最初の引数が NULL と評価されるかどうかに
よって異なる結果を返します。
CASE 式へ戻る 4-39 ページ
NVL 関数
NVL
要素
< 式 1>
< 式 2>
(
< 式 1>
目的
所定のデータ型の値と評価する
式、または所定のデータ型の結
果値を返す式です。
,
< 式 2>
)
制限
構文
式は、ホスト変数、またはバイ 式、4-33 ページ
ト (BYTE) またはテキスト
(TEXT) の各データ型になること
はできません。< 式 1> と
< 式 2> の値は、互換データ型と
評価されなければなりません。
セグメント
4-43
式
NVL は、< 式 1> を評価します。< 式 1> が NULL でないと、NVL は、< 式 1> の値
を返します。< 式 1> が NULL の場合、NVL は、< 式 2> の値を返します。式 < 式 1>
と < 式 2> は、共通互換型と評価される限り、どのようなデータ型も使用できます。
表 employees の列 addr の行の中に NULL 値が指定されているものがあるときに、
ユーザが、こうした行に対応してラベル Address unknown を出力できるようにした
いとします。ユーザは、次の SELECT 文を入力して、列 addr に NULL 値が指定され
ている場合にラベル Address unknown が表示されるようにします。
SELECT fname, NVL (addr, 'Address unknown') AS address
FROM employees
DECODE 関数
IDS
Dynamic Server では、DECODE 式は、指定の列で検出された値によって異なる結果
が出力される点で、CASE 式とよく似ています。
DECODE 関数
CASE 式へ戻る 4-39 ページ
,
DECODE
(
<式>
<WHEN 式 >
,
)
<THEN 式 >
NULL
,
<ELSE 式 >
NULL
要素
<式>
<ELSE 式 >
<THEN 式 >
目的
所定のデータ型の値と評価する
式、または所定のデータ型の結
果値を返す式です。
制限
<WHEN 式 > のデータ型は、
< 式 > のデータ型と互換性がな
ければなりません。
構文
式、4-33 ページ
<WHEN 式 >
式 < 式 >、<WHEN 式 >、および <THEN 式 > は必須です。DECODE は、< 式 > を評
価した後、これを <WHEN 式 > と比較します。<WHEN 式 > の値が、< 式 > の値と
一致すると、DECODE は、<THEN 式 > を返します。
4-44
Informix Guide to SQL:Syntax
式
式 <WHEN 式 > と <THEN 式 > は、ペアです。DECODE 関数では、このペアをい
くつでも指定することができます。どのような場合も、このペアの最初のメンバ
を < 式 > と比較し、一致すると、そのペアの次のメンバを返します。
どの式も < 式 > と一致しない場合、DECODE は、<ELSE 式 > を返します。ただし、
どの式も < 式 > と一致せず、ユーザが <ELSE 式 > を指定していない場合は、NULL
を返します。
入力としてどのデータ型でも指定できますが、次の二つの制限があります。
■
パラメータ < 式 >、<WHEN 式 >、<THEN 式 >、および <ELSE 式 > はすべて、同
じデータ型が指定されているか、共通互換型と評価される必要があります。
■
パラメータ <THEN 式 > がある場合には必ず、すべて同じデータ型が指定
されているか、共通互換型と評価される必要があります。同じように、
<THEN 式 > がある場合には必ず、<ELSE 式 > と同じデータ型が指定され
ているか、共通互換型と評価される必要があります。
ユーザは、出力時に、表 students の列 evaluation の記述値を数値に変換したいとしま
す。次の表に、表 students の内容を示します。
firstname
evaluation
Edward
Great
Joe
not done
Mary
Good
Jim
Poor
セグメント
4-45
式
ここで、ユーザは、SELECT 文と DECODE 関数を入力して、列 evaluation 内の記述
値を、それに相当する数値に変換します。
SELECT firstname, DECODE(evaluation,
'Poor', 0,
'Fair', 25,
'Good', 50,
'Very Good', 75,
'Great', 100,
-1) as grade
FROM students
次の表に、この SELECT 文の出力を示します。
4-46
firstname
grade
Edward
100
Joe
-1
Mary
50
Jim
0
Informix Guide to SQL:Syntax
式
定数式
次のダイヤグラムは定数式の構文を示しています。
定数式
式へ戻る 4-33 ページ
引用符付き文字列
4-156 ページ
リテラル番号
4-138 ページ
USER
+
SITENAME
DBSERVERNAME
TODAY
CURRENT
日時 (DATETIME) 型
フィールド修飾子
4-31 ページ
リテラル日時
(DATETIME) 型
4-132 ページ
リテラル時間隔
(INTERVAL) 型
4-135 ページ
< 番号 >
UNITS
< 日時単位 >
セグメント
4-47
式
要素
< 日時単位 >
< 番号 >
目的
制限
時間隔の制度を指定する、
日時単位は、目的にリストされ
ているキーワードのいずれかで
YEAR、MONTH、DAY、
HOUR、MINUTE、SECOND、 なければなりません。
FRACTlON のいずれか単位です。 キーワードは大文字または小文
構文
制限の列を参照して
ください。
単位が YEAR の場合、式は年月 字のどちらでも入力することが
時間隔になります。それ以外の場 できます。
合、式は日時時間隔になります。 キーワードを引用符で囲むこと
はできません。
日時単位を指定するのに使用す <n> が整数でない場合には、その リテラル番号、
るリテラル番号です。
値は使用されるときに最も近い
4-138 ページ
整数に丸められます。<
番号
に
>
このパラメータについては、
は選択した日時単位に適合する
4-53 ページの「キーワード
UNITS」を参照してください。 値を指定しなければなりません。
次の例は定数式を示しています。
DBSERVERNAME
TODAY
'His first name is'
CURRENT YEAR TO DAY
INTERVAL (4 10:05) DAY TO MINUTE
DATETIME (4 10:05) DAY TO MINUTE
5 UNITS YEAR
次のリストに詳細情報の参照先を示します。
4-48
■
式としての引用符付き文字列については、4-49 ページの「式としての引用
符付き文字列」を参照してください。
■
式の中でのユーザ機能については、4-49 ページの「USER 関数」を参照し
てください。
■
式の中での SITENAME 関数と DBSERVERNAME 関数については、4-50 ペー
ジの「DBSERVERNAME 関数と SITENAME 関数」を参照してください。
■
式としてのリテラル番号については、4-51 ページの「式としてのリテラル
番号」を参照してください。
Informix Guide to SQL:Syntax
式
■
式の中での TODAY 関数については、4-51 ページの「TODAY 関数」を参照
してください。
■
式の中での CURRENT 関数については、4-51 ページの「CURRENT 関数」
を参照してください。
■
式としてのリテラル日時 (DATETIME) 型については、4-52 ページの「式と
してのリテラル日時 (DATETIME) 型」を参照してください。
■
式としてのリテラル時間隔 (INTERVAL) 型については、4-53 ページの「式
としてのリテラル時間隔 (INTERVAL) 型」を参照してください。
■
式の中でのキーワード UNITS については、4-53 ページの「キーワード
UNITS」を参照してください。
式としての引用符付き文字列
次の例は、式としての引用符付き文字列を示しています。
SELECT 'The first name is ', fname FROM customer
INSERT INTO manufact VALUES ('SPS', 'SuperSport')
UPDATE cust_calls SET res_dtime = '1997-1-1 10:45'
WHERE customer_num = 120 AND call_code = 'B'
USER 関数
USER 関数は、現行ユーザ ( すなわち、プロセスを実行しているユーザ ) のログイン
名を含む文字列を戻します。
次の文は、USER 関数の使用方法を示します。
INSERT INTO cust_calls VALUES
(221,CURRENT,USER,'B','Decimal point off', NULL, NULL)
SELECT * FROM cust_calls WHERE user_id = USER
UPDATE cust_calls SET user_id = USER WHERE customer_num = 220
ユーザ関数は、ユーザ ID の大文字と小文字を変更しません。つまり、ユーザ関数
を式の中で使用し、現在のユーザが Robertm の場合、robertm ではなく Robertm が
戻されます。ユーザを列のデフォルト値として指定する場合、この列は文字
(CHAR) 型、可変長文字型 (VARCHAR)、各国語文字型 (NCHAR)、各国語可変長文
字 (NVARCHAR) 型でなければならず、最低 8 バイトの長さが必要です。
セグメント
4-49
式
ANSI
ANSI 標準準拠のデータベースでは、所有者名に引用符を付けないと、表の所有者
の名前は大文字で格納されます。条件の一部としてキーワード USER を使用する場
合、格納するユーザ名が、大 / 小文字に関してユーザ機能が戻す値と一致している
ことを確認してください。 ♦
DBSERVERNAME 関数と SITENAME 関数
DBSERVERNAME 関数と SITENAME 関数 は、次のどちらかのデータベース サーバ
名を戻します。一つは、現行データベースが存在している Universal Server インス
トールのファイル ONCONFIG に定義されているデータベース サーバ名です。もう
一つは、環境変数 INFORMIXSERVER に指定されているデータベース サーバ名で
す。上記二つの関数名 DBSERVERNAME と SITENAME はシノニムです。
DBSERVERNAME 関数は、表の格納場所の決定、表への情報の挿入、表からの情
報の抽出に使用します。DBSERVERNAME は単純な文字フィールドに挿入するこ
とができまた列のデフォルト値としても使用できます。DBSERVERNAME を列の
デフォルト値として指定する場合、その列は文字 (CHAR) 型、可変長文字
(VARCHAR) 型、各国語文字 (NCHAR) 型、または各国語可変長文字 (NVARCHAR)
型でなければならず最低 18 バイトの長さが必要です。
次の例では、最初の文は表 customer が常駐するデータベースサーバ名を戻していま
す。問合せが WHERE 節で制限されていないので、表内の各行に対して
DBSERVERNAME が戻されます。SELECT 節にキーワード DISTINCT を追加する
と、問合せは DBSERVERNAME を一度戻します。2 番目の文は、現行サイト名を
含んだ行を表に追加します。3 番目の文は、現行システムのサイト名を持つすべて
の行を site_col に戻します。最後の文は、表 customer の会社名を現行システム名に
変更します。
SELECT DBSERVERNAME FROM customer
INSERT INTO host_tab VALUES ('1', DBSERVERNAME)
SELECT * FROM host_tab WHERE site_col = DBSERVERNAME
UPDATE customer SET company = DBSERVERNAME
WHERE customer_num = 120
4-50
Informix Guide to SQL:Syntax
式
式としてのリテラル番号
次の例では、式としてのリテラル番号を示しています。
INSERT INTO items VALUES (4, 35, 52, 'HRO', 12, 4.00)
INSERT INTO acreage VALUES (4, 5.2e4)
SELECT unit_price + 5 FROM stock
SELECT -1 * balance FROM accounts
TODAY 関数
TODAY 関数は、システムの日付を日付 (DATE) 型として戻す場合に使用します。
TODAY 関数を列のデフォルト値として指定する場合、その列は日付 (DATE) 型列
でなければなりません。
次の例は、INSERT 文、UPDATE 文、または SELECT 文での TODAY 関数の使用例
を示しています。
UPDATE orders (order_date) SET order_date = TODAY
WHERE order_num = 1005
INSERT INTO orders VALUES
(0, TODAY, 120, NULL, N, '1AUE217', NULL, NULL, NULL, NULL)
SELECT * FROM orders WHERE ship_date = TODAY
CURRENT 関数
CURRENT 機能は、現在の瞬間を示す日付と時刻を持つ日時 (DATETIME) 型値を戻
します。
日時型修飾子を指定しない場合、デフォルトの修飾子は YEAR TO FRACTION(3) に
なります。CURRENT 関数は、リテラル日時型が使用可能なすべてのコンテキスト
で使用できます (4-132 ページを参照してください )。CURRENT を列のデフォルト
値に指定する場合、次の例に示すように、その列は日時型列でなければなりませ
ん。また、CURRENT の修飾子は列修飾子に一致しなければなりません。
CREATE TABLE new_acct (col1 int, col2 DATETIME YEAR TO DAY
DEFAULT CURRENT YEAR TO DAY)
キーワード CURRENT を一つの文の複数の場所で使用すると、各呼出し点で同一の
値を戻すことができます。CURRENT 関数を使用して、実行のたびに異なる値を得
ることはできません。
セグメント
4-51
式
戻される値はシステムクロックから得られ、SQL 文が開始されると固定されます。
たとえば、EXECUTE PROCEDURE 文からキーワード CURRENT を呼び出すと、ス
トアドプロシジャが開始されるとき値が戻されます。
CURRENT 関数は、常に現行データベースがあるデータベースサーバの中で評価さ
れます。現行データベースが遠隔データベースサーバの中にある場合、戻される値
はその遠隔ホストからのものです。
CURRENT 関数は、文に現れる物理的な順序で実行されるとはかぎりません。その
ため、CURRENT 機能を文の実行の開始点、終了点、または特定の点を示すために
使用することはできません。
ご使用のプラットフォームが、現在時刻を秒以下の精度で戻すシステム呼出しを提
供していない場合、CURRENT 関数は FRACTION フィールドにゼロを戻します。
次の例で、最初の文は CURRENT 関数を WHERE 条件で使用しています。2 番目の
文は、CURRENT 関数を DAY 関数の入力として使用しています。最後の問合せは、
call_dtime 値が 1997 年の初めから現在までの行を選択します。
DELETE FROM cust_calls WHERE
res_dtime < CURRENT YEAR TO MINUTE
SELECT * FROM orders WHERE DAY(ord_date) < DAY(CURRENT)
SELECT * FROM cust_calls WHERE call_dtime
BETWEEN '1997-1-1 00:00:00' AND CURRENT
式としてのリテラル日時 (DATETIME) 型
次の例では、式としての日時 (DATETIME) 型を示しています。
SELECT DATETIME (1997-12-6) YEAR TO DAY FROM customer
UPDATE cust_calls SET res_dtime = DATETIME (1998-07-07 10:40)
YEAR TO MINUTE
WHERE customer_num = 110
AND call_dtime = DATETIME (1998-07-07 10:24) YEAR TO MINUTE
SELECT * FROM cust_calls
WHERE call_dtime
= DATETIME (1998-12-25 00:00:00) YEAR TO SECOND
4-52
Informix Guide to SQL:Syntax
式
式としてのリテラル時間隔 (INTERVAL) 型
次の例は、式としてのリテラル時間隔 (INTERVAL) 型を示しています。
INSERT INTO manufact VALUES ('CAT', 'Catwalk Sports',
INTERVAL (16) DAY TO DAY)
SELECT lead_time + INTERVAL (5) DAY TO DAY FROM manufact
上記の例の 2 番目の文は、表 manufact から選択された lead_time の各値に 5 日を追
加します。
キーワード UNITS
キーワード UNITS を使用して、単純な時間隔型、特定の時間隔型値や日時型値の
増加や減少を表示することができます。
<n> が整数でない場合は、使用時にもっとも近い整数に切り捨てられます。
次の例では、最初の SELECT 文はキーワード UNITS を使用して、5 日増加したす
べての manufacturer の lead times を選択しています。2 番目の SELECT 文では、30
日以上前に行われたすべての呼出しを探索しています。WHERE 節の中の式が最大
日数である 99 より大きい値を戻すと、問合せは失敗します。最後の文は、メー
カー ANZA のリードタイムを 2 日間延ばします。
SELECT lead_time + 5 UNITS DAY FROM manufact
SELECT * FROM cust_calls
WHERE (TODAY - call_dtime) > 30 UNITS DAY
UPDATE manufact SET lead_time = 2 UNITS DAY + lead_time
WHERE manu_code = 'ANZ'
セグメント
4-53
式
関数式
次のダイヤグラムが示すように、関数式は、引数を取ります。
関数式
式へ戻る 4-33 ページ
代数関数
4-55 ページ
+
DBINFO 関数
4-60 ページ
指数関数と対数関数
4-67 ページ
HEX 関数
4-68 ページ
長さ関数
4-69 ページ
時刻関数
4-71 ページ
三角関数
4-79 ページ
文字列操作関数
4-82 ページ
次の例は関数式を示しています。
EXTEND (call_dtime, YEAR TO SECOND)
MDY (12, 7, 1900 + cur_yr)
DATE (365/2)
LENGTH ('abc') + LENGTH (pvar)
HEX (customer_num)
HEX (LENGTH(123))
TAN (radians)
4-54
Informix Guide to SQL:Syntax
式
ABS (-32)
EXP (3)
MOD (10,3)
代数関数
次のダイヤグラムが示すように、代数関数は一つまたは複数の引数を取ります。
関数式へ戻る
4-54 ページ
代数関数
ABS
(
< 数値式 >
)
MOD
(
< 被除数 >,< 除数 >
)
POW
(
< 基数 >, < 指数 >
)
ROOT
(
< 被開法数 >
)
,
< インデックス >
,2
ROUND
(
)
式 4-33
ページ
,
< 丸め値 >
,0
SQRT
(
TRUNC
(
<sqrt 被開法数 >
)
)
式 4-33
ページ
,
< 切捨て値 >
,0
セグメント
4-55
式
要素
< 基数 >
目的
制限
構文
指数で指定した値を乗する値です。 < 基数 > には実数、または実 式、4-33 ページ
基数値は POW 関数に指定される 数を導く式が指定できます。
< 被除数 >
最初の引数です。
< 除数 > の値で除算される値です。 < 被除数 > には実数、または 式、4-33 ページ
< 被除数 > の値は MOD 関数に指 実数を導く式が指定できます。
< 除数 >
定される最初の引数です。
< 被除数 > の値で除算される値
です。
< 除数 > にはゼロ以外の実数、 式、4-33 ページ
またはゼロ以外の実数を導く
式が指定できます。
< 除数 > の値は MOD 関数に指定
される 2 番目の引数です。
< 基数 > で指定した値に乗ずる値 < 指数 > には実数または実数を 式、4-33 ページ
です。
導く式が指定できます。
< 指数 >
< インデック
ス>
< 数値式 >
< 指数 > の値は POW 関数に指定
される 2 番目の引数です。
返されるルートのタイプで、2 は < インデックス > にはゼロ以 式、4-33 ページ
平方根、3 は立方根というように 外の実数、またはゼロ以外の
表します。
実数を導く式が指定できます。
< インデックス > の値は、ROOT
関数に指定される 2 番目の引数
です。デフォルトの < インデッ
クス > の値は 2 です。
絶対値を返す場合に使用する数
式です。
< 数値式 > には実数が指定で
きます。
式、4-33 ページ
< 被開法数 >
式は ABS 関数に引数を渡します。
ルート値を返す式です。
< 被開法数 > には実数、また実 式、4-33 ページ
数を導く式が指定できます。
< 被開法数 > の値は ROOT 関数
< 丸め値 >
に指定される最初の引数です。
数値式を丸めるのに使用する桁
数です。
< 丸め値 > には +32 ∼ -32 の
範囲の整数を指定します。
リテラル番号、
4-138 ページ
< 丸め値 > は ROUND 関数に指定
される 2 番目の引数です。デ
フォルトの丸め値はゼロで、こ
れは数値式はゼロ桁、またはそ
の位置で丸められることを意味
します。
(1/2)
4-56
Informix Guide to SQL:Syntax
式
要素
<sqrt 被開法
数>
< 切捨て値 >
目的
平方根を返す式です。
制限
構文
<sqrt 被開法数 > には実数、ま 式、4-33 ページ
たは実数を導く式が指定でき
ます。
<sqrt 被開法数 > の値は SQRT 関
数に指定される引数です。
数値式が切り捨てられる位置です。 < 切捨て値 > には +32 ∼ -32
リテラル番号、
の範囲の整数を指定します。
4-138 ページ
< 切捨て値 > は TRUNC 関数に指
この制限についての詳細は、
定される 2 番目の引数です。デ
4-59 ページの「TRUNC 関数」
フォルトの < 切捨て値 > はゼロ
を参照してください。
でこれは数値式はゼロ桁、また
はその位置で切り捨てられるこ
とを意味します。
(2/2)
ABS 関数
ABS 関数は、式に絶対値を与えます。この関数には一つの数値の引数が必要です。
引数と同じタイプの値が戻されます。次の例では、現金で 20 ドルより多く支払わ
れたすべての注文 (+) または店の貸方 (-) を示しています。データベース stores7 に
負の残高は含まれていません。しかし、アプリケーションでは負の残高が含まれる
ことがあります。
SELECT order_num, customer_num, ship_charge
FROM orders WHERE ABS(ship_charge) > 20
MOD 関数
MOD 関数は、二つの数値式の係数または余り値を戻します。被除数と除数に整数
式を指定します。除数はゼロであってはなりません。戻される値は整数 (INT) 型で
す。次の例では、30 日間の請求サイクルを使用して、請求サイクルまでの期間を求
めます。
SELECT MOD(today - MDY(1,1,year(today)),30) FROM orders
POW 関数
POW 関数は基数を指数に上げます。この関数には二つの数値の引数が必要です。
戻される値は実数 (FLOAT) 型です。次の例では、1,000 平方単位未満である領域
(pr2) の円内のすべての情報を戻します。
SELECT * FROM circles WHERE (3.1417 * POW(radius,2)) < 1000
セグメント
4-57
式
ROOT 関数
ROOT 関数は、数値式のルート値を戻します。この関数には最低一つの数値の引数
(< 被開法数 >) が必要で、二つの引数 ( 一つの < 被開法数 > と複数の < インデック
ス > 引数 ) が指定できます。被開法数の引数だけを指定すると、インデックス引数
にはデフォルト値として 2 が指定されます。< インデックス > の値にゼロは使用で
きません。ROOT 関数が戻す値は実数 (FLOAT) 型です。次の例の最初の SELECT
文は、式の平方根を取ります。2 番目の SELECT 文は、式の立方根を取ります。
SELECT ROOT(9) FROM angles
SELECT ROOT(64,3) FROM angles
-- square root of 9
-- cube root of 64
SQRT 関数は、インデックスを指定しないと SQRT(x)=ROOT(x) のフォームを使用
します。
ROUND 関数
ROUND 関数は、式の丸めた値を戻します。この式は数値であるか、または数値に
変換されなければなりません。
桁数の指定を行わないと、値はゼロ桁または 1 の位に丸められます。32(+ と -) の桁
数の制限は、10 進数値全体に適用されます。
図 4-1 で示しているように、正の桁値を指定すると値は小数点以下に丸められ、負
の桁値を指定すると値は整数に丸められます。
図 4-1
ROUND 関数
24536.8746
式:
ROUND (24,536.8746, -2) = 24,500.00
ROUND (24,536.8746, 0) = 24,537.00
-2
0
2
ROUND (24,536.8746, 2) = 24,536.87
次の例では、SELECT 文内の列式とともに ROUND 関数を使用する方法を示してい
ます。この文は、注文番号と注文品目のゼロの位に丸められた合計価格、およびそ
の丸められた合計金額が 124.00 であることを示しています。
SELECT order_num , ROUND(total_price) FROM items
WHERE ROUND(total_price) = 124.00
4-58
Informix Guide to SQL:Syntax
式
ROUND 関数の引数として金額 (MONEY) 型を使用しゼロの位に丸めると、値は .00
で表示されます。次の例の SELECT 文では、整数 (INTEGER) 型値と金額 (MONEY)
型値を丸めています。125 が表示され、丸められた価格は注文品目の各行について
xxx.00 という形式で示されます。
SELECT ROUND(125.46), ROUND(total_price) FROM items
SQRT 関数
SQRT 関数は、数値式の平方根を戻します。
次の例では、表 angles の各行について 9 の平方根を戻します。
SELECT SQRT(9) FROM angles
TRUNC 関数
TRUNC 関数は、数値式の切り捨てられた値を戻します。
この式は数値または、数値式に変換できる形式でなければなりません。桁数の指定
を行わないと、値はゼロ桁または 1 の位に切り捨てられます。32(+ と -) の桁数の制
限は、10 進数値全体に適用されます。
図 4-2 で示しているように、正の桁値を指定すると値は小数点以下に切り捨てられ、
負の桁値を指定すると値は整数に切り捨てられます。
図 4-2
TRUNC 関数
式
24536.8746
:
TRUNC (24536.8746, -2) =24500
TRUNC (24536.8746, 0) = 24536
TRUNC (24536.8746, 2) = 24536.87
-2
0
2
TRUNC 関数の引数として金額 (MONEY) 型を使用し、ゼロの位に切り捨てると、
.00 の位は削除されます。たとえば、次の SELECT 文は金額 (MONEY) 型値と整数
(INTEGER) 型値を切り捨てています。125 と注文品目の各行について切り捨てられ
た価格が整数のフォーマットで表示されています。
SELECT TRUNC(125.46), TRUNC(total_price) FROM items
セグメント
4-59
式
DBINFO 関数
DBINFO 関数は、次のどの目的にも使用できます。
IDS
■
表領域番号または式に対応する DB 領域の名前を探索する。
■
表に挿入された最後のシリアル (SERIAL) 型値を探索する。
■
SELECT 文、INSERT 文、DELETE 文、UPDATE 文、EXECUTE
PROCEDURE 文で処理された行の数を求める。
■
現在のセッション識別子を探索する。
■
Dynamic Server で、クライアント アプリケーションが接続されるデータ
ベース サーバのホスト名を探索する。
■
Dynamic Server で、クライアント アプリケーションが接続されるデータ
ベース サーバの正確なバージョンを探索する。♦
DBINFO 関数は、SQL 文の任意の場所とルーチン内で使用できます。
関数式へ戻る 4-54 ページ
DBINFO 関数
DBINFO
(
' DBSPACE '
,
< 表領域番号 >
<式>
' sqlca.sqlerrd1 '
' sqlca.sqlerrd2 '
+
' sessionid '
IDS
' dbhostname '
' version '
4-60
Informix Guide to SQL:Syntax
,
'specifier'
)
式
要素
<式>
目的
< 表領域番号 > を導く式です。
< 指定子 >
返されるバージョン文字列部分
を指定するリテラル値です。
< 表領域
番号 >
表の表領域番号 ( パーティショ
ン番号 ) です。
DBINFO 関数のオプション
DBSPACE は、特定の表領域番
号に関連した DB 領域名を返し
ます。
制限
式には、プロシジャ変数、ホス
ト変数、列名、副問合せを含む
ことができますが、それらは数
値でなければなりません。
< 指定子 > に入力できる値の
セットについては、4-65 ページ
の「オプション ’version’ の使用
方法」を参照してください。
指定した表領域番号は存在して
いなければなりません。つまり
データベースの表 systables の列
partnum になければなりません。
構文
式、4-33 ページ
式、4-33 ページ
リテラル番号、
4-138 ページ
オプション ’DBSPACE’ の使用方法
オプション 'DBSPACE' は、表領域番号に対応する DB 領域の名前を格納している文
字列を戻します。< 表領域番号 > の値を示す < 表領域番号 > または式のどちらか
を、追加パラメータとして指定しなければなりません。次の例ではオプション
'DBSPACE' を使用しています。まず、この例ではシステムカタログ表 systables に問
合せを行い、表 customer の < 表領域番号 > を求め、次に DBINFO 関数を実行して
DB 領域名を求めます。
SELECT tabname, partnum FROM systables
この文がパーティション番号 16777289 を戻す場合、次の例のようにこの値を 2 番目
の引数に代入して表 customer を格納している DB 領域を探索することができます。
SELECT DBINFO ('DBSPACE', 16777289) FROM systables
セグメント
4-61
式
オプション ’sqlca.sqlerrd1’ の使用方法
オプション 'sqlca.sqlerrd1' は、表に挿入された最後のシリアル (SERIAL) 型値を示す
一つの整数を戻します。この DBINFO 関数を使用して、表に挿入された最後のシリ
アル型値を抽出することができます。有効な結果を得るには、シリアル型値を挿入
する INSERT 文のすぐ後にこのオプションを指定してください。次の例ではオプ
ション 'sqlca.sqlerrd1' を使用しています。
.
.
EXEC SQL create table fst_tab (ordernum serial, part_num int);
EXEC SQL create table sec_tab (ordernum serial);
EXEC SQL insert into fst_tab VALUES (0,1);
EXEC SQL insert into fst_tab VALUES (0,4);
EXEC SQL insert into fst_tab VALUES (0,6);
EXEC SQL insert into sec_tab values (dbinfo('sqlca.sqlerrd1'));
.
.
この例では、主キーのシリアル型値を含んでいる行を表 fst_tab に挿入し、その後
DBINFO() 関数を使用して同じシリアル型値を表 sec_tab に挿入します。DBINFO()
関数が戻す値は、fst_tab に挿入された最後の行のシリアル (SERIAL) 型値です。
オプション ’sqlca.sqlerrd2’ の使用方法
オプション 'sqlca.sqlerrd2' は、SELECT 文、INSERT 文、DELETE 文、UPDATE 文、
EXECUTE PROCEDURE 文が処理した行の数を示す一つの整数を戻します。このオプ
ションは、SQL 文およびストアドプロシジャの任意の場所で使用できます。このオ
プションもすべての SQL API に適用されます。有効な結果を求めるには、このオプ
ションを SELECT 文と EXECUTE PROCEDURE 文の実行が終わった後に使用してく
ださい。また、このオプションをカーソル内で使用するときは、すべての行を取り出
してからカーソルをクローズして、有効な結果が得られるようにしてください。
次の例では、オプション 'sqlca.sqlerrd2' を使用して、表から削除された行の数を求
めるストアドプロシジャを示しています。
CREATE PROCEDURE del_rows (pnumb int)
RETURNING int;
DEFINE nrows int;
DELETE FROM fst_tab WHERE part_num=pnumb;
LET nrows = DBINFO('sqlca.sqlerrd2');
RETURN nrows;
END PROCEDURE
4-62
Informix Guide to SQL:Syntax
式
オプション ’sessionid’ の使用
DBINFO 関数のオプション 'sessionid' は、現行のセッションのセッション識別子を
返します。
クライアント アプリケーションがデータベースサーバに接続している場合、サーバ
はクライアントを使用してセッションを開始し、クライアントに対してセッション
識別子を割り当てます。セッション識別子は、クライアントとデータベース サーバ
間の指定された接続の一意な識別子の役割を果たします。データベース サーバは、
セッション コントロール ブロックと呼ばれる共有メモリのデータ構造体の中に、
セッション識別子を格納します。指定されたセッションのセッション コントロール
ブロックには、ユーザ識別子、クライアントのプロセス識別子、ホスト コンピュー
タ名、およびさまざまな状態フラグが含まれます。
オプション 'sessionid' を指定する場合、データベースサーバはセッションコント
ロール ブロックから現行セッションのセッション識別子を探索し、整数値としてこ
の値を返します。データベース sysmaster のシステム監視インターフェイス表の中
にはセッション識別子のための列を含むものもあるので、これらの SMI 表からユー
ザ自身のセッションについての情報を取り出すために、DBINFO 関数が取得する
セッション識別子を使用できます。
次の例では、現行セッション識別子の値を取得するために SELECT 文で DBINFO
関数を指定しています。ユーザはシステム カタログ表 systable に対してこの問合せ
を行い、WHERE 節を使用して問合せ結果を一行に制限しています。
SELECT DBINFO('sessionid') AS my_sessionid
FROM systables
WHERE tabname = 'systables'
次の表がこの問合せの結果です。
my_sessionid
14
セグメント
4-63
式
先程の例では、SELECT 文はシステム カタログ表 systable に対して問合せました。
しかし、任意のシステム カタログ表またはデータベースのユーザ表に問い合わせる
ことによってセッション識別子の値を取得することもできます。たとえば、次の問
合せを入力して現行セッション識別子の値を取得できます。
SELECT DBINFO('sessionid') AS user_sessionid
FROM customer
where customer_num = 101
次の表がこの問合せの結果です。
user_sessionid
14
DBINFO 関数は SQL 文内だけでなくストアドプロシジャでも使用できます。次に、
プログラムまたはプロシジャを呼び出すために現行のセッション識別子の値を返す
ストアドプロシジャの例を示します。
CREATE PROCEDURE get_sess()
RETURNING INT;
RETURN DBINFO('sessionid');
END PROCEDURE;
IDS
オプション ’dbhostname’ の使用方法
Dynamic Server では、オプション ’dbhostname’ を使用すれば、データベース クライ
アントが接続されるデータベース サーバのホスト名を検索することができます。こ
のオプションを使用すると、データベース サーバが実行されているコンピュータの
物理マシン名が検索されます。
次の例では、ユーザは、SELECT 文に、DBINFO のオプション ’dbhostname’ を入力
して、DB-Access が接続されるデータベース サーバのホスト名を検索しています。
SELECT DBINFO('dbhostname')
FROM systables
WHERE tabid = 1
4-64
Informix Guide to SQL:Syntax
式
次の表に、この問合せの結果を示します。
( 定数 )
rd_lab1
IDS
オプション ’version’ の使用方法
Dynamic Server では、DBINFO 関数のオプション ’version’ を使用すれば、クライア
ント アプリケーションが実行されているデータベース サーバの正確なバージョン
番号を検索することができます。このオプションは、メッセージ ログから正確な
バージョン文字列が検索します。完全なバージョン文字列の値は、ユーティリティ
oninit のオプション -V により表示される値と同じです。
オプション 'version' のパラメータ < 指定子 > を使用して、検索するバージョン文字
列の部分を指定します。次の表に、パラメータ < 指定子 > に入力できる値をリスト
し、< 指定子 > 値ごとに返されるバージョン値の部分を示し、< 指定子 > の各値で
戻される値の例を記載します。各例では、完全なバージョン文字列 Informix
Dynamic Server バージョン 7.30.UC1 の一部が返されます。
パラメータ
< 指定子 > の値
返されるバージョン文字列の
部分
戻り値の例
'server-type'
サーバの種類
Informix Dynamic Server
'major'
現行のサーバ バージョンのメ
ジャー バージョン番号
7
'minor'
現行のサーバ バージョンのマ
イナー バージョン番号
30
セグメント
4-65
式
パラメータ
< 指定子 > の値
返されるバージョン文字列の
部分
'os'
バージョン文字列内のオペ
レーティングシステム識別子
です。次のものがあります。
戻り値の例
U
T = Windows NT
U = 32 ビット オペレーティン
グ システムでの UNIX 32
ビット実行
H = 64 ビット オペレーティン
グ システムでの UNIX 32
ビット実行
F = 64 ビット オペレーティン
グ システムでの UNIX 64
ビット実行
'level'
現行のサーバ バージョンの一 C1
時的リリース レベル
'full'
oninit に -V を指定して実行す
ると返される完全バージョン
文字列
Informix Dynamic Server
バージョン 7.30.UC1
次の例では、SELECT 文で、DBINFO のオプション 'version' を使用して、DB-Access
クライアントが接続されるデータベース サーバのメジャー バージョン番号を検索
しています。
SELECT DBINFO('version', 'major')
FROM systables
WHERE tabid = 1
次の表に、この問合せの結果を示します。
( 定数 )
7
4-66
Informix Guide to SQL:Syntax
式
指数関数と対数関数
指数関数と対数関数は最低一つの引数を取ります。戻される値は実数 (FLOAT) 型
です。次の例では、指数関数と対数関数を示しています。
関数式へ戻る
4-54 ページ
指数関数と対数関数
要素
< 実数式 >
EXP
(
< 実数式 >
)
LOGN
(
< 実数式 >
)
LOG10
(
< 実数式 >
)
目的
EXP、LOGN、LOG10 関数に引
数を渡す式です。
制限
構文
式の定義域は実数のセットで、 式、4-33 ページ
式の範囲は正の実数のセット
これらの関数での < 実数式 > の です。
意味については、次ページ以降
を参照してください。
EXP 関数
EXP 関数は、指数値を戻します。次の例では、表 angles の各行について指数 3 が戻
されます。
SELECT EXP(3) FROM angles
セグメント
4-67
式
LOGN 関数
LOGN 関数は、数値式の自然対数を戻します。対数値は指数値の逆数です。次の
SELECT 文では、表 history の各行の母集団の自然対数を戻します。
SELECT LOGN(population) FROM history WHERE country='US'
ORDER BY date
LOG10 関数
LOG10 関数は基数 10 の対数値を戻します。次の例では、表 travel の各行に対する
距離の基数 10 の対数値を戻します。
SELECT LOG10(distance) + 1 digits FROM travel
HEX 関数
関数式へ戻る
4-54 ページ
HEX 関数
(
HEX
要素
< 整数式 >
< 整数式 >
)
目的
制限
16 進での値を知るための数値式 整数を求める整数、または式を
指定します。
です。
構文
式、4-33 ページ
HEX 関数は、整数式の 16 進コードを戻します。次の例では、表 orders の列のデー
タ型と列の長さを 16 進フォーマットで表示しています。金額 (MONEY) 型列と 10
進数 (DECIMAL) 型列の場合は、最下位のバイトと最下位から 2 番目のバイトから
有効桁数と小数点以下桁数を決定することができます。可変長文字 (VARCHAR) 型
列と各国語可変長文字 (NVARCHAR) 型列の場合は、最下位のバイトおよび最下位
から 2 番目のバイトから、最小領域と最大領域を決定することができます。コード
化された情報についての詳細は、
『Informix Guide to SQL: Reference』を参照してくだ
さい。
SELECT colname, coltype, HEX(collength)
FROM syscolumns C, systables T
WHERE C.tabid = T.tabid AND T.tabname = 'orders'
4-68
Informix Guide to SQL:Syntax
式
次の例では、現行データベース内のすべての表の名前と対応する表領域の数を 16
進フォーマットでリストしています。この例は、16 進数で表された二つの最上位バ
イトが DB 領域の数を構成しているので特に役立ちます。これらの最上位バイトは
oncheck の出力で表を識別するのに使用します。
SELECT tabname, HEX(partnum) FROM systables
HEX 関数は、次の例に示すように一つの式に対して作用することができます。
SELECT HEX(order_num + 1) FROM orders
長さ関数
関数式へ戻る
4-54 ページ
LENGTH
関数
+
LENGTH
(
引用符付き文字列
4-156 ページ
)
CHAR_LENGTH
E/C
CHARACTER_LENGTH
SPL
< 変数名 >
<列>
OCTET_LENGTH
<表>.
要素
<列>
目的
指定した表の列名です。
<表>
指定の列がある表の名前です。
< 変数名 >
文字列を含むホスト変数、また
はプロシジャ変数です。
制限
列は文字 (CHARACTER) 型でな
ければなりません。
表は存在していなければなりま
せん。
構文
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
ホスト変数またはプロシジャ変 ホスト変数名は、
数は文字 (CHARACTER) 型でな 変数名に適用され
ければなりません。
る言語固有の規則
に従っている必要
があります。
プロシジャ 呼出し
式、4-110 ページ
セグメント
4-69
式
長さ関数を使用して、列、文字列、変数の長さを求めることができます。長さ関数
には、次のようなものがあります。
✮
LENGTH
✮
OCTET_LENGTH
■
CHAR_LENGTH ( または CHARACTER_LENGTH)
これらの関数はそれぞれ個別の目的を持っています。
LENGTH 関数
LENGTH 関数は、後書きの空白を除いた文字 (CHAR) 型列のバイト数を戻します。
バイト (BYTE) 型列またはテキスト (TEXT) 型列またはの場合、LENGTH 関数は、
後書きの空白を含めた列の中のすべてのバイト数を戻します。
次の例では、LENGTH 関数の使用方法を説明しています。
SELECT customer_num, LENGTH(fname) + LENGTH(lname),
LENGTH('How many bytes is this?')
FROM customer WHERE LENGTH(company) > 10
E/C
GLS
LENGTH 関数を使用して、文字変数の長さを戻すことができます。♦
LENGTH 関数に関する GLS の対応については『Informix Guide to GLS Functionality』
を参照してください。♦
OCTET_LENGTH 関数
OCTET_LENGTH 関数は、後書きの空白を含めた文字 (CHAR) 型列のバイト数を戻
します。OCTET_LENGTH 関数についての詳細は、
『Informix Guide to GLS
Functionality』を参照してください。
CHAR_LENGTH 関数
CHAR_LENGTH 関数は、文字 (CHAR) 型列の文字数 ( バイト数ではない ) を戻しま
す。CHAR_LENGTH 関数についての詳細は、
『Informix Guide to GLS Functionality』
を参照してください。
4-70
Informix Guide to SQL:Syntax
式
時刻関数
時刻関数
関数式へ戻る
4-54 ページ
+
DATE
(
DAY
(
< 非日付型式 >
)
< 日付 (DATE) 型式 / 日 )
時 (DATETIME) 型式 >
MONTH
WEEKDAY
YEAR
EXTEND
(
< 日付 (DATE) 型式 / 日
時 (DATETIME) 型式 >
)
< 最初のフィールド >
TO < 最後のフィールド >
,
MDY
(
< 月整数
(INTEGER) 型式 >
,
< 日整数
(INTEGER) 型式 >
,
< 年整数
(INTEGER) 型式 >
)
IDS
(
TO CHAR
)
< ソース日付 >
,
TO DATE
(
< フォーマット文字列 >
)
< 文字式 >
,
< フォーマット文字列 >
セグメント
4-71
式
要素
< 文字式 >
目的
日付 (DATE) 型値または日時
(DATETIME) 型値に変換される
式です。
< 日付 (DATE) DAY、MONTH、WEEKDAY、
型式 / 日時
YEAR、EXTEND 関数の引数を
渡す式です。
(DATETIME)
型式 >
月の中の日を表す式です。
< 日整数
(INTEGER) 型
式>
結果の最初のフィールドを指定
< 最初の
フィールド > する修飾子です。
< フォーマッ
ト文字列 >
< 最後の
フィールド >
< 月整数
(INTEGER) 型
式>
制限
構文
式は、文字データ型でなければ 式、4-33 ページ
なりません。定数、ホスト変
数、式、または列が可能です。
式の値は日付 (DATE) 型値また 式、4-33 ページ
は日時 (DATETIME) 型値でなけ
ればなりません。
式の値は特定の月の日数以下の
整数でなければなりません。
式、4-33 ページ
修飾子は、< 最後のフィールド 日時 (DATETIME) 型
> より長ければ、どのような日 フィールド修飾子、
< 最初のフィールド > と < 最後 時 (DATETIME) 型修飾子でも構 4-31 ページ
のフィールド > の修飾子を指定 いません。
しない場合には、< 最初の
フィールド > にはデフォルト値
の YEAR が使用されます。
日付 (DATE) 型値または日時
この文字列は、文字データ型で 引用符付き文字列、
(DATETIME) 型値のフォーマッ なければなりません。この文字 4-156 ページ
列には、環境変数 GL_DATE お
トを表す文字列です。
よび GL_DATETIME で許容され
ているフォーマットに従い、有
効な日付フォーマットが指定さ
れている必要があります。この
文字列には、列、ホスト変数、
式、または定数が可能です。
結果の最後のフィールドを指定 修飾子は < 最後のフィールド > 日時 (DATETIME) 型
より短ければ、どのような日時 フィールド修飾子、
する修飾子です。
< 最初のフィールド > と < 最後の (DATETIME) 型修飾子でも構い 4-31 ページ
フィールド > の修飾子を指定し ません。
ない場合には、< 最後のフィール
ド > にはデフォルト値の
FRACTION(3) が使用されます。
月を表す式です。
式は値はそれぞれ 1 ∼ 12 でな
ければなりません。
式、4-33 ページ
(1/2)
4-72
Informix Guide to SQL:Syntax
式
要素
目的
< 非日付型式 > 日付 (DATE) 型に値を変換する
式です。
< ソース日付 > 文字列に変換される日付を表す
式です。
< 年整数
(INTEGER) 型
式>
年を表す式です。
制限
構文
日付型に変換可能な式を指定す 式、4-33 ページ
ることができます。通常、文字
(CHAR) 型、日時 (DATETIME)
型、整数 (INTEGER) 型を表す
式を指定します。
この値は、日付 (DATE) 型値ま 式、4-33 ページ
たは日時 (DATETIME) 型値でな
ければなりません。ホスト変数、
式、列または定数が可能です。
式は 4 桁の整数でなければなり 式、4-33 ページ
ません。2 桁の省略形を使用す
ることはできません。
(2/2)
日付 (DATE) 型関数
日付 (DATE) 型関数は、この関数で呼び出す非日付 (DATE) 型式に対応する日付
(DATE) 型値を戻します。引数には、日付 (DATE) 型値に変換可能なすべての式を
使用できます。これらの式は、通常文字 (CHAR) 型値、日時 (DATETIME) 型値、整
数 (INTEGER) 型値です。次の WHERE 節は非日付式に対する文字 (CHAR) 型値を
指定しています。
WHERE order_date < DATE('12/31/97')
日付 (DATE) 型関数は文字型の非日付式を解釈する場合、この式が環境変数
DBDATE で指定したすべての日付 (DATE) 型フォーマットに従っているものと想定
します。たとえば、次の問合せを実行した時に DBDATE が Y2MD/ に設定されてい
るとします。
SELECT DISTINCT DATE('02/01/1998') FROM ship_info
この SELECT 文は、DATE 関数がこの非日付型式を変換できないためエラーを生成
します。DATE() 関数は日付文字列の最初の部分 (02) を年として解釈し、2 番目の
部分 (01) を月として解釈します。3 番目の部分 (1998) で、DATE() 関数が 2 桁の日
付 ( 有効な日付の値は 01 から 31 まで ) を想定しているところに 4 桁の値が指定さ
れています。このため値を変換できません。DBDATE の値 Y2MD/ を使用して
SELECT 文を正常に実行するには、非日付型式は '98/02/01' でなければなりません。
DBDATE のフォーマットについては『Informix Guide to SQL: Reference』を参照して
ください。
セグメント
4-73
式
非日付型式に正の整数 (INT) 型値を指定する場合、DATE() 関数はデフォルトの日
付 1889 年 12 月 31 日以降の日数としての値と解釈します。整数値が負の場合、
DATE 関数は 1889 年 12 月 31 日以前の日数としての値と解釈します。次の WHERE
節は非日付型式に整数型値を指定しています。
WHERE order_date < DATE(365)
データベース サーバは、order_value の値が 1900 年 12 月 31 日 (12/31/1899+365 日 )
より前の行を検索します。
DAY 関数
DAY 関数は、月の中の日付を示す整数を戻します。次の例では DAY 関数を
CURRENT 関数とともに使用して、列値を月の中の現在の日付と比較します。
WHERE DAY(order_date) > DAY(CURRENT)
MONTH 関数
MONTH 関数は、その日付 (DATE) 型引数または日時 (DATETIME) 型引数の月の部
分に対応する整数を戻します。次の例では、発注された月を示す 1 から 12 までの
数字を戻します。
SELECT order_num, MONTH(order_date) FROM orders
WEEKDAY 関数
WEEKDAY 関数は、週の曜日を示す整数を戻します。ゼロは日曜日、1 は月曜日と
いうように示します。次の例は、現在の曜日の週の同じ曜日に支払われたすべての
注文を示します。
SELECT * FROM orders
WHERE WEEKDAY(paid_date) = WEEKDAY(CURRENT)
4-74
Informix Guide to SQL:Syntax
式
YEAR 関数
YEAR 関数は、年を示す 4 桁の整数を戻します。次の例は、出荷日が現在の年の初
めより以前の注文を示します。
SELECT order_num, customer_num FROM orders
WHERE year(ship_date) < YEAR(TODAY)
同様に、日付 (DATE) 型は単純な暦の日付なので、日付型値を最後の修飾子が DAY
よりも小さい時間隔 (INTERVAL) 型値との間で加算または減算することはできませ
ん。この場合は、日付型値を日時型値に変換します。
EXTEND 関数
EXTEND 関数は、日時型値または日付型値の有効桁数を調整します。式は、日付型
値の引用符付き文字列では表現できません。
最初と最後の修飾子を指定しないと、デフォルトの修飾子 YEAR TO FRACTION(3)
になります。
式に修飾子で指定されていないフィールドが含まれている場合には、不要なフィー
ルドは廃棄されます。
最初の修飾子が、式の中に存在するフィールドよりも大きい ( 上位の ) 修飾子を指定
している場合、新しいフィールドは CURRENT 関数で戻された値により充てんされ
ます。最後の修飾子が、式の中に存在するフィールドよりも小さい ( 下位の ) フィー
ルドを指定している場合、新しいフィールドは定数値で充てんされます。欠落してい
る MONTH フィールドまたは DAY フィールドは 1 で充てんされ欠落している HOUR
フィールドから FRACTION フィールドまではゼロ (0) で充てんされます。
セグメント
4-75
式
次の例では、最初の EXTEND 呼出しは YEAR TO SECOND の列値 call_dtime の値を
示します。2 番目の文はリテラル DATETIME を拡張して、日時 (DATETIME) 型値か
ら時間隔 (INTERVAL) 型値を減算できるようにしています。修飾子が完全には一致
していない時間隔型値との間で加算または減算を行いたい場合、日時型値とともに
EXTEND 関数を使用しなければなりません。3 番目の例では、日時型値の一部であ
る時刻の部分だけを更新しています。EXTEND 関数は、日時型の hh:mm( 時と分 ) の
部分だけを生成します。日時型値の時と分から 11:00 を減算すると、差の時間隔型
値がプラスかマイナスの記号付きで生成されます。この値を元の値から減算すると、
値は強制的に 11:00 になります。
EXTEND (call_dtime, YEAR TO SECOND)
EXTEND (DATETIME (1989-8-1) YEAR TO DAY, YEAR TO MINUTE)
- INTERVAL (720) MINUTE (3) TO MINUTE
UPDATE cust_calls SET call_dtime = call_dtime (EXTEND(call_dtime, HOUR TO MINUTE) - DATETIME (11:00) HOUR
TO MINUTE) WHERE customer_num = 106
MDY 関数
MDY 関数は、月、日、年を示す整数の値を示す 3 つの式を持つ日付 (DATE) 型値
を戻します。最初の式は、1 から 12 までの月の数字を示す整数の値を求めなければ
なりません。
2 番目の式は、月の中の日を示す整数の値を求めなければなりません。この整数の
値は、月によって 1 から 28、1 から 29、1 から 30、または 1 から 31 となります。
3 番目の式は、年を示す 4 桁の整数の値を求めなければなりません。3 番目の式に、
2 桁の省略形を使用することはできません。次の例では、注文番号 8052 に関連付け
られた paid_date を、現在の月の最初の日に等しいものとして設定しています。
UPDATE orders SET paid_date = MDY(MONTH(TODAY), 1, YEAR(TODAY))
WHERE po_num = '8052'
4-76
Informix Guide to SQL:Syntax
式
IDS
TO_CHAR 関数
Dynamic Server では、DATE あるいは DATETIME の文字列の値を TO_CHAR 関数で
変換します。もうじ列は、source_data パラメータに指定されたデータに含まれてい
て、format_string パラメータに指定された形式のデータで表示されます。
source_date パラメータの値が NULL の場合、関数の結果は NULL 値になります。
Format_string パラメータが省略されている場合、TO_CHAR 関数は文字列の形式に
デフォルトのデータ形式を使用します。デフォルトのデータ形式は、
GL_DATETIME および GL_DATE のように環境変数によって指定されます。
format_string パラメータには、source_date パラメータのような類似の修飾子はあり
ません。フォーマット マスク修飾子が含まれている場合、format_string パラメータ
は source_date パラメータの修飾子とは異なり、TO_CHAR 関数は、EXTEND 関数
を呼び出したかのように DATETIME 値を拡張します。
次の例では、ユーザが表 tab1 の begin_date 列の文字列を変換しようとしています。
begin_date 列は、DATETIME YEAR TO SECOND データ型として定義します。ユー
ザは、SELECT 文を使用して TO_CHAR 関数の変換を実行します。
SELECT TO_CHAR(begin_date, '%A %B %d, %Y %R')
FROM tab1
format_string パラメータの記号意味を下記に示します。フォーマット記号とその意
味についての完全なリストは、
『Informix Guide to GLS Functionality』の環境変数
GL_DATE および環境変数 DL_DATETIME を参照してください。
記号
意味
%A
ロケールに定義されているすべての平日の曜日
%B
ロケールに定義されている 1 年の月の名前
%d
一ヶ月の日にち数字
%Y
4 桁の年の数
%R
24 時間表記の時刻
セグメント
4-77
式
指定された < フォーマット文字列 > を列 begin_date に適用した結果は次のようにな
ります。
Wednesday July 23, 1997 18:45
IDS
TO_DATE 関数
Dynamic Server では、TO_DATE 関数は文字列を日時 (DATETIME) 型値に変換しま
す。パラメータ < 文字式 > を、パラメータ < フォーマット文字列 > で指定した日付
フォーマットにしたがって日付として評価し、その結果を返します。
パラメータ < 文字式 > の値が NULL の場合、関数の結果も NULL になります。
パラメータ < フォーマット文字列 > を省略すると、TO_DATE 関数はデフォルトの
日時 (DATETIME) フォーマットを日時 (DATETIME) 型値に適用します。デフォル
トの日時 (DATETIME) フォーマットは、環境変数 GL_DATETIME で指定されてい
ます。
次の例では、文字列を日時 (DATETIME) 型値に変換し、表 tab1 の列 begin_date の値
を変換した値で更新しています。列 begin_date は年秒日時 (DATETIME YEAR TO
SECOND) 型として定義されています。TO_DATE 関数を含んだ UPDATE 文を使用
します。
UPDATE tab1
SET begin_date = TO_DATE('Wednesday July 23, 1997 18:45',
'%A %B %d, %Y %R');
この例のパラメータ < フォーマット文字列 > は、TO_DATE 関数がどのように列
begin_date の変換された文字列をフォーマットするかを示しています。フォーマッ
ト文字列に使用されている各フォーマット記号の意味を示す表については、4-77
ページの「TO_CHAR 関数」を参照してください。
4-78
Informix Guide to SQL:Syntax
式
三角関数
三角関数は、次のダイヤグラムに示す一つの引数を取ります。
三角関数
関数式へ戻る
4-54 ページ
COS
(
< ラジアン式 >
(
< 数値式 >
)
SIN
TAN
ASIN
)
ACOS
ATAN
ATAN2
要素
< 数値式 >
(
<y>, <x>
)
目的
ASIN、ACOS、ATAN 関数に引
数を渡す数値式です。
< ラジアン式 > ラジアンを求める式です。
<x>
<y>
制限
構文
式の値は -1 ∼ 1 の範囲でなけれ 式、4-33 ページ
ばなりません。
式の値は数値でなければなりま 式、4-33 ページ
詳細については、4-80 ページの せん。
「ラジアン式の公式」を参照し
てください。
直交座標 (<x,y>) の <x> 座標を 式の値は数値でなければなりま 式、4-33 ページ
表す式です。
せん。
直交座標 (<x,y>) の <y> 座標を 式の値は数値でなければなりま 式、4-33 ページ
表す式です。
せん。
セグメント
4-79
式
ラジアン式の公式
COS 関数、SIN 関数、TAN 関数は、引数としてラジアンの数値 (< ラジアン式 >) を
取ります。
角度を使用していてラジアンに変換したいときは、次の公式を使います。
# degrees * p/180= # radians
ラジアンを使用していて角度に変換したいときは、次の公式を使います。
# radians * 180/p = # degrees
COS 関数
COS 関数は、ラジアン式のコサインを戻します。次の例は、表 anglestbl 内の列
degrees の値のコサインを戻します。この例で COS 関数に渡された式は、角度をラ
ジアンに変換しています。
SELECT COS(degrees*180/3.1417) FROM anglestbl
SIN 関数
SIN 関数は、ラジアン式のサインを戻します。次の例では、表 anglestbl の列 radians
内の値のサインを戻します。
SELECT SIN(radians) FROM anglestbl
TAN 関数
TAN 関数は、ラジアン式のタンジェントを戻します。次の例では、表 anglestbl の
列 radians 内の値のタンジェントを戻します。
SELECT TAN(radians) FROM anglestbl
4-80
Informix Guide to SQL:Syntax
式
ACOS 関数
ACOS 関数は、数値式のコサインを戻します。次の例では、ラジアン内の値 -0.73
の余弦弧を戻します。
SELECT ACOS(-0.73) FROM anglestbl
ASIN 関数
ASIN 関数は、数値式の正弦弧を戻します。次の例では、ラジアン内の値 -0.73 の正
弦弧を戻します。
SELECT ASIN(-0.73) FROM anglestbl
ATAN 関数
ATAN 関数は、数値式の正接弧を戻します。次の例では、ラジアン内の値 -0.73 の
正接弧を戻します。
SELECT ATAN(-0.73) FROM anglestbl
ATAN2 関数
ATAN2 関数は、(<x,y>) に関連付けられた極座標 (<r,θ>) の角成分を計算します。次
の例では、 θ に対する角度を直交座標 (4,5) と比較します。
WHERE angles > ATAN2(4,5)
--determines θ for (4,5) and
compares to angles
放射座標 <r> の長さを、次の例の式を使用して求めることができます。
SQRT(POW(x,2) + POW(y,2))
--determines r for (x,y)
直交座標 (4,5) に対する放射座標 <r> の長さを、次の例の式を使用して求めること
ができます。
SQRT(POW(4,2) + POW(5,2))
--determines r for (4,5)
セグメント
4-81
式
文字列操作関数
文字列操作関数は、文字列に関する各種操作を実行します。文字列操作関数の構文
は、次のとおりです。
文字列操作関数
関数式へ戻る
4-54 ページ
TRIM 関数
4-83 ページ
IDS
SUBSTRING 関数
4-85 ページ
+
SUBSTR 関数
4-87 ページ
REPLACE 関数
4-89 ページ
LPAD 関数
4-91 ページ
RPAD 関数
4-92 ページ
大文字小文字変換関数
4-93 ページ
4-82
Informix Guide to SQL:Syntax
式
TRIM 関数
TRIM 関数を使用して、文字列から先行の埋込み文字または最後の埋込み文字もし
くはその両方を削除します。
文字列操作関数へ戻る
4-82 ページ
TRIM 関数
TRIM
(
< ソース式 >
LEADING
)
FROM
< トリム式 >
TRAILING
BOTH
< トリム式 >
要素
< トリム式 >
< ソース式 >
目的
単一の文字または NULL の値
の式です。
列や他の TRIM() 関数を含む任
意の文字列式です。
FROM
制限
この式は文字式でなければなり
ません。
式はホスト変数であってはなり
ません。
構文
引用符付き文字列、
4-156 ページ
引用符付き文字列、
4-156 ページ
TRIM 関数は、この関数に渡された文字列と同じ可変長文字 (VARCHAR) 型文字列
を戻します。LEADING、TRAILING、BOTH のいずれかのトリムを指定しないと、
BOTH が想定されます。< トリム式 > を使用しないと、一つの空白が想定されま
す。< トリム式 > または < ソース式 > のいずれかが NULL を示すと、この TRIM 関
数の結果は NULL になります。結果として得られる文字列の最大長は、可変長文字
(VARCHAR) 型が 255 文字までしかサポートしていないため、255 文字以下でなけ
ればなりません。
次の例に、TRIM 関数の一般的な使用方法をいくつか示します。
SELECT TRIM (c1) FROM tab;
SELECT TRIM (TRAILING '#' FROM c1) FROM tab;
SELECT TRIM (LEADING FROM c1) FROM tab;
UPDATE c1='xyz' FROM tab WHERE LENGTH(TRIM(c1))=5;
SELECT c1, TRIM(LEADING '#' FROM TRIM(TRAILING '%' FROM
'###abc%%%')) FROM tab;
セグメント
4-83
式
DESCRIBE 文を、選択対象の並びの中で TRIM 関数を使う SELECT 文とともに使用
する場合、トリミングされた列が記述される文字型は、使用しているデータベース
サーバと < ソース文字型値式 > のデータ型によって異なります。ESQL/C での
『Informix Guide to GLS Functionality』
TRIM 関数に関する GLS の対応については、
を参照してください。♦
GLS
固定文字型列
TRIM 関数は、固定長文字型列で指定することができます。文字列の長さが完全に
埋められないと、未使用の文字は空白でパッドされます。図 4-3 は、列エントリ
’##A2T##’ についてこの概念を説明しています。ここで、列は CHAR(10) として定
義されています。
1
2
3
#
#
A
4
2
5
6
7
8
T
#
#
9
10
図 4-3
固定長文字型列への
列エントリ
パッドされた空白
文字
トリム式 ’#’ を、列からトリミングしたい場合、パッドされた空白を実際の文字と同
じように考えなければなりません。たとえば、トリムを BOTH に指定すると、
TRIM 関数が文字列に続くパッドされた空白に一致しないため、トリム操作による
結果は A2T## になります。この場合、他の文字に先行する ’#’ だけがトリミングさ
れます。次に示すのは SELECT 文とその結果 ( 図 4-4) です。
SELECT TRIM(BOTH '#' FROM col1) FROM taba
1
A
2
2
3
T
4
#
5
7
8
9
#
文字
4-84
6
Informix Guide to SQL:Syntax
パッドされた空白
10
図 4-4
TRIM 操作の結果
式
次の SELECT 文は、すべての ’#’ を削除します。
SELECT TRIM(LEADING '#' FROM TRIM(TRAILING ' ' FROM col1)) FROM taba
SUBSTRING 関数
IDS
Dynamic Server では、SUBSTRING 関数は、ソース文字列のサブセットを返します。
文字列操作関数へ戻る
4-82 ページ
SUBSTRING 関数
SUBSTRING
(
< ソース文字列 >
FROM
)
< 開始位置 >
FOR
要素
< 長さ >
< ソース文字
列>
< 開始位置 >
< 長さ >
目的
< ソース文字列 > から返される
文字の数です。
制限
構文
このパラメータは、整数でなけ リテラル番号、
ればなりません。このパラメー 4-138 ページ
タには、式、定数、列、または
ホスト変数が可能です。
SUBSTRING 関数への入力とし このパラメータは、文字データ 式、4-33 ページ
型に変換できるデータ型ならど
て使用される文字列です。
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
SUBSTRING 関数が文字を返す このパラメータは、整数でなけ リテラル番号、
< ソース文字列 > の開始列位置 ればなりません。このパラメー 4-138 ページ
タには、式、定数、列、または
です。
ホスト変数が可能です。このパ
ラメータの直前には、プラス記
号 (+) やマイナス記号 (-) を付け
ることも、記号を何も付けない
こともできます。
セグメント
4-85
式
このサブセットの先頭は、< 開始位置 > で指定された列位置になります。次の表に、
< 開始位置 > の入力値に基づいて、データベース サーバが、戻りサブセットの開始
位置を特定する方法を示します。
< 開始位置 >
の値
データベース サーバが戻りサブセットの開始位置を特定する
方法
正の値
< ソース文字列 > の先頭文字から正方向にカウントします。
例えば、< 開始位置 > = 1 の場合、< ソース文字列 > の先頭文字
は、戻りサブセット内の先頭文字になります。
ゼロ (0)
< ソース文字列 > の先頭文字の一つ前の位置 ( すなわち、左側 )
からカウントします。
例えば、< 開始位置 > = 0 で < 長さ > = 1 の場合、データベース
サーバは NULL を返します。一方、< 長さ > = 2 の場合には、デー
タベース サーバは、< ソース文字列 > の先頭文字を返します。
負の値
< ソース文字列 > の先頭文字の一つ前の位置 ( すなわち、左側 )
から逆方向にカウントします。
例えば、< 開始位置 > = -1 の場合、戻りサブセットの開始位置は、
< ソース文字列 > の先頭文字の二つ前の位置 (0 と -1) になります。
サブセットのサイズは、< 長さ > で指定されます。パラメータ < 長さ > は、バイト
数ではなく、論理文字数を参照します。< 長さ > を省略すると、SUBSTRING 関数
は、< 開始位置 > で始まる < ソース文字列 > の全体を返します。
次の例では、ユーザは、列位置 3 で始まり、文字長が 2 文字のソース文字列のサブ
セットが返されるよう指定しています。
SELECT SUBSTRING('ABCDEFG' FROM 3 FOR 2)
FROM mytable
次の表に、この SELECT 文の出力を示します。
( 定数 )
CD
次の例では、ユーザは、戻りサブセットに負の < 開始位置 > を指定しています。
SELECT SUBSTRING('ABCDEFG' FROM -3 FOR 7)
FROM mytable
4-86
Informix Guide to SQL:Syntax
式
データベース サーバは、位置 -3 ( 先頭文字の 4 つ前の位置 ) から開始して、正方向
に 7 文字カウントします。次の表に、この SELECT 文の出力を示します。
( 定数 )
ABC
SUBSTR 関数
IDS
Dynamic Server では、SUBSTR 関数と SUBSTRING 関数は同じ目的 ( ソース文字列
のサブセットを返す ) で使用されますが、構文が異なります。
文字列操作関数へ戻る
4-82 ページ
SUBSTR
関数
SUBSTR
(
< ソース文字列 >
,
)
< 開始位置 >
,
< 長さ >
セグメント
4-87
式
要素
< 長さ >
目的
< ソース文字列 > から返される
文字の数です。
< ソース文字
列>
< 開始位置 >
制限
構文
このパラメータは、整数でなけ リテラル番号、
ればなりません。このパラメー 4-138 ページ
タには、式、定数、列、または
ホスト変数が可能です。
SUBSTR 関数への入力として使 このパラメータは、文字データ 式、4-138 ページ
型に変換できるデータ型ならど
用される文字列です。
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
このパラメータは、整数でなけ リテラル番号、
SUBSTR 関数が文字を返す
< ソース文字列 > の開始列位置 ればなりません。このパラメー 4-138 ページ
タには、式、定数、列、または
です。
ホスト変数が可能です。このパ
ラメータの直前には、プラス記
号 (+) やマイナス記号 (-) を付け
ることも、記号を何も付けない
こともできます。
SUBSTR 関数は、< ソース文字列 > のサブセットを返します。このサブセットの先
頭は、< 開始位置 > で指定された列位置になります。次の表に、< 開始位置 > の入
力値に応じて、データベース サーバが、戻りサブセットの開始位置を特定する方法
を示します。
< 開始位置 >
の値
データベース サーバが戻りサブセットの開始位置を特定する
方法
正の値
< ソース文字列 > の先頭文字から正方向にカウントします。
ゼロ (0)
< ソース文字列 > の先頭文字から正方向にカウントします ( すな
わち、< 開始位置 > 0 は、1 と等価として処理されます )。
負の値
< ソース文字列 > の最終文字から逆方向にカウントします。
値 -1 は、< ソース文字列 > の最終文字を返します。
< 長さ > は、サブセットの ( バイトではなく ) 文字数を指定します。< 長さ > を省略す
ると、SUBSTR 関数は、< 開始位置 > で始まる < ソース文字列 > の全体を返します。
4-88
Informix Guide to SQL:Syntax
式
次の例では、ユーザは、返されるソース文字列のサブセットが、文字列の終わりか
ら 3 文字戻った先頭位置から開始されるよう指定しています。ソース文字列の長さ
は 7 文字であるため、この開始位置は、< ソース文字列 > の 5 番目の列になります。
ユーザは、< 長さ > に値を指定していないため、データベース サーバは、列位置 5
で始まるソース文字列の全体部分を返します。
SELECT SUBSTR('ABCDEFG', -3)
FROM mytable
次の表に、この SELECT 文の出力を示します。
( 定数 )
EFG
REPLACE 関数
IDS
Dynamic Server では、REPLACE 関数は、ソース文字列内の指定文字を別の文字に置
換します。
文字列操作関数へ戻る
4-82 ページ
REPLACE
関数
REPLACE
(
< ソース文字列 >
,
)
< 旧文字列 >
,
< 新文字列 >
セグメント
4-89
式
要素
< 新文字列 >
< 旧文字列 >
< ソース文字
列>
目的
制限
構文
戻り文字列の < 旧文字列 > を置換 このパラメータは、文字データ 式、4-33 ページ
する一つまたは複数の文字です。 型に変換できるデータ型ならど
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
< ソース文字列 > 内の、< 新規 このパラメータは、文字データ 式、4-33 ページ
文字列 > で置換される一つまた 型に変換できるデータ型ならど
のデータ型でも可能です。この
は複数の文字です。
パラメータには、式、定数、列、
またはホスト変数が可能です。
REPLACE 関数への入力として このパラメータは、文字データ 式、4-33 ページ
型に変換できるデータ型ならど
使用される文字列です。
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
REPLACE 関数は、< 旧文字列 > がすべて < 新規文字列 > に置換された < ソース文
字列 > のコピーを返します。オプション < 新規文字列 > を省略すると、戻り文字列
から、< 旧文字列 > がすべて省略されます。
次の例では、ユーザは、ソース文字列内の xz をすべて t に置換しています。
SELECT REPLACE('Mighxzy xzime', 'xz', 't')
FROM mytable
次の表に、この SELECT 文の出力を示します。
( 定数 )
Mighty time
4-90
Informix Guide to SQL:Syntax
式
LPAD 関数
IDS
Dynamic Server では、LPAD 関数は、< 長さ > で指定された合計文字数まで左パッド
された < ソース文字列 > のコピーを返します。
文字列操作関数へ戻る
4-82 ページ
LPAD 関数
LPAD
(
< ソース文字列 >
,
)
< 長さ >
,
要素
< 長さ >
目的
戻り文字列内の合計文字数を示
す整数値です。
< パッド文字
列>
一つまたは複数のパッド文字を
指定する文字列です。
< ソース文字
列>
LPAD 関数への入力として使用
される文字列です。
< パッド文字列 >
制限
構文
このパラメータには、式、定
リテラル番号、
数、列、またはホスト変数が可 4-138 ページ
能です。
このパラメータは、文字データ 式、4-33 ページ
型に変換できるデータ型ならど
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
このパラメータは、文字データ 式、4-33 ページ
型に変換できるデータ型ならど
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
パラメータ < パッド文字列 > は、ソース文字列をパッドするときに使用する一つま
たは複数のパッド文字列を指定します。パッド文字のシーケンスは、戻り文字列が
< 長さ > で指定された長さに達するまで必要な回数だけ発生します。< パッド文字
列 > 内のパッド文字のシーケンスは、長過ぎて < 長さ > 内に収まらない場合には切
り捨てられます。パラメータ < パッド文字列 > を省略すると、デフォルト値は、単
一の空白になります。
次の例では、ユーザは、ソース文字列が、合計 16 文字長まで左パッドされるよう
指定しています。また、ユーザは、パッド文字が、ダッシュとアンダスコア (-_) で
構成されるシーケンスになるように指定しています。
SELECT LPAD('Here we are', 16, '-_')
FROM mytable
セグメント
4-91
式
次の表に、この SELECT 文の出力を示します。
( 定数 )
-_-_-Here we are
RPAD 関数
IDS
Dynamic Server では、RPAD 関数は、< 長さ > で指定された合計文字数まで右パッド
された < ソース文字列 > のコピーを返します。
文字列操作関数へ戻る
4-82 ページ
RPAD 関数
RPAD
(
< ソース文字列 >
,
)
< 長さ >
,
要素
< 長さ >
目的
戻り文字列内の合計文字数を示
す整数値です。
< パッド文字
列>
一つまたは複数のパッド文字を
指定する文字列です。
< ソース文字
列>
RPAD 関数への入力として使用
される文字列です。
4-92
Informix Guide to SQL:Syntax
< パッド文字列 >
制限
構文
このパラメータには、式、定
リテラル番号、
数、列、またはホスト変数が可 4-138 ページ
能です。
このパラメータは、文字データ 式、4-33 ページ
型に変換できるデータ型ならど
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
このパラメータは、文字データ 式、4-33 ページ
型に変換できるデータ型ならど
のデータ型でも可能です。この
パラメータには、式、定数、列、
またはホスト変数が可能です。
式
パラメータ < パッド文字列 > は、ソース文字列をパッドするときに使用する一つま
たは複数のパッド文字列を指定します。パッド文字のシーケンスは、戻り文字列が
< 長さ > で指定された長さに達するまで必要な回数だけ発生します。< パッド文字
列 > 内のパッド文字のシーケンスは、長過ぎて < 長さ > 内に収まらない場合には切
り捨てられます。パラメータ < パッド文字列 > を省略すると、デフォルト値は、単
一の空白になります。
次の例では、ユーザは、ソース文字列が、合計 18 文字長まで右パッドされるよう
指定しています。また、ユーザは、パッド文字が、疑問符と感嘆符 (?!) で構成され
るシーケンスになるように指定しています。
SELECT RPAD('Where are you', 18, '?!')
FROM mytable
次の表に、この SELECT 文の出力を示します。
( 定数 )
Where are you?!?!?
IDS
大文字小文字変換関数
Dynamic Server では、大文字小文字変換関数を使用すれば、データベースで、大文
字と小文字を区別しない探索を実行して、出力のフォーマットを指定することがで
きます。次のダイヤグラムに、大文字小文字変換関数式の構文を示します。
大文字小文字
変換関数
文字列操作関数へ戻る
4-82 ページ
UPPER
(
< ソース式 >
)
LOWER
INITCAP
セグメント
4-93
式
要素
< ソース式 >
目的
文字列と評価される列名、関
数、引用符付き文字列、ホスト
変数、または式です。
制限
この式は、文字データ型でなく
てはなりません。
構文
式、4-33 ページ
ホスト変数を使用する場合に
は、変換した文字列を処理する
のに十分な長さのホスト変数が
宣言される必要があります。
大文字小文字変換関数は、次の関数を実行します。
■
UPPER
この関数は、< ソース式 > 内の小文字のアルファベット文字をすべて、対
応する大文字のアルファベット文字に置換した < ソース式 > のコピーを返
します。
■
LOWER
この関数は、< ソース式 > 内の大文字のアルファベット文字をすべて、対
応する小文字のアルファベット文字に置換した < ソース式 > のコピーを返
します。
■
INITCAP
この関数は、< ソース式 > 内の語がすべて大文字の英字で始まる < ソース
式 > のコピーを返します。
この関数では、英字以外のどの文字の後でも、語が開始されます。このた
め、空白以外にも、コンマ、ピリオド、およびコロンなどの記号は、新た
な語を開始します。
入力のデータ型は、文字データ型でなければなりません。列が記述される場合、
データベース サーバが返すデータ型は、入力のデータ型と同じになります。例え
ば、入力のデータ型が文字 (CHAR) 型の場合、出力のデータ型も文字 (CHAR) 型に
なります。
GLS
4-94
大文字小文字変換関数により任意の列の記述から返されるバイト長は、ソース文字
列の入力のバイト長と同じです。複数バイト文字の < ソース式 > を指定して大文字
小文字変換関数を使用すると、この変換により、文字列の長さが増減することがあ
ります。結果文字列のバイト長が、< ソース式 > のバイト長を超えると、データ
ベース サーバは、< ソース式 > のバイト長内に収まるように結果文字列を切り捨て
ます。♦
Informix Guide to SQL:Syntax
式
< ソース式 > が NULL の場合、大文字小文字変換関数の結果も NULL になります。
次のインスタンスでは、データベース サーバは、大文字小文字変換関数をストアド
プロシジャとして処理します。
■
大文字小文字変換関数に引数が指定されていない場合
■
大文字小文字変換関数に引数が一つ指定されており、その引数が名前付き
引数の場合
■
大文字小文字変換関数に複数の引数が指定されている場合
■
引数としてホスト変数が指定されていて、SELECT リストに大文字小文字
変換関数が指定されている場合
直前のリストの条件が満足されていない場合、データベース サーバは、大文字小文
字変換関数をシステム関数として処理します。
例
次の例に、大文字小文字変換関数を使用して、値を返すフォーマットを指定する方
法を記載します。
Input Record: SAN Jose
SELECT City, LOWER(City), Lower("City"), UPPER (City),
INITCAP(City)
FROM Weather;
問合せ出力
SAN Jose san jose city SAN JOSE San Jose
次の例に、UPPER 関数を使用して、列 lname で、大文字小文字を区別しない探索を
実行して、ラスト ネームが curran の従業員を全員探す方法を示します。選択リスト
に INITCAP 関数が指定されているため、データベース サーバは、大文字小文字混
合フォーマットで結果を返します。例えば、1 対応行の出力は、accountant James
Curran のようになります。
SELECT title, INITCAP(fname), INITCAP(lname) FROM employees
WHERE UPPER (lname) = "CURRAN"
次の例に、LOWER 関数を使用して、列 City で、大文字小文字を区別しない探索を
実行する方法を示します。この文は、データベース サーバに指示して、語 san jose
のインスタンスをすべて ( すなわち、どのバリエーションも ) 大文字小文字混合
フォーマット San Jose に置換します。
UPDATE Weather SET City =("San Jose")
WHERE LOWER (City = "san jose");
セグメント
4-95
式
集計式
集計式は、選択したデータベースデータを要約するために集計関数を使用します。
次のダイヤグラムは、集計関数式の構文を示しています。
式へ戻る
4-33 ページ
集計式
COUNT ( * )
(
AVG
MAX
MIN
SUM
COUNT
(
+
<列>
DISTINCT
< 表 >.
UNIQUE
< ビュー >.
< シノニム >.
DISTINCT
UNIQUE
COUNT
(
ALL
AVG
MAX
MIN
SUM
RANGE
STDEV
VARIANCE
4-96
Informix Guide to SQL:Syntax
(
ALL
式の
サブセット
4-98
ページ
)
)
式
要素
< 列名 >
目的
指定した集計関数が適用されて
いる列名です。
< シノニム >
指定の列があるシノニムの名前
です。
<表>
指定の列がある表の名前です。
< ビュー >
指定の列があるビューの名前
です。
制限
SELECT 文の SELECT 節ですべ
ての集計関数と一つまたは複数
の列を指定すると、GROUP BY
節の集計式や時間式で使用され
ていないすべての列名を指定し
なければなりません。バイト
(BYTE) 型列またはテキスト
(TEXT) 型列に集計関数を適用
することはできません。他の一
般的な制限については、4-98
ページの「集計式で許される式
のサブセット」を参照してくだ
さい。< 列名 > の前に付ける
キーワードに依存する制限につ
いては、以降に記述されている
それぞれのキーワードを参照し
てください。
シノニムが指し示すシノニムお
よび表は存在していなければな
りません。
表は存在していなければなりま
せん。
ビューは存在していなければな
りません。
構文
識別子、
4-112 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
集計関数は、問合せが行われた行のセットに対して一つの値を戻します。次の例
は、SELECT 文の中での集計関数を示しています。
SELECT SUM(total_price) FROM items WHERE order_num = 1013
SELECT COUNT(*) FROM orders WHERE order_num = 1001
SELECT MAX(LENGTH(fname) + LENGTH(lname)) FROM customer
集計関数と選択対象の並びの中の一つまたは複数の列を使用する場合、使用されて
いないすべての列名を集合の一部として、または GROUP BY 節内の時刻式として
指定しなければなりません。
セグメント
4-97
式
集計式で許される式のサブセット
集計関数の引数自身に、集計関数を含めることはできません。次の集計関数は使用
できません。
■
MAX(AVG(order_num))
■
副問合せ文に含まれていない WHERE 節の中の集計関数。または、親問合
せから発生した相関した列上にあり、WHERE 節が HAVING 節内の副問合
せ文の中にある集計関数
■
バイト (BYTE) 型列またはテキスト (TEXT) 型列上の集計関数
式の構文についての詳細は、4-33 ページを参照してください。
行セットでの重複の設定と除外
キーワード DISTINCT によって、指定された列の一意の値だけに関数を適用するこ
とができます。キーワード UNIQUE はキーワード DISTINCT のシノニムです。
キーワード ALL はキーワード DISTINCT の反対です。キーワード ALL を指定する
と、指定された列や式から選択されたすべての値が、重複値があればそれらも含め
て計算で使用されます。
COUNT 関数
さまざまな形式の COUNT 関数を使用して、いろいろな情報を検索することができ
ます。次のセクションで COUNT 関数の説明をします。
キーワード COUNT(*)
キーワード COUNT(*) は、SELECT 文の WHERE 節の条件を満たす行の数を返しま
す。次の例では、表 stock で列 manu_code に値 HRO を持つ行数を求めています。
SELECT COUNT(*) FROM stock WHERE manu_code = 'HRO'
4-98
Informix Guide to SQL:Syntax
式
SELECT 文に WHERE 節がない場合、キーワード COUNT(*) は表に含まれる行数の
合計を返します。次の例では、表 stock に含まれる行数を求めています。
SELECT COUNT(*) FROM stock
SELECT 文の中に GROUP BY 節があれば、キーワード COUNT(*) は各グループ内
の値の個数を示します。次の例は、名前によりグループ化されています。データ
ベースサーバが複数の同じ名前を見つけると、それらの行が選択されます。
SELECT fname, COUNT(*) FROM customer
GROUP BY fname
HAVING COUNT(*) > 1
一つまたは複数の行の値が NULL である場合、キーワード COUNT(*) は WHERE 節
がこれらを明示的に省略しないかぎり NULL 列を含めます。
キーワード COUNT DISTINCT とキーワード UNIQUE
キーワード COUNT DISTINCT は、次の例に示すように、列または式の中の一意の
値の個数を戻します。COUNT 関数で NULL が発生すると、NULL は無視されます。
SELECT COUNT (DISTINCT item_num) FROM items
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード COUNT はその列についてゼロを戻し
ます。
キーワード UNIQUE は、COUNT 関数で使用されている場合、キーワード
DISTINCT とまったく同じ意味を持ちます。キーワード UNIQUE は列または式の中
の一意で非 NULL の値の個数を返します。
次の例ではキーワード UNIQUE を使用していますが、先程のキーワード DISTINCT
を使用している例と同値です。
SELECT COUNT (UNIQUE item_num) FROM items
セグメント
4-99
式
オプション COUNT< 列 >
オプション COUNT< 列 > は、次の例に示すように、列または式の中の非 NULL の
値の個数の合計を返します。
SELECT COUNT (item_num) FROM items
明確にするために列名を指定する前に、キーワード ALL を指定できますが、キー
ワード ALL を指定しても省略しても問合せ結果は同じです。
次の例は、オプション COUNT< 列 > にキーワード ALL を指定する方法を示したも
のです。
SELECT COUNT (ALL item_num) FROM items
COUNT 関数の各種フォーマットの比較
COUNT 関数のいろいろな形式を使用すれば、任意の表のいろいろなタイプの情報
を検索することができます。次の表に、COUNT 関数の各形式の意味を要約します。
COUNT オプション
説明
COUNT (*)
問合せを満足する行数を返します。
WHERE 節を指定しないと、このオプションは、
表内の合計行数を返します。
COUNT DISTINCT または
COUNT UNIQUE
指定の列内の一意の非 NULL 値の数を返します。
COUNT(< 列 >) または
COUNT(ALL< 列 >)
指定の列内の非 NULL 値の合計数を返します。
例をいくつか挙げて、COUNT 関数のいろいろな形式間の相違を示します。次の例
では、デモンストレーション データベースの表 orders に問合せをしています。例の
ほとんどは、この表内の列 ship_instruct に問い合わせしています。表 orders の構造
と列 ship_instruct 内のデータについては、『Informix Guide to SQL: Reference』のデモ
ンストレーション データベースの説明を参照してください。
4-100 Informix Guide to SQL:Syntax
式
オプション COUNT(*) の例
次の例は、表 orders 内の合計行数を調べる場合を示します。WHERE 節を指定せず
に、SELECT 文で COUNT(*) 関数を使用します。
SELECT COUNT(*) AS total_rows FROM orders
次の表に、この問合せの結果を示します。
total_rows
23
次の例は、表 orders 内のどれだけの行で、列 ship_instruct に NULL 値が指定されて
いるかを調べる場合を示します。WHERE 節を指定した SELECT 文で COUNT(*) 関
数を使用し、さらに WHERE 節に IS NULL 条件を指定します。
SELECT COUNT (*) AS no_ship_instruct
FROM orders
WHERE ship_instruct IS NULL
次の表に、この問合せの結果を示します。
no_ship_instruct
2
次の例は、表 orders 内のどれだけの行で、列 ship_instruct に値 express が指定されて
いるかを調べる場合を示します。選択リストに COUNT(*) 関数を指定し、WHERE
節に等号 (=) 関係演算子を指定します。
SELECT COUNT (*) AS ship_express
FROM ORDERS
WHERE ship_instruct = 'express'
セグメント
4-101
式
次の表に、この問合せの結果を示します。
ship_express
6
オプション COUNT< 列 > の例
次の例は、表 orders の列 ship_instruct に非 NULL 値がいくつあるのかを調べる場合
を示します。SELECT 文の選択対象の並びに COUNT < 列名 > 関数を入力します。
SELECT COUNT(ship_instruct) AS total_notnulls
FROM orders
次の表に、この問合せの結果を示します。
total_notnulls
21
キーワード COUNT の後ろのカッコにキーワード ALL を記述し、列 ship_instruct に
非 NULL 値がいくつあるかを求めることもできます。
SELECT COUNT (ALL ship_instruct) AS all_notnulls
FROM orders
次の表には、キーワード ALL を記述してもしなくても、問合せの結果は同じである
ことが示されています。
all_notnulls
21
4-102 Informix Guide to SQL:Syntax
式
オプション COUNT DISTINCT の例
次の例は、表 orders の列 ship_instruct にある一意の非 NULL 値の数を調べる場合を
示します。SELECT 文の選択リストに COUNT DISTINCT 関数を入力します。
SELECT COUNT(DISTINCT ship_instruct) AS unique_notnulls
FROM orders
次の表に、この問合せの結果を示します。
unique_notnulls
16
キーワード AVG
キーワード AVG は、列または式で指定されたすべての値の平均値を戻します。
キーワード AVG を適用できるのは数値型列だけです。キーワード DISTINCT を使
用すると、平均値は指定された列や式の中の異なる値だけよりも大きくなります。
次の例の中の問合せでは、ヘルメットの平均価格を求めています。
SELECT AVG(unit_price) FROM stock WHERE stock_num = 110
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード AVG はその列について NULL を戻し
ます。
キーワード MAX
キーワード MAX は、指定された列または式の中の最大値を戻します。キーワード
DISTINCT を使用しても結果は同じになります。次の例の問合せでは、取扱品目の
中でもっとも高価であるが注文されていない品目を探索しています。
SELECT MAX(unit_price) FROM stock
WHERE NOT EXISTS (SELECT * FROM items
WHERE stock.stock_num = items.stock_num AND
stock.manu_code = items.manu_code)
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード MAX はその列について NULL を戻し
ます。
セグメント
4-103
式
キーワード MIN
キーワード MIN は、列または式の中の最小値を戻します。キーワード DISTINCT
を使用しても結果は同じになります。次の例では、表 stock の中でもっとも安い品
目を探索しています。
SELECT MIN(unit_price) FROM stock
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード MIN はその列について NULL を戻し
ます。
キーワード SUM
キーワード SUM は、次の例に示すとおり、指定された列または式の中のすべての
値の合計を戻します。キーワード DISTINCT を使用すると、その列や式の中の異な
る値についてのみの合計が戻されます。
SELECT SUM(total_price) FROM items WHERE order_num = 1013
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード SUM はその列について NULL を戻し
ます。
キーワード SUM は文字 (CHAR) 型列には使用できません。
キーワード RANGE
キーワード RANGE は、母集団のサンプルの範囲を計算します。次のように、最大
値と最小値の差が計算されます。
range(expr) = max(expr) - min(expr)
キーワード RANGE を適用できるのは数値列だけです。次の問合せでは、母集団の
年齢の範囲を探索しています。
SELECT RANGE(age) FROM u_pop
4-104 Informix Guide to SQL:Syntax
式
他の集計関数と同様に、キーワード RANGE は、次の例に示すように問合せが
GROUP BY 節を含んでいるとグループの行に適用されます。
SELECT RANGE(age) FROM u_pop
GROUP BY birth
他の集計関数と同様に、キーワード RANGE は、次の例に示すように問合せが
GROUP BY 節を含んでいるとグループの行に適用されます。
重要 : RANGE 関数のすべての計算は 32 桁の有効桁数で行われます。この精度は、
多くの入力データセットで十分でしょう。ただし、すべての入力データ値が 16 桁
以上の有効桁数を持っている場合、計算の精度が落ちたり誤った結果を戻したりし
ます。
キーワード STDEV
キーワード STDEV は、母集団のサンプルの標準偏差を計算します。これはキー
ワード VARIANCE の平方根になります。
キーワード STDEV が適用できるのは数値列だけです。次の問合せでは、ある母集
団についての標準偏差を求めています。
SELECT STDEV(age) FROM u_pop WHERE u_pop.age > 0
他の集計関数と同様に、STDEV 関数は、次の例に示すように問合せが GROUP BY
節を含んでいるとグループの行に適用されます。
SELECT STDEV(age) FROM u_pop
GROUP BY birth
WHERE STDEV(age) > 0
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード STDEV はその列について NULL を戻
します。
重要 : キーワード STDEV のすべての計算は 32 桁の有効桁数で行われます。この
精度は、多くの入力データセットで十分でしょう。ただし、すべての入力データ値
が 16 桁以上の有効桁数を持っている場合、計算の精度が落ちたり誤った結果を戻
したりします。
セグメント
4-105
式
キーワード VARIANCE
キーワード VARIANCE は、母集団の分散の偏りのない推定値として、値のサンプ
ルの分散を戻します。次の値が計算されます。
(SUM(Xi**2) - (SUM(Xi)**2)/N)/(N-1)
この例で、Xi は列内の各値を示し、N は列内の値の合計数を示しています。キー
ワード VARIANCE は数値列だけに適用できます。次の問合せでは、母集団の分散
を求めています。
SELECT VARIANCE(age) FROM u_pop WHERE u_pop.age > 0
他の集計関数と同様に、キーワード VARIANCE は、次の例に示すように問合せが
GROUP BY 節を含んでいるとグループの行に適用されます。
SELECT VARIANCE(age) FROM u_pop
GROUP BY birth
WHERE VARIANCE(age) > 0
指定された列の中のすべての値が NULL でないかぎり、NULL は無視されます。す
べての列の値が NULL であれば、キーワード VARIANCE はその列について NULL
を戻します。
重要 : キーワード VARIANCE のすべての計算は 32 桁の有効桁数で行われます。こ
の精度は多くの入力データセットで十分でしょう。ただし、すべての入力データ値
が 16 桁以上の有効桁数を持っている場合、計算の精度が落ちたり誤った結果を戻
したりします。
4-106 Informix Guide to SQL:Syntax
式
集計関数の動作のまとめ
次に示す例は、集計関数の動作の概要を知るのに役立ちます。表 testtable に
a_number という単一の整数 (INT) 型列があるとします。この表の内容は次のとおり
です。
a_number
2
2
2
3
3
4
(null)
集計関数を使用して、列 a_number や表 testtable についての異なる種類の情報を取得
できます。次の例では、AVG 関数を指定して列 a_number のすべての非 NULL 値の
平均を取得しています。
SELECT AVG(a_number) AS average_number
FROM testtable
次の表に、この問合せの結果を示します。
average_number
2.66666666666667
セグメント
4-107
式
先程の例で示した文と同じような SELECT 文で、他の集計関数を使用できます。選
択リストに異なる集計関数を持つ一連の SELECT 文を入力し、しかも SELECT 文に
WHERE 節を指定していない場合、次の表に示す結果が得られます。
関数
結果
COUNT(*)
7
AVG
2.66666666666667
AVG (DISTINCT)
3.00000000000000
MAX
4
MAX(DISTINCT)
4
MIN
2
MIN(DISTINCT)
2
SUM
16
SUM(DISTINCT)
9
COUNT(DISTINCT)
3
COUNT(ALL)
6
RANGE
2
STDEV
0.81649658092773
VARIANCE
0.66666666666667
4-108 Informix Guide to SQL:Syntax
式
E/C
ESQL/C のエラー検査
集計関数は常に一つの行を戻します。行が一つも選択されないと、関数は NULL を
戻します。キーワード COUNT(*) を使用して、選択された行があるかどうかを判断
することができます。また、標識変数を使用して、選択された行が空であるかどう
かを判断することもできます。集計関数に関連付けられたカーソルとともに行を取
り出すと、常に一つの行が戻されます。したがって、データの終わりに 100 があっ
ても、最初の取出しで sqlcode 変数には絶対に戻されません。
また、エラー検査には GET DIAGNOSTICS 文を使用することもできます。
式とともに算術演算子を使用する方法
式と算術演算子を組み合わせれば、複雑な式を作成することができます。ただし、
集計関数を使用する式を列式と組み合わせることはできません。次の例では、算術
演算子を使用しています。
quantity * total_price
price * 2
COUNT(*) + 2
算術式の中の値が一つでも NULL であると、次の例に示すとおり、式全体の値が
NULL になります。
SELECT order_num, ship_charge/ship_weight FROM orders
WHERE order_num = 1023
ship_charge または ship_weight のいずれかが NULL であると、式
ship_charge/ship_weight の戻り値も NULL になります。式 ship_charge/ship_weight が
ある条件で使用されると、その真の値は未知になります。
日時 (DATETIME) 型値を、一つまたは複数の時間隔 (INTERVAL) 型値と組み合わ
せる場合には、時間隔 (INTERVAL) 型値のフィールドはすべて、日時 (DATETIME)
型値に指定されている必要があります。その時、暗黙的 EXTEND 関数は実行され
ません。さらに、YEAR から MONTH への時間隔と、DAY から SECOND への時間
隔を一緒に使用することはできません。
セグメント
4-109
式
プロシジャ 呼出し式
次のダイヤグラムに、プロシジャ 呼出し式を示します。
プロシジャ
コール式
< プロシジャ >
(
式 4-33
ページ
< 呼び出される変数 >
要素
< 呼び出され
る変数 >
式へ戻る
4-33 ページ
,
)
=
目的
プロシジャに引数を指定する場
合のパラメータ名です。
制限
呼び出されるプロシジャで、任
意の引数にオプション < 呼び出
このパラメータ名は、もともと される変数 > を使用する場合に
CREATE PROCEDURE 文に指定 は、そのプロシジャのすべての
されており、その後 EXECUTE 引数にこのオプションを使用し
PROCEDURE 文に使用されるも なければなりません。すなわ
ち、呼び出されるプロシジャの
のです。
引数の全てに < 呼び出される変
数 > = < 式 > の構文を使用する
か、どの引数にもこの構文を使
用しない必要があります。
< プロシジャ > 呼び出されるプロシジャの名前 呼び出されるプロシジャは存在
です。
しなければなりません。
構文
DEFINE 文、
3-8 ページ
データベース オブ
ジェクト名、
4-25 ページ
次の例に、一般的なプロシジャ呼出し式をいくつか示します。最初の例では、オプ
ション < 呼び出される変数 > が省略されています。次の例では、オプション < 呼び
出される変数 > が使用されています。
read_address('Miller')
read_address(lastname = 'Miller')
4-110 Informix Guide to SQL:Syntax
式
参照
『Informix Guide to SQL: Tutorial』を参照して
SELECT 文の中の式の説明については、
ください。
列式の説明と長さ関数の説明と、第 7 章の TRIM 関数の説明については、
『Informix
Guide to GLS Functionality』を参照してください。
セグメント
4-111
識別子
識別子
識別子セグメントを使用して、列、表、インデックス、ビューなどのデータベース
オブジェクトの単純名を指定します。構文ダイヤグラムの識別子の参照を確認する
場合に使用します。
構文
< 文字 >
< アンダスコア >
< 文字 >
< 数字 >
< アンダスコア >
区切り識別子
4-114 ページ
要素
< 数字 >
目的
識別子の一部となる整数です。
< 文字 >
識別子の一部となる文字です。
< アンダスコ
ア>
識別子の一部となるアンダスコ
ア文字です。
4-112 Informix Guide to SQL:Syntax
制限
0 から 9 までの数字を指定しな
ければなりません。
デフォルトロケールを使用して
いる場合は、ASCII コードセッ
トで a から z の 1 文字を大文字
か小文字で指定してください。
構文
リテラル番号、
4-138 ページ
文字はキーボードか
ら入力するリテラル
値です。
デフォルト以外のロケールを使
用している場合は、そのロケー
ルがサポートするアルファベッ
ト文字を指定してください。詳
細は、4-114 ページの「識別子
での非 ASCII 文字のサポート」
を参照してください。
スペース文字、ダッシュ、ハイ アンダスコア (_) は
フン、および他の英数字以外の キーボードから入力
文字はアンダスコア文字として するリテラル値です。
は使えません。
識別子
説明
識別子は最大で 18 バイトです。
大文字の使用
データベース オブジェクトの名前は、大文字で指定することができます。ただし、
環境変数 DELIMIDENT が設定されておらず、データベース オブジェクトの名前が
二重引用符で囲まれていない場合は、データベース サーバは、その名前を小文字に
シフトします。前述の条件が満たされている場合は、データベース サーバは、デー
タベース オブジェクトの名前を区切り識別子として処理して、その名前を大文字で
保持します。区切り識別子についての詳細は、4-114 ページの「区切り識別子」を
参照してください。
識別子としての予約語の使用
ほとんどすべての語を識別子として使用できますが、SQL 文の識別子として予約語
を使うと構文があいまいになることがあります。予約語を使った文は、失敗したり期
待された結果が得られなかったりする場合があります。識別子として予約語を使用す
ることが原因となる構文のあいまいさとこれらの問題に対処する方法については、
4-117 ページの「あいまいさが生じる可能性と構文エラー」を参照してください。
区切り識別子を使用すれば、構文があいまいになることなく、容易かつ安全に予約
語を識別子として使用できます。予約語を区切り識別子として使用する場合は、特
別な対処方法は不要です。区切り識別子の構文と説明についての詳細は、4-114
ページの「区切り識別子」を参照してください。
ヒント : エラーの原因となった文と関係のなさそうなエラーメッセージを受け取っ
た場合は、文に予約語が区切り識別子でない識別子として使用されていないかどう
かを調べてください。
Informix 実装 SQL の全予約語のリストについては、付録 A を参照してください。
セグメント
4-113
識別子
識別子での非 ASCII 文字のサポート
GLS
デフォルト以外のロケールを使用している場合、そのロケールが文字として認識す
る任意のアルファベット文字を SQL 識別子名で使用できます。ロケールがサポー
トしているかぎり、非 ASCII 文字を使用することができます。この機能により、イ
ンデックス、表、ビューなどのデータベースオブジェクトの名前に非 ASCII 文字を
使用できます。非 ASCII 文字をサポートする SQL 識別子のリストは『Informix
Guide to GLS Functionality』を参照してください。
区切り識別子
区切り
識別子
識別子へ戻る
4-112 ページ
"
< 文字 >
< 数字 >
< アンダスコア >
< 特列文字 >
4-114 Informix Guide to SQL:Syntax
"
識別子
要素
< 数字 >
< 文字 >
目的
区切り識別子の一部となる整数
です。
区切り識別子の一部となる文字
です。
< 特殊文字 >
区切り識別子の一部となる #、
$、空白などの非英数字です。
< アンダスコア >
区切り識別子の一部となるアン
ダスコア (_) です。
制限
0 から 9 までの数字を指定しな
ければなりません。
区切り識別子内の文字は、大文
字と小文字を区別します。デ
フォルトロケールを使用してい
る場合は、ASCII コードセット
で a から z の 1 文字を大文字か
小文字で指定してください。デ
フォルト以外のロケールを使用
している場合は、そのロケール
がサポートするアルファベット
文字を指定してください。詳細
は、4-116 ページの「区切り識
別子での非 ASCII 文字のサポー
ト」を参照してください。
ASCII コードセットを使用する
場合は、いずれかの英数字以外
の ASCII 文字を指定することが
できます。
アンダスコア文字の代わりに
ダッシュ、ハイフンなどの
適切な文字を使用することがで
きます。
構文
リテラル番号、4138 ページ
文字はキーボード
から入力するリテ
ラル値です。
英数字以外の文字
はキーボードから
入力するリテラル
値です。
アンダスコア (_)
はキーボードから
入力するリテラル
値です。
区切り識別子を使用して、それなしでは TABLE、WHERE、DECLARE などの SQL
予約済みキーワードと区別がつかないデータベースオブジェクト名を指定すること
ができます。区切り識別子を使用できない唯一のデータベースオブジェクトはデー
タベース名です。
区切り識別子は大文字と小文字を区別します。
区切り識別子は ANSI( 米国規格協会 ) 標準に準拠しています。
データベース オブジェクトを作成する場合、区切り識別子には、後書きの空白を指
定しないでください。すなわち、名前の最終非空白文字の直後に終了引用符を指定
してください。
セグメント
4-115
識別子
英数字以外の文字のサポート
区切り識別子を使用して、データベースオブジェクト名に英数字以外の文字を指定
することができます。ただし、DB 領域や BLOB 領域などの格納オブジェクト名に
区切り識別子を使用して、英数字以外の文字を指定することはできません。
GLS
区切り識別子での非 ASCII 文字のサポート
非 ASCII 文字をサポートするコードセットを持つデフォルト以外のロケールを使用
している場合、ほとんどの区切り識別子で非 ASCII 文字を指定できます。識別子の
区切られていないフォームで非 ASCII 文字を指定できれば、同じ識別子の区切られ
ているフォームでも非 ASCII 文字を指定できます。非 ASCII 文字をサポートする識
別子のリストと区切り識別子での非 ASCII 文字の詳細は『Informix Guide to GLS
Functionality』の第 3 章を参照してください。
環境変数 DELIMIDENT の効果
区切り識別子を使用するには、環境変数 DELIMIDENT を設定しなければなりませ
ん。環境変数 DELIMIDENT を設定すると、二重引用符 (“) で囲まれたデータベース
オブジェクトは識別子として扱われ、単一引用符 (‘) で囲まれたデータベースオブ
ジェクトは文字列として扱われます。環境変数 DELIMIDENT が設定されていない
と、二重引用符で囲まれた値も文字列として扱われます。
環境変数 DELIMIDENT が設定されている場合に、次の例に示す SELECT 文が引用
符付き文字列として扱われるようにするには、単一引用符で囲む必要があります。
PREPARE ... FROM 'SELECT * FROM customer'
4-116 Informix Guide to SQL:Syntax
識別子
区切り識別子の例
次の例は、大文字と小文字を区別する表名を持つ表の作成方法を示しています。
CREATE TABLE "Power_Ranger" (...)
次の例は、名前に空白文字を含む表の作成方法を示しています。表名が二重引用符
(“) で囲まれていない場合は、名前に空白文字やアンダスコア (_) 以外の英数字を使
用することはできません。
CREATE TABLE "My Customers" (...)
次の例は、名前にキーワードを使用する表の作成方法を示しています。
CREATE TABLE "TABLE" (...)
二重引用符の区切り識別子での使用
区切り識別子で二重引用符 (“) を使用したい場合は、次の例に示すように、その二
重引用符をさらに別の二重引用符 (“) で囲む必要があります。
CREATE TABLE "My""Good""Data" (...)
あいまいさが生じる可能性と構文エラー
SQL 識別子としてほとんどの文字を使用することができますが、構文上のあいまい
さが生じる可能性があります。文があいまいなために、結果が期待どおりにならな
いこともあります。次の節では、潜在的な問題とその対処方法の概要を説明します。
列名としての関数の使用
次の二つの例は、SELECT 文で関数を列名として使用する場合の対処方法を示して
います。この対処方法は、関数式 ( 代数関数、指数関数、対数関数、時刻、16 進、
長さ、dbinfo の関数、三角関数、トリム関数 ) だけでなく集計関数 (AVG、
COUNT、MAX、MIN、SUM) にも適用できます。
セグメント
4-117
識別子
avg を列名として使用すると、次の例のように失敗します。これはデータベース
サーバによって avg が列名としてでなく、集計関数として解釈されるためです。
SELECT avg FROM mytab -- fails
環境変数 DELIMIDENT が設定されている場合は、次の例に示すように avg を列名
として使用することができます。
SELECT "avg" from mytab -- successful
次の対処方法の例では、列名とともに表名を指定してあいまいさが除去されています。
SELECT mytab.avg FROM mytab
次の例に示すように、キーワード TODAY、CURRENT、USER を列名として使用す
るとあいまいになる場合があります。
CREATE TABLE mytab (user char(10),
CURRENT DATETIME HOUR TO SECOND,TODAY DATE)
INSERT INTO mytab VALUES('josh','11:30:30','1/22/98')
SELECT user,current,today FROM mytab
データベースサーバは、SELECT 文の user、current、today を SQL 関数の USER、
CURRENT、TODAY として解釈します。したがって SELECT 文は
josh,11:30:30,1/22/89 を返す代りに、現行ユーザ名と現行時刻および現行日付を返
します。
表の実際の列を選択したい場合は、次のいずれかの方法で SELECT 文を書く必要が
あります。
SELECT mytab.user, mytab.current, mytab.today FROM mytab;
EXEC SQL select * from mytab;
4-118 Informix Guide to SQL:Syntax
識別子
列名としてのキーワードの使用
SELECT 文や他の SQL 文で、キーワードを列名として使用したい場合は特定の対処
方法を使用することができます。複数の対処方法を利用できる場合もあります。
列名としてのキーワード ALL、DISTINCT、UNIQUE の使用
SELECT 文でキーワード ALL、DISTINCT、UNIQUE を列名として使用したい場合
は対処方法を利用できます。
まず、対処方法なしでこれらのキーワードを使用するとどうなるかを検討してみま
す。次の例のように、列名として all を使用すると、SELECT 文に失敗します。こ
れは、データベースサーバが all を列名ではなく、キーワードとして解釈するため
です。
SELECT all FROM mytab -- fails
この SELECT 文を成功させるには、対処方法を使用する必要があります。環境変数
DELIMIDENT が設定されている場合は、all を二重引用符で囲めば列名として使用
できます。次の例では、データベースサーバは all を列名として解釈するので
SELECT 文は成功します。
SELECT "all" from mytab -- successful
次の対処方法の例では、キーワード ALL を列名 all とともに使用しています。
SELECT ALL all FROM mytab
この節でのその他の例は、CREATE TABLE 文でキーワード UNIQUE または
DISTINCT を列名として使用するための対処方法を示しています。
unique 列名として使用すると、次の例のように失敗します。これはデータベース
サーバが、unique を列名ではなくキーワードとして解釈するためです。
CREATE TABLE mytab (unique INTEGER) -- fails
セグメント
4-119
識別子
次の例に示す対処方法では、二つの SQL 文を使用します。最初の文は列 mycol を
作成します。次の文は列名を mycol から unique に変更します。
CREATE TABLE mytab (mycol INTEGER)
RENAME COLUMN mytab.mycol TO unique
次の対処方法の例も、二つの SQL 文を使用しています。最初の文は列 mycol を作
成します。次の文は表を変更して、列 unique を追加し、列 mycol を削除します。
CREATE TABLE mytab (mycol INTEGER)
ALTER TABLE mytab
ADD (unique integer)
DROP (mycol)
列名としての INTERVAL や DATETIME の使用
ここでの例は、SELECT 文でキーワード INTERVAL または DATETIME を列名とし
て使用する場合の対処方法を示しています。
interval を列名として使用すると、次の例のように失敗します。これは、データベー
スサーバが interval をキーワードとして解釈し、INTERVAL の修飾子が後に続くと
想定するためです。
SELECT interval FROM mytab -- fails
環境変数 DELIMIDENT が設定されていると、次の例のように interval を列名として
使用できます。
SELECT "interval" from mytab -- successful
次の対処方法の例では、列名とともに表名を指定してあいまいさが除去されています。
SELECT mytab.interval FROM mytab;
次の対処方法の例には、表名とともに所有者名が含まれています。
SELECT josh.mytab.interval FROM josh.mytab;
4-120 Informix Guide to SQL:Syntax
識別子
IDS
列名としての rowid( 行 ID 番号 ) の使用
Dynamic Server では断片化されていない表は、どれも rowid という名前の仮想列を
持っています。あいまいさを防ぐ必要があるため、rowid を列名として使用するこ
とはできません。次のアクションを実行するとエラーが発生します。
■
rowid という名前の列を使用した表やビューの作成
■
rowid という名前の列を追加することによる表の変更
■
列名の rowid への変更
ただし、rowid という語句を表名として使用することはできます。
CREATE TABLE rowid (column INTEGER,
date DATE, char CHAR(20))
重要 : アクセス方法として、列 rowid を使用するのではなく主キーを使用すること
をお勧めします。
表名としてのキーワードの使用
ここでの例は、キーワード STATISTICS または OUTER を表名として使用するとき
に所有者名を入れることであいまいさを除去する方法を示しています。この対処方
法は、STATISTICS や OUTER をビュー名またはシノニムとして使用する場合にも
適用できます。
statistics を表名として使用すると、次の例のように失敗します。これはデータベー
スサーバが、UPDATE 文で statistics を表名としてではなく、UPDATE STATISTICS
構文の一部として解釈するためです。
UPDATE statistics SET mycol = 10
次の対処方法の例では、あいまいさをなくすために表名とともに所有者名を指定し
ています。
UPDATE josh.statistics SET mycol = 10
outer を表名として使用すると、次の例のように失敗します。これはデータベース
サーバが outer を外部結合を実行するキーワードとして解釈するためです。
SELECT mycol FROM outer -- fails
次の対処方法の例では、あいまいさをなくすために所有者名を使用しています。
SELECT mycol FROM josh.outer
セグメント
4-121
識別子
キーワード AS を使用する対処方法
文があいまいでなく、構文が正しい場合でもデータベースサーバが構文エラーを返
すことがあります。前のページでは、いくつかの状況での既存の構文上の対処方法
を紹介しました。例外に対してはキーワード AS を使用して対処方法にすることが
できます。
キーワード AS を、列ラベルまたは表の別名の前で使用することができます。
次の例では、キーワード AS を列ラベルとともに使用しています。
SELECT < 別名 > AS < 表示ラベル > FROM < 表名 >
次の例では、キーワード AS を表の別名とともに使用しています。
SELECT < 選択リスト > FROM < 表名 > AS < 表の別名 >
列ラベルとしてのキーワード AS の使用
ここでの例は、キーワード AS を列ラベルとともに使用する対処方法を示していま
す。最初の二つの例は、キーワード UNIT( または YEAR、MONTH、DAY、
HOUR、MINUTE、SECOND、FRACTION) を列ラベルとして使用する方法を示して
います。
units を列ラベルとして使用すると、次の例のように失敗します。これはデータベース
サーバが units を列名 mycol の日時 (DATETIME) 型修飾子として解釈するためです。
SELECT mycol units FROM mytab
次の対処方法の例にはキーワード AS が含まれています。
SELECT mycol AS units FROM mytab;
次の例は、キーワード AS または FROM を列ラベルとして使用する方法を示してい
ます。
as を列ラベルとして使用すると、次の例のように失敗します。これはデータベース
サーバによって as が from を列ラベルとして識別するものとして解釈され、必要な
FROM 節が探索されなくなるからです。
SELECT mycol as from mytab -- fails
次の例では、キーワード AS が繰り返されています。
SELECT mycol AS as from mytab
4-122 Informix Guide to SQL:Syntax
識別子
from を列ラベルとして使用すると、次の例のように失敗します。これはデータベー
スサーバが、最初の from の後に表名が続くと想定するためです。
SELECT mycol from FROM mytab -- fails
次の例ではキーワード AS を使用して、最初の from を列ラベルとして識別しています。
SELECT mycol AS from FROM mytab
表の別名としてのキーワード AS の使用
ここでの例は、キーワード AS を表の別名とともに使用する対処方法を示していま
す。最初の二つは、キーワード ORDER、FOR、GROUP、HAVING、INTO、
UNION、WITH、CREATE、GRANT、WHERE を表の別名として使用する方法を示
しています。
order を表の別名として使用すると、次の例のように失敗します。これはデータ
ベースサーバが、order を ORDER BY 節の一部として解釈するためです。
SELECT * FROM mytab order -- fails
次の対処方法の例では、キーワード AS を使用して、order を表の別名として識別で
きるようにしています。
SELECT * FROM mytab AS order;
次の二つの例は、キーワード WITH を表の別名として使用する方法を示しています。
with を表の別名として使用すると、次の例のように失敗します。これはデータベース
サーバがキーワードを WITH CHECK OPTION 構文の一部として解釈するためです。
EXEC SQL select * from mytab with; -- fails
次の対処方法の例では、キーワード AS を使用することで with を表の別名として識
別しています。
EXEC SQL select * from mytab as with;
次の二つの例は、キーワード CREATE または GRANT を表の別名として使用する方
法を示しています。
セグメント
4-123
識別子
create を表の別名として使用すると、次の例のように失敗します。これはデータ
ベースサーバがキーワードを、表、シノニム、ビューなどの実体を作成するための
構文として解釈するためです。
EXEC SQL select * from mytab create; -- fails
次の対処方法の例では、キーワード AS を使用することで create を表の別名として
識別しています。
EXEC SQL select * from mytab as create;
キーワードのカーソル名としての取出し
状況によっては、SQL プログラムでキーワードを識別子として使用した場合に発生
する構文上のあいまいさに対処できないことがあります。
次の例では、FETCH 文によって next という名前のカーソルが指定されます。
FETCH 文は構文エラーを生成します。これはプリプロセッサが、アクティブセッ
トの次の行を示すキーワードとして next を解釈し、next の後にカーソル名が続くと
想定するためです。このようなエラーは、キーワード NEXT、PREVIOUS、PRIOR、
FIRST、LAST、CURRENT、RELATIVE、ABSOLUTE をカーソル名として使用する
と必ず発生します。
/* This code fragment fails */
EXEC SQL declare next cursor for
select customer_num, lname from customer;
EXEC SQL open next;
EXEC SQL fetch next into :cnum, :lname;
プロシジャ変数名としてのキーワードの使用
次のキーワードをプロシジャの変数の識別子として使用すると、構文があいまいに
なります。
CURRENT
DATETIME
GLOBAL
INTERVAL
4-124 Informix Guide to SQL:Syntax
NULL
OFF
ON
PROCEDURE
SELECT
識別子
INSERT 文での CURRENT、DATETIME、INTERVAL、NULL の使用
INSERT 文では、CURRENT、DATETIME、INTERVAL、または NULL といった
キーワードをプロシジャの名前として使用することができません。
たとえば、null という名前の変数を定義し、列に値 null を挿入しようとすると、次
の例のように構文エラーが返されます。
CREATE PROCEDURE problem()
.
.
.
DEFINE null INT;
LET null = 3;
INSERT INTO tab VALUES (null); -- error, inserts NULL, not 3
条件文での NULL と SELECT の使用
null または select という名前で変数を定義し、その変数をキーワード IN を使用する
条件文で使用するとあいまいになります。次の例は、問題を起こす 3 つの条件とし
ての IF 文、SELECT 文の WHERE 節、WHILE 文を示しています。
CREATE PROCEDURE problem()
.
.
.
DEFINE x,y,select, null, INT;
DEFINE pfname CHAR[15];
LET x = 3; LET select = 300;
LET null = 1;
IF x IN (select, 10, 12) THEN LET y = 1; -- problem if
IF x IN (1, 2, 4) THEN
SELECT customer_num, fname INTO y, pfname FROM customer
WHERE customer IN (select , 301 , 302, 303); -- problem in
WHILE x IN (null, 2) -- problem while
.
.
.
END WHILE;
セグメント
4-125
識別子
IN リスト内の最初の要素でないことが確かであれば、IN リストで変数 select を使
用することができます。次の対処方法の例では、前の例で示した IF 文を訂正して
います。
IF x IN (10, select, 12) THEN LET y = 1; -- problem if
null を変数名として使用したり、null を IN 条件内で使用するための対処方法はあり
ません。
TRACE 文での ON、OFF、PROCEDURE の使用
on、off、procedure という名前のプロシジャ変数を定義し、それらを TRACE 文で使
おうとすると変数の値はトレースされません。その代わりに、TRACE ON 文、
TRACE OFF 文、または TRACE PROCEDURE 文が実行されます。変数をさらに複
雑な式にすることで、変数の値をトレースすることができます。次の例は、あいま
いな構文とその対処方法を示しています。
DEFINE on, off, procedure INT;
TRACE
TRACE
TRACE
TRACE
on;
0+ on;
off;
''||off;
--ambiguous
--ok
--ambiguous
--ok
TRACE procedure; --ambiguous
TRACE 0+procedure; --ok
変数名としての GLOBAL の使用
global という名前の変数を定義しようとすると、その操作は失敗します。次の例に
示す構文は、広域変数を定義している構文と衝突しています。
DEFINE global INT; -- fails;
環境変数 DELIMIDENT が設定されている場合は、次の例に示すように global を変
数名として使用することができます。
DEFINE "global" INT; -- successful
4-126 Informix Guide to SQL:Syntax
識別子
カーソル名としての EXECUTE、SELECT、WITH の使用
キーワード EXECUTE、SELECT、WITH はカーソル名として使用しないでくださ
い。これらのキーワードの一つを FOREACH 文でカーソル名として使おうとする
と、そのカーソル名はキーワードとして解釈されます。対処方法はありません。
次の例は失敗します。
DEFINE execute INT;
FOREACH execute FOR SELECT col1 -- error, looks like
-- FOREACH EXECUTE PROCEDURE
INTO var1 FROM tab1; --
WHILE 文と FOR 文の中の SELECT 文
WHILE 文または FOR ループの中で SELECT 文を使用し、括弧で囲む必要がある場
合は BEGIN...END ブロック内で SELECT 文全体を囲ってください。次の例の最初
の WHILE 文内の SELECT 文は、プロシジャ var1 への呼出しとして解釈され、二番
目の WHILE 文は正しく解釈されます。
DEFINE var1, var2 INT;
WHILE var2 = var1
SELECT col1 INTO var3 FROM TAB -- error, seen as call var1()
UNION
SELECT co2 FROM tab2;
END WHILE
WHILE var2 = var1
BEGIN
SELECT col1 INTO var3 FROM TAB -- ok syntax
UNION
SELECT co2 FROM tab2;
END
END WHILE
セグメント
4-127
識別子
ON EXCEPTION 文の中のキーワード SET
ON EXCEPTION 文の中でキーワード SET で始まる文を使用する場合は、
BEGIN...END ブロック内で閉じるようにしてください。次のリストにキーワード
SET で始まるいくつかの SQL 文を示します。
SET
SET DEBUG FILE
SET EXPLAIN
SET ISOLATION
SET LOCK MODE
SET LOG
SET OPTIMIZATION
SET PDQPRIORITY
次の例は、ON EXCEPTION 文内での SET LOCK MODE 文の正しい使い方と誤った
使い方を示してます。
次の ON EXCEPTION 文はエラーを返します。これは SET LOCK MODE 文が
BEGIN...END ブロック内で閉じられていないためです。
ON EXCEPTION IN (-107)
SET LOCK MODE TO WAIT; -- error, value expected, not 'lock'
END EXCEPTION
次の ON EXCEPTION 文は、SET LOCK MODE 文が BEGIN...END ブロック内で閉じ
られているために成功します。
ON EXCEPTION IN (-107)
BEGIN
SET LOCK MODE TO WAIT; -- ok
END
END EXCEPTION
参照
所有者名の命名に関する説明については、お手持ちの『Performance Guide』を参照
してください。
非 ASCII 文字をサポートする識別子の説明と、区切り識別子での非 ASCII 文字の説
明については、
『Informix Guide to GLS Functionality』を参照してください。
4-128 Informix Guide to SQL:Syntax
時間隔 (INTERVAL) 型フィールド修飾子
時間隔 (INTERVAL) 型フィールド修飾子
時間隔 (INTERVAL) 型フィールド修飾子を使用して、時間隔 (INTERVAL) 型値の単
位を指定します。構文ダイヤグラムの時間隔 (INTERVAL) 型フィールド修飾子の参
照を確認する場合に使用します。
構文
YEAR
( <y- 有効桁数 >)
(4)
TO YEAR
MONTH
(< 有効桁数 > )
(2)
TO MONTH
DAY
(< 有効桁数 > )
(2)
TO DAY
HOUR
(< 有効桁数 > )
(2)
TO HOUR
MINUTE
(< 有効桁数 > )
(2)
TO MINUTE
(< 有効桁数 > )
(2)
TO SECOND
SECOND
FRACTION
TO FRACTION
( <f- 有効桁数 > )
(3)
セグメント
4-129
時間隔 (INTERVAL) 型フィールド修飾子
要素
目的
制限
<f- 有効桁数 > 小数フィールドで使用される最大 <f- 有効桁数 > で指定できる最
桁数です。
大値は 5 です。
< 有効桁数 >
<f- 有効桁数 > のデフォルト値は
3 です。
時間隔 (INTERVAL) 型フィールド < 有効桁数 > で指定できる最大
で保持できる最大数の月、日、時 値は 9 です。
間、分の桁数です。
< 有効桁数 > のデフォルト値は 2
です。
<y- 有効桁数 > 時間隔 (INTERVAL) 型フィール
<y- 有効桁数 > で指定できる最
ドで保持できる最大数の年の桁数 大値は 9 です。
です。
構文
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
デフォルト値は 4 です。
説明
次の二つの例は、YEAR TO MONTH 型の時間隔データ型を示しています。最初の
例では、年フィールドの有効桁数として 3 を指定しているので、999 年 11ヵ月の時
間隔に対応することができます。二番目の例は、年のフィールドにデフォルトの有
効桁数を使用しているため、9,999 年 11ヵ月の時間隔に対応することができます。
YEAR (3) TO MONTH
YEAR TO MONTH
一つのフィールドだけを含む値が必要な場合は、最初と最後の修飾子を同じにしま
す。たとえば、年の総体的な時間隔は YEAR TO YEAR として修飾します。また、
99,999 年までの時間隔の場合は YEAR (5) TO YEAR として修飾します。
次の例は、時間隔型修飾子を示しています。
YEAR(5) TO MONTH
DAY (5) TO FRACTION(2)
DAY TO DAY
FRACTION TO FRACTION (4)
4-130 Informix Guide to SQL:Syntax
時間隔 (INTERVAL) 型フィールド修飾子
参照
時間隔 (INTERVAL) 型フィールド修飾子の指定と、算術演算と関係演算での時間隔
『Informix Guide to SQL: Reference』の時間隔
(INTERVAL) 型の使用方法については、
(INTERVAL) データ型を参照してください。
セグメント
4-131
リテラル日時 (DATETIME) 型
リテラル日時 (DATETIME) 型
リテラル日時 (DATETIME) 型セグメントは、リテラル日時 (DATETIME) 型値を指
定します。構文ダイヤグラムのリテラル日時 (DATETIME) 型の参照を確認する場合
に使用します。
構文
(
DATETIME
日時 (DATETIME)
型フィールド
修飾子
4-31 ページ
)
数値による日付
数値による日付
yyyy
mo
dd
< 空白 >
hh
:
mi
:
ss
.
f
4-132 Informix Guide to SQL:Syntax
リテラル日時 (DATETIME) 型
要素
<dd>
<f>
<hh>
<mi>
<mo>
< 空白 >
目的
数字の桁で表現される日です。
制限
最大 2 桁まで指定することがで
きます。
数字の桁で表現される秒の 10
最大 5 桁まで指定することがで
進小数部です。
きます。
数字の桁で表現される時間です。 最大 2 桁まで指定することがで
きます。
数字の桁で表現される分です。 最大 2 桁まで指定することがで
きます。
数字の桁で表現される月
最大 2 桁まで指定することがで
きます。
空白文字です。
二つ以上の空白文字を指定する
ことはできません。
<ss>
数字の桁で表現される秒です。
<yyyy>
数字の桁で表現される年です。
最大 2 桁まで指定することがで
きます。
最大 4 桁まで指定することがで
きます。2 桁を指定すると、
データベースサーバは環境変数
DBCENTURY の設定を使用して
年の値を展開させます。環境変
数 DBCENTURY が設定されて
いない場合は、現行の世紀を使
用して年の値が展開されます。
構文
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
空白文字は、キー
ボード上のスペース
バーを押して入力す
るリテラル値です。
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
説明
リテラル日時型セグメントの日付には、数値による日付と日時 (DATETIME) 型
フィールド修飾子の両方を指定する必要があります。日時 (DATETIME) 型フィール
ド修飾子は、指定する数値による日付と関連していなければなりません。たとえ
ば、最大の単位が年で、最小の単位が分の数値による日付を指定する場合は、日時
型フィールドには YEAR TO MINUTE を指定しなければなりません。
セグメント
4-133
リテラル日時 (DATETIME) 型
次の例はリテラル日時 (DATETIME) 型値を示しています。
DATETIME (97-3-6) YEAR TO DAY
DATETIME (09:55:30.825) HOUR TO FRACTION
DATETIME (97-5) YEAR TO MONTH
次の例は、EXTEND 関数とともに使用されているリテラル日時 (DATETIME) 型値
を示しています。
EXTEND (DATETIME (1997-8-1) YEAR TO DAY, YEAR TO MINUTE)
- INTERVAL (720) MINUTE (3) TO MINUTE
参照
日時 (DATETIME) 型と、環境変数 DBCENTURY の説明については、『Informix
Guide to SQL: Reference』を参照してださい。
日時 (DATETIME) 型値のカスタマイズの説明については、
『Informix Guide to GLS
Functionality』を参照してださい。
4-134 Informix Guide to SQL:Syntax
リテラル時間隔 (INTERVAL) 型
リテラル時間隔 (INTERVAL) 型
リテラル時間隔 (INTERVAL) 型セグメントはリテラル時間隔 (INTERVAL) 型値を指
定します。構文ダイヤグラムのリテラル時間隔 (DATETIME) 型の参照を確認する場
合に使用します。
構文
数値による日付
(
INTERVAL
時間隔
(INTERVAL) 型
フィールド修飾
子 4-129 ページ
)
数値による日付
yyyy
mo
dd
< 空白 >
hh
:
mi
:
ss
.
f
セグメント
4-135
リテラル時間隔 (INTERVAL) 型
要素
<dd>
目的
日を表す数です。
<f>
秒の小数部です。
<hh>
時間を表す数です。
<mi>
分を表す数です。
<mo>
月を表す数です。
< 空白 >
空白文字です。
<ss>
秒を表す数です。
<yyyy>
年を表す数です。
4-136 Informix Guide to SQL:Syntax
制限
これが最初のフィールドでなく
有効桁数が時間隔 (INTERVAL)
型フィールド修飾子によって別
に指定されていなければ、許容
最大桁数は 2 です。
時間隔 (INTERVAL) 型フィール
ド修飾子の小数部に指定される
有効桁数に応じて最大 5 桁まで
指定することができます。
これが最初のフィールドでなく
有効桁数が時間隔 (INTERVAL)
型フィールド修飾子によって別
に指定されていなければ、許容
最大桁数は 2 です。
これが最初のフィールドでなく
有効桁数が時間隔 (INTERVAL)
型フィールド修飾子によって別
に指定されていなければ、許容
最大桁数は 2 です。
これが最初のフィールドでなく
有効桁数が時間隔 (INTERVAL)
型フィールド修飾子によって別
に指定されていなければ、許容
最大桁数は 2 です。
空白文字の代わりに他の文字を
使用することはできません。
これが最初のフィールドでなく
有効桁数が時間隔 (INTERVAL)
型フィールド修飾子によって別
に指定されていなければ、許容
最大桁数は 2 です。
これが最初のフィールドでなく
有効桁数が時間隔 (INTERVAL)
型フィールド修飾子によって別
に指定されていなければ、許容
最大桁数は 4 です。
構文
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
空白文字は、キー
ボード上のスペース
バーを押して入力す
るリテラル値です。
リテラル番号、
4-138 ページ
リテラル番号、
4-138 ページ
リテラル時間隔 (INTERVAL) 型
説明
次の例は、リテラル時間隔 (INTERVAL) 型値を示しています。
INTERVAL (3-6) YEAR TO MONTH
INTERVAL (09:55:30.825) HOUR TO FRACTION
INTERVAL (40 5) DAY TO HOUR
参照
算術演算と関係演算での時間隔 (INTERVAL) 型データの使用の説明については、
『Informix Guide to SQL: Reference』の時間隔 (INTERVAL) データ型の説明を参照し
てださい。
セグメント
4-137
リテラル番号
リテラル番号
リテラル番号は整数型の定数、または非整数 ( 実数 ) 型の定数です。構文ダイヤグ
ラムのリテラル番号の参照を確認する場合に使用します。
構文
< 数字 >
+
.
< 数字 >
.
< 数字 >
E
< 数字 >
+
-
要素
< 数字 >
目的
リテラル番号の一部となる数字
です。
制限
0 から 9 までの値を指定しなけ
ればなりません。
構文
数字はキーボードか
ら入力するリテラル
値です。
説明
リテラル番号にカンマを入れることはできません。つまり、小数点を表すのにカン
マを使用することはできません。リテラル番号の前にはプラス記号またはマイナス
記号を付けることができます。
整数
整数に小数点を入れることはできません。次の例は整数を示しています。
10
4-138 Informix Guide to SQL:Syntax
-27
25567
リテラル番号
実数型数値と 10 進数
実数型数値と 10 進数は、小数点と指数表記、またはそのどちらかを含みます。次
の例は実数型数値と 10 進数を示しています。
123.456
1.23456E2
123456.0E-3
この例の小数点より右側の桁は、小数部分を示しています。
二つの例に含まれている E は、指数表記のシンボルです。E の後に続く数字は指数
の値です。たとえば、3E5( または 3E+5) は、3 と 10 の 5 乗を乗算したものを表し、
3E-5 は 3 と 10 の -5 乗を乗算したものを表しています。
リテラル番号と金額 (MONEY) 型
リテラル番号を金額 (MONEY) 型値として使用する場合は、通貨シンボルを前に付
けたりカンマを入れたりしないでください。
参照
10 進数 (DECIMAL) 型、実数 (FLOAT) 型、整数 (INTEGER) 型、金額 (MONEY) 型
などの数値データ型の説明については、
『Informix Guide to SQL: Reference』を参照し
てください。
セグメント
4-139
オプティマイザ ディレクティブ
IDS
オプティマイザ ディレクティブ
オプティマイザ ディレクティブ セグメントは、オプティマイザの問合せ予定を部
分的または完全に指定するときに使用できるキーワードを指定します。構文ダイヤ
グラムでオプティマイザ ディレクティブを参照する場合には必ず、このセグメント
を使用してください。
このセグメントは、Dynamic Server でしか使用できません。
構文
,
--+
{+
/*+
結合順序
ディレクティブ
4-142 ページ
アクセス方法
ディレクティブ
4-144 ページ
}
*/
結合方法
ディレクティブ
4-148 ページ
最適化目標
ディレクティブ
4-151 ページ
EXPLAIN
説明
オプティマイザの問合せ予定を部分的または完全に指定するときには、一つまたは
複数のオプティマイザ ディレクティブを使用します。
オプティマイザ ディレクティブを使用する場合、そのオプティマイザ ディレク
ティブの適用範囲は、現行の問合せに限られます。
4-140 Informix Guide to SQL:Syntax
オプティマイザ ディレクティブ
デフォルトでは、オプティマイザ ディレクティブは使用可能になっています。指定
したディレクティブの処理方法に関する情報を得るには、SET EXPLAIN 文の出力
を表示します。オプティマイザ ディレクティブを使用不可能にするには、環境変数
IFX_DIRECTIVES を 0 または OFF に設定するか、ONCONFIG ファイルのパラメー
タ DIRECTIVES を 0 に設定する必要があります。
コメント形式のオプティマイザ ディレクティブ
コメントのフォームでは、オプティマイザ ディレクティブ、またはオプティマイザ
ディレクティブの文字列は、DELETE 文、SELECT 文、または UPDATE 文でキー
ワードの直後にあります。
コメント記号の後、任意のディレクティブの先頭文字は必ず、プラス (+) 記号にな
ります。コメント記号とプラス記号の間に空白を使用することはできません。
次のコメント スタイルのどれでも使用することができます。
■
二重ハイフン (--)
二重ハイフンは、テキストのコメント行を 1 行だけ区切るため、終了記号
が必要ありません。
■
中かっこ ({})
■
C 言語スタイルのコメント。スラッシュとアスタリスク (/**/)
SQL コメント記号についての詳細は、1-6 ページの「SQL コメントの入力方法」を
参照してください。
一つの問合せで複数のディレクティブを使用する場合には、こうしたディレクティ
ブを区切る必要があります。空白、カンマ、または選択した任意の文字を使用すれ
ば、ディレクティブを区切ることができます。ただし、Informix では、カンマでディ
レクティブを区切ることをお薦めします。
オプティマイザ ディレクティブの制
通常、DELETE 文、SELECT 文、または UPDATE 文では、どの問合せブロックにも
オプティマイザ ディレクティブを指定することができます。ただし、文に次の項目
のどれかを指定すると、オプティマイザ ディレクティブは使用できなくなります。
E/C
■
分散問合せ。すなわち、一つまたは複数の遠隔表にアクセスする問合せ。
■
ESQL/C。すなわち、WHERE CURRENT OF カーソル節が指定されている
文。 ♦
セグメント
4-141
オプティマイザ ディレクティブ
結合順序ディレクティブの使用
オプティマイザに、FROM 節に指定された順序で表を結合させるには、ORDERED
結合順序ディレクティブを使用します。
結合順序
ディレクティブ
オプティマイザ ディレクティブへ
戻る 4-140 ページ
ORDERED
< コメント >
要素
< コメント >
目的
制限
ディレクティブの目的などの重 コメント記号内にテキストが指
要情報を説明するテキストです。 定されている必要があります。
構文
文字列
たとえば、次の問合せを実行すると、データベース サーバは、表 dept と表 job を結
合した後、その結果を表 emp と結合します。
SELECT --+ ORDERED
name, title, salary, dname
FROM dept, job, emp
Where title = 'clerk'
AND loc = 'Palo Alto'
AND emp.dno = dept.dno
AND emp.job= job.job
表 dept と表 job 間に述部はないので、この問合せでは、デカルト積が強制実行され
ます。
4-142 Informix Guide to SQL:Syntax
オプティマイザ ディレクティブ
ビューでの順序ディレクティブの使用
問合せにビューが必要な場合、ORDERED 結合順序ディレクティブの配置により、
部分結合順序を指定するか、全結合順序を指定するかが決まります。
■
ビューの作成時の部分結合順序の指定
ビューを作成する場合に ORDERED 結合順序ディレクティブを使用する
と、基本表は、ビュー定義に指定されている順序で連続的に結合されます。
ビューに関する以降の問合せでは必ず、データベース サーバは、ビュー定
義に指定されている順序で連続的に基本表を結合します。ビューで使用さ
れる場合、ORDERED ディレクティブは、問合せ内の FROM 節で指定され
ているほかの表の結合順序に影響を及ぼしません。
■
ビューの問合せ時の全結合順序の指定
任意のビューを使用する問合せで ORDERED 結合順序ディレクティブを指
定すると、表はすべて、ビューを形成する表も、指定の順序で結合されま
す。問合せに任意のビューが指定されている場合、基本表は、そのビュー
定義に指定されている順序で連続的に結合されます。
ビューで ORDERED 結合順序ディレクティブを使用する場合の例については、
『Performance Guide』を参照してください。
セグメント
4-143
オプティマイザ ディレクティブ
アクセス方法ディレクティブ
オプティマイザによる表の探索方法を指定するには、アクセス方法ディレクティブ
を使用します。
アクセス方法
ディレクティブ
INDEX
オプティマイザ ディレクティブへ
戻る 4-140 ページ
(
<表>
)
,
< ビュー >
< インデックス >
< シノニム >
< コメント >
"< インデッ
クス >"
< 別名 >
,
AVOID_INDEX
(
<表>
< インデックス >
"< インデッ
クス >"
< ビュー >
< シノニム >
< 別名 >
FULL
(
AVOID_FULL
<表>
< ビュー >
< シノニム >
< 別名 >
4-144 Informix Guide to SQL:Syntax
)
)
オプティマイザ ディレクティブ
要素
< 別名 >
< コメント >
< インデック
ス>
目的
FROM 節内の表またはビューに
割り当てられた一時的な代替名
です。
制限
別名が FROM 節で宣言される場
合、この別名は、オプティマイ
ザ ディレクティブでも使用され
る必要があります。
ディレクティブの目的などの重 テキストは、カッコの外側、コ
要情報を説明するテキストです。 メント記号の内部に指定される
必要があります。
問合せ予定ディレクティブを指 インデックスは、指定の表に定
定するインデックスの名前です。 義される必要があります。
< シノニム >
問合せ予定ディレクティブを指
定するシノニムの名前です。
<表>
問合せ予定ディレクティブを指
定する表の名前です。
AVOID_INDEX ディレクティブ
を使用して、インデックスを少
なくとも一つ指定する必要があ
ります。
シノニムと、シノニムがポイン
トする表が存在している必要が
あります。
表が存在している必要があり
ます。
< ビュー >
問合せ予定ディレクティブを指
定するビューの名前です。
ビューが存在している必要があ
ります。
構文
識別子、
4-112 ページ
文字列
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
カッコ内に指定されている要素は、一つまたは複数の空白、またはカンマで区切る
ことができます。
セグメント
4-145
オプティマイザ ディレクティブ
次の表に、各アクセス方法ディレクティブの目的と、各ディレクティブがオプティ
マイザの問合せ予定にどのような影響を及ぼすかリストします。
キーワード
目的
オプティマイザの動作
Avoid_full
リストされている表で全表走
査を実行しません。
オプティマイザは、走査できる
各種インデックスを考慮します。
インデックスがない場合、オプ
ティマイザは、全表走査を実行
します。
avoid_index
リストされているインデック
スのどれも使用しません。
オプティマイザは、残っている
インデックスと全表走査を考慮
します。
特定表のインデックスがすべて
指定されると、オプティマイザ
は、全表走査を使用して表にア
クセスします。
Full
全表走査を実行します。
任意の列にインデックスがあっ
ても、オプティマイザは、全表
走査を使用して表にアクセスし
ます。
Index
指定されたインデックスを使
用して表にアクセスします。
複数のインデックスが指定され
ると、オプティマイザは、コス
トが最小になるインデックスを
選択します。
インデックスが指定されていな
い場合、使用可能なインデック
スがすべて考慮されます。
表の全走査の禁止
AVOID_FULL と INDEX の各キーワードはどちらも、オプティマイザが、表の全走
査をしないように指定します。ただし、Informix では、表の全走査をしないように指
定するときには、キーワード AVOID_FULL を使用することをお薦めします。この
否定ディレクティブを使用すれば、オプティマイザは全表走査を使用しないことを
指定するだけでなく、アクセス方法ディレクティブの指定後に作成されたインデッ
クスを使用することもできます。
4-146 Informix Guide to SQL:Syntax
オプティマイザ ディレクティブ
同じ表での複数のアクセス方法ディレクティブの使用
通常、指定できるアクセス方法ディレクティブは、表ごとに一つだけです。ただ
し、同じ表に AVOID_FULL と AVOID_INDEX を両方とも指定することができま
す。上記アクセス方法ディレクティブを両方とも指定すると、オプティマイザはそ
の表の全走査を実行せず、指定したインデックスを使用しません。
このように否定ディレクティブを組み合わせれば、オプティマイザは、アクセス方
法ディレクティブの指定後に作成されたインデックスを使用することができます。
アクセス方法ディレクティブの使用例
employee と命名された表を使用し、この表に、loc_no、dept_no、および job_no の
各インデックスが指定されているとします。FROM 節で表を使用する SELECT 文を
実行する場合、次の方法のどれかを使用すれば、オプティマイザに指示して、その
表にアクセスすることができます。
肯定ディレクティブの使用例
SELECT {+INDEX(EMP dept_no)}
.
.
.
この例では、アクセス方法ディレクティブにより、オプティマイザは、列 dept_no
でインデックスを走査します。
否定ディレクティブの使用例
SELECT {+AVOID_INDEX(EMP loc_no, job_no), AVOID_FULL(EMP)}
.
.
.
この例では、複数のアクセス方法ディレクティブが指定されています。この場合も
やはり、こうしたアクセス方法ディレクティブにより、オプティマイザは、列
dept_no でインデックスを走査します。ただし、表 employee に、インデックス
emp_no が新たに作成されると、オプティマイザは、そのインデックスを考慮でき
ます。
セグメント
4-147
オプティマイザ ディレクティブ
結合方法ディレクティブ
データベース サーバが任意の問合せで表を結合する方法に影響を与えるには、結合
方法ディレクティブを使用します。
結合方法
ディレクティブ
オプティマイザ ディレクティブへ
戻る 4-140 ページ
,
USE_NL
(
)
<表>
< ビュー >
AVOID_NL
< コメント >
< シノニム >
< 別名 >
,
USE_HASH
(
)
<表>
< ビュー >
/BUILD
< シノニム >
/PROBE
AVOID_HASH
< 別名 >
要素
< 別名 >
< コメント >
< シノニム >
<表>
< ビュー >
目的
FROM 節内の表またはビューに
割り当てられた一時的な代替名
です。
制限
別名が FROM 節で宣言される場
合、この別名は、オプティマイ
ザ ディレクティブでも使用され
る必要があります。
ディレクティブの目的などの重 テキストは、カッコの外側、コ
要情報を説明するテキストです。 メント記号の内部に指定される
必要があります。
問合せ予定ディレクティブを指 シノニムと、シノニムがポイン
定するシノニムの名前です。
トする表が存在している必要が
あります。
問合せ予定ディレクティブを指 表が存在している必要があり
定する表の名前です。
ます。
問合せ予定ディレクティブを指
定するビューの名前です。
4-148 Informix Guide to SQL:Syntax
ビューが存在している必要があ
ります。
構文
識別子、
4-112 ページ
文字列
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
データベース オブ
ジェクト名、
4-25 ページ
オプティマイザ ディレクティブ
カッコ内に指定されている要素は、一つまたは複数の空白、またはカンマで区切る
ことができます。
次の表に、各結合方法ディレクティブの目的をリストします。
キーワード
目的
USE_NL
リストされている表を、入れ子ループ結合内の内部表
として使用します。
FROM 節に n 個の表が指定されている場合、結合方法
ディレクティブ USE_NL には、多くて n-1 個の表を指
定することができます。
Use_HASH
ハッシュ結合を使用して、リストされている表にアク
セスします。
表を使用して、ハッシュ表を作成するか、ハッシュ表
を調べるか選択することもできます。
Avoid_nl
リストされている表を、入れ子ループ結合内の内部表
として使用しません。
このディレクティブを指定してリストされた表は、や
はり、外部表として入れ子ループ結合に関与すること
ができます。
Avoid_hash
リストされている表にハッシュ結合を使用してアクセ
スしません。
オプションとして、ハッシュ結合は許可するが、表が
調査の対象にならないように制限、またはハッシュ表
の作成元の表を制限できます。
セグメント
4-149
オプティマイザ ディレクティブ
ハッシュ結合での表のロールの指定
ハッシュ結合を使用するかしないかを指定する場合、次のキーワードを使用すれ
ば、各表のロールも指定することができます。
■
BUILD
USE_HASH で使用される場合、このキーワードは、指定された表を使用
してハッシュ表を構成することを示します。AVOID_HASH で使用される
場合、このキーワードは、指定された表を使用せずにハッシュ表を構成す
ることを示します。
■
PROBE
USE_HASH で使用される場合、このキーワードは、指定された表を使用
してハッシュ表を調べることを示します。AVOID_HASH で使用される場
合、このキーワードは、指定された表を使用せずにハッシュ表を調べるこ
とを示します。
BUILD と PROBE のどちらのキーワードも指定されていない場合、オプティマイザ
はコストをかけて表のロールを特定します。
結合方法ディレクティブの使用例
次の例では、USE_HASH 結合方法ディレクティブにより、オプティマイザは、表
dept でハッシュ結合を構成して、この表 dept とほかの表を結合するのにハッシュ結
合だけを考慮します。ほかのディレクティブが指定されていないため、オプティマ
イザは、問合せで、ほかの結合の最適な計画を選択することができます。
SELECT /*+ USE_HASH (dept /BUILD)
Force the optimizer to use the dept table to
construct a hash table */
name, title, salary, dname
FROM emp, dept, job
WHERE loc = 'Phoenix'
AND emp.dno = dept.dno
AND emp.job = job.job
4-150 Informix Guide to SQL:Syntax
オプティマイザ ディレクティブ
最適化目標ディレクティブ
問合せ結果の性能を特定するのに使用する方法を指定するときに、最適化目標ディ
レクティブを使用します。
最適化目標
ディレクティブ
オプティマイザ ディレクティブへ戻る
4-140 ページ
ALL_ROWS
FIRST_ROWS
要素
< コメント >
< コメント >
目的
制限
ディレクティブの目的などの重 テキストは、カッコの外側、コ
要情報を説明するテキストです。 メント記号の内部に指定される
必要があります。
構文
文字列
次の 2 種類の最適化目標ディレクティブがあります。
■
First_Rows
このディレクティブは、問合せを満足する行を最初の画面分だけ検出する
プロセスの最適化計画を選択するよう、オプティマイザに通知します。
対話型モードを使用する問合せか、ほんの数行のリターンしか必要ない問合
せの場合に、初期応答時間を短くするのに、このオプションを使用します。
■
All_Rows
このディレクティブは、問合せを満足する行をすべて検出するプロセスの
最適化計画を選択するよう、オプティマイザに通知します。
この最適化フォームは、デフォルトです。
最適化目標ディレクティブの制限
次のインスタンスでは、最適化目標ディレクティブは使用できません。
■
ビュー定義
■
副問合せ
セグメント
4-151
オプティマイザ ディレクティブ
最適化目標ディレクティブの例
次の問合せは、ボーナスの額が上位 50 番までの従業員の名前を返します。最適化
目標ディレクティブは、できるだけ早く最初の画面文の行を返すよう、オプティマ
イザに指示します。
SELECT {+FIRST_ROWS
Return the first screenful of rows as fast as possible}
FIRST 50 lname, fname, bonus
FROM emp
ORDER BY bonus DESC
セッション全体に最適化目標を設定する方法については、SET OPTIMIZATION 文
を参照してください。
ディレクティブモード ディレクティブ
特定問合せに応じて SET EXPLAIN 文を ON にするときには、EXPLAIN ディレク
ティブモード ディレクティブを使用します。このディレクティブを使用すれば、問
合せ予定のテストとデバッグを実行することができます。問合せ予定に関する情報
は、ファイル sqexplain.out に出力されます。SET EXPLAIN 文がすでに ON に指定さ
れている場合、このディレクティブは冗長になります。
次の二つの状況では、EXPLAIN ディレクティブモード ディレクティブは使用できません。
■
ビュー定義
■
副問合せ
参照
ファイル sqexplain.out については、SET EXPLAIN 文を参照してください。
セッション全体に最適化を設定する方法については、SET OPTIMIZATION 文を参
照してください。
オプティマイザ ディレクティブと性能については、
『Performance Guide』を参照し
てください。
環境変数 IFX_DIRECTIVES については、『Informix Guide to SQL: Reference』を参照
してください。
ONCONFIG ファイルの変数 DIRECTIVES については、お手持の『Administrator’s
Guide』を参照してください。
4-152 Informix Guide to SQL:Syntax
所有者名
所有者名
所有者名セグメントは、データベース内のデータベース オブジェクトの所有者の名
前を指定します。構文ダイヤグラムで所有者名を参照する場合には必ず、このセグ
メントを使用します。
構文
所有者名
< 所有者 >
’< 所有者 >’
要素
< 所有者 >
目的
データベース内のデータベース
オブジェクトの所有者のユーザ名
です。
制限
ANSI 標準準拠のデータベースを
使用している場合、ユーザは、自
分が所有していないデータベース
オブジェクトには、< 所有者 > を
入力する必要があります。
構文
名前は、ご使用のオ
ペレーティング シ
ステムの命名規則に
準拠する必要があり
ます。
説明
ANSI 標準に準拠していないデータベースでは、所有者名はオプションです。デー
タアクセス文を使用する場合には、< 所有者 > を指定する必要はありません。ただ
し、ユーザが < 所有者 > を指定すると、データベース サーバは、その < 所有者 >
が適切かどうかを確認します。引用符で囲まないと、< 所有者 > は大文字と小文字
を区別しません。
次の例に、表 kaths.tab1 のデータへ正常にアクセスできる問合せを 4 つ示します。
SELECT
SELECT
SELECT
SELECT
*
*
*
*
FROM
FROM
FROM
FROM
tab1
kaths.tab1
KATHS.tab1
Kaths.tab1
セグメント
4-153
所有者名
引用符の使用
引用符を使用すると、< 所有者 > は、大文字と小文字を区別します。すなわち、引
用符は、入力したとおりに名前を読み取り、格納するようにデータベース サーバに
通知します。この大文字と小文字の区別が適用されるのは、データベース オブジェ
クトを作成したとき、またはデータベース オブジェクトにアクセスするときです。
所有者が Sam の表があるとします。次の二つの文のどちらかを使用すれば、この表
のデータにアクセスすることができます。
SELECT * FROM table1
SELECT * FROM ' Sam' .table1
所有者名が必要ないので、最初の問合せは成功します。指定の所有者名が、データ
ベースに格納された所有者名と一致するため、二番目の問合せは成功します。
システム カタログ表の情報へのアクセス
選択基準の一つとして所有者名を使用して、システム カタログ表の一つにあるデー
タベース オブジェクト情報にアクセスする場合、所有者名は大文字と小文字を区別
します。この種の問合せでは引用符を使用する必要があるため、ユーザは、システ
ム カタログ表に格納されているとおりに所有者名を入力しなければなりません。次
の二つの例のうち、二番目の例だけが、表 Kaths.table1 の情報へのアクセスに成功
します。
SELECT * FROM systables WHERE tabname = ' table1' AND owner = ' kaths'
SELECT * FROM systables WHERE tabname = ' table1' AND owner = ' Kaths'
ユーザ Informix は、システム カタログ表の所有者です。
ヒント : キーワード USER は、システムに格納されたとおりのログイン名を返しま
す。この格納されているログイン名と所有者名とが異なる場合 ( たとえば、所有者
名に大文字と小文字が混在したり、ログイン名がすべて小文字からなる場合 )、
owner=USER 構文は失敗します。
ANSI
ANSI 標準準拠のデータベース制限および大文字と小文字の区別
ANSI 標準準拠のデータベースでデータベース オブジェクトを作成したり、データ
ベース オブジェクトの名前を変更したりするときに所有者名を指定する場合、デー
タ アクセス文にその所有者名を指定する必要があります。ユーザは、自分が所有し
ていないデータベース オブジェクトにアクセスする場合には、所有者名を指定する
必要があります。
4-154 Informix Guide to SQL:Syntax
所有者名
次の表に、データベース オブジェクトの作成、名前変更、またはアクセス時に、
データベース サーバが < 所有者 > を読み取って格納する方法について説明します。
所有者名の指定方法
データベース サーバの動作内容
指定しない
システムに格納されたログイン名のとおりに
< 所有者 > を読み取り、格納します。
ユーザは、自分が所有していないデータベース
オブジェクトまたはデータベースには、< 所有
者 > を指定する必要があります。
引用符を使用せずに指定する
大文字で < 所有者 > を読み取り、格納します。
引用符で囲む
入力したとおりに < 所有者 > を読み取り、
格納します。
データベース サーバがこの指定方法を処理す
る方法についての詳細は、「引用符の使用」と
「システム カタログ表の情報へのアクセス」を
参照してください。
< 所有者 > が引用符で囲まれないと、データベース サーバは、自動的にその < 所有
者 > を大文字に変更します。このため、大文字と小文字の区別のエラーが発生する
ため、問合せは失敗します。
たとえば、ユーザ nancy が次の文を使用する場合、結果として生じるビューの名前
は、nancy.njcust になります。
CREATE VIEW 'nancy'.njcust AS
SELECT fname, lname FROM customer WHERE state = 'NJ'
次の SELECT 文は、名前 NANCY.njcust を nancy.njcust という実際の所有者名およ
び表名と一致させようとするため、失敗します。
SELECT * FROM nancy.njcust
ヒント : 任意の問合せの選択基準の一つとして所有者名を使用する ( たとえば、
WHERE owner=’kaths’) 場合、引用符で囲んだ文字列が、データベースに格納され
たとおりの所有者名と一致することを確認してください。データベース サーバが、
データベース オブジェクトまたはデータベースを検出できないときには、引用符で
囲まれた文字列で大文字が使用される ( たとえば、WHERE owner=’KATHS’) よう
にこの問合せを変更することが必要な場合があります。
セグメント
4-155
引用符付き文字列
引用符付き文字列
引用符付き文字列は、引用符で囲まれた文字列定数です。構文ダイヤグラムの引用
符付き文字列の参照を確認する場合に使用します。
構文
'
+
'
< 文字 >
''
"
"
< 文字 >
""
要素
<文字>
目的
引用符付き文字列の一部となる
文字です。
制限
環境変数 DELIMIDENT が設定
されている場合、引用符付き文
字列内の一つまたは複数の文字
を二重引用符で囲むことはでき
ません。
構文
文字はキーボードか
ら入力するリテラル
値です。
説明
文字列定数は 1 行に書き込まなければなりません。つまり、埋込み型の改行は使用
できません。
4-156 Informix Guide to SQL:Syntax
引用符付き文字列
引用符付き文字列での文字の指定の制限
引用符付き文字列で文字を指定する場合は、次の制限を守らなければなりません。
GLS
■
ASCII のコードセットを使用している場合は、単一引用符と二重引用符を
含む印刷可能な ASCII 文字を指定することができます。引用符付き文字列
内での引用符の使用の制限については、4-157 ページの「文字列での引用
符の使用」を参照してください。
■
ASCII 以外のコードセットを使用している場合は、複数バイト文字を含む
非 ASCII 文字を指定することができます。詳細は、
『Informix Guide to GLS
Functionality』の引用符付き文字列の説明を参照してください。 ♦
■
環境変数 DELMIDENT を設定している場合は、引用符付き文字列の区切り
に二重引用符を使用することはできません。環境変数 DELIMIDENT が設
定されている場合は、二重引用符で囲まれている文字列は、引用符付き文
字列ではなく、識別子として扱われます。環境変数 DELIMIDENT が設定
されていない場合は、二重引用符で囲まれている文字列は、識別子ではな
く、引用符付き文字列として扱われます。詳細は、4-157 ページの「文字
列での引用符の使用」を参照してください。
■
日時 (DATETIME) 型と時間隔 (INTERVAL) 型のデータを、引用符付き文字
列として入力することができます。日時 (DATETIME) 型と時間隔
(INTERVAL) 型のデータを、引用符付き文字列フォーマットで入力する場
合の制限については、4-158 ページの「文字列としての日時 (DATETIME)
型値と時間隔 (INTERVAL) 型値」を参照してください。
■
検索条件でキーワード LIKE や MATCH とともに使用される引用符付き文字
列は、検索条件で特別な意味を持つワイルドカード文字を含むことができ
ます。詳細は、4-158 ページの「条件での LIKE と MATCHES」を参照して
ください。
■
引用符付き文字列の値を挿入する場合は、いくつかの制限を守る必要があ
ります。詳細は、4-159 ページの「引用符付き文字列としての値の挿入」
を参照してださい。
文字列での引用符の使用
単一引用符は、二重引用符で区切られた文字列定数では特別な意味を持ちません。
同様に、二重引用符は、単一引用符で区切られた文字列定数では特別な意味を持ち
ません。たとえば、次の文字列は有効です。
"Nancy's puppy jumped the fence"
'Billy told his kitten, "no!" '
セグメント
4-157
引用符付き文字列
文字列が二重引用符で区切られている場合は、次の文字列で示しているように、二
重引用符をさらに別の二重引用符で囲むことで文字列に二重引用符を使用すること
ができます。
"Enter ""y"" to select this row"
環境変数 DELIMIDENT が設定されている場合は、二重引用符は文字列ではなく識
別子を区切ります。区切り識別子についての詳細は、4-114 ページの「区切り識別
子」を参照してください。
文字列としての日時 (DATETIME) 型値と時間隔 (INTERVAL)
型値
日時 (DATETIME) 型と時間隔 (INTERVAL) 型データを、それぞれ 4-132 ページと 4135 ページに記述されている「リテラル日時 (DATETIME) 型」と「リテラル時間隔
(INTERVAL) 型」で入力することができます。またそれらを引用符付き文字列とし
て入力することもできます。文字列として入力された有効なリテラルは、自動的に
日時 (DATETIME) 型値や時間隔 (INTERVAL) 型値に変換されます。次の INSERT
文は時間隔 (INTERVAL) 型値や日時 (DATETIME) 型値を入力するのに引用符を使
用しています。
INSERT INTO cust_calls(call_dtime) VALUES ('1997-5-4 10:12:11')
INSERT INTO manufact(lead_time) VALUES ('14')
引用符付き文字列の値のフォーマットは、列の修飾子で指定したフォーマットと完
全に一致しなければなりません。前述の例の最初のケースでは、INSERT 文を有効
にするためには、修飾子 YEAR TO SECOND とともに call_dtime を定義しなければ
なりません。
条件での LIKE と MATCHES
条件の中のキーワード LIKE や MATCH を伴った引用符付き文字列は、ワイルド
カード文字を含むことができます。ワイルドカード文字についての詳細は、4-5
ページの「条件セグメント」を参照してください。
4-158 Informix Guide to SQL:Syntax
引用符付き文字列
引用符付き文字列としての値の挿入
引用符付き文字列の値を挿入する場合は、次の制約に従う必要があります。
■
CHAR、VARCHAR、NCHAR、NVARCHAR、DATE、DATETIME、
INTERVAL の値は引用符で囲みます。
■
日付 (DATE) 型の値を mm/dd/yy のフォーマットで設定します。
■
256 バイトより長い文字列を挿入することはできません。
■
10 進値の数字には小数点を付けます。10 進標識としてカンマは使用できま
せん。
■
金額 (MONEY) 型データの前にドル記号 ($) をつけたり、カンマを含むこと
はできません。
■
列が NULL を許容する場合にのみ、
位置指定子として NULL を含むことがで
きます。
参照
環境変数 DELIMIDENT の説明については、『Informix Guide to SQL: Reference』を参
照してください。
引用符付き文字列の説明については、
『Informix Guide to GLS Functionality』を参照し
てください。
セグメント
4-159
関係演算子
関係演算子
関係演算子を使用して、二つの式を定量的に比較します。構文ダイヤグラムの関係
演算子の参照を確認する場合に使用します。
構文
<
<=
>
=
>=
<>
+
!=
構文ダイヤグラムで示されている各演算子は、特定の意味を持っています。
関係演算子
意味
<
より小さい
<=
以下
>
より大きい
=
等しい
>=
以上
<>
等しくない
!=
等しくない
4-160 Informix Guide to SQL:Syntax
関係演算子
説明
日付 (DATE) 型と日時 (DATETIME) 型の式では、「より大きい」という表現は、時
間的に後であることを意味します。
時間隔 (INTERVAL) 型式での「より大きい」という表現は、長い時間隔を意味します。
文字 (CHAR) 型、可変長文字 (VARCHAR) 型およびラージ可変長文字 (LVARCHAR) 型
の式では、
「より大きい」という表現は、コード セット順序で「後」を意味します。
GLS
各国語文字 (NCHAR) 型と各国語可変長文字 (NVARCHAR) 型の式では、ロケールに
よる照合順序が使用されます。したがって、各国語文字 (NCHAR) 型と各国語可変
長文字 (NVARCHAR) 型の式では、「より大きい」はロケールによる照合順序での
「後」を意味します。ロケールによる照合順序と各国語文字 (NCHAR) 型と各国語可
変長文字 (NVARCHAR) 型についての詳細は、『Informix Guide to GLS Functionality』
を参照してください。 ♦
英語データの照合順序
デフォルトロケール ( アメリカ英語 ) を使用している場合、データベースサーバは、
関係演算子の前後につく文字式を比較するのにデフォルトコードセットのコード
セット順序を使用します。
UNIX
UNIX プラットフォームでは、デフォルトコードセットは次の文字セットからなる
ISO8859-1 コードセットです。
■
ASCII 文字は、0 から 127 の間のコードポイントに含まれます。
この範囲には制御文字、句読点、英文字、数字が含まれています。
■
8 ビット文字は、128 から 255 の間のコードポイントを参照します。
この範囲には多くの英語以外の文字 (é, â, ö, ñ) とシンボル (£、©、¿ など )
が含まれています。 ♦
WIN NT
Windows NT では、デフォルトのコード セットは、Microsoft1252 です。このコード
セットには、ASCII コード セットと 8 ビット文字セットが含まれています。♦
セグメント
4-161
関係演算子
次のチャートは、ASCII コードセットを示しています。列 Num は ASCII コード番
号を示し、列 Char はそれぞれの ASCII コード番号に対応している ASCII 文字を示
します。ASCII 文字は ASCII コード番号にしたがってソートされます。したがって
数字、大文字、小文字の順序になります。この表ではカレット記号 (^) は CTRL
キーを示しています。たとえば、^X は CTRL-X を意味します。
Num
Char
Num
Char
Num
Char
Num
Char
Num
Char
Num
Char
Num
Char
0
^@
20
^T
40
(
60
<
80
P
100
d
120
x
1
^A
21
^U
41
)
61
=
81
Q
101
e
121
y
2
^B
22
^V
42
*
62
>
82
R
102
f
122
z
3
^C
23
^W
43
+
63
?
83
S
103
g
123
{
4
^D
24
^X
44
,
64
@
84
T
104
h
124
|
5
^E
25
^Y
45
-
65
A
85
U
105
i
125
}
6
^F
26
^Z
46
.
66
B
86
V
106
j
126
~
7
^G
27
esc
47
/
67
C
87
W
107
k
127
del
8
^H
28
^¥
48
0
68
D
88
X
108
l
9
^I
29
^]
49
1
69
E
89
Y
109
m
10
^J
30
^^
50
2
70
F
90
Z
110
n
11
^K
31
^_
51
3
71
G
91
[
111
o
12
^L
32
52
4
72
H
92
¥
112
p
13
^M
33
!
53
5
73
I
93
]
113
q
14
^N
34
"
54
6
74
J
94
^
114
r
15
^O
35
#
55
7
75
K
95
_
115
s
16
^P
36
$
56
8
76
L
96
`
116
t
17
^Q
37
%
57
9
77
M
97
a
117
u
18
^R
38
&
58
:
78
N
98
b
118
v
19
^S
39
'
59
;
79
O
99
c
119
w
4-162 Informix Guide to SQL:Syntax
関係演算子
GLS
デフォルト以外のコードセットでの ASCII 文字のサポート
デフォルト以外のロケールでのほとんどのコードセット ( デフォルト以外のコード
セットと呼ぶ ) は、ASCII 文字をサポートしています。デフォルト以外のロケール
を使用している場合、データベースサーバは、そのデフォルト以外のコードセット
が ASCII 文字をサポートしているかぎり、文字 (CHAR) 型式と可変長文字
(VARCHAR) 型式の ASCII データで ASCII コードセット順序を使用します。
参照
SELECT 文での関係演算子に関する説明については、『Informix Guide to SQL:
Tutorial』を参照してください。
関係演算子の GLS に関する説明については、
『Informix Guide to GLS Functionality』
を参照してください。
セグメント
4-163
付録
予約語
この付録では Informix 実装 SQL の予約語をリストします。SQL 識別子
としては、ほとんどどの語でも使用できますが、構文があいまいにな
ることがあります。文があいまいなために、期待された結果が得られ
ないことがあります。こうした場合の対処方法については、4-112
ページの識別子セグメントを参照してください。
A
ADD
AFTER
ALL
ALL_ROWS
ALTER
AND
ANSI
ANY
APPEND
AS
ASC
AT
ATTACH
AUDIT
AUTHORIZATION
AVG
BEFORE
BEGIN
BETWEEN
BOTH
BUFFERED
BY
BYTE
CALL
CASCADE
CASE
CHAR
CHAR_LENGTH
CHARACTER
CHARACTER_LENGTH
CHECK
CLOSE
CLUSTER
CLUSTERSIZE
COBOL
COLUMN
COMMIT
COMMITTED
CONNECT
CONSTRAINT
CONSTRAINTS
CONTINUE
A-2 Informix Guide to SQL:Syntax
COUNT
CRCOLS
CREATE
CURRENT
CURSOR
DATABASE
DATASKIP
DATE
DATETIME
DAY
DBA
DBPASSWORD
DEBUG
DEC
DECIMAL
DECLARE
DECODE
DEFAULT
DEFERRED
DEFINE
DELETE
DESC
DETACH
DIRTY
DISABLED
DISTINCT
DISTRIBUTIONS
DOCUMENT
DOUBLE
DROP
EACH
ELIF
ELSE
ENABLED
END
ERROR
ESCAPE
EXCEPTION
EXCLUSIVE
EXEC
EXECUTE
EXISTS
EXIT
EXPLAIN
EXPRESSION
EXTEND
EXTENT
FETCH
FILE
FILLFACTOR
FILTERING
FIRST_ROWS
FLOAT
FOR
FOREACH
FOREIGN
FORTRAN
FOUND
FRACTION
FRAGMENT
FROM
GLOBAL
GO
GOTO
GRANT
GROUP
HAVING
HIGH
HOLD
HOUR
IF
IMMEDIATE
IN
INDEX
INDEXES
INDICATOR
INIT
INITCAP
INSERT
INT
INTEGER
INTERVAL
INTO
IS
ISOLATION
KEY
LABELEQ
LABELGE
LABELGLB
LABELGT
LABELLE
LABELLT
LABELLUB
LABELTOSTRING
LANGUAGE
LEADING
LET
LEVEL
LIKE
LISTING
LOCK
LOG
予約語
A-3
LOW
LOWER
MATCHES
MAX
MEDIAN
MEDIUM
MEMORY_RESIDENT
MIN
MINUTE
MODE
MODIFY
MODULE
MONEY
MONTH
MOUNTING
NCHAR
NEW
NEXT
NO
NON_RESIDENT
NONE
NOT
NULL
NUMERIC
NVARCHAR
NVL
OCTET_LENGTH
OF
OFF
OLD
ON
ONLY
OPEN
OPTICAL
OPTIMIZATION
OPTION
OR
ORDER
OUTER
PAGE
PASCAL
PDQPRIORITY
PLI
A-4 Informix Guide to SQL:Syntax
PRECISION
PRIMARY
PRIVATE
PRIVILEGES
PROCEDURE
PUBLIC
RAISE
RANGE
READ
REAL
RECOVER
REFERENCES
REFERENCING
RELEASE
REMAINDER
RENAME
REPEATABLE
REPLICATION
RESERVE
RESOLUTION
RESOURCE
RESTRICT
RESUME
RETURN
RETURNING
RETURNS
REVOKE
ROBIN
ROLE
ROLLBACK
ROLLFORWARD
ROUND
ROW
ROWIDS
ROWS
SCHEMA
SECOND
SECTION
SELECT
SERIAL
SERIALIZABLE
SESSION
SET
SHARE
SIZE
SKALL
SKINHIBIT
SKSHOW
SMALLFLOAT
SMALLINT
SOME
SQL
SQLCODE
SQLERROR
STABILITY
START
STATISTICS
STDEV
STEP
STOP
STRINGTOLABEL
SUBSTR
SUBSTRING
SUM
SYNONYM
SYSTEM
TABLE
TEMP
TEXT
THEN
TIMEOUT
TO
TRACE
TRAILING
TRANSACTION
TRIGGER
TRIGGERS
TRIM
UNCOMMITTED
UNION
UNIQUE
UNITS
UNLOCK
UPDATE
UPPER
USING
VALUES
VARCHAR
VARIANCE
VARYING
VIEW
VIOLATIONS
WAIT
WHEN
WHENEVER
WHERE
WHILE
WITH
WITHOUT
WORK
WRITE
YEAR
予約語
A-5
索引
索引
記号
¥、円記号、ワイルドカード文字
として使用 4-12, 4-13
"、二重引用符
引用符付き文字列 4-157
引用符付き文字列の周り 4-156
区切り識別子 4-114, 4-117
%、パーセント記号、ワイルド
カード文字として使用 4-12
'、単一引用符
引用符付き文字列 4-157
引用符付き文字列の周り 4-156
(|)、パイプ文字 2-100, 2-498
*、アスタリスク
SELECT 文で使用 2-453
算術演算子 4-33
ワイルドカード文字として使
用 4-13
+、加算記号、算術演算子 4-33
\、バックスラッシュ、ワイルド
カード文字として使用 4-12,
4-13
--、二重ハイフン、コメントシンボ
ル 1-6
_、アンダスコア、ワイルドカード
文字として使用 4-12
-、減算記号、算術演算子 4-33
/、除算記号、算術演算子 4-33
?、疑問符
PREPARE 文の位置指定子 2-404,
2-421
USING キーワードによる置
換 2-397
ワイルドカード文字として使
用 4-13
[...]、大かっこ
ワイルドカード文字として使
用 4-13
^、カレット、ワイルドカード文字
として使用 4-13
{}、中かっこ、コメントシンボ
ル 1-6
||、連結演算子 4-33, 4-34
数字
10 進数 (DECIMAL) 型
構文 4-27
A
ABS 関数 4-55, 4-57
ABSOLUTE キーワード、FETCH
文 2-305
ACCESS キーワード 2-370
ACOS 関数 4-79
ADC キーワード
SELECT 文 2-485
ADD キーワード
ALTER TABLE 文 2-42
ADD CONSTRAINT 節
ALTER TABLE 文 2-60
ADD CRCOLS 節
ALTER TABLE 文 2-40
ADD ROWIDS 節
ALTER TABLE 文 2-40
AFTER キーワード
CREATE TRIGGER 文 2-205
ALL キーワード
DISCONNECT 文 2-270
GRANT 文 2-352, 2-355
REVOKE 文 2-435, 2-437
REVOKE FRAGMENT 文 2-445
SELECT 文 2-452, 2-456
UNION 演算子 2-450, 2-501
式 4-98
集計関数 4-96
条件式 4-18
副問合せの開始 2-477
ALLOCATE DESCRIPTOR 文
連結演算子の使用 4-35
ALTER アクセス権 2-354
ALTER キーワード
GRANT 文 2-343
REVOKE 文 2-435
ALTER FRAGMENT 文
ADD 節 2-28
ATTACH 節 2-11
DETACH 節 2-19
DROP 節 2-30
MODIFY 節 2-31
WITH NO CHECK OPTION 2-14
アクセス権 2-10
一般化キーインデックス 2-22
影響
BYTE 列と TEXT 列 2-18
インデックス 2-13, 2-18
トリガ 2-13, 2-19
構文 2-8
式による結合 2-17
実行方法 2-10
使用方法 2-9
断片化されていない表に変
換 2-25
ハイブリッドな断片化 2-20
ラウンドロビンによる結合 2-17
ALTER INDEX 文
構文 2-34
クラスタ化インデックスの削
除 2-35
ALTER TABLE 文
ADD 節 2-42
ADD CONSTRAINT 節 2-60
ADD CRCOLS 節 2-40
BEFORE オプション 2-53
CHECK 節 2-52
DEFAULT 節 2-43
DROP 節 2-54
DROP CONSTRAINT 節 2-63
DROP CRCOLS 節 2-40
DROP ROWIDS 節 2-40
LOCK MODE 節 2-65
MODIFY 節 2-56
MODIFY NEXT SIZE 節 2-64
REFERENCES 節 2-47
TYPE オプション 2-41
アクセス権 2-343
カスケード削除 2-50
行 ID の追加 2-40
表の並べ替え 2-35
表のロックモードの変更 2-65
表レベル制約の定義 2-61
列の削除 2-54
列のデータ型の変更 2-56
AND キーワード
BETWEEN キーワード 2-473
条件セグメント 4-5, 4-20
ANSI 標準準拠
-ansi フラグ 序 13, 2-150, 2-156,
2-231
SQL 文 1-12
アイコン 序 11
行の更新 2-625
表の命名 2-428
レベル 序 20
ANSI 標準準拠のデータベース
BEGIN WORK 文 2-68
FOR UPDATE 不要 2-245
作成 2-91
説明 2-91
データベースオブジェクトの命
名 4-153
表のアクセス権 2-156
ANY キーワード
SELECT 文 2-477
条件式 4-18
AS キーワード
CREATE VIEW 文 2-230, 2-232
GRANT 文 2-343, 2-357
SELECT 文 2-452
表示ラベル 2-460
表の別名 2-468
ASC キーワード
CREATE INDEX 文 2-111
NULL 値のソート 2-489
SELECT 文 2-488
ASCII コードセット 4-162
ASIN 関数 4-79
ATAN 関数 4-79
ATAN2 関数 4-79
索引 2 Informix Guide to SQL:Syntax
AUTOFREE 機能
SET AUTOFREE 文 2-502
AVG 関数 4-96, 4-103
B
B ツリークリーナリスト 2-637
BEFORE キーワード
ALTER TABLE 文 2-53
CREATE TRIGGER 文 2-204
BEGIN キーワード、CREATE
PROCEDURE 文 2-143
BEGIN WORK 文
ANSI 標準準拠のデータベースで
の使用 2-68
トランザクションでのロック機
能 2-67
BEGIN-END ブロック、CREATE
PROCEDURE 文 2-143
BETWEEN キーワード
SELECT 文 2-473
条件セグメント 4-6, 4-10
BUFFERED キーワード
SET LOG 文 2-563
BUFFERED LOG キーワード
CREATE DATABASE 文 2-90
C
CALL キーワード、WHENEVER
文 2-645, 2-651
CALL 文、構文 3-4
CASCADE キーワード、REVOKE
文 2-433
CASE 式 4-39
cdrserver、レプリケーション列
名 2-178
cdrtime、レプリケーション列
名 2-178
CHARACTER_LENGTH 関数 4-70
CHECK 節
ALTER TABLE 文 2-52
CREATE EXTERNAL TABLE
文 2-97
CREATE TABLE 文 2-171
CLOSE 文
INSERT カーソル 2-71
構文 2-70
選択カーソル 2-71
トランザクションの終了により影
響を受けるカーソル 2-72
連結演算子の使用 4-35
CLOSE DATABASE 文
構文 2-73
前提条件 2-73
CLUSTER キーワード
ALTER INDEX 文 2-34
CREATE INDEX 文 2-109
CODESET キーワード
CREATE EXTERNAL 文 2-101,
2-499
COMMIT WORK 文
ANSI 標準準拠ではないデータ
ベース 2-76
ANSI 標準準拠のデータベー
ス 2-76
構文 2-75
COMMITTED READ キーワード
SET ISOLATION 文 2-555
CONNECT アクセス権 2-346
CONNECT キーワード
GRANT 文 2-346
REVOKE 文 2-439
CONNECT 文
DBPATH によるデータベースへ
の割当て 2-85
DEFAULT オプション 2-79
INFORMIXSERVER 環境変
数 2-79
USER 節 2-86
WITH CONCURRENT
TRANSACTION オプショ
ン 2-81
暗黙的な接続 2-80
構文 2-77
使用方法 2-77
接続識別子 2-79
接続のコンテキスト 2-79
データベース環境 2-82
CONTINUE キーワード、
WHENEVER 文 2-645, 2-649
CONTINUE 文
構文 3-7
COS 関数 4-79
COUNT 関数
SET DESCRIPTOR 文 2-547
式での使用 4-96, 4-98, 4-99
COUNT フィールド
GET DESCRIPTOR 文 2-321
WHERE 節 2-544
CRCOLS キーワード、CREATE
TABLE 文 2-178
CREATE DATABASE 文
ANSI 標準準拠 2-91
PREPARE 文とともに使用 2-89
構文 2-89
CREATE EXTERNAL TABLE 文
CHECK 節 2-97
DATAFILES 節 2-98
SAMEAS 節 2-94
オプション項目の構文 2-99
構文 2-92
列レベル制約 2-96
列を NOT NULL に設定 2-96
CREATE INDEX 文
ASC キーワード 2-111
CLUSTER キーワード 2-109
DESC キーワード 2-111
DISTINCT キーワード 2-108
FILLFACTOR 節 2-123
FRAGMENT BY EXPRESSION
節 2-125
IN DB 領域節 2-124
UNIQUE キーワード 2-108
USING BITMAP キーワード 2-107
暗黙的な表のロック 2-107
一般化キーインデックス 2-119
インデックスタイプのオプショ
ン 2-108
オブジェクトモードの指定 2-129
オフモードのインデックス 2-132
格納オプション 2-122
構文 2-106
ソート順 2-111
複合インデックス 2-110
フラグメントのクラスタ化 2-109
CREATE PROCEDURE 文
BEGIN-END ブロック 2-143
構文 2-134
CREATE PROCEDURE FROM 文
構文および使用 2-144
連結演算子の使用 4-35
CREATE ROLE 文、構文 2-146
CREATE SCHEMA 文
CREATE シーケンス 2-149
GRANT 文で作成されたオブジェ
クトの所有者を指定 2-149
構文 2-148
トリガの定義 2-199
CREATE SYNONYM 文
構文 2-151
シノニムの連鎖 2-153
CREATE TABLE 文
CHECK 節 2-171
DEFAULT 節 2-160
FRAGMENTBY 節 2-181
HYBRID 節 2-186
IN<DB スライス > 節 2-183
IN<DB 領域 > 節 2-179, 2-183
LOCK MODE 節 2-188
NOT NULL 列の設定 2-164
ON DELETE CASCADE キーワー
ド 2-164
REFERENCES 節 2-164
WITH CRCOLS キーワード 2-178
WITH ROWIDS 節 2-182
エクステントサイズの指定 2-189
カスケード削除 2-169
式による断片化 2-184
制約
規則 2-166
定義 2-163, 2-175
データベース表の格納 2-179
デフォルトのアクセス権 2-156
バイト (BYTE) 型とテキスト
(TEXT) 型の使用 2-164
表型 2-177
表の列の指定 2-159
列レベルの制約 2-163
構文 2-155
CREATE TRIGGER 文
ESQL/C アプリケーション 2-199
使用 2-199
使用するアクセス権 2-199
トリガアクション節 2-211
無効モードのトリガ 2-228
有効モードのトリガ 2-228
構文 2-198
CREATE VIEW 文
WITH CHECK OPTION キーワー
ド 2-234
アクセス権 2-231
アスタリスク (*) を使用した
SELECT 節 2-231
索引 3
仮想列 2-232
構文 2-230
制限 2-231
列のデータ型 2-231
CURRENT 関数
ALTER TABLE 文 2-43
DAY 関数の入力 4-52
INSERT 文 2-377, 2-379
WHERE 条件 4-52
式 4-47, 4-51
条件セグメント 4-6
デフォルト値として使用 2-162
CURRENT キーワード
DISCONNECT 文 2-269
FETCH 文 2-305
SET CONNECTION 文 2-510
CURRENT OF キーワード
DELETE 文 2-258, 2-261
UPDATE 文 2-622, 2-632
CURSOR STABILITY キーワード
SET ISOLATION 文 2-555
D
DATA フィールド
SET DESCRIPTOR 文 2-550
X/Open プログラム 2-322
DATABASE 文
現行データベースの指定 2-236
構文 2-236
実行後の SQLWARN 2-237
データベースの種類を判断 2-237
排他モード 2-237
DATAFILES 節
CREATE EXTERNAL TABLE
文 2-97
DAY 関数 4-71, 4-74
DAY キーワード
時間隔 (INTERVAL) 型 4-129,
4-135
日時 (DATETIME) 型セグメン
ト 4-132
日時 (DATETIME) 型 4-31
DB 領域
CREATE TABLE 文での設
定 2-179, 2-183
使用できない場合のスキッ
プ 2-534
DBA アクセス権、CREATAE
SCHEMA 文 2-149
DBA アクセス権付きプロシ
ジャ 2-135
DBA キーワード、REVOKE
文 2-439
DBANSIWARN 環境変数 2-150,
2-156, 2-231
DBCENTURY 環境変数 2-385
DBDATE 環境変数 2-385, 2-616
DBDELIMITER 環境変数 2-388
DBINFO 関数 4-60
DBMONEY 環境変数 2-385, 2-616
DBSERVERNAME 関数
ALTER TABLE 文 2-43
サーバ名を戻す 4-50
デフォルト値として使用 2-162
DBSPACETEMP 環境変数 2-193
DBTIME 環境変数 2-386, 2-617
DDL 文、サマリ 1-9
DEALLOCATE DESCRIPTOR 文
構文 2-239
連結演算子の使用 4-35
DECLARE 文
FOR READ ONLY キーワー
ド 2-251
FOR UPDATE ONLY キーワー
ド 2-245
FOR UPDATE キーワード 2-245
HOLD カーソル 2-247
INSERT カーソル 2-245, 2-256,
2-257
ORDER BY 節を持つ SELECT 文
での制限 2-490
PREPARE 文で処理されたカーソ
ル 2-254
SELECT カーソル 2-244
SELECT 文 2-464
UPDATE カーソル 2-245, 2-249
WHERE CURRENT OF 節 2-249
カーソルの特性 2-246
構文 2-241
指定した列の更新 2-250
順カーソル 2-246
スクロール 2-246
トランザクションとともにカーソ
ルを使用 2-255
プロシジャカーソル 2-244
読込み専用カーソル 2-245, 2-251
索引 4 Informix Guide to SQL:Syntax
連結演算子の使用 4-35
DECODE 関数 4-44
DEFAULT キーワード
CONNECT 文 2-79
CREATE EXTERNAL TABLE
文 2-101
CREATE PROCEDURE 文 2-137
DISCONNECT 文 2-268
SET CONNECTION 文 2-510
DEFINE 文
構文 3-8
使用できるデータ型 3-9
デフォルト値節 3-12
DELETE キーワード
GRANT 文 2-352
REVOKE 文 2-435
REVOKE FRAGMENT 文 2-445
DELETE 文
CURRENT OF 節 2-261
SELECT 文の FOR UPDATE 節を
使用 2-491
カーソル 2-249
カスケード 2-259
構文 2-258
トランザクション 2-259
トリガ 2-200, 2-212
DELIMIDENT 環境変数 4-116
DELIMITER キーワード
CREATE EXTERNAL TABLE
文 2-101, 2-499
UNLOAD 文 2-618
LOAD 文 2-388
DELUXE キーワード、CREATE
EXTERNAL TABLE 文 2-101
DESC キーワード
CREATE INDEX 文 2-111
NULL 値のソート 2-489
SELECT 文 2-485, 2-488
DESCRIBE 文
GET DESCRIPTOR 文との関
係 2-322
SELECT 文によって返された
値 2-264
sqlda ポインタを指定する INTO
節 2-266
USING SQL DESCRIPTOR
節 2-265
構文 2-262
文の型を記述する方法 2-263
連結演算子の使用 4-35
DETACH 節
ALTER FRAGMENT 文 2-19
ハイブリッドな断片化 2-20
DIRTY READ キーワード
SET ISOLATION 文 2-555
DISCONNECT 文
ALL キーワード 2-270
CURRENT キーワード 2-269
DEFAULT オプション 2-268
DISTINCT キーワード
CREATE INDEX 文 2-108
SELECT 文 2-452, 2-456
集計式 4-96
副問合せ 4-16
DML 文、サマリ 1-10
DROP 節、ALTER TABLE 文 2-54
DROP CONSTRAINT 節、ALTER
TABLE 文 2-63
DROP CRCOLS 節、ALTER TABLE
文 2-40
DROP DATABASE 文 2-271
DROP INDEX 文
構文 2-273
DROP ROLE 文 2-276
DROP ROWIDS 節、ALTER TABLE
文 2-40
DROP SYNONYM 文
構文 2-277
DROP TABLE 文
構文 2-279
DROP TRIGGER 文
構文 2-282
使用 2-282
DROP VIEW 文
構文 2-283
E
en_us.8859-1 ロケール 序 4
ESCAPE キーワード
CREATE EXTERNAL TABLE
文 2-102, 2-499
LIKE キーワード 2-474
MATCHES キーワード 2-475
条件セグメント 4-12
ESCAPE 節
LIKE キーワードで使用 4-14
MATCHES キーワードで使
用 4-14
条件セグメント 4-6
EXCLUSIVE キーワード
DATABASE 文 2-236, 2-237
LOCK TABLE 文 2-391
EXECUTE 文
INTO 節 2-287
sqlca レコード 2-287
USING キーワード 2-290
USING SQL DESCRIPTOR
節 2-292
エラー状態 2-293
構文 2-285
文のパラメータ化 2-290
連結演算子の使用 4-35
EXECUTE IMMEDIATE 文
構文と説明 2-294
実行できない文 2-295
連結演算子の使用 4-35
EXECUTE ON キーワード、
GRANT 文 2-342, 2-348
EXECUTE PROCEDURE 文
FOREACH 文での使用 3-23
INTO キーワード 2-306
カーソル、DECLARE 文を使
用 2-244
構文 2-297
EXISTS キーワード
副問合せ
開始 2-476
条件 4-17
EXIT 文 3-16
EXP 関数 4-67
EXPRESS キーワード、CREATE
EXTERNAL TABLE 文 2-102
EXTEND 関数 4-71, 4-75
EXTENT SIZE キーワード、
CREATE TABLE 文 2-189
F
FETCH 文
CLOSE 文による影響 2-71
GET DESCRIPTOR 文に対する関
係 2-318
SQLCA を使用した検査結
果 2-310
X/Open モード 2-303
更新のために行を取り出す方
法 2-309
更新のためのロック 2-309
構文 2-301
順カーソル 2-304
スクロールカーソル 2-304
プログラム配列 2-307
メモリ内での値の行き先を指
定 2-306
連結演算子の使用 4-35
FILLFACTOR 節、CREATE INDEX
文 2-123
finderr ユーティリティ 序 17
FIRST キーワード、FETCH
文 2-304
FIRST 節、SELECT 文 2-454
FLUSH 文
構文 2-312
連結演算子の使用 4-35
FOR キーワード
CONTINUE 文 3-7
CREATE SYNONYM 文 2-151
EXIT 文 3-16
FOR 文
構文 3-18
式の並びの使用 3-21
増分値の使用 3-20
複数の範囲指定 3-21
FOR EACH ROW 節
CREATE TRIGGER 文 2-204,
2-205, 2-206
FOR READ ONLY キーワード
DECLARE 文 2-251
FOR TABLE キーワード、UPDATE
STATISTICS 文 2-634
FOR UPDATE キーワード
DECLARE 文 2-241, 2-245, 2-249,
2-254
SELECT 文 2-450, 2-490
UPDATE 文との関係 2-632
列の並び 2-250
FOREACH キーワード
CONTINUE 文 3-7
EXIT 文 3-16
FOREACH 文、構文 3-23
FORMAT キーワード、CREATE
EXTERNAL TABLE 文 2-102,
2-499
索引 5
FRACTION キーワード
時間隔 (INTERVAL) 型 4-129
フィールド修飾子 4-135
日時 (DATETIME) 型 4-31
フィールド修飾子 4-132
FRAGMENT BY EXPRESSION 節
CREATE INDEX 文 2-125
FREE 文
カーソルへの影響 2-400
構文 2-315
連結演算子の使用 4-35
FROM キーワード
PUT 文 2-421
FROM 節
SELECT 文 2-450, 2-466
G
GET DESCRIPTOR 文
COUNT キーワード 2-321
FETCH 文で使用 2-308
構文 2-318
連結演算子の使用 4-35
GET DIAGNOSTICS 文
MESSAGE_TEXT キーワー
ド 2-335
CLASS_ORIGIN キーワード 2-335
CONNECTION_NAME キーワー
ド 2-338
EXCEPTION 節 2-333
MESSAGE_LENGTH キーワー
ド 2-335
MORE キーワード 2-332
NUMBER キーワード 2-332
RETURNED_SQLSTATE キー
ワード 2-335
ROW_COUNT キーワード 2-332
SERVER_NAME キーワー
ド 2-335
SQL 文節 2-331
SUBCLASS_ORIGIN キーワー
ド 2-335
構文 2-325
目的 2-325
連結演算子の使用 4-35
GL_DATE 環境変数 2-385, 2-616
GL_DATETIME 環境変数 2-386,
2-617
GO TO キーワード、WHENEVER
文 2-645, 2-650
GRANT 文
ALL キーワード 2-352, 2-355
DELETE キーワード 2-352
INDEX キーワード 2-352
INSERT キーワード 2-352
PRIVILEGES キーワード 2-352
REFERENCES キーワード 2-352
SELECT キーワード 2-352
UPDATE キーワード 2-352
WITH GRANT OPTION キーワー
ド 2-356
構文 2-343
授与者の変更 2-357
データベースレベルのアクセス
権 2-345
デフォルトの表レベルのアクセス
権 2-355
ビューに対するアクセス権 2-358
表レベルのアクセス権 2-353
付与権の付与 2-356
ロールのアクセス権 2-348
GRANT FRAGMENT 文
AS 節 2-366
WITH GRANT OPTION 節 2-365
構文 2-359
GROUP BY 節
SELECT 文 2-481
GROUP UP 節
SELECT 文 2-450
H
HAVING 節、SELECT 文 2-450,
2-483
HEX 関数 4-38, 4-68
HIGH キーワード、SET
OPTIMIZATION 文 2-566
HOLD カーソル
HOLD カーソルとともに使用し
た INSERT カーソル 2-257
定義 2-246
使用 2-247
HOUR キーワード
時間隔 (INTERVAL) 型 4-129,
4-135
索引 6 Informix Guide to SQL:Syntax
日時 (DATETIME) 型セグメン
ト 4-132
日時 (DATETIME) 型 4-31
HYBRID 節、CREATE TABLE
文 2-186
I
IBM フォーマットの 2 進、外部
表 2-94
IDATA フィールド
SET DESCRIPTOR 文 2-549
IF 文
NULL 値 3-28
構文 3-27
ILENGTH フィールド
SET DESCRIPTOR 文 2-549
X/Open プログラム 2-322
IN キーワード
LOCK TABLE 文 2-390
WHERE 節 2-473
条件セグメント 4-11
副問合せ条件 4-16
INDEX アクセス権 2-354
INDEX キーワード
GRANT 文 2-352
REVOKE 文 2-435
INDEXES キーワード、INFO
文 2-370
INDICATOR キーワード、SELECT
文 2-463, 2-464, 2-465
INDICATOR フィールド
SET DESCRIPTOR 文での設
定 2-551
INFO 文
構文 2-368
informix
ユーザに関連付けられたアクセス
権 2-347
INFORMIXDIR/bin ディレクトリ 序
5
INFORMIXSERVER 環境変数 2-79
INSERT INTO キーワード
INSERT 文 2-372
INSERT カーソル
HOLD カーソルとともに使
用 2-257
INSERT 文 2-375
PUT 文 2-420
SQLCA に格納される CLOSE 文
実行後の結果 2-71
オープン 2-396
クローズ 2-71
再オープン 2-397
使用 2-245
INSERT キーワード
GRANT 文 2-352
LOAD 文 2-389
REVOKE 文 2-435
REVOKE FRAGMENT 文 2-445
INSERT バッファ
PUT 文による行の格納 2-418
挿入された行数 2-424
定数値を使用した書込み 2-419
フラッシュのトリガ 2-422
INSERT 文
DECLARE 文の使用 2-241
INSERT カーソルとともに使
用 2-256
NULL 値の挿入 2-380
PUT 文によるバッファ挿入の書
込み 2-418
SELECT 文 2-380
関数の使用 2-379
構文 2-372
シリアル (SERIAL) 型列 2-379
挿入
カーソルによる行 2-375
ビュー 2-374
挿入する値の指定 2-377
動的な SQL 2-381
トランザクションの影響 2-376
トリガ 2-200, 2-212
INTO キーワード、FETCH 文 2-307
INTO 節
SELECT 文 2-461
INTO EXTERNAL 節、SELECT
文 2-497
INTO SCRATCH 節、SELECT
文 2-497
INTO TEMP 節
SELECT 文 2-450, 2-496
UNION 演算子 2-500
IS キーワード
WHERE 節 2-473
IS NOT キーワード、条件セグメン
トの構文 4-6
IS NOT NULL キーワード、条件セ
グメント 4-11
IS NULL キーワード、条件セグメ
ント 4-11
ISAM エラーコード 3-34, 3-39
ISO 8859-1 コードセット 序 4
ITYPE フィールド
SET DESCRIPTOR 文 2-549
設定 2-551
X/Open プログラム 2-322
L
LAST キーワード、FETCH 文 2-304
LENGTH 関数 4-70
LENGTH フィールド
10 進数 (DECIMAL) 型と金額
(MONEY) 型 2-550
SET DESCRIPTOR 文 2-550
日時 (DATETIME) 型と時間隔
(INTERVAL) 型 2-551
LET 文、構文 3-31
LIKE キーワード
SELECT 文 2-474
条件セグメント 4-6
ワイルドカード文字 2-474
LOAD 文
DELIMITER 節 2-388
INSERT INTO 節 2-389
LOAD FROM ファイル 2-385
可変長文字 (VARCHAR)
型 2-387
構文 2-383
テキスト (TEXT) 型 2-387
バイト (BYTE) 型 2-387
ロードする表を指定 2-389
LOCK MODE 節
ALTER TABLE 文 2-65
CREATE TABLE 文 2-188
LOCK TABLE 文
構文 2-390
トランザクション付きデータベー
ス 2-391
トランザクションでの使用 2-67
トランザクションなしのデータ
ベース 2-392
LOG10 関数 4-67, 4-68
LOGN 関数 4-67, 4-68
LOW キーワード、SET
OPTIMIZATION 文 2-566
LPAD 関数 4-91
M
MATCHES キーワード
SELECT 文 2-474
条件セグメント 4-6, 4-11
ワイルドカード文字 2-475
MAX 関数 4-96, 4-103
MAXERRORS 環境変数 2-101
MAXERRORS キーワード
CREATE EXTERNAL TABLE
文 2-102
MDY 関数 4-71, 4-76
MIN 関数 4-96, 4-104
MINUTE キーワード
時間隔 (INTERVAL) 型 4-129
日時 (DATETIME) 型 4-31
日時 (DATETIME) 型セグメン
ト 4-132
MOD 関数 4-55, 4-57
MODIFY 節、ALTER TABLE
文 2-56
MODIFY NEXT SIZE 節、ALTER
TABLE 文 2-64
MONTH 関数 4-71, 4-74
MONTH キーワード
時間隔 (INTERVAL) 型 4-129,
4-135
日時 (DATETIME) 型セグメン
ト 4-132
日時 (DATETIME) 型 4-31
N
NEW キーワード、REFERENCING
節 2-207, 2-209, 2-210
NEXT キーワード、FETCH
文 2-304
NEXT SIZE キーワード、CREATE
TABLE 文 2-189
MINUTE キーワード
時間隔 (INTERVAL) 型 4-135
NODEFDAC 環境変数、新しいスト
アドプロシジャに対する影
響 2-135
索引 7
NOT キーワード
BETWEEN キーワード 2-473
IN キーワード 2-476
WHERE 節 2-474
条件セグメント 4-5, 4-6, 4-12
NOT FOUND キーワード、
WHENEVER 文 2-645
NOT IN キーワード 4-16
NOT NULL キーワード
ALTER TABLE 文 2-44
CREATE EXTERNAL TABLE
文 2-96
CREATE TABLE 文 2-164
NOT WAIT キーワード
SET LOCK MODE 文 2-561
NULL キーワード
プロシジャ変数のあいまいな使
用 4-125
NULL 値
AND および OR キーワード 4-6
NOT 演算子をつけた条件で使
用 4-6
ORDER BY 節 2-489
SELECT 文での検査 2-288, 2-291
SPL IF 文 3-28
SPL WHILE 文 3-50
VALUES 節による挿入 2-380
ストアドプロシジャで暗黙的に返
された 3-41
列の更新 2-629
NVL 関数 4-43
OPEN 文
FREE 文 2-400
INSERT カーソルのオープ
ン 2-396
PROCEDURE カーソルのオープ
ン 2-395
SELECT カーソルまたは
UPDATE カーソルのオープ
ン 2-394
アクティブセットの構築 2-394
カーソルの再オープン 2-397
疑問符 (?) パラメータへの値の代
入 2-397
構文 2-393
連結演算子の使用 4-35
OPERATIONAL 表型の作成 2-178
OR キーワード
条件セグメント 4-5, 4-20
ORDER BY キーワード
INSERT 文の制限 2-381
ORDER BY 列のインデック
ス 2-112
ORDER BY 節
SELECT 文 2-450, 2-485, 2-488
UNION 演算子 2-500
列
インデックス 2-490
選択番号 2-489
OUTPUT 文
構文 2-401
使用 2-401
O
P
OCTET_LENGTH 関数 4-70
OF キーワード
DECLARE 文 2-250
構文 2-241
OLD キーワード、REFERENCING
節 2-209, 2-210
ON キーワード
CREATE INDEX 文 2-106
GRANT 文 2-343
ON DELETE CASCADE キーワー
ド 2-50, 2-200
ON EXCEPTION 文
構文 3-34
位置 3-35
PAGE キーワード、CREATE
TABLE 文 2-65, 2-188
PDQ
SET PDQPRIORITY 文 2-569
PIPE キーワード、OUTPUT
文 2-402
POW 関数 4-55, 4-57
PRECISION フィールド
GET DESCRIPTOR 文 2-323
SET DESCRIPTOR 文 2-550
PREPARE 文
FREE 文を使用したリソースの解
放 2-316
SELECT 文に関する制限 2-406
索引 8 Informix Guide to SQL:Syntax
SQL 識別子のパラメータ化 2-410
位置指定子としての疑問符
(?) 2-404
構文 2-403
性能効率の向上 2-415
定義 2-540
複数文テキスト 2-295, 2-413,
2-415
文識別子の使用 2-404
文のパラメータ化 2-409
有効な文テキスト 2-406
連結演算子の使用 4-35
PREPARE 文で処理された文
DESCRIBE 文による戻り値の記
述 2-263
PREPARE 文で処理されるオブ
ジェクトの制限 2-404
コメント記号 2-406
パラメータ化 2-290
有効な文テキスト 2-406
実行 2-285
PREVIOUS キーワード、FETCH
文 2-304
PRIOR キーワード、FETCH
文 2-304
PRIVILEGES キーワード
INFO 文 2-370
GRANT 文 2-352
REVOKE 文 2-435
PROCEDURE カーソル
オープン 2-395
再オープン 2-397
PUBLIC キーワード
GRANT 文 2-343, 2-347
REVOKE 文 2-436
PUT 文
行値のソース 2-419
構文 2-417
トランザクションの中での使
用 2-418
トリガによる影響 2-201
連結演算子の使用 4-35
R
RAISE EXCEPTION 文、構文 3-39
RANGE 関数 4-104
RAW 表型の作成 2-177
READ COMMITTED キーワード
SET TRANSACTION 文 2-584
READ UNCOMMITTED キーワード
SET TRANSACTION 文 2-584
RECORDEND 環境変数 2-101, 2-498
RECORDEND キーワード
CREATE EXTERNAL TABLE
文 2-102, 2-499
REFERENCES アクセス権の定
義 2-354
REFERENCES キーワード
GRANT 文 2-352
REVOKE 文 2-435
REFERENCES 節
ALTER TABLE 文 2-47
CREATE TABLE 文 2-164
REFERENCING 節
CREATE TRIGGER 文 2-210
DELETE REFERENCING 節 2-208
INSERT REFERENCING 節 2-207
UPDATE REFERENCING 節 2-209
参照 2-214
REJECTFILE キーワード、
CREATE EXTERNAL TABLE
文 2-100, 2-102, 2-103
RELATIVE キーワード、FETCH
文 2-305
RENAME COLUMN 文
構文 2-425
制限 2-425
RENAME DATABASE 文
構文 2-427
RENAME TABLE 文
ANSI 標準準拠の命名 2-428
構文 2-428
REPEATABLE READ キーワード
SET ISOLATION 文 2-555
SET TRANSACTION 文 2-584
REPLACE 関数 4-89
RESOURCE アクセス権 2-346
CREATE SCHEMA 文 2-149
RESOURCE キーワード
REVOKE 文 2-439
RESTRICT キーワード、REVOKE
文 2-433, 2-434
RETURN 文
NULL 値を返す 3-41
返す値が不十分 3-41
構文 3-41
REVOKE 文
ALL キーワード 2-435
ALTER キーワード 2-435
DBA キーワード 2-439
DELETE キーワード 2-435
INDEX キーワード 2-435
INSERT キーワード 2-435
PRIVILEGES キーワード 2-435
PUBLIC キーワード 2-436
REFERENCES キーワード 2-435
RESOURCE キーワード 2-439
RESTRICT キーワード 2-434
SELECT キーワード 2-435
UPDATE キーワード 2-435
構文 2-431
システムカタログ表 2-435
データベースレベルのアクセス
権 2-439
必要なアクセス権 2-433
表レベルのアクセス権 2-435
列指定のアクセス権 2-438
ロールでの使用 2-433
REVOKE FRAGMENT 文
ALL キーワード 2-445
DELETE キーワード 2-445
INSERT キーワード 2-445
UPDATE キーワード 2-445
アクセス権の取消し 2-445
構文 2-443
ROLLBACK WORK 文
WHENEVER 文での使用 2-449
WHENEVER 文とともに使
用 2-67, 2-74
構文 2-448
ROOT 関数 4-55, 4-58
ROUND 関数 4-55, 4-58
ROW キーワード
CREATE TABLE 文 2-65, 2-188
ROWID キーワード 4-38
RPAD 関数 4-92
S
SAMEAS 節 2-94
SCALE フィールド
GET DESCRIPTOR 文 2-323
SET DESCRIPTOR 文 2-550
SCROLL キーワード
DECLARE 文 2-246
構文 2-241
SECOND キーワード
時間隔 (INTERVAL) 型 4-129
フィールド修飾子 4-135
日時 (DATETIME) 型 4-31
フィールド修飾子 4-132
SELECT カーソル
オープン 2-394
再オープン 2-397
使用 2-244
SELECT キーワード
GRANT 文 2-352
REVOKE 文 2-435
プロシジャ変数のあいまいな使
用 4-125
SELECT 文
BETWEEN 条件 2-473
DECLARE 文を使用 2-241
DESCRIBE 文による戻り値の記
述 2-262, 2-264, 2-265, 2-266
ESQL での INTO 節 2-461
FIRST 節 2-454
FOR EACH ROW のトリガ 2-206
FOR READ ONLY 節 2-492
FOR UPDATE 節 2-490
FOREACH 文で使用 3-23
FROM 節 2-466
GROUP BY 節 2-481
HAVING 節 2-483
IN 条件 2-473
INSERT 文 2-380
INTO キーワード 2-306
INTO 節の制限 2-406
INTO EXTERNAL 節 2-497
INTO SCRATCH 節 2-497
INTO TEMP 節 2-496
IS NULL 条件 2-473
LET 文で使用 3-32
LIKE 条件と MATCHES 条
件 2-474
ORDER BY 節 2-485
NULL 値 2-489
ROWID キーワード 4-38
SELECT 節 2-452
UNION 演算子 2-499
WHERE 節 2-471
表の結合 2-478
副問合せ 2-472
索引 9
WITH NO LOG キーワード 2-497
カーソル 2-490, 2-492
DECLARE 文を使用 2-244
外部結合 2-467
関係演算子条件 2-472
構文 2-450
式の使用 2-456
集計関数 4-96
ストアドプロシジャ 2-458
引数として使用 3-6
選択番号 2-489
単一 2-462
抽出した行の ASCII ファイルへ
の書込み 2-615
列の番号 2-489
SERIALIZABLE キーワード
SET TRANSACTION 文 2-584
SET キーワード
UPDATE 文
構文 2-622
使用 2-627
SET 節 2-214
SET AUTOFREE 文
関連する PREPARE 文で処理され
た文 2-503
切り離された PREPARE 文で処理
された文 2-503
構文と使用方法 2-502
SET CONNECTION 文
CURRENT キーワード 2-510
DEFAULT オプション 2-510
構文と使用方法 2-505
連結演算子の使用 4-35
SET Database Object Mode 文
CREATE TRIGGER 文 2-225
START VIOLATIONS TABLE 文
との関係 2-517, 2-596
一覧モードフォーマット 2-514
エラーオプション 2-516
構文 2-512
使用
違反表と共に 2-517
診断表と共に 2-517
データ操作文と共に 2-518
データ定義文と共に 2-524
表モードフォーマット 2-513
SET DATASKIP 文
構文 2-534
スキップされる場合 2-535
索引 10
SET DEBUG FILE TO 文
TRACE 文で使用 3-47
構文と使用 2-537
SET DEFERRED_PREPARE 文
構文 2-540
SET DESCRIPTOR 文
VALUE 節 2-548
X/Open モード 2-549
構文 2-547
連結演算子の使用 4-35
SET EXPLAIN 文
出力の解釈 2-553
SET ISOLATION 文
SET TRANSACTION 文との類
似 2-585
構文 2-555
デフォルトのデータベースレベ
ル 2-558
排他レベル
影響 2-558
定義 2-556
SET LOCK MODE 文
構文 2-560
待機期間の設定 2-561
SET LOG 文
構文 2-563
バッファ付きおよびバッファな
し 2-563
SET OPTIMIZATION 文
ALL_ROWS オプション 2-566
FIRST_ROWS オプション 2-566
HIGH オプション 2-566
LOW オプション 2-566
構文と使用 2-565
SET PDQPRIORITY 文
構文 2-569
SET PLOAD FILE 文
構文 2-573
SET Residency 文
構文 2-575
SET ROLE 文 2-578
SET SCHEDULE LEVEL 文
構文 2-580
SET SESSION AUTHORIZATION 文
構文 2-581
範囲 2-582
SET Transaction Mode 文
構文 2-590
SET TRANSACTION 文
Informix Guide to SQL:Syntax
SET ISOLATION 文との類
似 2-585
構文 2-584
デフォルトのデータベースレベ
ル 2-588
排他レベル
影響 2-589
定義 2-587
setnet32 2-83
SHARE キーワード、LOCK TABLE
文での構文 2-390
SIN 関数 4-79
SIZE キーワード、CREATE
EXTERNAL TABLE 文 2-102
SOME キーワード
条件式 4-18
副問合せの開始 2-477
SPL 文の説明 3-3
SQL
キーワード 4-113, A-1
SQL 通信領域 (SQLCA)
CLOSE 文実行後の結果 2-71
DATABASE 文実行後の結
果 2-237
DB 領域がスキップされた場合の
警告 2-534
DESCRIBE 文実行後の結果 2-263
EXECUTE 文 2-287
FETCH 文実行後の結果 2-310
FLUSH 文実行後の結果 2-313
OPEN 文実行後の結果 2-396
PUT 文実行後の結果 2-423
SELECT 文の実行後の結果 2-465
SQL 文
ANSI の機能拡張 1-13
ANSI 標準準拠 1-12
カテゴリ 1-9
コメント 1-6
sqlda 構造体
DESCRIBE 文 2-263, 2-264
EXECUTE 文 2-291
FETCH 文 2-309
OPEN文 2-288, 2-291, 2-394, 2-399,
2-418
PUT 文 2-421
SQLERROR キーワード、
WHENEVER 文 2-645, 2-648
sqlhosts ファイル 2-83
SQLNOTFOUND、EXECUTE 文に
おけるエラー状態 2-293
SQLSTATE 変数
警告 2-648
実行時エラー 2-648
見つからない条件 2-649
SQLWARNING キーワード、
WHENEVER 文 2-645, 2-648
SQRT 関数 4-55, 4-59
STANDARD 表型の作成 2-178
START VIOLATIONS TABLE 文
SET Database Object Mode 文との
関係 2-517, 2-596
開始と停止 2-596
構文 2-594
実行に必要なアクセス権 2-598
STATIC 表型の作成 2-177
STATUS キーワード、INFO
文 2-371
STDEV 関数 4-105
STOP キーワード、WHENEVER
文 2-645, 2-649
STOP VIOLATIONS TABLE 文
構文 2-613
実行に必要なアクセス権 2-614
説明 2-613
stores7 データベース 序 5
SUBSTRING 関数 4-89, 4-91, 4-92
SUM 関数 4-96, 4-104
syscolauth システムカタログ
表 2-435
sysdepend システムカタログ
表 2-283
systabauth システムカタログ
表 2-435
SYSTEM 文
環境変数の設定 3-45
構文 3-44
T
TABLE キーワード、UPDATE
STATISTICS の構文 2-634
TABLES キーワード、INFO
文 2-369
TAN 関数 4-79
TO キーワード
GRANT 文 2-343
式 4-96
TO CLUSTER キーワード
ALTER INDEX 文 2-34
TO_CHAR 関数 4-77
TO_DATE 関数 4-78
TODAY 関数
ALTER TABLE 文 2-43
INSERT 文 2-377, 2-379
式 4-47, 4-51
条件セグメント 4-6
デフォルト値として使用 2-162
TRACE 文
構文 3-47
TRIM 関数 4-83
TRUNC 関数 4-55, 4-59
TYPE フィールド
X/Open プログラム 2-322
設定 2-549
SET DESCRIPTOR 文での設
定 2-548
U
UNION 演算子
SELECT 文 2-450, 2-499
使用の制限 2-500
UNIQUE キーワード
CREATE INDEX 文 2-108
SELECT 文 2-452, 2-456
集計式 4-96
制約の定義 2-175
副問合せ 4-16
UNITS キーワード 4-47, 4-53
UNLOAD 文
DELIMITER 節 2-618
UNLOAD TO ファイル 2-616
可変長文字 (VARCHAR) 型列、
テキスト (TEXT) 型列、バイ
ト (BYTE) 型列 2-617
構文 2-615
UNLOAD TO ファイル 2-616
UNLOCK TABLE 文
構文と使用方法 2-620
UPDATE カーソル 2-249
UPDATE 文での使用 2-632
オープン 2-394
制限される文 2-252
ロック 2-249
UPDATE キーワード
GRANT 文 2-352
REVOKE 文 2-435
REVOKE FRAGMENT 文 2-445
UPDATE 節
CREATE TRIGGER 文 2-202
UPDATE 文
FETCH 文 2-309
SELECT 文の FOR FOR UPDATE
節を使用 2-491
SET キーワードの使用 2-627
UPDATE カーソル 2-249
WHERE キーワードの使用 2-631
WHERE CURRENT OF キーワー
ドの使用 2-632
カーソルによる更新 2-632
更新する列の制限 2-250
更新のロールバック 2-626
構文 2-623
式の使用 2-630
トランザクション 2-625
トリガ 2-200, 2-202, 2-212
ビューによる更新 2-624
列の NULL 値への更新 2-629
列の 2 回の更新 2-631
ロックに関する検討事項 2-626
UPDATE STATISTICS 文
一時表 2-643
インデックスページの検査 2-637
検索ストラテジの最適化 2-636
構文 2-634
使用
LOW キーワード 2-639
データベースサーバのアップグ
レード時 2-638
表の修正後 2-637
データ分布
削除 2-639
作成 2-640
分布のみの指定 2-643
USER 関数
ALTER TABLE 文 2-43
ANSI 標準準拠 4-50
影響 2-433
INSERT 文 2-377, 2-379
式 4-47, 4-49
条件セグメント 4-6
デフォルト値として使用 2-162
USING キーワード
索引
11
EXECUTE 文 2-290
OPEN 文 2-393, 2-397
USING BITMAP キーワード、
CREATE INDEX 文 2-107
USING DESCRIPTOR キーワード
DESCRIBE 文 2-264, 2-265
EXECUTE 文の構文 2-290
FETCH 文 2-309
OPEN 文 2-393, 2-399
PUT 文 2-292, 2-421, 2-422
USING SQL DESCRIPTOR キーワー
ド
EXECUTE 文 2-292
USING キーワード
EXECUTE 文 2-290
V
VALUE 節
FETCH 文との関係 2-323
GET DESCRIPTOR 文 2-322
NULL 値の抽出 2-323
SET DESCRIPTOR 文 2-548
VALUES 節
INSERT 文 2-372, 2-377
PUT 文による影響 2-420
VARIANCE 関数 4-106
W
WAIT キーワード
SET LOCK MODE 文 2-561
WEEKDAY 関数 4-71, 4-74
WHEN 条件、トリガアクショ
ン 2-211
WHENEVER 文
CALL キーワード 2-645
構文と使用方法 2-645
連結演算子の使用 4-35
WHERE キーワード
DELETE 文 2-258, 2-260
SELECT 文 2-471
UPDATE 文 2-622, 2-631
項目記述子の設定 2-544
WHERE 節
ALL キーワード 2-477
ANY キーワード 2-477
BETWEEN キーワード 2-473
索引 12
IN キーワード 2-473
IS キーワード 2-473
SELECT 文 2-450
SOME キーワード 2-477
関係演算子 2-472
表の結合 2-478
副問合せ 2-471, 2-472
WHERE CURRENT OF キーワード
UPDATE 文 2-622, 2-632
トリガによる影響 2-201
WHILE キーワード
CONTINUE 文 3-7
EXIT 文 3-16
WHILE 文
構文 3-50
NULL 値条件 3-50
WITH APPEND キーワード
SET DEBUG FILE TO 文 2-537
WITH BUFFERED LOG キーワー
ド、CREATE DATABASE
文 2-89
WITH CHECK キーワード、
CREATE VIEW 文 2-230, 2-234
WITH CRCOLS キーワード、
CREATE TABLE 文 2-178
WITH GRANT キーワード、
GRANT 文の構文 2-343
WITH GRANT OPTION キーワード
GRANT 文 2-356
REVOKE 文 2-433
WITH HOLD キーワード
DECLARE 文 2-241, 2-247, 2-257
WITH LOG MODE ANSI キーワー
ド、CREATE DATABASE
文 2-90
WITH NO CHECK OPTION、
ALTER FRAGMENT 文で使
用 2-14
WITH NO LOG キーワード
CREATE TABLE 文 2-191
SELECT 文 2-496, 2-497
WITH RESUME キーワード、
RETURN 文 3-42
WITHOUT HEADINGS キーワード、
OUTPUT 文 2-402
Informix Guide to SQL:Syntax
X
X/Open 標準準拠
レベル 序 20
X/Open モード
FETCH 文 2-303
SET DESCRIPTOR 文 2-549
Y
YEAR 関数 4-71, 4-75
YEAR キーワード
時間隔 (INTERVAL) 型 4-129,
4-135
日時 (DATETIME) 型セグメン
ト 4-132
日時 (DATETIME) 型 4-31
あ
アイコン
機能 序 10
構文ダイヤグラム 序 13
コメント 序 9
準拠 序 11
製品 序 10
プラットフォーム 序 10
アクション節、CREATE TRIGGER
文 2-204, 2-210
アクセス権
CONNECT 2-346
CREATE TABLE 文を使用する表
に対するデフォルト 2-156
DBA 2-347
GRANT 文で定義 2-352
GRANT 文を使用した付与 2-342
RESOURCE 2-346
REVOKE 文による取消し 2-431,
2-432
アクセス権が競合する場合 2-344
インデックスの削除に必要 2-273
シノニム 2-151
トリガアクション 2-222
ビュー 2-231
ビューの作成に必要 2-358
表を断片化する場合 2-359
フラグメントレベル
GRANT FRAGMENT 文による
付与 2-359
継続期間 2-363
コマンド妥当性検査での役
割 2-362
定義 2-361
取消し 2-443
列指定の取消し 2-438
ロールの付与 2-348
アクティブセット
OPEN 文による構築 2-394, 2-395
アスタリスク (*)
SELECT 文で使用 2-453
算術演算子 4-33
ワイルドカード文字として使
用 4-13
アップグレード
新しいデータベースサーバ 2-638
データベースサーバ 2-638
アプリケーション
コメント 1-7
スレッド保護 2-269
単一スレッド 2-508
マルチスレッド 2-508, 2-510
アンダスコア (_)、ワイルドカード
文字として使用 4-12
い
一意性制約
削除 2-64
使用規則 2-166, 2-175
一時表
DBSPACETEMP 環境変数 2-193
SELECT 文 INTO TEMP 節を使用
して作成 2-496
格納 2-192
削除されるとき 2-192
制約の作成 2-195
断片化 2-191
統計情報の更新 2-636
分布の作成 2-643
命名 2-192
列の定義 2-194
一覧モードフォーマット、SET
Database Object Mode 文 2-514
一般化キーインデックス
SELECT 節 2-120
WHERE 節 2-122
説明 2-119
違反表
SET Database Object Mode 文と共
に使用 2-517
START VIOLATIONS TABLE 文
での作成 2-594
アクセス権 2-600
起動する時期 2-517
構造 2-598
削除の制限 2-281
診断表との関係 2-599
ターゲット表との関係 2-599
停止方法 2-613
例 2-520, 2-526, 2-603, 2-606, 2-614
インデックス
ALTER FRAGMENT 文
ATTACH 節の影響 2-13
CREATE INDEX 文での作
成 2-106
DROP INDEX 文で削除 2-273
ORDER BY 節 2-112, 2-490
アップグレード中の変換 2-634,
2-638
一意
制限 2-27
一意性 2-131
重複値が存在する場合の追
加 2-524
一意性制約および参照制約 2-109
同じ列で使用可能な数 2-117
オフモード 2-132
拡大 2-123
クラスタ化されたフラグメン
ト 2-109
情報の表示 2-370
制約による共有 2-158
双方向移動 2-111
断片化された表 2-109
重複 2-108
名前の指定 4-25
複合 2-110
フラグメントの作成 2-125
分離 2-118
変更されたフラグメントの影
響 2-18
メモリに存在 2-575
連結、定義 2-118
引用符 4-114
所有者名 4-154
単一
引用符付き文字列 4-157
引用符付き文字列の周り 4-156
二重
引用符付き文字列 4-157
引用符付き文字列の周り 4-156
区切り識別子 4-117
引用符付き文字列
INSERT 文 2-377
LIKE キーワード 2-474
LIKE と MATCHES 4-158
値の挿入 4-159
式 4-47, 4-49
条件セグメント 4-6
セグメント 4-156
日時 (DATETIME) 型と時間隔
(INTERVAL) 型 4-158
え
エクステント
ALTER TABLE 文での変更 2-64
サイズの変更 2-65
エラーの検査
ON EXCEPTION 文でのエラーの
状態 3-35
SYSTEM 文 3-45
WHENEVER 文の使用 2-648
ストアドプロシジャでのエラー後
も続行 3-38
エラーメッセージファイル 序 17
円記号 (¥)
エスケープ文字 4-13
ワイルドカード文字として使
用 4-12, 4-13
お
大文字小文字変換関数 4-93
オプティマイザ
SET OPTIMIZATION 文 2-565
UPDATE STATISTICS 文 2-636
オプティマイザ ディレクティブ
セグメント 4-140
親子関係 2-49, 2-166
オンラインマニュアル 序 16
索引
13
か
カーソル
FETCH 文で抽出する値 2-301
OPEN 文による起動 2-393
PREPARE 文で処理された文
関連付け 2-254
使用 2-244
ROLLBACK WORK 文によるク
ローズ 2-448
SELECT 文の INTO キーワー
ド 2-463
SET AUTOFREE 文を使用した自
動的な解放 2-502
UPDATE 2-245, 2-249
ANSI 標準準拠でないデータ
ベースでの使用 2-253
ANSI 標準準拠のデータベース
での使用 2-253
制限される文 2-252
オープン 2-394, 2-395
クローズ 2-70
最適化文 1-10
順 2-246
スクロール 2-246
宣言 2-241
操作文 1-10
特性 2-246
トランザクションとともに使
用 2-255
トランザクションの終了により影
響を受ける 2-72
プログラム操作の順序 2-244
文、トリガイベント 2-201
読込み専用 2-245, 2-251
ANSI 標準準拠でないデータ
ベースでの使用 2-253
ANSI 標準準拠のデータベース
での使用 2-253
制限される文 2-252
カーソル安全性排他レベル 2-557
カーソルプロシジャ 2-138, 3-25
外部キー 2-166, 2-177
外部表
NULL 値 2-95
SELECT 文 2-497
作成 2-92
整数データ型 2-94
拡張機能、SQL に対する
索引 14
記号 序 11, 序 13
確定読込み排他レベル 2-556, 2-587
格納オプション、CREATE INDEX
文 2-122
加算 (+) 記号、算術演算子 4-33
カスケード削除
関連するロック 2-170
構文 2-50, 2-164
制限 2-170, 2-51
定義 2-50, 2-169
複数の子表 2-169
ログ機能 2-170
ロック機能 2-51
カスケードトリガ
関連名の範囲 2-214
最大数 2-224
説明 2-224
トリガアクション 2-206
トリガ表 2-225
トリガ表との関係 2-220
各国語可変長文字 (NVARCHAR)
型
関係演算子 4-161
構文 4-28
各国語文字 (NCHAR) 型
関係演算子 4-161
合併される表 2-12
可変長文字 (VARCHAR) 型
LOAD 文 2-387
UNLOAD 文 2-617
構文 4-28
デフォルト値として使用 2-161
より大きい 4-161
可変文字 (CHARACTER
VARYING) 型
構文 4-30
カレット (^)
大かっこでの使用 4-13
ワイルドカード文字として使
用 4-13
環境変数、SYSTEM 文での設
定 3-45
関係演算子
SELECT 文の WHERE キーワー
ド 2-472
条件セグメント 4-6
セグメント 4-160
関数式
CHARACTER_LENGTH 関数 4-70
Informix Guide to SQL:Syntax
DBINFO 関数 4-60
HEX 関数 4-54
LENGTH 関数 4-54
OCTET_LENGTH 関数 4-70
SELECT 文 2-458
TRIM 関数 4-54
三角関数 4-54
時刻関数 4-54
指数関数と対数関数 4-54
説明 4-54
代数関数 4-54, 4-55
長さ関数 4-69
関連名
COUNT DISTINCT 節 2-214
GROUP BY 節 2-214
SET 節 2-214
値の表 2-216
規則 2-214
旧 2-210
使用 2-214
新 2-210
ストアドプロシジャ 2-214, 2-222
範囲 2-214
き
キーワード
SQL 4-113, A-1
トリガアクションでの使用 2-213
記述子 2-264
規則
任意 2-127
範囲 2-127
表の命名 2-156
機能アイコン 序 10
機能、製品 序 5
疑問符 (?)
USING キーワードによる置
換 2-397
PREPARE 文の位置指定子 2-404,
2-421
ワイルドカード文字として使
用 4-13
行
FETCH 文で抽出 2-305
FLUSH 文を使用したバッファに
蓄積された行の書込み 2-312
格納場所の検索 4-38
行 ID 2-305
削除 2-258
順序、独立性の保証 2-206
挿入
カーソルによる 2-375
ビューによる 2-374
ビューによる更新 2-624
幻 2-556, 2-587
ロックがかけられている行に対す
るエンジンの応答 2-561
行 ID
ALTER TABLE での追加 2-40
INT 節による追加 2-26
断片化された表からの削除 2-40
列式での使用 4-38
列名として使用 4-121
断片化された表 2-26
業界標準への準拠 序 20
金額 (MONEY) 型
構文 4-27
デフォルト値として使用 2-161
く
区切り記号
LOAD 文入力ファイル 2-388
UNLOAD 文での指定 2-618
区切り識別子
構文 4-114
クラスタ化されたインデックス
ALTER INDEX 文 2-34
CREATE INDEX 文 2-109
繰返し読込み排他レベル
説明 2-557, 2-587
け
警告、DB 領域がスキップされた場
合 2-534
結合
2 表結合 2-479
外部結合 2-467, 2-480
条件セグメント 2-478
セルフ結合 2-480
複数表結合 2-479
結合キー問合せ 2-121
幻行 2-556, 2-587
現行データベース
DATABASE 文による指定 2-236
検査制約
説明 2-97, 2-171
データのアンロード 2-103
リジェクトファイル 2-103
減算 (-) 記号、算術演算子 4-33
こ
広域環境の定義
3-10
広域言語サポート (GLS) 序 4
更新アクセス権、ビューに対す
る 2-624
更新可能なビュー 2-235
更新トリガ
複数定義 2-203
構文の表記
使用されるアイコン 序 13
ダイヤグラムの例 序 14
要素 序 12
読み方 序 14
項目記述子
定義 2-7
小桁整数型 (SMALLINT) 型
デフォルト値として使用 2-161
コマンドファイル
コメントシンボル 1-7
定義 1-7
コメントアイコン 序 9
コメントシンボル
PREPARE 文で処理された
文 2-406
SQL API 1-7
アプリケーションプログラム 1-7
コマンドファイル 1-7
ストアドプロシジャ 1-7
中かっこ ({}) 1-6
二重ハイフン(--) 1-6
入力方法 1-6
例 1-7
さ
最適化
高レベルまたは低レベルの指
定 2-565
サーバ 2-565
データベースサーバ 2-565
問合せ 2-552
ネットワーク 2-567
サブスクリプト
副文字列 2-487
文字型列での使用 4-37
列式での使用 4-37
三角関数
ACOS 関数 4-81
ASIN 関数 4-81
ATAN 関数 4-81
ATAN2 関数 4-81
COS 関数 4-80
SIN 関数 4-80
TAN 関数 4-80
参考文献 序 19
算術演算子 4-33
参照制約
DELETE 文によるトリガ 2-200
削除 2-64
実行 2-158
使用規則 2-166
説明 2-49
データ型の制限 2-167
サンプルコードの表記 序 15
残余、断片化する式 2-30
し
時間隔 (INTERVAL) 型
構文 4-27, 4-135
式 4-53
条件より大きい 4-161
デフォルト値として使用 2-161
フィールド修飾子、構文 4-129
式セグメント
SPL 式 4-110
UPDATE 文 2-629
関数式 4-54
構文 4-33
式との組合せ 4-109
集計式 4-96
ソート 2-489
定数式 4-47
列式 4-35
式の計算
GROUP BY 節による制限 2-482
索引
15
式ベースの分散スキーム、
CREATE INDEX 文 2-125
識別子セグメント
大文字 4-113
カーソル名 4-124, 4-127
キーワードを列名として使
用 4-119
区切り識別子 4-114
構文 4-112
ストアドプロシジャ 4-124
非 ASCII 文字 4-114, 4-116
表名 4-121, 4-123
変数名 4-126
マルチバイト文字 4-114, 4-116
列名 4-122
時刻関数
GROUP BY 節による制限 2-482
SELECT 文 2-458
指数関数 4-67
システムカタログ表
syscolauth 2-435
systabauth 2-357, 2-435
データベース入力 2-89
表の削除 2-281
システム記述子領域
EXECUTE 文 2-292
値の割当て 2-544
項目記述子 2-7
使用 2-264
内容の変更 2-547
割当て 2-548
システム名、データベース名
の 4-23
実行の順序
アクション文 2-212
実数 (FLOAT) 型
構文 4-27
デフォルト値として使用 2-161
シノニム
ANSI 標準準拠の命名 2-152
CREATE SYNONYM 文での作
成 2-151
削除 2-277
名前の指定 4-25
別名との違い 2-151
連鎖 2-153
集計関数
ALL キーワード 4-96
AVG 関数 4-96
索引 16
COUNT 関数 4-96
DISTINCT キーワード 4-96
ESQL 4-109
EXISTS 副問合せ 4-17
GROUP BY 節 2-481, 2-482
MAX 関数 4-96
MIN 関数 4-96
RANGE 関数 4-104
SELECT 文 2-458
STDEV 関数 4-105
SUM 関数 4-96
UNIQUE キーワード 4-96
VARIANCE 関数 4-106
式 2-458
動作のまとめ 4-107
修飾子、フィールド
時間隔 (INTERVAL) 型 4-129,
4-135
日時 (DATETIME) 型 4-31, 4-132
主キー制約 2-49
削除 2-64
参照 2-49
実行 2-158
使用規則 2-166
条件 2-176
データ型変換 2-58
要件 2-44
列の定義 2-176
10 進数 (DECIMAL)型
デフォルト値として使用 2-161
順カーソル
FETCH 文 2-304
使用方法 2-246
定義 2-246
準拠
アイコン 序 11
業界標準 序 20
小桁実数 (SMALLFLOAT) 型
構文 4-27
小桁整数 (SMALLINT) 型
構文 4-27
条件セグメント
ESCAPE 節 4-14
NULL 値 4-6
SELECT 文の副問合せ 4-15
関係演算子 4-9
関数の使用 4-6
キーワード
ALL 4-18
Informix Guide to SQL:Syntax
ANY 4-18
BETWEEN 4-10
EXISTS 4-17
IN 4-11
IS NOT NULL 4-11
IS NULL 4-11
MATCHES 4-11
NOT 4-12
SOME 4-18
検索でのワイルドカード 4-12
構文 4-5
条件の結合 2-478
説明 4-5
比較条件 4-6
ブール式 4-6
照合
関係演算子 4-161
乗算 (*) 記号、算術演算子 4-33
状態、INFO 文で表示 2-371
使用方法
関連名 2-214
除算 (/) 記号、算術演算子 4-33
所有者
ALTER TABLE 文 2-38, 2-62
ANSI 標準準拠のデータベー
ス 4-153
CREATE SYNONYM 文 2-152
RENAME COLUMN 文 2-425
RENAME TABLE 文 2-428
大文字と小文字の区別 4-154
オブジェクト名セグメント 4-25,
4-140, 4-144, 4-148, 4-151
システムカタログ表 2-63
所有者名セグメント 4-153
データベースオブジェクト名セグ
メント 4-153
所有者アクセス権付きプロシ
ジャ 2-135
所有者名セグメント 4-153
シリアル (SERIAL) 型
INSERT 文 2-379
値のリセット 2-58
構文 4-27
シリアル列
ハッシュで断片化に使用 2-186
非順次番号 2-186
診断表
SET Database Object Mode 文と共
に使用 2-517
START VIOLATIONS TABLE 文
での作成 2-594
アクセス権 2-607
違反表との関係 2-599
起動する時期 2-517
構造 2-606
削除の制限 2-281
ターゲット表との関係 2-599
停止方法 2-613
例 2-526, 2-610, 2-612, 2-614
す
据置き PREPARE 機能
SET DEFERRED_PREPARE
文 2-540
スクラッチ表 2-191, 2-497
スクロールカーソル
FETCH 文 2-304
使用方法 2-246
定義 2-246
ストアドプロシジャ
BEGIN-END ブロック 2-143
DBA アクセス権付き
作成方法 2-135
トリガと併用 2-223
SELECT 文 2-458
データの受取り 2-461
TRACE 文の出力ファイル 2-537
アクセス権 2-223
取消し 2-433
アクセス権の付与 2-348
エラーの擬似的発生 3-39
オペレーティングシステムのコマ
ンドを実行 3-44
カーソル 2-138, 3-25
使用 3-24
規則 2-222
コメント 1-7, 2-139
参照の検査 2-222
所有者アクセス権付き 2-135,
2-223
説明 3-3
デバッグ 3-47
トランザクション 2-143
トリガアクション 2-212, 2-222
バイト (BYTE) 型およびテキスト
(TEXT) 型 3-15
非カーソル 2-138
複数行の処理 3-42
ヘッダ 3-9
マニュアルの表示 2-139
メールの送信 3-45
戻り値に関する制限 2-139
スレッド
定義 2-508
マルチスレッドアプリケーショ
ン 2-508
スレッド保護アプリケーション
説明 2-269
せ
整数 (INTEGER) 型
構文 4-27
整数、外部表 2-94
製品アイコン 序 10
制約
ALTER TABLE 文
削除 2-63
追加 2-59, 2-60, 2-61, 2-524
変更 2-158
DROP INDEX 文 2-273
確認 2-225
許容される列数 2-157
実行 2-158
制約のある列の変更 2-56
設定 2-590
追加するときに必要なアクセス
権 2-62
定義 2-156
トランザクションモード 2-590
名前の指定 4-25
表からの列の削除が与える影
響 2-54
整数 (INTEGER) 型
デフォルト値として使用 2-161
セグメント
SPL 文との関係 4-3
SQL 文との関係 4-3
説明 4-3
セッションコントロールブロック
DBINFO 関数によるアクセ
ス 4-63
定義 4-63
セッション識別子
DBINFO 関数によって返され
る 4-63
接続
DEFAULT 2-510
暗黙的 2-80, 2-268, 2-510
休止状態 2-268
現行 2-78, 2-269, 2-510
コンテキスト 2-79, 2-268, 2-507
識別子 2-79
待機 2-78
停止状態 2-506
デフォルト 2-80, 2-268
接続アクセス権
取消し 2-439
セルフ結合
説明 2-480
そ
相関副問合せの説明 4-15
増進可能なロック 2-249
挿入バッファ
カーソルによる行の挿入 2-375
挿入された行のカウント 2-314
ソート
SELECT 文 2-485
結合された問合せ 2-500
ゾーン 10 進数、外部表 2-94
ソフトウェアの要件 序 4
存在する表 2-12
た
ターゲット表
違反表との関係 2-599
診断表との関係 2-599
大かっこ [...]
ワイルドカード文字として使
用 4-13
対数関数
LOG10 関数 4-67, 4-68
LOGN 関数 4-67, 4-68
代数関数
ABS 関数 4-57
MOD 関数 4-57
POW 関数 4-57
ROOT 関数 4-58
ROUND 関数 4-58
索引
17
SQRT 関数 4-59
TRUNC 関数 4-59
構文 4-55
多重ソート
SELECT 文 2-489
他の表からの表の分離 2-179, 2-183
単一 SELECT 文 2-462
単一スレッドアプリケーショ
ン 2-508
単純代入、SPL 3-32
単純読込みの排他レベル 2-556
断片化
CREATE TABLE 文による行 ID
の追加 2-179
新しいストラテジの定義 2-11
一時表 2-191
インデックス 2-125
変更 2-33
既存の断片化する式の変更 2-31
既存のフラグメントの削除 2-30
行 ID 2-26
削除 2-40
追加 2-40
行領域 2-11
残余フラグメント 2-30
システム定義のハッシュ分散ス
キーム 2-184
使用できない DB 領域のスキッ
プ 2-534
ストラテジ
再初期化 2-26
式 2-184
範囲規則 2-184
ラウンドロビン方式 2-183
断片化されていない表に変
換 2-25
断片化する式 2-17
テキスト (TEXT) 型とバイト
(BYTE) 型 2-18
任意の規則 2-184
表 2-181
表の結合 2-11
フラグメント
切離し 2-19
追加 2-28
変更 2-8
ログ / ディスク領域が足りない場
合 2-10
索引 18
ち
中かっこ ({})コメントシンボ
ル 1-6
重複値
問合せ 2-456
直列化可能排他レベル
説明 2-587
て
定数項
デフォルト値として使用 2-161
定数式
GROUP BY 節による制限 2-482
PUT 文を使用した挿入 2-419
SELECT 文 2-457
構文 4-47
データ
LOAD 文を使用して挿入 2-383
アクセス文 1-10
整合性文 1-11
操作文 1-10
定義文 1-9
データ型
ALTER TABLE 文による変更 2-58
CREATE VIEW 文による指
定 2-231
INSERT 文
考慮事項 2-378
制約 4-159
構文 4-27
参照制約の条件 2-49, 2-167
ロードされた値のフォーマッ
ト 2-385
データスキップ
使用できない DB 領域のスキッ
プ 2-534
データ分布
RESOLUTION 2-640, 2-643
一時表 2-643
確信値 2-643
データベース
CLOSE DATABASE 文によるク
ローズ 2-73
CREATE DATABASE 文による作
成 2-89
遠隔 4-23
Informix Guide to SQL:Syntax
削除 2-271
デフォルトの排他レベル 2-558,
2-588
問合せの最適化 2-636
名前の変更 2-427
排他モードでのオープン 2-237
変数で命名 4-24
命名規則 4-23
ロック 2-237
データベースオブジェクト
所有者の命名 4-153
命名 4-25
データベースオブジェクト名セグ
メント 4-25
データベースオブジェクトモード
SET Database Object Mode 文 2-515
使用
データ操作文と共に 2-518
データ定義文と共に 2-524
トリガ 2-228
必要なアクセス権 2-512
フィルタ
エラーオプション 2-516
定義 2-519
利点 2-532
無効
定義 2-519
利点 2-531
有効
定義 2-519
利点 2-532
例 2-520, 2-526
データベース管理者 (DBA) 2-347
データベース名セグメント
遠隔データベース 4-23
構文 4-22
変数で命名 4-24
命名規則 4-22
データベースレベルのアクセス権
説明 2-345
取消し 2-439
付与 2-345
付与権の付与 2-356
データレプリケーション 2-40
テキスト (TEXT) 型
LOAD 文 2-387
格納 2-180
構文 4-27, 4-28
ストアドプロシジャで使用 3-9,
3-15
UNLOAD 文 2-617
デッドロックの検出 2-561
デフォルト値
ALTER TABLE 文 2-43
CREATE TABLE 文による指
定 2-160
デフォルトロケール 序 4
デモンストレーションデータベー
ス序5
と
問合せ
オプティマイザ ディレクティブ
による最適化 4-140
オペレーティングシステムファイ
ルへの結果の送信 2-402
スケジューリングレベル 2-580
他のプログラムへの結果
送信 2-402
引渡し 2-402
動的管理文 1-10
ドキュメントノート 序 18
プログラム項目 序 19
トランザクション
カーソルの使用 2-255
現行の接続 2-81
ストアドプロシジャ 2-143
説明 2-69
データ操作文による例 2-69
トランザクション モード、制
約 2-590
トリガ
ALTER FRAGMENT 文
ATTACH 節の影響 2-13
関連名 2-215
クライアント / サーバ環境 2-226
使用者を制限しない 2-223
データベースオブジェクトモード
設定 2-512
名前の指定 4-25
表からの列の削除が与える影
響 2-55
表に対する数 2-200
変更されたフラグメントに影
響 2-19
無効になることの回避 2-226
トリガアクション
WHEN 条件 2-211
アクション文 2-212
カスケード 2-206
関連名 2-222
構文の並び 2-211
順序 2-204
トリガ表に対するアクショ
ン 2-217
複数のトリガ 2-205
マージ 2-205
トリガイベント
CREATE TRIGGER 文 2-200
アクセス権 2-201
カーソル 2-201
定義 2-200
トリガ表
アクション 2-217
カスケードトリガ 2-225
トリガ文
UPDATE 文 2-203
同じ結果を返す 2-200
実行 2-201
複数行への影響 2-206
矛盾しない結果 2-212
な
長さ関数 2-458, 4-69
に
二重ハイフン (--) コメントシンボ
ル 1-6
日時 (DATETIME) 型
構文 4-27, 4-132
式 4-52
条件より大きい 4-161
デフォルト値として使用 2-161
フィールド修飾子 4-31
任意の規則 2-127
は
パーセント記号 (%)、ワイルドカー
ド文字として使用 4-12
排他レベル
FETCH 文 2-309
カーソル安定性 2-557
外部表 2-558, 2-584
確定読込み 2-556, 2-587
繰返し読込み 2-557, 2-587
更新中の場合 2-310
単純読込み 2-556
直列化可能 2-587
定義 2-556, 2-587
不確定読込み 2-587
バイト (BYTE) 型
LOAD 文 2-387
UNLOAD 文 2-617
格納 2-180
構文 4-27, 4-28
ストアドプロシジャでの使用 3-9,
3-15
バイト (BYTE) 型とテキスト
(TEXT) 型
CREATE TABLE 文 2-180
抽出中の排他レベルの影響 2-558,
2-589
パイプ文字 2-100, 2-498
配列
FETCH 文への行の移動 2-307
パック 10 進数、外部表 2-94
バックスラッシュ ( \ )
エスケープ文字 4-13
ワイルドカード文字として使
用 4-12, 4-13
パラメータ
CALL 文 3-5
SPL のバイト (BYTE) 型またはテ
キスト (TEXT) 型 3-15
ストアドプロシジャ 2-136
パラメータ化
PREPARE 文で処理された
文 2-290
定義 2-290
範囲規則 2-127
ひ
非カーソルプロシジャ 2-138
比較条件、構文と使用方法 4-6
光ディスクサブシステム文 1-11
日付 (DATE) 型
索引
19
関数 4-71
式での使用 4-73
式の構文 4-71
構文 4-27
条件より大きい 4-161
デフォルト値として使用 2-161
ビュー
GRANT 文によるアクセス
権 2-358
アスタリスク (*) を使用した
SELECT 節 2-231
更新 2-624
更新可能 2-235
削除 2-283
作成 2-230
シノニムの作成 2-151
名前の指定 4-25
ユニオン 2-232
列の削除が与える影響 2-55
表
LOAD 文を使用してデータを
ロード 2-383
一時 2-190, 2-496
一時表の定義 2-194
違反 2-598
外部 2-92, 2-497
型 2-177
合併 2-12
削除 2-279
システムカタログ表の削除 2-281
シノニム
削除 2-277
作成 2-151
条件セグメントで結合 2-478
診断 2-606
スクラッチ 2-191, 2-497
制約の追加 2-59, 2-60, 2-61
存在 2-12
ターゲット 2-599
問合せの最適化 2-636
名前の指定 4-25
フラグメンテーションストラテジ
の定義 2-181
命名規則 2-156
メモリに存在 2-575
ログ機能 2-191
ロック
ALTER INDEX 文 2-35
モードの変更 2-65
索引 20
ロックがかけられている表に対す
るエンジンの応答 2-561
ロックの解除 2-620
表記上のきまり
アイコン 序 9
サンプルコード 序 15
文字 序 8
標識変数
SELECT 文 2-463, 2-464, 2-465
式 4-109
表示ラベル
CREATE VIEW 文 2-231
SELECT 文 2-452, 2-460
表名
SELECT 文での別名 2-466
表モードフォーマット、SET
Database Object Mode 文 2-513
表レベル制約
ALTER TABLE 文 2-61
表レベルのアクセス権
GRANT 文、デフォルト 2-355
取消し 2-435
付与 2-352
付与権の付与 2-356
ふ
ファイル
OUTPUT 文による出力の送
信 2-402
フィールド修飾子
時間隔 (INTERVAL) 型 4-129,
4-135
日時 (DATETIME) 型 4-31
フィルタデータベースオブジェク
トモード
定義 2-519
利点 2-532
ブール式 4-5
不確定読込み排他レベル 2-587
複合代入 3-32
複数行の問合せ、戻り値の格納場
所 2-306
複数のトリガ
実行の順番 2-203
無効になることの回避 2-226
例 2-203
列番号 2-203
Informix Guide to SQL:Syntax
副問合せ
ALL、ANY、SOME キーワー
ド 2-477
DISTINCT キーワード 2-456
EXISTS キーワードで開始 2-476
IN キーワードで開始 2-476
UNION 演算子での制限 2-500
条件セグメント 4-15
相関 4-15
定義 2-472
副文字列
SELECT 文の ORDER BY 節 2-487
フラグメントレベルのアクセス権
GRANT FRAGMENT 文による付
与 2-359
取消し 2-443, 2-445
プラットフォームアイコン 序 10
プログラムグループ
ドキュメントノート 序 19
プロシジャ名、指定 4-25
文、SQL
ANSI 標準準拠 1-12
ANSI 標準からみた拡張機能 1-13
カテゴリ 1-9
入力方法 1-3
文識別子
DECLARE 文 2-241, 2-254
FREE 文 2-315, 2-316
カーソルとの関連付け 2-244
解放 2-405
PREPARE 文 2-404
定義 2-404
分析
UPDATE STATISTICS 文 2-640,
2-643
データ分布 2-640
文のパラメータ化、SQL 識別
子 2-410
分布
DROP DISTRIBUTIONS 節による
データの削除 2-639
MEDIUM キーワードの使用 2-642
作成に必要なアクセス権 2-640
分離インデックス 2-118
へ
並行度
SET ISOLATION 文 2-555
SET TRANSACTION 文 2-588
カーソル安定性排他レベル 2-557
確定読込み排他レベル 2-556,
2-587
繰返し読込み排他レベル 2-557,
2-587
単純読込み排他レベル 2-556
直列化可能排他レベル 2-587
不確定読込み排他レベル 2-587
並列に分散した問合せ
SET PRIORITY 文 2-569
ペーパーマニュアル 序 17
別名
GROUP BY 節 2-485
SELECT 文での表 2-467
変数
IF 文の UNKNOWN( 未知 )
値 3-28
SPL での定義 3-8
SPL のデフォルト値 3-12, 3-14
SPL 変数の有効範囲 3-9
広域、SPL 3-10
ロケール、SPL 3-14
ま
マシンノート 序 18
マニュアルの種類
エラーメッセージファイル 序 17
オンラインマニュアル 序 16
参考文献 序 19
ドキュメントノート 序 18
ペーパーマニュアル 序 17
マシンノート 序 18
リリースノート 序 18
マルチスレッドアプリケーション
説明 2-508, 2-510
文字 (CHAR) 型
構文 4-27
デフォルト値として使用 2-161
より大きい 4-161
文字列操作関数 4-82
時間隔 (INTERVAL) 型
INSERT 文 2-377
引用符付き文字列 4-158
式 4-47, 4-53
条件セグメント 4-6
セグメント 4-135
日時 (DATETIME) 型
INSERT 文 2-377
IN キーワード 2-473
引用符付き文字列 4-158
式 4-47, 4-52
条件セグメント 4-6
セグメント 4-132
番号
IN キーワード 4-11
INSERT 文 2-377
式 4-47, 4-51
条件セグメント 4-6
セグメント 4-138
リリースノート 序 18, 序 19
ゆ
る
有効データベースオブジェクト
モード
定義 2-519
利点 2-532
ユーザ informix、関連付けられたア
クセス権 2-347
ループ
WHILE 文で不確定 3-50
制御 3-18
定義 2-519
利点 2-531
め
命名規則
データベース 4-23
データベースオブジェクト 4-26
表 2-156, 4-26
メール、ストアドプロシジャから
の送信 3-45
も
よ
予約語
区切り識別子を使用 4-115
識別子としての使用 4-113
リスト A-1
ら
み
未知の真理値 4-6
む
無効データベースオブジェクト
モード
ラージ可変長文字 (LVARCHAR) 型
より大きい 4-161
り
リテラル
ALTER TABLE 文の日時
(DATETIME) 型 2-43
れ
列
ALTER TABLE 文での変更 2-56
外部キーとしての定義 2-177
仮想 2-232
検査制約の指定 2-97, 2-171
削除 2-54
作成 2-42, 2-159
サブスクリプトの指定 2-487, 4-37
主キーとして定義 2-176
制約定義時に許容される数 2-157
制約の追加 2-157
挿入 2-374
名前の変更 2-425
番号、トリガによる影響 2-203
被参照と参照 2-49, 2-166
列式
SELECT 文 2-457
構文 4-35
列の値
索引
21
修飾する場合 2-215
修飾のある値と修飾のない
値 2-216
トリガアクション 2-215
列名
関数を名前として使用 4-117
キーワードを名前として使
用 4-119
修飾する場合 2-213
連結インデックス 2-118
連結演算子 (||) 4-33, 4-34
ろ
ロール
CREATE ROLE 文による作
成 2-146
DROP ROLE 文による削除 2-276
GRANT 文によるアクセス権の付
与 2-348
REVOKE 文によるアクセス権の
取消し 2-433
SET ROLE 文
設定 2-578
有効化 2-578
定義 2-146
範囲 2-579
ログ機能
CREATE DATABASE 文 2-90
カスケード削除 2-51, 2-170
トリガ 2-227
バッファ付きおよびバッファな
し 2-563
バッファなし
SET LOG 文による変更 2-563
ログファイル
ロードジョブアンロードジョ
ブ 2-573
ロケール 序 4
ロック
COMMIT WORK 文で解除 2-75
FETCH 文 2-309
ROLLBACK WORK 文による解
除 2-448
SET ISOLATION 文 2-555
SET LOCK MODE 文 2-560
SET TRANSACTION 文 2-584
UNLOCK TABLE 文の使用 2-620
索引 22
UPDATE カーソルの影響 2-249
共有モード 2-390
行レベルの無視 2-391
更新中 2-249
更新ロック 2-626
挿入中 2-376
待機期間 2-561
デフォルトの表のロック 2-188
途中の更新 2-626
トランザクション 2-67
排他モード 2-391
ロックの種類 2-65, 2-188
論理演算子、条件セグメント 4-20
わ
ワイルドカード文字
LIKE 条件 2-474, 4-12
LIKE と MATCHES 4-158
MATCHES 条件 2-474, 4-13
アスタリスク (*) 4-13
アンダスコア (_) 4-12
円記号 (¥) 4-12, 4-13
カレット (^) 4-13
疑問符 (?) 4-13
大かっこ ([...]) 4-13
パーセント記号 (%) 4-12
バックスラッシュ ( \ ) 4-12, 4-13
Informix Guide to SQL:Syntax
Fly UP