Comments
Transcript
IBM Informix SQL リファレンス・ガイド リファレンス・ガイド (
IBM Informix SQL リファレンス・ガイド (下巻 (下巻) 下巻) バージョン 5.2 Part No. CT1YKJA GB88-8617-00 ( 英文原典:G251-0405-00) お願い 本書および本書で紹介する製品をご使用になる前に、特記事項に記載されている情報をお読みくださ い。 本マニュアルに関するご意見やご感想は、次の URL からお送りください。今後の参考にさせていただきま す。 http://www.ibm.com/jp/manuals/main/mail.html なお、日本 IBM の発行のマニュアルはインターネット経由でもご購入いただけます。詳しくは http://www.ibm.com/jp/manuals/ の「ご注文について」をご覧ください。 (URL は変更になる場合があります) 原典 : G251-0405-00 IBM Informix Guide for SQL 発行 : 日本アイ・ビー・エム株式会社 担当 : ナショナル・ランゲージ・サポート 第 1 刷 2002.12 © Copyright International Business Machines Corporation 1996, 2002. All rights reserved. Translation@Copyright IBM Japan 2002 目次 目次 概要 はじめに . . . . . . . . . . . . . . . . . . . . . 本書について . . . . . . . . . . . . . . . . . . . . 本書の構成 . . . . . . . . . . . . . . . . . . . . SQL を使用する IBM Informix 製品 . . . . . . . . . . . . 本書で扱う製品 . . . . . . . . . . . . . . . . . . . デモンストレーション・データベース . . . . . . . . . . . IBM Informix OnLine でのデモンストレーション・データ ベースの作成 . . . . . . . . . . . . IBM Informix SE でのデモンストレーション・データベース の作成 . . . . . . . . . . . . . . IBM Informix Server 製品、バージョン 5.x の新規機能 . . . . . . ドキュメント規則 . . . . . . . . . . . . . . . . . . 文字の表記 . . . . . . . . . . . . . . . 構文規則 . . . . . . . . . . . . . . . . コード規則の例 . . . . . . . . . . . . . . 関連マニュアル . . . . . . . . . . . . . . . . . . . オンライン・マニュアル . . . . . . . . . . . エラー・メッセージ・ファイル . . . . . . . . . ドキュメント・ノート、リリース・ノート、マシン・ノート . 業界標準の準拠 . . . . . . . . . . . . . . . . . . . 資料・製品についてのご意見 . . . . . . . . . . . . . . 第 1 章 3 3 4 5 5 6 7 8 9 11 12 13 18 19 20 21 23 24 24 stores5 データベース 本章の内容 . . 表の構造 . . . customer 表. orders 表 . items 表. . stock 表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-3 1-4 1-5 1-6 1-6 1-8 catalog 表 . . . . . . cust_calls 表 . . . . . call_type 表 . . . . . manufact 表 . . . . . state 表 . . . . . . stores5 データベース・マップ . 主キーと外部キーの関係 . . customer 表と orders 表 . . orders 表と items 表 . . . items 表と stock 表 . . . stock 表と catalog 表. . . stock 表と manufact 表 . . cust_calls 表と customer 表 . call_type 表と cust_calls 表 . state 表と customer 表 . . stores5 データベース内のデータ 第 2 章 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1-9 1-10 1-10 1-11 1-11 1-11 1-13 1-14 1-15 1-16 1-17 1-18 1-19 1-20 1-21 1-21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2-3 2-4 2-8 2-9 2-9 2-10 2-11 2-11 2-12 2-13 2-16 2-17 2-18 2-18 2-22 2-24 2-25 2-26 2-27 2-28 2-28 2-29 システム・カタログ 本章の内容 . . . . . . . . . . . システム・カタログの使用 . . . . . . システム・カタログへのアクセス . システム・カタログ・データの更新 . システム・カタログの構造 . . . . . . SYSBLOBS . . . . . . . . . . SYSCHECKS . . . . . . . . . SYSCOLAUTH . . . . . . . . SYSCOLDEPEND. . . . . . . . SYSCOLUMNS . . . . . . . . SYSCONSTRAINTS . . . . . . . SYSDEFAULTS . . . . . . . . SYSDEPEND . . . . . . . . . SYSINDEXES . . . . . . . . . SYSOPCLSTR . . . . . . . . . SYSPROCAUTH . . . . . . . . SYSPROCBODY . . . . . . . . SYSPROCEDURES . . . . . . . SYSPROCPLAN . . . . . . . . SYSREFERENCES . . . . . . . SYSSYNONYMS . . . . . . . . SYSSYNTABLE . . . . . . . . iv IBM Informix SQL リファレンス・ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SYSTABAUTH SYSTABLES . SYSUSERS . SYSVIEWS . . . . . . . . . . . . . . . . . . . 2-30 . . . . . . . . . . . . . . . . . . 2-31 . . . . . . . . . . . . . . . . . . 2-34 . . . . . . . . . . . . . . . . . . 2-34 システム・カタログ・マップ 第 3 章 . . . . . . . . . . . . . . 2-35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . データ型 本章の内容 . . . . . . . データベースのデータ型 . . BYTE . . . . . . . CHAR(n) . . . . . . CHARACTER(n) . . . DATE . . . . . . . DATETIME . . . . . DEC . . . . . . . . DECIMAL[(p,s)] . . . . DOUBLE PRECISION(n) . FLOAT(n) . . . . . . INT . . . . . . . . INTEGER . . . . . . INTERVAL . . . . . MONEY(p,s) . . . . . NUMERIC(p,s) . . . . REAL . . . . . . . SERIAL(n) . . . . . SMALLFLOAT . . . . SMALLINT . . . . . TEXT . . . . . . . VARCHAR(m,r) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3 3-4 3-5 3-6 3-7 3-7 3-8 3-11 3-11 3-12 3-12 3-12 3-13 3-13 3-17 3-17 3-17 3-17 3-18 3-19 3-19 3-21 データ型変換 . . . . . . . . . . . . . . . . . . . . 3-22 数値から数値への変換 . . . . . . . . . . . . 3-23 数値と文字 (CHAR) 型との間の変換 . . . . . . . . 3-23 DATE と DATETIME 間の変換 . . . . . . . . . . 3-24 DATE、DATETIME、および INTERVAL を使用した演算の範囲 . . 3-24 DATETIME 値の操作 . . . . . . . . . . . . . 3-26 INTERVAL 値を持つ DATETIME の操作 . . . . . . . 3-26 DATETIME 値および INTERVAL 値を持つ DATE の操作. . . 3-27 INTERVAL 値の操作 . . . . . . . . . . . . . 3-29 INTERVAL 値の乗算または除算. . . . . . . . . . 3-30 目次 v 第 4 章 第 5 章 環境変数 本章の内容 . . . . . . 環境変数の設定 . . . . . Informix 環境変数 . . . . DBANSIWARN . . . DBDATE . . . . . . DBDELIMITER . . . DBEDIT . . . . . . DBFORMAT . . . . DBLANG . . . . . DBMENU . . . . . DBMONEY . . . . . DBNETTYPE . . . . DBPATH . . . . . . DBPRINT . . . . . DBREMOTECMD. . . DBSRC . . . . . . DBTEMP . . . . . DBTIME . . . . . . INFORMIXCOB . . . INFORMIXCOBDIR . . INFORMIXCOBSTORE . INFORMIXCOBTYPE . INFORMIXDIR . . . INFORMIXONLINEDIR INFORMIXTERM. . . NOSORTINDEX . . . SQLEXEC . . . . . SQLRM . . . . . . SQLRMDIR . . . . . TBCONFIG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-3 4-4 4-5 4-7 4-8 4-9 4-10 4-10 4-11 4-12 4-12 4-13 4-14 4-15 4-16 4-16 4-17 4-18 4-20 4-20 4-21 4-21 4-22 4-23 4-23 4-24 4-25 4-26 4-27 4-27 UNIX 環境変数 . PATH . . . TERM. . . TERMCAP . TERMINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-28 4-28 4-29 4-30 4-30 . . . . . . . . . . . . . 5-3 . . . . . . . . . . . . . . . . . . . . SQLCA を使用したエラー処理 本章の内容 . . vi IBM Informix SQL リファレンス・ガイド . . . . . IBM Informix 4GL 内の SQLCA レコード . . . . IBM Informix ESQL/C 内の sqlca 構造体 . . . . . IBM Informix ESQL/COBOL 内の SQLCA レコード . 第 6 章 . . . . . . . . . . 5-5 . 5-7 . 5-10 記述子の使用 本章の内容 . . . . . . . . . . . . . . . ESQL/C のシステム記述子領域および sqlda 構造体 . システム記述子領域の使用 . . . . . . sqlda 構造体へのポインターの使用 . . . . ESQL/COBOL でのシステム記述子領域 . . . . . システム記述子領域の使用 . . . . . . 第 7 章 . . . . . . . . . . . . . . . . . . . . . . . . . . . 6-3 . . . 6-4 . . 6-5 . . 6-9 . . . 6-13 . . 6-13 構文 本章の内容 . . . . . . . . SQL 文 . . . . . . . . . ALLOCATE DESCRIPTOR . ALTER INDEX . . . . . ALTER TABLE . . . . . BEGIN WORK . . . . . CHECK TABLE . . . . . CLOSE . . . . . . . CLOSE DATABASE . . . COMMIT WORK . . . . CREATE AUDIT . . . . CREATE DATABASE . . . CREATE INDEX . . . . CREATE PROCEDURE . . CREATE PROCEDURE FROM CREATE SCHEMA . . . . CREATE SYNONYM . . . CREATE TABLE . . . . CREATE VIEW . . . . . DATABASE . . . . . . DEALLOCATE DESCRIPTOR DECLARE . . . . . . DELETE . . . . . . . DESCRIBE . . . . . . DROP AUDIT . . . . . DROP DATABASE . . . . DROP INDEX . . . . . DROP PROCEDURE . . . DROP SYNONYM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-9 7-9 7-13 7-17 7-20 7-37 7-39 7-41 7-45 7-47 7-48 7-50 7-55 7-59 7-68 7-69 7-71 7-76 7-98 7-102 7-106 7-108 7-124 7-127 7-133 7-134 7-136 7-138 7-139 目次 vii DROP TABLE . . . . . . . DROP VIEW . . . . . . . EXECUTE . . . . . . . . EXECUTE IMMEDIATE . . . EXECUTE PROCEDURE . . . FETCH . . . . . . . . . FLUSH . . . . . . . . . FREE . . . . . . . . . . GET DESCRIPTOR . . . . . GRANT . . . . . . . . . INFO . . . . . . . . . . INSERT . . . . . . . . . LOAD. . . . . . . . . . LOCK TABLE . . . . . . . OPEN . . . . . . . . . . OUTPUT . . . . . . . . . PREPARE . . . . . . . . PUT . . . . . . . . . . RECOVER TABLE . . . . . RENAME COLUMN . . . . RENAME TABLE . . . . . REPAIR TABLE . . . . . . REVOKE . . . . . . . . ROLLBACK WORK . . . . . ROLLFORWARD DATABASE . SELECT . . . . . . . . . SET CONSTRAINTS . . . . . SET DEBUG FILE TO . . . . SET DESCRIPTOR . . . . . SET EXPLAIN . . . . . . . SET ISOLATION . . . . . . SET LOCK MODE . . . . . SET LOG . . . . . . . . SET OPTIMIZATION. . . . . START DATABASE . . . . . UNLOAD . . . . . . . . UNLOCK TABLE . . . . . . UPDATE . . . . . . . . . UPDATE STATISTICS . . . . WHENEVER . . . . . . . セグメント . . . . . . . . . 条件 . . . . . . . . 制約名 . . . . . . . viii IBM Informix SQL リファレンス・ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-141 7-143 7-144 7-149 7-152 7-155 7-164 7-167 7-172 7-178 7-188 7-192 7-202 7-207 7-210 7-219 7-221 7-234 7-243 7-246 7-248 7-250 7-252 7-259 7-261 7-263 7-294 7-296 7-298 7-306 7-312 7-316 7-319 7-321 7-323 7-325 7-329 7-331 7-341 7-343 7-349 7-350 7-365 データベース名 . . . . データ型 . . . . . . DATETIME フィールド修飾子 式 . . . . . . . . 識別子 . . . . . . . インデックス名 . . . . INTERVAL フィールド修飾子 リテラル DATETIME . . . . リテラル INTERVAL . . . . リテラル番号 . . . . . プロシージャー名 . . . . 引用符付きストリング . . 関係演算子 . . . . . . シノニム名 . . . . . . . 表名 . . . . . . . . . ビュー名 . . . . . . 第 8 章 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7-367 7-370 7-373 7-375 7-403 7-417 7-419 7-421 7-424 7-427 7-429 7-431 7-434 7-438 7-440 7-444 ストアード・プロシージャーおよび SPL 概要 . . . . . . . . . . . . . . . . . . . ストアード・プロシージャーと SPL の概要 . . . . . ストアード・プロシージャーの機能 . . . . . SQL とストアード・プロシージャーの関係 . . . ストアード・プロシージャーの作成と使用 . . . . . DB-Access の使用によるプロシージャーの作成 . . 埋め込み言語製品の使用によるプロシージャーの作成 プロシージャーのコメント化とドキュメント化 . . コンパイル時エラーの診断 . . . . . . . . コンパイル時警告の表示 . . . . . . . . . テキストまたはマニュアルの生成 . . . . . . プロシージャーの実行 . . . . . . . . . プロシージャーのデバッグ . . . . . . . . プロシージャーの再作成 . . . . . . . . . ストアード・プロシージャーに対するアクセス権 . . . 作成時のアクセス権 . . . . . . . . . . 実行時のアクセス権 . . . . . . . . . . アクセス権の取り消し . . . . . . . . . 変数と式 . . . . . . . . . . . . . . . . . 変数 . . . . . . . . . . . . . . . 式 . . . . . . . . . . . . . . . プログラムの流れの制御 . . . . . . . . . . . . 分岐 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 目次 8-5 8-5 8-6 8-6 8-7 8-7 8-8 8-8 8-9 8-10 8-11 8-11 8-14 8-16 8-16 8-17 8-17 8-19 8-19 8-19 8-23 8-25 8-26 ix ループ . . . . . . . 関数処理 . . . . . . . プロシージャーとの情報のやり取り 結果の戻り . . . . . . 例外処理 . . . . . . . . . . エラーのトラップと復旧 . . ON EXCEPTION 文の制御範囲 ユーザー生成の例外 . . . SPL 文の構文 . . . . . . . . CALL . . . . . . . . . . CONTINUE . . . . . . . . DEFINE . . . . . . . . . EXIT . . . . . . . . . . FOR . . . . . . . . . . FOREACH . . . . . . . . IF . . . . . . . . . . . LET . . . . . . . . . . ON EXCEPTION . . . . . . RAISE EXCEPTION . . . . . RETURN. . . . . . . . . SYSTEM . . . . . . . . TRACE . . . . . . . . . WHILE . . . . . . . . . 付録 A 特記事項 用語集 索引 x IBM Informix SQL リファレンス・ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8-26 8-28 8-29 8-29 8-32 8-32 8-33 8-34 8-36 8-37 8-40 8-41 8-49 8-51 8-55 8-59 8-63 8-66 8-72 8-74 8-77 8-79 8-83 PREPARE PREPARE 目的 PREPARE 文は、実行時に、4GL または IBM Informix ESQL プログラムの SQL 文に関する実行計画を構文解析、妥当性検査、および生成するために使用 します。 構文 I4GL ESQL < 文識別子 > PREPARE ESQL < 文識別子 変数 > FROM 引用符付き ストリング 7-431 ページ < 変数名 > < 文識別子 > SQL 文識別子です。< 文識別子 > は、どの識別子とも同じ ルールに従っていなければなりません (7-403 ページの識別子 セグメントを参照 )。 < 文識別子 変数 > SQL 文識別子を含む埋め込み言語文字変数の名前です。< 識 別子変数 > とそれに含まれている識別子は、どの識別子とも 同じルールに従っていなければなりません (7-403 ページの識 別子セグメントを参照 )。 < 変数名 > PREPARE 文で処理する SQL 文が含まれている IBM Informix 4GL プログラム変数または IBM Informix ESQL ホスト変数の名 前です。 PREPARE 文における引用符付きストリングの最大長は 2048 バイトです。 構文 7-221 使用法 使用法 PREPARE 文を使用すれば、実行時にユーザー・プログラムで SQL 文のテキ ストをアセンブルし、それを実行可能にすることができます。SQL のこの 動的フォームは、次の 3 つのステップで実行されます。 1. PREPARE 文は、入力された文テキストを、引用符付きストリング として、または文字変数内に格納されたテキストとして受け入れま す。文テキストには、文を実行するときに定義する値を表すため の疑問符 ( ?) 位置指定値を含めることができます。 2. EXECUTE または OPEN 文は、必要な入力値を提供し、PREPARE 文 で処理された文を 1 回または複数回実行することができます。 3. PREPARE 文で処理された文に割り当てられたリソースは、後で FREE 文を使用して解放することができます。 単一プログラム内の、PREPARE 文で処理されたオブジェクトの数は、利用 できるメモリーによって制限されます。この数には、PREPARE 文で指定さ れた 文識別子と、SELECT または INSERT 文を組み入れたカーソル宣言の両 方が含まれています。制限を超えないようにするには、FREE 文を使用して いくつかの文またはカーソルを解放してください。 「文識別子」という用語は、文識別子 または文識別子変数 を意味していま す。 文識別子 PREPARE 文は、文テキストをデータベース・サーバーに送信し、文テキス トはそこで分析されます。文テキストにエラーが含まれていれば、その文 テキストは内部フォームに変換されます。こうして変換された文は、後で 実行するために、PREPARE 文が割り当てたデータ構造体に格納されます。 この構造体は、文識別子 という名前を持っています。後続の SQL 文は、こ の文識別子 を使用して文を参照します。 後続の FREE 文は、文に割り当てられたリソースを解放します。ユーザー は、データベース・サーバー・リソースを解放したら、文を再度 PREPARE 文で処理するまで、DECLARE カーソルまたは EXECUTE 文で 文識別子を使 用することはできません。 7-222 IBM Informix SQL リファレンス・ガイド 使用法 プログラムは、1 つ以上のソース・コード・ファイルからなっていること があります。デフォルトでは、文識別子の範囲はプログラムに対してグ ローバルになっています。つまり、1 つのファイルで準備した文識別子は 他のファイルからも参照できます。 複数ファイルのプログラムで、文識別子の範囲をそれが準備されるファイ ルに限定したい場合は、-local コマンド行オプションを指定して、すべての ファイルをプリプロセッサー処理する必要があります。-local オプションを 指定してプリプロセッサーで処理する場合の詳細説明、制限事項、および パフォーマンスの問題については、ESQL 製品マニュアルを参照してくださ い。 文識別子の解放 文識別子は、1 つまたは一連の SQL 文を同時に表すことができます。特定 の文識別子を別の SQL 文テキストにバインドしたい場合は、既存の文識別 子を指定して、新規の PREPARE 文を実行することができます。 ESQL PREPARE 文では動的文識別子名がサポートされますので、文識別子を識別 子として、またはホスト文字ストリング変数として準備することができま す。次の 2 つの例の場合、最初の例は、埋め込み言語変数として準備した 文識別子を示し、2 番目の例は文字ストリング定数として準備した文識別 子を示しています。 図 7-61 IBM Informix ESQL/C における文識別子の準備 strcpy (stmtid, "query2"); $ PREPARE $stmtid FROM "SELECT * FROM customer"; $ PREPARE query2 FROM "SELECT * FROM customer"; 構文 7-223 使用法 図 7-62 IBM Informix ESQL/COBOL における文識別子の準備 MOVE "QUERY_2" TO STMTID. EXEC SQL PREPARE :STMTID FROM "SELECT * FROM CUSTOMER" END-EXEC. EXEC SQL PREPARE QUERY_2 FROM "SELECT * FROM CUSTOMER" END-EXEC. < 文識別子変数 > は、CHARACTER データ型でなければなりません。C で は、この文識別子変数は $char として定義する必要があります。COBOL で は、< 識別子変数 > は、標準 CHARACTER 型として定義する必要がありま す。♦ 文テキスト PREPARE 文は、文テキストを引用符付きストリングとして、またはプログ ラム変数に格納されたテキストとして受け取ることができます。文テキス トには次の制限が適用されます。 ! テキストには、SQL 文のみを含めることができます。テキストに は、ホストプログラム言語からの文やコメントを含めることはでき ません。 “--” ( 二重ハイフン ) が前に付いているコメント、または “{ }” ( 中 括弧 ) で囲まれているコメントは、SQL で標準であり、文テキスト で使用できます。コメントは行の終わりまたは文の終わりで終了し ます。 ! テキストには、単一の SQL 文、セミコロンで分離された文のシー ケンスのいずれかを含めることができます。 ! ホスト言語変数の名前は、PREPARE 文で処理された文テキストで は認識されません。使用できる識別子は、表名や列名など、データ ベースで定義された名前だけです。したがって、INTO 節を含む SELECT 文を PREPARE 文で処理することはできません。それは、 INTO 節にはホスト言語変数が必要だからです。 ? を位置指定値として使用して、文を実行するときに、どこにデー タを提供するかを指示します。 7-224 IBM Informix SQL リファレンス・ガイド 使用法 ESQL ! ドル記号、セミコロン、EXEC SQL という語などの、埋め込み SQL 文プレフィックスや終了文字をテキストにインクルードすることは できません。♦ IBM Informix 4GL の PREPARE 文の例を示します。 図 7-63 IBM Informix 4GL におけるサンプル PREPARE 文 PREPARE new_cust FROM "INSERT INTO customer(fname,lname)", "VALUES(?,?)" 許可される文 以下にリストされている文を除き、任意の単一 SQL 文を PREPARE 文で処 理するすることができます。 I4GL CLOSE EXECUTE IMMEDIATE FREE PUT DECLARE FETCH OPEN WHENEVER EXECUTE FLUSH PREPARE 上記の文に加え、LOAD 文と UNLOAD 文も PREPARE 文で処理することはで きません。♦ SELECT 文を PREPARE 文で処理することができます。SELECT 文に INTO TEMP 節がインクルードされている場合は、PREPARE 文で処理された文を EXECUTE 文で実行することができます。INTO TEMP 節がインクルードされ ていない場合は、この文はデータ行を戻します。それらの行を取り出すに は、DECLARE、OPEN、および FETCH カーソル文を使用してください。 PREPARE 文で処理された SELECT 文には、FOR UPDATE 節をインクルード することができます。この節は、通常、UPDATE カーソルを作成するため に DECLARE 文で使用されます。4GL コードのサンプル・セグメントを次に 示します。 構文 7-225 パラメーターが既知の場合の PREPARE 文による文の処理 図 7-64 IBM Informix における FOR UPDATE 節を持つ SELECT 文 4GL PREPARE up_sel FROM "SELECT * FROM customer ", "WHERE customer_num between ? and ? ", "FOR UPDATE" DECLARE up_curs CURSOR FOR up_sel OPEN sel_cursor USING low_cust, high_cust PREPARE 文による複数文の処理 セミコロンで区切られた複数の文が入っているテキストで、以下の文 ( 上 記の文に加え ) は使用できません。 CLOSE DATABASE DATABASE SELECT CREATE DATABASE DROP DATABASE START DATABASE したがって、SELECT は、PREPARE 文による複数文の処理では使用できま せん。一連の文を実行しているときに現行データベースをクローズさせる 文も使用できません。 パラメーターが既知の場合の PREPARE 文による文の 処理 PREPARE 文で処理された一部の文では、必要なすべての情報が、 PREPARE 文で処理する時点で分かっている場合があります。次の例は、 IBM Informix ESQL/C において、2 つの文が定数データから PREPARE 文で処 理されています。 図 7-65 IBM Informix ESQL/C における PREPARE 文による定数データからの 2 つの文の処理 sprintf(redo_st, "%s; %s", "DROP TABLE workt1", "CREATE TABLE workt1 (wtk serial, wtv float)" ); $PREPARE redotab FROM redo_st; PREPARE 文で処理する前に文のすべての部分が分かっていますが、それら はプログラム入力からも動的に引き出すことができます。この IBM Informix 4GL の例では、ユーザー入力データが SELECT 文に取り込まれ、次にこの文 が PREPARE 文で処理され、カーソルに関連付けられます。 7-226 IBM Informix SQL リファレンス・ガイド 後でパラメーターを受け取る文の PREPARE 文による処理 図 7-66 PREPARE 文による 4GL 文の処理とユーザー入力データのインクルード DEFINE u_po LIKE orders.po_num PROMPT "Enter p.o. number please: " FOR u_po PREPARE sel_po FROM "SELECT * FROM orders ", "WHERE po_num = '", u_po, "'" DECLARE get_po CURSOR FOR sel_po 詳細については、使用しているアプリケーション開発支援ツールのマニュ アルを参照してください。 後でパラメーターを受け取る文の PREPARE 文による 処理 一部の文では、文を実行するたびに異なる値が挿入されるため、PREPARE 文で文を処理するときにパラメーターが分かっていない場合があります。 これらの文では、文の実行時にパラメーターを提供しなければならなく なった場合に ? 位置指定値を使用することができます。 次の例の PREPARE 文は、? 位置指定値を使用した場合を示しています。 図 7-67 ? 位置指定値を使用した場合の PREPARE 文による 4GL 文の処理 PREPARE s3 FROM "SELECT * FROM customer WHERE state MATCHES ?" PREPARE in1 FROM "INSERT INTO manufact VALUES (?,?,?)" PREPARE update2 FROM "UPDATE customer SET zipcode = ?" "WHERE CURRENT OF zip_cursor" 位置指定値を使用して式の値のみを提供することができます。データベー ス名、表名、列名などの識別子を表すために、? 位置指定値を使用すること はできません。 次の例の IBM Informix ESQL/C コード・セグメントでは、demoquery という 名前の変数に基づいて、PREPARE 文による処理を行っています。この変数 のテキストには 1 つの ? 位置指定値がインクルードされています。 PREPARE 文で処理された文はカーソルに関連付けられ、カーソルがオープ ンされると、OPEN 文の USING 節が位置指定値の値を提供します。 構文 7-227 SQL 識別子を持つ文の PREPARE 文による処理 図 7-68 値を受け取る IBM Informix ESQL/C 文の PREPARE 文による処理 $char queryvalue [6]; $char demoquery [80]; $database stores5; sprintf(demoquery, "%s %s", "SELECT fname, lname FROM customer", "WHERE lname > ? "); $PREPARE quid FROM $demoquery; $DECLARE democursor CURSOR FOR quid; strcpy(queryvalue, "C"); $OPEN democursor USING $queryvalue; USING 節は、OPEN 文 ( カーソルと関連付けられた文 ) にも、EXECUTE 文 (PREPARE 文で処理された他のすべての文 ) にも使用できます。 IBM Informix 4GL の例を次に示します。 図 7-69 PREPARE 文で処理した 4GLSELECT 文の、OPEN 文を使用した実行 DEFINE zip LIKE customer.zipcode PREPARE zip_sel FROM "SELECT * FROM customer WHERE zipcode MATCHES ?" DECLARE zip_curs CURSOR FOR zip_sel PROMPT "Enter a zipcode: " FOR zip OPEN zip_curs USING zip I4GL PREPARE 文で処理した SELECT 文に? 位置指定値が含まれている場合は、 この文を FOREACH 文で実行することはできません。この場合は、OPEN、 FETCH、および CLOSE 文グループを使用してください。♦ SQL 識別子を持つ文の PREPARE 文による処理 データベース名、表名、列名などの SQL 識別子に? 位置指定値を使用する ことはできません。この場合は、文テキストを PREPARE 文で処理すると きに、これらの識別子をその文テキストに指定してください。 ただし、文を書き込むときにこれらの識別子が使用できない場合は、ユー ザー入力から SQL 識別子を受け取る文を構築する必要があります。次の 4GL 例では、列名がユーザーから提供され、文テキストに挿入された後、 PREPARE 文で処理されます。この列の検索値もユーザー入力から受け取ら れますが、このデータは USING 節を持つ文に提供されます。 7-228 IBM Informix SQL リファレンス・ガイド SQL 識別子を持つ文の PREPARE 文による処理 図 7-70 SQL 識別子を入力として受け取る 4GL 文の PREPARE 文による処理 DEFINE column_name CHAR(30), column_value CHAR(40), del_str CHAR(100) PROMPT "Enter column name: " FOR column_name LET del_str = "DELETE FROM customer WHERE ", column_name CLIPPED, "=?" PREPARE de4 FROM del_str PROMPT "Enter search value in column ",column_name, ":" FOR column_value EXECUTE de4 USING column_value 次の例の IBM Informix ESQL/C プログラム・フラグメントは、表名の入力を ユーザーに要求し、その名前を SELECT 文に使用します。表名は実行時に なるまで分からないため、表列の数とデータ型も分かりません。したがっ て、プログラムは、前もって各行からデータを受け取るためのホスト変数 を割り当てることができません。その代わり、このプログラム・フラグメ ントは、文を sqlda 記述子の中に記述し、その記述子を使用して各行を取 り出します。この取り出しにより、各行は、プログラムによって動的に提 供されるメモリー格納場所に入れられます。 アクティブ・セット内のすべての行をプログラムで検索する必要がある場 合は、FETCH 文が、各行を取り出したループに入れられます。FETCH 文が 複数のデータ値 ( 列 ) を検索した場合は、その FETCH の後に別のループが 発生し、このループにより各データ値に対して何らかのアクションが取ら れます。 図 7-71 SQL 識別子を入力として受け取る IBM Informix ESQL/C 文の PREPARE 文による処理 #include $include $include $include <stdio.h> sqlca; sqlda; sqltypes; char *malloc( ); main() { struct sqlda *demodesc; $char demoselect[200]; char tablename[19]; int i; /* This program selects all the columns of a given tablename. The tablename is supplied interactively. */ 構文 7-229 SQL 識別子を持つ文の PREPARE 文による処理 $database stores5; printf( "This program does a SELECT * on a table\n" ); printf( "Enter table name: " ); scanf( "%s",tablename ); sprintf( demoselect, "select * from %s", tablename ); $prepare iid from $demoselect; $describe iid into demodesc; /* Print what DESCRIBE returns */ for ( i = 0; i < demodesc->sqld; i++ ) prsqlda (demodesc->sqlvar + i); /* 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: case SQLINT: 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 . */ $prepare d_stmt from $demoselect; $declare d_curs cursor for d_stmt; $open d_curs; /* Fetch selected rows one at a time into demodesc. */ for( ; ; ) { printf( "\n" ); $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: 7-230 IBM Informix SQL リファレンス・ガイド 複数 SQL 文のシーケンスの PREPARE 文による処理 printf( "%s: %d\n", demodesc->sqlvar[i].sqlname, *((int *) demodesc->sqlvar[i].sqldata) ); break; /* And so forth for each type... */ } } } $close d_curs; $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=%lx\n", sp->sqlname); } 複数 SQL 文のシーケンスの PREPARE 文による処理 いくつかの SQL 文をまとめて同一の PREPARE 文にインクルードすれば、そ れらの文を 1 つのアクションとして実行することができます。複数文テキ ストは 1 つの単位として処理されます。各アクションは逐次処理されませ ん。したがって、複数文テキストに、テキスト内の前の文で実行されたア クションに依存する文をインクルードすることはできません。 コンパイル済みのすべての製品は、複数文テキストの最初のエラーに関す るエラー状態情報を戻します。シーケンス内のどの文がエラーを起こした かは示されません。 次の例には、既存の製造元コードを新規コードと置き換えて、stores5 デー タベースを更新する IBM Informix 4GL コードのフラグメントが示されていま す。manu_code 列は、4 つの表をリンクする可能性のある結合列であるた め、3 つの表では、以前のコードを新規コードで置き換えなければなりま せん。 構文 7-231 複数 SQL 文のシーケンスの PREPARE 文による処理 図 7-72 IBM Informix 4GL における複数文テキストの PREPARE 文による処理 DATABASE stores5 MAIN DEFINE code_chnge RECORD new_code LIKE manufact.manu_code, old_code LIKE manufact.manu_code END RECORD, sqlmulti CHAR(250) PROMPT "Enter new manufacturer code: " FOR code_chnge.new_code PROMPT "Enter old manufacturer code: " FOR code_chnge.old_code LET sqlmulti = "UPDATE manufact SET manu_code = ? WHERE manu_code = ?;", "UPDATE stock SET manu_code = ? WHERE manu_code = ?;", "UPDATE items SET manu_code = ? WHERE manu_code = ?;", "UPDATE catalog SET manu_code = ? WHERE manu_code = ?;" PREPARE exmulti FROM sqlmulti EXECUTE exmulti USING code_chnge.*, code_chnge.*, code_chnge.* code_chnge.* END MAIN 次の例では、PREPARE 文により 6 つの SQL 文が処理されて単一の IBM Informix ESQL/C ストリング照会に編成されます。個々の文はセミコロン で区切られます。1 つの $prepare 文が 6 つの文をすべて実行用に処理でき、 1 つの $execute 文が qid ストリングを実行できます。 図 7-73 IBM Informix ESQL/C における複数文テキストの PREPARE 文による処理 sprintf (query, "%s %s %s %s %s %s %s %s %s", "begin work;", "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 (?, ?);", "commit work;"); $prepare qid from $query; $execute qid using $delta, $acct_number, $delta, $teller_number, $delta, $branch_number, $timestamp,$values; 7-232 IBM Informix SQL リファレンス・ガイド PREPARE 文で処理された文の効率化 PREPARE 文で処理された文の効率化 パフォーマンス効率を高めるには、PREPARE とループの EXECUTE 文を使用 して、冗長な構文解析と最適化が原因で発生するオーバーヘッドを除去し てください。たとえば、WHILE ループに含まれている UPDATE 文は、この ループが実行されるたびに構文解析されます。PREPARE 文により UPDATE 文をこのループの外部で処理すれば、この文は 1 回しか構文解析されない ため、オーバーヘッドが除去され、文の実行を迅速に行うことができます。 4GL 例を次に示します。 図 7-74 パフォーマンス改善のための PREPARE 文による 4GL 文の処理 PREPARE up1 FROM "UPDATE customer ", "SET discount = 0.1 WHERE customer_num = ?" WHILE TRUE PROMPT "Enter Customer Number" FOR dis_cust IF dis_cust = 0 THEN EXIT WHILE END IF EXECUTE up1 USING dis_cust END WHILE 参考資料 本書では、DECLARE、DESCRIBE、EXECUTE、FREE、および OPEN 文を参照 してください。 IBM Informix SQL チュートリアル・ガイド では、PREPARE 文と動的な SQL の説 明を参照してください。 構文 7-233 PUT PUT 目的 PUT 文は、後でデータベースに挿入するための行をバッファーに格納する ために使用します。 構文 I4GL ESQL + < カーソル 識別子 > PUT ESQL ESQL , < カーソル 変数 > < 変数名 > FROM USING SQL DESCRIPTOR "< 記述子 >" < 記述子 変数 > E/C DESCRIPTOR <sqlda ポイ ンター > < カーソル 識別子 > INSERT 文に対して宣言されたカーソルの識別子です。 < カーソル 変数 > INSERT 文に対して宣言されたカーソルを識別する埋め込み変 < 記述子 > ALLOCATE DESCRIPTOR 文で割り当てられたシステム記述子 数名です。 領域を識別する引用符付きストリングです。 7-234 IBM Informix SQL リファレンス・ガイド 使用法 < 記述子 変数 > ALLOCATE DESCRIPTOR 文で割り当てられたシステム記述子 領域を識別する埋め込み変数名です。 <sqlda PREPARE 文で処理された INSERT 文の中の ? 位置指定値に対 ポインター > 応する値を表す sqlda 構造体をポイントします。 < 変数名 > PREPARE 文で処理された INSERT 文の中の ? 位置指定値と置 き換えられる内容を持つプログラム変数です。 使用法 各 PUT 文は、< カーソル名 > をオープンしたときに作成した INSERT バッ ファーに行を格納します。文を実行するときにバッファーに新規行を入れ るスペースがない場合は、バッファー内の行が一括してデータベースに書 き込まれ、バッファーは空になります。その結果、PUT 文の実行によって、 データベースが出力されたり、されなかったりします。 FLUSH 文を使用して、新規行を追加せずに、バッファー内の行をデータ ベースに書き込むことができます。CLOSE 文は、残りのすべての行を書き 込んでから INSERT カーソルをクローズします。 現行のデータベースが明示的な トランザクションを使用する場合は、PUT 文をトランザクション内で実行しなければなりません。 次に、4GL における PUT 文の使用例を示します。 図 7-75 IBM Informix 4GL における PUT 文の使用 DECLARE ins_curs CURSOR FOR INSERT INTO state VALUES (code, sname) OPEN ins_curs LET code = "AK" LET sname = "Alaska" PUT ins_curs 次に、IBM Informix ESQL/C と、PREPARE 文で処理された文の使用例を示し ます。 図 7-76 IBM Informix ESQL/C における PUT 文の使用 $PREPARE ins_mcode FROM "INSERT INTO manufact VALUES(?,?)"; $DECLARE mcode CURSOR FOR ins_mcode; $OPEN mcode; $PUT mcode FROM $the_code, $the_name; 構文 7-235 使用法 X/O PUT は X/Open の標準 SQL 文ではありません。したがって、ESQL 製品で PUT 文を X/Open モードでコンパイルすると、警告メッセージが出ます。 X/Open モードでのコンパイルについて詳しくは、使用している製品のマ ニュアルを参照してください。♦ 7-236 IBM Informix SQL リファレンス・ガイド 挿入値の提供 挿入値の提供 挿入行を構成する値のソースは、次の 4 つのいずれかです。 ESQL ! INSERT 文に書き込まれた定数値。 ! INSERT 文で指定されたプログラム変数。 ! PUT 文の FROM 節で指定されたプログラム変数。 ! sqlda 構造体またはシステム記述子領域によってアドレッシングさ れたメモリー内で準備された後、PUT 文の USING 節で指定された 値。♦ INSERT での定数値の使用 INSERT 文の VALUES 節は、挿入列の値をリストします。これらの うちの 1 つ以上の値は定数、つまり数字または文字ストリング、である可能性があ ります。 すべての 挿入値が定数であれば、PUT 文に特殊な効果が現れます。PUT 文 は、行を作成してそれをバッファーに入れることをしないで、単にカウン ターを増分します。FLUSH または CLOSE 文を使用してバッファーを空にす ると、1 つの行と反復カウントがデータベース・サーバーに送信され、 データベース・サーバーはその数だけの行を挿入します。 次の IBM Informix 4GL 例では、99 個の空の顧客レコードが customer 表に挿 入されます。すべての値が定数であるため、カーソルがクローズされるま で、ディスク出力は行われません。(customer_num が定数ゼロであれば、 SERIAL 値の生成が行われます。) 図 7-77 IBM Informix 4GL における表への空の顧客レコードの挿入 DECLARE fill_c CURSOR FOR INSERT INTO customer(customer_num) VALUES(0) DEFINE count SMALLINT OPEN fill_c FOR count = 1 TO 99 PUT fill_c END FOR CLOSE fill_c 構文 7-237 挿入値の提供 INSERT におけるプログラム変数の指名 INSERT 文をカーソル宣言の一環として書き込むときは、(DECLARE 文で )、 VALUES 節でプログラム変数を指名することができます。各 PUT 文を実行 すると、その時点のプログラム変数の内容を使用して、バッファーに挿入 する行が構成されます。 ヒント : VALUES 節でプログラム変数を指名できるのは、DECLARE 分の一 部として INSERT 文を書き込むときだけです。文識別子によってカーソルに 関連付けられた、PREPARE 文で処理された文のコンテキストでは、変数名 は認識されません。 以下の IBM Informix ESQL/C 例は、INSERT カーソルの使用を示しています。 このコードには次の文がインクルードされています。 ! DECLARE 文が、データを customer 表に挿入する INSERT 文に ins_curs というカーソルを関連付けます。VALUES は、cust_rec と いうデータ構造体を指名します。ESQL/C プリプロセッサーは、構 造体の各コンポーネントごとに 1 つずつ cust_rec を値のリストに変 換します。 ! OPEN 文がバッファーを作成します。 ! この例では定義されていない関数が、対話型ユーザーから顧客情報 を取得し、それを cust_rec に残します。 ! PUT 文が、cust_rec 構造体の現行内容から行を構成し、それを行 バッファーに送信します。 ! CLOSE 文が、行バッファーに残っているすべての行を customer 表 に挿入し、INSERT カーソルをクローズします。 図 7-78 IBM Informix ESQL/C における INSERT カーソルの使用 int keep_going = 1; $struct cust_row { /* fields of a row of customer table */ } cust_rec; $declare ins_curs cursor for insert into customer values ($cust_rec); $open ins_curs; for (; (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 */ $put ins_curs; } if (sqlca.sqlcode == 0)/* no error from PUT */ keep_going = (prompt_for_y_or_n("another new customer") == 'Y') } $close ins_curs; 7-238 IBM Informix SQL リファレンス・ガイド 挿入値の提供 PUT におけるプログラム変数の指名 INSERT 文を PREPARE 文で処理すると ( 7-221 ページの PREPARE 文を参照 )、 その VALUES 節のプログラム変数を使用できません。 しかし、? 位置指定値を 使用して値を表すことができます。欠落した値を提供するには、 PUT 文の FROM 節にプログラム変数の名前をリストします。 次に IBM Informix 4GL の 例を示します。 図 7-79 IBM Informix 4GL における PUT 文でのプログラム変数のリスト作成 DEFINE answer CHAR(1), u_company LIKE customer.company PREPARE sel2 FROM "INSERT INTO customer (customer_num, company) ", "VALUES (0, ?)" DECLARE ins_curs CURSOR FOR sel2 OPEN ins_curs LET answer = "y" WHILE answer = "y" PROMPT "Enter a customer: " FOR u_company PUT ins_curs FROM u_company PROMPT "Do you want to enter another customer (y/n) ? " FOR answer END WHILE CLOSE ins_curs システム記述子領域の使用 ESQL 1 つ以上の値のデータ型とメモリー格納場所を記述するシステム記述子領 域を作成することができます。次に、そのシステム記述子領域を PUT 文の USING SQL DESCRIPTOR 節で指定することができます。 記述の使用について詳しくは、本書の 第 6 章 および使用している埋め込み 言語製品のマニュアルを参照してください。次の例は、システム記述子領 域から取得した値を関連付ける方法を示しています。 図 7-80 IBM Informix ESQL/C におけるサンプル PUT USING SQL DESCRIPTOR 文 $ PUT selcurs USING SQL DESCRIPTOR "desc1"; 構文 7-239 バッファー内の行の書き込み 図 7-81 IBM Informix ESQL/COBOL におけるサンプル PUT USING SQL DESCRIPTOR 文 EXEC SQL PUT SEL_CURS USING SQL DESCRIPTOR "DESC1" END-EXEC. ♦ sqlda 構造体の使用 E/C 1 つ以上の値のデータ型とメモリー格納場所を記述する sqlda 構造体を作成 することができます。そうすると、PUT 文の USING DESCRIPTOR 節で sqlda 構造体を指定することができます。PUT 文を実行するたびに、sqlda によっ て記述された値を使用して、INSERT 文の ? 位置指定値が置き換えられま す。このプロセスは、変数のリストで USING キーワードを使用するのと似 ていますが、ユーザーのプログラムがデータ値のメモリー格納場所の完全 制御を行うという点が異なります。 sqlda 構造体の詳細については、本書の第 6 章および IBM Informix ESQL/C Programmer’s Manual を参照してください。 図 7-82 ESQL/C におけるサンプル PUT USING DESCRIPTOR 文 $put selcurs using descriptor pointer2; ♦ バッファー内の行の書き込み OPEN 文が INSERT カーソルをオープンすると、INSERT バッファーが作成 されます。PUT 文はこの INSERT バッファーに行を入れます。バッファー 内の行のブロックが、必要なときだけ、データベース表に一括して挿入さ れます。この動作は「バッファーのフラッシュ」と呼ばれます。バッ ファーのフラッシュが行われるのは、以下のいずれかのイベントの後です。 ! PUT 文の開始時にバッファーがいっぱいになっていて、新規行を収 容できない。 ! FLUSH 文が実行された。 ! CLOSE 文がカーソルをクローズした。 ! カーソルを指名して OPEN 文が実行された。 OPEN 文をオープン・カーソルに適用すると、カーソルをクローズ してからそれを再オープンします。この暗黙の CLOSE 文はバッ ファーをフラッシュします。 ! COMMIT WORK 文が実行された。 7-240 IBM Informix SQL リファレンス・ガイド エラー検査 プログラムが INSERT カーソルをクローズせずに終了した場合は、バッ ファーはフラッシュされません。最後のフラッシュ以降にバッファーに挿 入された行は失われます。プログラムの終了でカーソルがクローズされ、 バッファーがフラッシュされると考えないでください。 エラー検査 SQLCA には、各 PUT 文の正常終了に関する情報と、挿入された行をカウン トできる情報が含まれています。各 PUT 文の結果は、次の表に示されてい るように、SQLCA のフィールドに含まれています。 4GL ESQL/C ESQL/COBOL STATUS SQLCA.SQLCODE sqlca.sqlcode SQLCODE SQLCODE OF SQLCA SQLCA.SQLERRD[3] sqlca.sqlerrd[2] SQLERRD[3] OF SQLCA INSERT カーソルによるデータ・バッファー方式は、バッファーがフラッ シュされるまでエラーが発見されないことを意味します。たとえば、意図 された列のデータ型と互換性がない入力値は、バッファーがフラッシュさ れたときにのみ発見されます。エラーが発見されると、そのエラーの後に 配置されたバッファー内の行は挿入されません。それらの行はメモリーか ら消失します。 エラーが発生しないと、SQLCODE フィールドはゼロに設定されます。エ ラーが発生すると、このフィールドはエラー・コードに設定されます。 SQLERRD 配列の 3 番目のエレメントは、正常にデータベースに挿入された 行の数に設定されます。 ! INSERT バッファーに行が入れられ、バッファー内の行がデータ ベースに書き込まれないと、SQLCODE と SQLERRD の両方がゼロに 設定されます ( エラーが発生しなかったために SQLCODE、および 行が挿入されなかったために SQLERRD)。 ! PUT 文の実行中にバッファー内の行ブロックがデータベースに書き 込まれた場合は、SQLCODE はゼロに設定され、SQLERRD は、デー タベースに正常に挿入された行の数に設定されます。 構文 7-241 参考資料 ! バッファー内の行をデータベースに書き込んでいるときにエラーが 発生した場合は、SQLCODE がエラーを示し、SQLERRD には、正常 に挿入された行の数が入ります。( 挿入されなかった行はバッ ファーから廃棄されます。) 合計および保留中の行のカウント 実際にデータベースに挿入された行の数と、まだ挿入されていない行の数 をカウントするには、以下の手順を実行してください。 ! 2 つの整変数を PREPARE 文で処理します。 たとえば、 < 合計 > と < 保 留中 >。 ! カーソルがオープンされたら、両方の変数をゼロに設定します。 ! PUT 文を実行するたびに、合計 と保留中 を増やします。 ! PUT または FLUSH 文を実行するたびに、あるいはカーソルをクロー ズするたびに、SQLERRD 配列の 3 番目のフィールドを保留中 から 減算します。 合計から保留中を引いた数は、常に、実際に挿入された行の数です。すべ てのコマンドが正常に実行された場合は、カーソルをクローズした後、保 留中にはゼロが入っていなければなりません。PUT、FLUSH、または CLOSE 文の実行中にエラーが発生した場合は、保留中に残っている値は、挿入さ れなかった ( 廃棄された ) 行の数に設定されます。 参考資料 本書では、カーソル関連の CLOSE、FLUSH、DECLARE、および OPEN 文を 参照してください。また、ALLOCATE DESCRIPTOR 文も参照してください。 IBM Informix SQL チュートリアル・ガイド では、PUT 文の説明を参照してくだ さい。 7-242 IBM Informix SQL リファレンス・ガイド RECOVER TABLE RECOVER TABLE 目的 RECOVER TABLE 文は、障害が発生した場合にデータベース表を復元するた めに IBM Informix SE と一緒に使用します。 構文 SE + RECOVER TABLE 表名 7-440 ページ 使用法 RECOVER TABLE 文は、表更新記録をデータベースのアーカイブ・コピーに 適用します。IBM Informix SE は、更新記録を使用して、表ごとに操作を記録 します。表を所有している場合や、データベースに対する DBA アクセス権 を持っている場合は、RECOVER TABLE 文を出すことができます。 システム障害が発生した場合は、オペレーティング・システム・ユーティ リティーを使用して、更新記録が入っている各表ファイルを復元してくだ さい。RECOVER TABLE 文を出して、更新記録に記録されたトランザクショ ンで、新規に復元された各表を更新してください。 構文 7-243 バックアップ / 復元プロシージャー バックアップ / 復元プロシージャー 更新記録が含まれているデータベースのアーカイブ・コピーを取るための 推奨されるバックアップ / 復元プロシージャーは、次のとおりです。 ! 更新記録が含まれている各表ごとに DROP AUDIT 文を実行します。 DROP AUDIT 文が、更新記録ファイルへのシステム・ログ操作を終 了します。 ! 新規更新記録のパス名を指定して、各表ごとに CREATE AUDIT 文を 実行します。保護機能を最大化するために、データベースと同じ記 憶装置上にない位置を指定してください。更新記録内のファイルの 表名とシーケンスを反映するファイル名、たとえば、 audit_cust_001 または audit_cust_002 を選択することもできます。 CREATE AUDIT 文は、systables システム・カタログ表の更新記録 ファイルの新規名と格納場所を登録します。 ! オペレーティング・システム・ユーティリティーを使用してデータ ベース・ファイルをバックアップします。 実行中に、RECOVER TABLE は、更新記録と表名が、変更が行われた行のレ コード番号と整合しているかどうかを調べます。非常にまれなケースとし て、RECOVER TABLE 文が、システム・クラッシュによる不整合を検出でき る場合があります。この場合にのみ、RECOVER TABLE 文は停止し、ユー ザーが手動で表を復旧させなければなりません。 次に示すアクションと文のリストは、customer 表を復旧させるためのガイ ドとして役立ちます。まず、最後のアーカイブ・コピーから customer 表を 復元します。次に、以下の文を実行します。この場合、アーカイブ・コ ピーを作成した直後から更新記録が開始されたと想定しています。 RECOVER TABLE customer DROP AUDIT FOR customer CREATE AUDIT FOR customer その次に、復旧した表の新規バックアップを作成します。 更新記録ファイル は、人間に解読可能なフォームになっていません。しか し、DBA は、必要な場合、このファイルをデータベース (.dat) ファイルに コピーして、このファイルを操作することができます。変更したファイル を再度更新記録ファイルにコピーし、特定の表のカスタマイズ復元を行う ことができます。たとえば、更新記録ファイルを修正して、特定のユー ザーによって入力された行を除外したり、特定のトランザクションを元に 戻したりできます。更新記録ファイルを修正するための個々の手順につい ては、アプリケーション開発支援ツールのマニュアルを参照してください。 7-244 IBM Informix SQL リファレンス・ガイド 参考資料 参考資料 本書では、CREATE AUDIT および DROP AUDIT 文を参照してください。 構文 7-245 RENAME COLUMN RENAME COLUMN 目的 RENAME COLUMN 文は、列の名前を変更するために使用します。 構文 + RENAME COLUMN < 新列 > 表名 7-440 ページ .< 以前の列 > TO < 新列 > 列の新規名です。 < 以前の列 > リネームされる列です。 使用法 以下のいずれかの条件が当てはまる場合は、表の列の名前を変更すること ができます。 ! 表を所有している。 ! データベースに対する DBA アクセス権を持っている。 ! 表に対する Alter アクセス権を持っている。 列の名前を変更するときは、表内で固有の列名を選択してください。 DB ESQL 列がデータベース内のビューによって参照された場合は、sysviews システ ム・カタログ表内のビューのテキストが、新規列名を反映するように更新 されます。列がデータベース内のチェック制約によって参照された場合は、 syschecks システム・カタログ表内のチェック制約のテキストが、新規列名 を反映するように更新されます。♦ 7-246 IBM Informix SQL リファレンス・ガイド 参考資料 次の例は、customer 表の customer_num 列に c_num という新規名を割り当 てます。 RENAME COLUMN customer.customer_num TO c_num SE ROLLBACK WORK 文を使用して、正常に実行された RENAME COLUMN 文を 元に戻すことはできません。RENAME COLUMN 文が含まれているトランザ クションをロールバックした場合は、列にはその新規名が保存され、エ ラー・メッセージは出ません。♦ 参考資料 本書では、ALTER TABLE、CREATE TABLE、および RENAME TABLE 文を参照 してください。 構文 7-247 RENAME TABLE RENAME TABLE 目的 RENAME TABLE 文は、表の名前を変更するために使用します。 構文 + < 以前の 名前 > RENAME TABLE TO < 新規名 > < 所有者 >. < 新規名 > 表に割り当てられる新規名です。 < 以前の 名前 > リネームされる表です。 < 所有者 > 表の所有者です。 使用法 以下のいずれかの文が当てはまる場合は、表の名前を変更することができ ます。 ! 表を所有している。 ! データベースに対する DBA アクセス権を持っている。 ! 表に対する Alter アクセス権を持っている。 表の名前を変更しても、表の所有者を変更することはできません。所有者 を以前の名前 の一部として指定することができますが、所有者 を 新規名の 一部として指定すると、コンパイル中にエラーが発生します。 ビューがこの表を参照する場合は、sysviews システム・カタログ表内の ビューのテキストが、新規表名を反映するように更新されます。 ANSI ANSI 準拠のデータベースでは、自分が所有していない表を参照する場合、 所有者 を指定しなければなりません。♦ 7-248 IBM Informix SQL リファレンス・ガイド 参考資料 次の例は、items 表を再編成します。この例の意図は、quantity 列を 5 番目 の位置から 3 番目の位置へ移動することです。この例は、次の 4 つのス テップを示しています。 ! 3 番目の位置に quantity 列が入っている新規表 new_table を作成す る。 ! 表を現行 items 表からのデータで充てんする。 ! 以前の items 表を削除する。 ! new_table 名を items 名で変更する。 図 7-83 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 SE ROLLBACK WORK 文を使用して、正常に実行された RENAME TABLE 文を元 に戻すことはできません。RENAME TABLE 文が含まれているトランザク ションをロールバックした場合は、表にはその新規名が保存され、エ ラー・メッセージは出ません。♦ 参考資料 本書では、ALTER TABLE、CREATE TABLE、DROP TABLE、および RENAME COLUMN 文を参照してください。 構文 7-249 REPAIR TABLE REPAIR TABLE 目的 REPAIR TABLE 文は、電源障害、コンピューター・クラッシュ、その他の予 期しないプログラム停止などが原因で、損傷を受けたかまたは破壊された 可能性のある表インデックスを削除および再作成するために使用します。 損傷を受けたと判明した表のみが再作成されます。REPAIR TABLE 文を使用 する必要があるかどうかを判別するには、最初に CHECK TABLE 文を出しま す。 構文 SE DB ISQL + REPAIR TABLE 表名 7-440 ページ 使用法 インデックス・ファイルの整合性を復元したい表の名前を指定します。例 : REPAIR TABLE cust_calls 表を所有していない場合 や、データベースに対する DBA アクセス権を持っ ていない場合は、その表に対して REPAIR TABLE 文を使用することはできま せん。データベースに対する DBA アクセス権を持っていない場合は、 systables システム・カタログ表に対して REPAIR TABLE 文を使用することは できません。 REPAIR TABLE 文は bcheck ユーティリティーを呼び出します。bcheck の詳 細については、IBM Informix SE Administrator’s Guide を参照してください。 7-250 IBM Informix SQL リファレンス・ガイド 参考資料 参考資料 本書では、CHECK TABLE 文を参照してください。 IBM Informix SE Administrator’s Guide では、bcheck ユーティリティーの説明を 参照してください。 構文 7-251 REVOKE REVOKE 目的 REVOKE 文は、表、データベース、またはプロシージャーに関する他の ユーザーのアクセス権を取り去るために使用します。 構文 + REVOKE 表 レベル・ アクセス権 7-254 ページ ON 表名 7-440 ページ ビュー名 7-444 ページ FROM PUBLIC , < ユーザー> シノニム 名 7-438 ページ EXECUTE ON プロシー ジャー名 7-429 ページ データベース・ レベル・ アクセス権 7-256 ページ < ユーザー > アクセス権が取り消されるユーザー ( 複数の場合もある ) を 指名します。PUBLIC キーワードはすべてのユーザーからア クセス権を取り消します。 使用法 REVOKE 文を GRANT 文と一緒に使用して、データベースの修正、表データ のアクセスや修正などを行うためのユーザー権限を細かく制御することが できます。 7-252 IBM Informix SQL リファレンス・ガイド 使用法 他のユーザーに付与したアクセス権のすべてまたは一部を取り消すことが できます。他のユーザーが付与したアクセス権は、だれも取り消すことは できません。ただし、WITH GRANT OPTION キーワードを使用して付与した アクセス権を < ユーザー > から取り消したい場合は、その < ユーザー > に よって付与されたアクセス権のチェーンを切断することができます。この 場合、< ユーザー > からアクセス権を取り消すと、< ユーザー > またはそ の < ユーザー > が作成したチェーンから受け取ったすべてのユーザーのア クセス権が自動的に取り消されます。 あるユーザーからストアード・プロシージャーに対する EXECUTE アクセス 権を取り消すと、そのユーザーは、EXECUTE PROCEDURE または CALL 文を 使用してそのストアード・プロシージャーを実行できなくなります。 ユーザーは自分自身からアクセス権を取り消すことはできません。 SE ROLLBACK WORK を使用して、正常に実行された REVOKE 文を元に戻すこ とはできません。REVOKE 文が含まれたトランザクションをロールバック した場合は、アクセス権がユーザーに付与されず、エラー・メッセージは 出ません。♦ 構文 7-253 表レベル・アクセス権 表レベル・アクセス権 表レベル・ アクセス権 ALL PRIVILEGES , INSERT DELETE SELECT UPDATE INDEX ALTER REFERENCES ある表レベル・アクセス権をユーザーから取り消すには、そのアクセス権 のすべての発生を取り消す必要があります。たとえば、2 人のユーザーが あるユーザーに同じアクセス権を付与している場合は、両方のユーザーが アクセス権を取り消さなければなりません。片方の権限授与者しかアクセ ス権を取り消さなかった場合、ユーザーは、もう一方の権限授与者から受 け取ったアクセス権を保持することになります。( データベース・サーバー は、各表レベル付与のレコードを syscolauth および systabauth システム・ カタログ表に保持します。) ある表所有者がアクセス権を PUBLIC に付与した場合、その表所有者は、 どのユーザーからもそのアクセス権を取り消すことはできません。たとえ ば、表所有者が Select アクセス権を PUBLIC に付与し、mary から Select ア クセス権を取り消そうとすると、REVOKE 文がエラーを生成します。Select アクセス権は PUBLIC に付与されたのであり、mary に付与されたわけでは ないため、そのアクセス権を mary から取り消すことはできません。(ISAM エラー番号 111、「レコードが見つかりません」は、表所有者が取り消そうとし ているアクセス権を表すレコードが、syscolauth および systabauth システ ム・カタログ表のどちらにも入っていないことを示しています。) 7-254 IBM Informix SQL リファレンス・ガイド 表レベル・アクセス権 表レベル・アクセス権の取り消しは、個別に行うことも、組み合わせて行 うこともできます。< ユーザー > から取り消すアクセス権に対応するキー ワードをリストしてください。それらのキーワードは、次のリストに記述 されています。ただし、GRANT 文と異なり、Select、Update、または References アクセス権を REVOKE 文の列名で修飾することはできません。つま り、特定の列に対するアクセス権を取り消すことはできません。 SELECT SELECT 文から取得したデータを表示する権限です。 UPDATE 列値を変更する権限です。 INSERT 行を挿入する権限です。 DELETE 行を削除する権限です。 INDEX 永久インデックスを作成する権限です。Index アクセス権を 利用するには、Resource アクセス権を持っていなければなり ません。(Connect アクセス権を持つユーザーは、だれでも一 時表のインデックスを作成できます。) ALTER 列の追加または削除、または列データ型の修正を行う権限で す。Alter アクセス権を利用するには、Resource アクセス権を 持っていなければなりません。 REFERENCES 参照制約の列を参照する権限です。References アクセス権を 利用するには、Resource アクセス権を持っていなければなり ません。( ただし、ALTER TABLE 文に参照制約を追加するこ とができます。この方法を使用する場合は、データベースに 対する Resource アクセス権を持っている必要はありません。 )Resource アクセス権を 1 つ以上の列に限定するには、それら をリストしてください。 ALL 先行のすべてのアクセス権です。PRIVILEGES キーワードはオ プションです。 次の例は、customer 表のすべてのユーザーから Index および Alter アクセス 権を取り消します。次にこれらのアクセス権は、個別にユーザー mary に 付与されます。 図 7-84 Index および Alter アクセス権の取り消しと付与 REVOKE INDEX, ALTER ON customer FROM PUBLIC GRANT INDEX, ALTER ON customer TO mary 構文 7-255 データベース・レベル・アクセス権 特定の列に対するアクセス権を取り消すことはできないため、あるユー ザーから Select、Update、または References アクセス権を取り消すと、表の すべての列に対するアクセス権を取り消すことになります。ユーザーに提 供する必要がある列固有のアクセス権を個別に付与し直すには、GRANT 文 を使用する必要があります。 図 7-85 列固有のアクセス権の付与し直し REVOKE ALL ON customer FROM PUBLIC GRANT ALL ON customer TO john, cathy GRANT SELECT (fname, lname, company, city) ON customer TO PUBLIC データベース・レベル・ アクセス権 データベース・ レベル・ アクセス権 CONNECT RESOURCE DBA DBA アクセス権を持つユーザーのみが、データベース・レベル・アクセス 権を付与または取り消すことができます。 アクセス権を制御するデータベース・アクセス権には 3 つのレベルがあり ます。それらのアクセス権レベルは、低いほうから高いほうへ、Connect、 Resource、および DBA です。データベース・アクセス権を取り消すには、 CONNECT、RESOURCE、または DBA のいずれかを REVOKE 文に指定しま す。 アクセス権の階層構成 ( 後述のアクセス権定義の項を参照 ) が原因で、DBA アクセス権を持つユーザーから Resource または Connect アクセス権を取り 消しても、その文は効果がありません。DBA アクセス権を持つユーザーか ら DBA アクセス権を取り消した場合は、そのユーザーはデータベースに対 する Connect アクセス権を保持します。DBA または Resource アクセス権を 持つユーザーがデータベース・アクセスを行えないようにするには、まず、 DBA または Resource アクセス権を取り消し、次に、別個の REVOKE 文の Connect アクセス権を取り消します。 7-256 IBM Informix SQL リファレンス・ガイド データベース・レベル・アクセス権 同様に、Resource アクセス権を持つユーザーから Connect アクセス権を取 り消しても、その文は効果がありません。Resource アクセス権を持つユー ザーから Resource アクセス権を取り消すと、そのユーザーはデータベース に対する Connect アクセス権を保持します。 次のキーワードには、3 つのデータベース・アクセス権が関連付けられて います。 CONNECT Connect アクセス権はデータの照会と修正を行えるようにし ます。修正したいオブジェクトを所有している場合は、デー タベース・スキーマを修正することができます。Connect ア クセス権を持つユーザーは、だれでも以下の機能を実行でき ます。 ! ユーザーが必要な表レベル・アクセス権を持ってい る場合、SELECT、INSERT、UPDATE、および DELETE 文を実行する。 ! ユーザーが基礎表に対する Select アクセス権を持っ ている場合、ビューを作成する。 ! シノニムを作成する。 ! 一時表を作成し、一時表のインデックスを作成する。 ! ユーザーが表またはインデックス ( または表の Alter、 Index、または References アクセス権 ) を所有してい る場合、表またはインデックスを修正または削除す る。 ! ユーザーが表を所有している場合 ( または WITH GRANT OPTION キーワードによる表のアクセス権を付 与されている場合 ) 、表に対するアクセス権を付与 する。 RESOURCE Resource アクセス権はデータベースの構造体を拡張できるよ うにします。Connect アクセス権の機能に加え、Resource ア クセス権の所有者は以下のことも行えます。 ! 新規表を作成する。 ! 新規インデックスを作成する。 ! 新規プロシージャーを作成する。 構文 7-257 参考資料 DBA Resource アクセス権の機能に加え、DBA アクセス権の所有者 は以下のことも行えます。 ! DBA アクセス権を含め、すべてのアクセス権を他の ユーザーに付与する。 ! NEXT SIZE キーワードを使用して、システム・カタロ グのサイズを変更する。 SE ! systables 以外のすべてのシステム・カタログ表の行 を挿入、削除、または更新する。 ! 所有者には関係なく、すべてのオブジェクトを削除 する。 ! 表、ビュー、およびインデックスを作成し、他の ユーザーをオブジェクトの所有者として指定する。 ! DROP DATABASE コマンドを実行する。 ! START DATABASE および ROLLFORWARD DATABASE コ マンドを実行する。♦ ヒント : ユーザー informix を使用すればシステム・カタログ表を修正でき ますが、システム・カタログ表の行を更新、削除、または変更しないこと を強くお勧めします。システム・カタログ表に修正を加えると、データ ベースの整合性が壊れる場合があります。 参考資料 本書では、GRANT 文を参照してください。 IBM Informix SQL チュートリアル・ガイド では、アクセス権とセキュリティー の説明を参照してください。 7-258 IBM Informix SQL リファレンス・ガイド ROLLBACK WORK ROLLBACK WORK 目的 ROLLBACK WORK 文は、トランザクションをキャンセルし、トランザク ションの開始以降に行われたすべての変更を元に戻すために使用します。 構文 ROLLBACK WORK 使用法 ROLLBACK WORK 文はトランザクション付きデータベースでのみ有効です。 ANSI 準拠でないデータベースでは、BEGIN WORK 文でトランザクションを 開始してください。トランザクションを終了させるには COMMIT WORK 文 を使用し、トランザクションをキャンセルするには ROLLBACK WORK 文を 使用します。ROLLBACK WORK 文は、データベースをトランザクション開 始前の状態に復元します。 ROLLBACK WORK 文は、キャンセルしたトランザクションによって設定さ れているすべての行および表をアンロックします。保留中のトランザク ションがないときに ROLLBACK WORK 文を出すと、エラーが発生します。 ANSI ANSI 準拠データベースでは、トランザクションは暗黙的です。トランザク ションは、各 COMMIT WORK または ROLLBACK WORK 文の後で開始されま す。保留中のトランザクションがないときに ROLLBACK WORK 文を出した 場合は、この文は受け入れられますが、それには効果がありません。♦ 構文 7-259 参考資料 SE IBM Informix SE を使用する場合は、ROLLBACK WORK 文は、GRANT または REVOKE 文、あるいはデータ定義文によって行われたデータベース変更を 除く、すべてのデータベース変更を元に戻します。データ定義文は単一ト ランザクションとして扱われます。データ定義文が正常に実行された場合 は、それらは自動的にコミットされ、ROLLBACK WORK 文でロールバック することはできません。データ定義文には、表の数、名前、またはイン デックスを修正する文、および列の数、名前、またはデータ型を修正する 文が含まれています。 あるトランザクションをロールバックすると、そのトランザクションを元 に戻すために実行されたアクションも表更新記録にログ記録されます ( 表 更新記録が存在する場合 )。♦ I4GL ROLLBACK WORK 文は、保留として宣言されたカーソルを除く、すべての ESQL オープン・カーソルをクローズします。保留として宣言されたカーソルは、 トランザクションの動作に関係なく、オープン状態になっています。♦ I4GL FOREACH ループ内で ROLLBACK WORK 文を使用しないでください。♦ ESQL WHENEVER 文によって呼び出されたルーチン内で ROLLBACK WORK 文を使 用する場合は、ROLLBACK WORK 文の前で WHENEVER SQLERROR CONTINUE および WHENEVER SQLWARNING CONTINUE を指定してください。 こうすることで、ROLLBACK WORK 文にエラーまたは警告が発生した場合 に、プログラムのループを回避することができます。♦ 参考資料 本書では、BEGIN WORK および COMMIT WORK 文を参照してください。 4GL を使用している場合は、アプリケーション開発支援ツールのマニュア ルで、FOREACH および WHENEVER 文を参照してください。 IBM Informix SQL チュートリアル・ガイド では、ROLLBACK WORK の説明を参 照してください。 7-260 IBM Informix SQL リファレンス・ガイド ROLLFORWARD DATABASE ROLLFORWARD DATABASE 目的 ROLLFORWARD DATABASE は、トランザクション・ログ・ファイルを復元 済みデータベースに適用するために IBM Informix SE データベース・サー バーで使用します。 構文 SE + ROLLFORWARD DATABASE データ ベース名 7-367 ページ 使用法 データベースを復元するには、データベースのアーカイブ・コピーと、 アーカイブ・コピーを作成した直後に開始されたトランザクション・ログ の両方が必要です。 ROLLFORWARD DATABASE 文を実行するには、DBA アクセス権が必要です。 常に ROLLFORWARD DATABASE 文の前に CLOSE DATABASE 文を入れてくだ さい。データベースがオープンしていると、ROLLFORWARD DATABASE 文 は失敗します。 ROLLFORWARD DATABASE 文は、他のプロセスによるアクセスを防止する ために排他ロックをデータベースに設定します。別のプロセスがデータ ベースを使用している場合は ( データベースを読み取っているだけの場合 でも )、ROLLFORWARD DATABASE 文は失敗します。 ROLLFORWARD DATABASE 文が実行された後、データベースはロックされ たままになります。このため、ユーザーはエラーを調べてから他のユー ザーにアクセス権を与えることができます。データベースが使用できる状 態になっていることを確認したら、CLOSE DATABASE 文を実行して、排他 ロックをアンロックしてください。DATABASE 文でデータベースをオープ ンすることができます。 構文 7-261 参考資料 INET IBM Informix NET を使用している場合は、データベース・サーバーから ROLLFORWARD DATABASE 文を出してください。この文はクライアントか らは実行できません。♦ 参考資料 本書では、BEGIN WORK、COMMIT WORK、CLOSE DATABASE、DATABASE、 および ROLLBACK WORK 文を参照してください。 IBM Informix SQL チュートリアル・ガイド では、アーカイブとログの説明を参 照してください。 7-262 IBM Informix SQL リファレンス・ガイド SELECT SELECT 目的 SELECT は、データベースを照会するために使用します。 構文 UNION UNION ALL SELECT 選択リスト 7-265 ページ FROM 節 7-274 ページ I4GL ESQL SPL WHERE 節 7-276 ページ INTO 節 7-270 ページ GROUP BY 節 7-284 ページ HAVING 節 7-286 ページ + ORDER BY 節 7-288 ページ INTO TEMP 節 7-290 ページ 使用法 現行のデータベースの表または現行でないデータベースの表を照会するこ とができます。 構文 7-263 使用法 STAR SE 現行データベースと異なるデータベース・サーバー上のデータベースの表 を照会することができます。♦ 現行のデータベースのみを照会することができます。♦ SELECT 文は、8 つの基本部分からなっています。各部分を以下にリスト し、それぞれについて次ページ以降で詳しく説明します。 I4GL SELECT 節 データベースから読み取る項目のリストを指名します。 INTO 節 選択したデータを受け取るプログラム変数またはホス ト変数を指定します。♦ FROM 節 選択した列を含む表を指名します。 WHERE 節 選択した行に対して条件を設定します。 GROUP BY 節 行グループを要約結果に結合します。 HAVING 節 要約結果に対して条件を設定します。 ORDER BY 節 選択した行を整列します。 INTO TEMP 節 現行データベースに一時表を作成し、照会の結果をそ の表に入れます。 ESQL SPL 7-264 IBM Informix SQL リファレンス・ガイド SELECT 節 SELECT 節 SELECT 節には、以下の図に示されているように、SELECT キーワードと選 択されたオブジェクトのリストが含まれています。 選択 リスト SELECT , 選択 リスト 式 7-375 ページ ALL + DISTINCT < 表示 ラベル > AS UNIQUE * 表名 7-440 ページ . ビュー名 7-444 ページ . シノニム名 7-438 ページ . < 表示 ラベル > 式に割り当てられる一時的な名前です。 SELECT 節では、どのデータを選択するか、および重複した値を省略するか どうかを正確に指定してください。 構文 7-265 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) 選択リストの式 式の 4 つの基本型 ( 列、定数、関数、および集計関数 ) のいずれか、または 組み合わせを選択リストで使用できます。この 4 つの式型の詳しい説明が、 7-375 ページの『式』のセクションに記載されています。 以下のセクションでは、それぞれの単純式の型を選択リストで使用する例 を示します。 いくつかの単純数値式を結合するには、それらを加算、減算、乗算、およ び除算の算術演算子で接続します。ただし、列式と集計関数を結合する場 合は、列式を GROUP BY 節にインクルードする必要があります。 7-266 IBM Informix SQL リファレンス・ガイド SELECT 節 列の選択 列式は、SELECT 文で最もよく使用される式です。列式の構文と使用法の詳 しい説明については、7-378 ページの『列式』を参照してください。 選択リスト内の列式の例を次に示します。 図 7-86 選択リスト内の列式 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 定数の選択 定数式を選択リストにインクルードすると、照会によって戻された各行ご とに同じ値が戻されます。定数式の構文と使用法の詳しい説明については、 7-380 ページの『定数式』を参照してください。 選択リスト内の定数式の例を次に示します。 図 7-87 選択リスト内の定数式 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 関数式の選択 関数式は、照会の各行について評価する関数を使用する式です。すべての 関数式には引数が必要です。このセットの式には、列名を引数として使用 した時刻関数と長さ関数が含まれています。 選択リスト内の関数式の例をいくつか次に示します。 構文 7-267 SELECT 節 図 7-88 選択リスト内の関数式 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 集計関数の選択 集計関数は照会した行のセットにつき 1 つの値を戻します。集計関数は、 SELECT 文の WHERE 節によって戻された行のセットに依存する値を使用し ます。WHERE 節がない場合は、集計関数は、FROM 節によって書式化され たすべての行に依存する値を使用します。 選択リスト内の集計関数の例をいくつか次に示します。 図 7-89 選択リスト内の集計関数 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 算術演算子を使用する式の選択 数値式と算術演算子を結合して複雑な式を作成することができます。集計 関数が含まれている式と列式を結合することはできません。次の例は、選 択リスト内で算術演算子を使用する式を示しています。 図 7-90 選択リスト内で算術演算子を使用する式 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 7-268 IBM Informix SQL リファレンス・ガイド SELECT 節 表示ラベルの使用 一時表を作成する場合は、単純列式でないすべての列について、表示ラベ ルを提供する必要があります。表示ラベルは、一時表内の列の名前として 使用されます。 DB SELECT 文の出力では、表示ラベルはその列の見出しとして表示されま す。♦ ISQL ESQL < 表示ラベル > の値は、sqlda 構造体の sqlname フィールドに格納されま す。sqlda 構造体の詳細については、本書の第 6 章を参照してください。♦ ビューを作成するときに SELECT 文を使用する場合は、表示ラベルを使用 しないでください。代わりに、必要なラベル名を CREATE VIEW 列リストに 指定してください。 AS キーワードの使用 表示ラベルもキーワードであれば、AS キーワードを表示ラベルと一緒に使 用して、語の使用を明確にすることができます。UNITS、YEAR、MONTH、 DAY、HOUR、MINUTE、SECOND、または FRACTION の各単語を表示ラベル として使用したい場合は、AS キーワードをこの表示ラベルと一緒に使用し てください。次の例は、AS キーワードを使用して、minute を表示ラベルと して使用する方法を示しています。 SELECT call_dtime AS minute FROM cust_calls 構文 7-269 INTO 節 INTO 節 INTO 節は、SELECT 文によって検索されたデータを受け取るためのプログ ラム変数とホスト変数を指定するために使用します。INTO 節の構文は次の とおりです。 INTO 節 , INTO < データ変数 > ESQL + INDICATOR < データ 変数 > :< 標識変数 > < 標識変数 > 型と順序が選択リスト内の対応する列または式と一致するプ ログラム変数またはホスト・オブジェクトです。 < 標識変数 > 対応する < データ変数 > に NULL データが入れられた場合 に戻りコードを受け取る、プログラム変数です。 SELECT 文がスタンドアロンの場合、つまり、DECLARE 分の一部でなく、 INTO 節を使用していない場合は、単一の SELECT 文でなければなりません。 単一の SELECT 文は 1 つの行しか戻しません。次の例は、IBM Informix 4GL における単一の SELECT を示しています。 図 7-91 IBM Informix 4GL における単一の SELECT 文 SELECT fname, lname, company_name INTO p_fname, p_lname, p_coname WHERE customer_num = 101 標識変数を持つ INTO 節 SELECT 文から戻されたデータが NULL である可能性がある場合は、標識変 数を使用してください。標識変数の詳細については、埋め込み言語製品の マニュアルを参照してください。 7-270 IBM Informix SQL リファレンス・ガイド INTO 節 カーソルを持つ INTO 節 SELECT 文が複数行を戻した場合は、カーソルを使用して、一度に 1 行ずつ FETCH する必要があります。INTO 節を、SELECT 文ではなく、FETCH 文に 含めることができますが、両方の文に含めることはできません。 次の IBM Informix 4GL コード・フラグメントは、両方とも同等です。 図 7-92 IBM Informix 4GL プログラムにおける SELECT の INTO 節の使用 DECLARE q_curs CURSOR FOR SELECT lname, company INTO p_lname, p_company FROM customer OPEN q_curs WHILE status = 0 FETCH q_curs ... END WHILE CLOSE q_curs 図 7-93 IBM Informix 4GL プログラムにおける FETCH の INTO 節の使用 DECLARE q_curs CURSOR FOR SELECT lname, company FROM customer OPEN q_curs WHILE status = 0 FETCH q_curs INTO p_lname, p_company ... END WHILE CLOSE q_curs I4GL 4GL では、FETCH、OPEN、および CLOSE 文の代わりに、FOREACH 文を使用 することができます。 次の IBM Informix 4GL コード・フラグメントは、上記の 2 つの例と同じタス クを実行します。ただしこの場合は、IBM Informix 4GL でのみ提供される FOREACH 文を使用します。 構文 7-271 INTO 節 図 7-94 IBM Informix 4GL における FOREACH の使用 DECLARE q_curs CURSOR FOR SELECT lname, company FROM customer FOREACH q_curs INTO p_lname, p_company ... END FOREACH ♦ SELECT...INTO 照会の PREPARE 文による処理 INTO 節を持つ照会を PREPARE 文で処理することはできません。INTO 節を 持たない照会を PREPARE 文で処理し、PREPARE 文で処理した照会に対し てカーソルを宣言し、そのカーソルをオープンしてから、INTO 節を持つ FETCH 文を使用して、カーソルをプログラム変数にフェッチするすること ができます。あるいは、最初に照会を PREPARE 文で処理しないで照会に 対するカーソルを宣言し、そのカーソルを宣言するときに INTO 節を照会に インクルードすることもできます。次に、カーソルをオープンし、FETCH 文の INTO 節を使用せずに、カーソルをフェッチします。 INTO 節を持つ配列変数の使用 INTO 節が含まれている SELECT 文と一緒に DECLARE 文を使用し、かつプロ グラム変数が配列エレメントである場合は、個々の配列エレメントを整定 数または変数で識別することができます。文字部分列として使用する変数 の値はカーソルを宣言するときに決定されるため、一度宣言すれば、文字 部分列変数は定数として働きます。 たとえば、次の IBM Informix 4GL コード・フラグメントは、i および j 変数を a 配列として使用して、SELECT...INTO のカーソルを宣言します。カーソル を宣言すれば、SELECT 文の INTO 節は、INTO a[5], a[2] と同等になります。 図 7-95 IBM Informix 4GL における SELECT...INTO 文のカーソルの宣言 LET i = 5 LET j = 2 DECLARE c CURSOR FOR SELECT order_num, po_num INTO a[i], a[j] FROM orders WHERE order_num =1005 AND po_num =2865 また、FETCH 文でプログラム変数を使用して、INTO 節でプログラム配列エ レメントを指定することもできます。FETCH 文の場合、プログラム変数は、 カーソルの宣言時ではなく、各フェッチ時に評価されます。 7-272 IBM Informix SQL リファレンス・ガイド INTO 節 I4GL また、FOREACH 文でプログラム変数を使用して、INTO 節でプログラム配列 エレメントを指定することもできます。プログラム変数は、カーソルの宣 言時ではなく、FOREACH 文の各ループで評価されます。♦ エラー検査 INTO 節にリストされた変数の数と SELECT 節内の項目の数が異なる場合は、 SQLWARN 構造体に警告が戻されます。特定の構造体名が次の図に示されて います。転送された変数の数は、この 2 つの数のうち小さいほうの値です。 SQLWARN 構造体については、本書の第 5 章を参照してください。 ANSI 4GL ESQL/C ESQL/COBOL SQLCA.SQLAWARN[4] sqlca.sqlwarn.sqlwarn3 SQLWARN3 OF SQLWARN OF SQLCA INTO 節にリストされた変数の数と SELECT 節内の項目の数が異なる場合は、 エラーが戻されます。♦ 受け取る変数のデータ型と選択した項目のデータ型が一致しない場合は、 変換が可能であれば、選択した項目のデータ型が変換されます。変換が可 能でなければ、エラーが発生し、負の値が状態変数に戻されます。この場 合、プログラム変数の値は予測できません。各アプリケーション開発支援 ツールの状態変数の特定名が、次の図に示されています。 4GL ESQL/C ESQL/COBOL STATUS SQLCA.SQLCODE sqlca.sqlcode SQLCODE SQLCODE OF SQLCA 構文 7-273 FROM 節 FROM 節 FROM 節は、データを選択する元の表 ( 複数の場合もある ) をリストしま す。次の図は、FROM 節の構文を示しています。 表名 7-440 ページ FROM , < 表の 別名 > ビュー名 7-444 ページ 追加表 AS シノニム名 7-438 ページ 追加表 , 表名 7-440 ページ < 表の 別名 > ビュー名 7-444 ページ + AS シノニム名 7-438 ページ 表名 7-440 ページ OUTER < 表の 別名 > ビュー名 7-444 ページ AS シノニム名 7-438 ページ OUTER ( 表名 7-440 ページ ビュー名 7-444 ページ シノニム名 7-438 ページ 7-274 IBM Informix SQL リファレンス・ガイド ) < 表の 別名 > AS , 追加表 FROM 節 < 表の別名 > SELECT 文の範囲内で表に関連付けられる名前です。 OUTER キーワードを使用して外部結合を形成します。外部結合は、そうで ない場合に単純結合によって廃棄される行を保存します。外部結合の詳細 については、IBM Informix SQL チュートリアル・ガイド を参照してください。 表名として別名を指定することができます。その別名を使用して、SELECT 文の他の節に含まれている表を参照することができます。これは特にセル フ結合の場合に有効です。( セルフ結合の詳細については、7-276 ページの WHERE 節を参照してください。) I4GL FROM 節で指定できる表の別名は、フォーム仕様ファイルの TABLES セク ションで時々必要になることがある、表の別名とは明確に区別されます。♦ ISQL 次の例は、FROM 節の代表的な使用法を示しています。最初の照会では、 customer 表からすべての列と行を選択します。2 番目の照会では、 customer 表と orders 表の結合を使用して、発注したすべての顧客を選択し ます。 図 7-96 FROM 節の代表的な使用 SELECT * FROM customer SELECT fname, lname, order_num FROM customer, orders WHERE customer.customer_num = orders.customer_num 次の例は、上例の 2 番目の照会と同じです。ただしこの例は、表の別名を FROM 節に確立し、それらを WHERE 節で使用している点が異なります。 図 7-97 表の別名の確立と使用 SELECT fname, lname, order_num FROM customer c, orders o WHERE c.customer_num = o.customer_num 次の例は、OUTER キーワードを使用して、外部結合を作成し、顧客が発注 したかどうかに関係なく、すべての顧客とその発注内容のリストを作成し ます。 図 7-98 外部結合の作成 SELECT customer.customer_num, lname, order_num FROM customer c, OUTER orders o WHERE c.customer_num = o.customer_num 構文 7-275 WHERE 節 表の別名を持つ AS キーワード 潜在的にあいまいな語を表の別名として使用するには、その語の前に AS キーワードを付けます。ORDER、FOR、GROUP、HAVING、INTO、UNION、 WHERE、WITH、CREATE、または GRANT の各用語を表の別名として使用し たい場合は、AS キーワードを使用してください。 WHERE 節 WHERE 節は、選択するデータに対する検索基準と結合条件を指定するため に使用します。 AND WHERE 条件 7-350 ページ 結合 7-282 ページ WHERE 節での条件の使用 WHERE 節では、次の 5 種類の単純条件または比較を使用できます。 ! 関係演算子条件 ! BETWEEN ! IN ! IS NULL ! LIKE または MATCHES 7-276 IBM Informix SQL リファレンス・ガイド WHERE 節 また、WHERE 節内で SELECT 文を使用することもできます。これは副照会 と呼ばれます。副照会 WHERE 節としては、次の 3 種類があります。 ! IN ! EXISTS ! ALL/ANY/SOME それぞれの型の条件の例が以下のセクションで示されています。それぞれ の種類の条件について詳しくは、7-350 ページの条件セクションを参照して ください。 集計関数が副照会の一部でない限り、それを WHERE 節で使用することはで きません。 関係演算子条件 関係演算子条件の詳しい説明については、7-353 ページを参照してくださ い。 関係演算子条件が満たされるのは、関係演算子の両サイドの式が、演算子 によって設定された関係を満たしたときです。次の SELECT 文は、より大 (>) および等しい (=) 関係演算子を使用しています。 図 7-99 関係演算子条件の例 SELECT order_num FROM orders WHERE order_date > "6/04/91" SELECT fname, lname, company FROM customer WHERE city[1,3] = "San" BETWEEN 条件 BETWEEN 条件の詳しい説明については、7-354 ページを参照してください。 BETWEEN 条件が満たされるのは、BETWEEN キーワードの左側にある値が、 BETWEEN キーワードの右側にある 2 つの値の包括的範囲内にあるときで す。次の例の最初の照会は、BETWEEN キーワードの後で定数値を使用しま す。3 番目の照会は、CURRENT 関数とリテラル間隔を使用します。この照 会は現在日と 7 日前との間の日付を探します。 構文 7-277 WHERE 節 図 7-100 BETWEEN 条件の例 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/90" AND "9/1/90" SELECT * FROM cust_calls WHERE call_dtime BETWEEN (CURRENT - INTERVAL(7) DAY TO DAY) AND CURRENT IN 条件 IN 条件の詳しい説明については、7-355 ページを参照してください。 IN 条件が満たされるのは、IN キーワードの左側にある式が、このキーワー ドの右側にある値のリストにインクルードされているときです。 図 7-101 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 条件 IS NULL 条件の詳しい説明については、7-356 ページを参照してください。 IS NULL 条件が満たされるのは、この条件に NULL 値が含まれているときで す。NOT オプションを使用した場合にこの条件が満たされるのは、列に非 NULL 値が含まれているときです。次の例は、注文代金が支払われた注文 番号と顧客番号を選択します。 図 7-102 IS NULL 条件の例 SELECT order_num, customer_num FROM orders WHERE paid_date IS NULL LIKE または MATCHES 条件 LIKE または MATCHES 条件の詳しい説明については、7-357 ページを参照し てください。 7-278 IBM Informix SQL リファレンス・ガイド WHERE 節 LIKE または MATCHES 条件が満たされるのは、列値が、引用符付きストリ ングに指定された基準を満たしたときです。 次の SELECT 文は、lname 列がリテラル・ストリング "Baxter" で始まってい る各行から、customer 表内のすべての列を戻します。このストリングはリ テラル・ストリングであるため、条件には大文字と小文字の区別がありま す。 SELECT * FROM customer WHERE lname LIKE "Baxter%" 次の例は、ワイルドカードで LIKE 条件を使用します。最初の SELECT 文 は、何らかの種類のボールであるすべての在庫品目を検索します。2 番目 の SELECT 文は、% 記号が入っているすべての会社名を検索します。バッ クスラッシュは、ワイルドカード "%" の標準エスケープ文字として使用さ れています。3 番目の SELECT 文は、LIKE 条件を指定した ESCAPE オプショ ンを使用して、company 列に % 記号が含まれている customer 表から行を 検索します。z は、ワイルドカード "%" のエスケープ文字として使用されて います。 図 7-103 LIKE 条件の例 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" 次の例は、ワイルドカードを持つ MATCHES を使用します。最初の SELECT 文は、何らかの種類のボールであるすべての在庫品目を検索します。2 番 目の SELECT 文は、アスタリスクが入っているすべての会社名を検索しま す。バックスラッシュは、ワイルドカード "*" の標準エスケープ文字として 使用されています。3 番目の文は、MATCHES 条件を指定した ESCAPE オプ ションを使用して、company 列にアスタリスクが含まれている customer 表 から行を検索します。z 文字は、ワイルドカード "*" のエスケープ文字とし て使用されています。 構文 7-279 WHERE 節 図 7-104 MATCHES 条件の例 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" IN 副照会 IN 副照会の詳しい説明については、7-355 ページを参照してください。 IN 副照会では、複数行を戻すことができますが、1 つの列しか戻すことが できません。次の例は、SELECT 文での IN 副照会の使用法を示しています。 図 7-105 IN 副照会の例 SELECT DISTINCT customer_num FROM orders WHERE order_num NOT IN (SELECT order_num FROM items WHERE stock_num = 1) EXISTS 副照会 EXISTS 副照会の詳しい説明については、7-361 ページを参照してください。 EXISTS 副照会では、1 つ以上の列を戻すことができます。 EXISTS 副照会を指定した次の SELECT 文は、注文がなかった ( したがって、 items 表にリストされていない ) すべての品目の在庫番号と製造者コードを 戻します。items の stock_num と manu_code の両方を調べるには相関副照 会が必要であるため、この SELECT 文では EXISTS を使用することをお勧め します。 図 7-106 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) 上の例では 1 つの行または複数の行を調べているため、この副照会では、 列名の代わりに、SELECT * を使用することもできます。 7-280 IBM Informix SQL リファレンス・ガイド WHERE 節 ALL/ANY/SOME 副照会 ALL/ANY/SOME 副照会の詳しい説明については、7-362 ページを参照してく ださい。 次の例の最初の SELECT 文は、注文番号 1023 のすべての品目の合計価格よ りも大きな合計価格を持つ品目が含まれている、すべての注文の注文番号 を戻します。2 番目の SELECT 文は、MAX 集計関数を使用して同じ結果を出 しますが、こちらのほうが実行が速くなります。 図 7-107 ALL 副照会および同等の集合副照会の例 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 の少なくとも 1 つの品目の合計価格より も大きな合計価格を持つ品目が含まれているすべての注文の注文番号を戻 します。最初の文は ANY キーワードを使用し、2 番目の文は MIN 集計関数 を使用します。 図 7-108 ANY 副照会および同等の集合副照会の例 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) 副照会が正確に 1 つの値だけを戻すことが分かっている場合は、その副照 会で ANY、ALL、または SOME キーワードを省略することができます。 ANY、ALL、または SOME を省略し、副照会が複数の値を戻した場合は、エ ラーになります。次の例の副照会は集計関数を使用しているので、1 行し か戻しません。 図 7-109 ANY、ALL、または SOME キーワードを省略した副照会の例 SELECT order_num FROM items WHERE stock_num = 9 AND quantity = (SELECT MAX(quantity) FROM items WHERE stock_num = 9) 構文 7-281 WHERE 節 WHERE 節での結合の使用 WHERE 節で、 ある表の少なくとも 1 つの列と別の表の少なくとも 1 つの列 の間の関係を作成する場合、2 つの表を結合します。結合すると、 一時複合表 が作成されます。この表では、結合条件を満たすそれぞれの行のペア ( それ ぞれの表から 1 行ずつ ) がリンクされて、1 つの行を形成しています。 2 表結 合、複数表結合、およびセルフ結合を作成できます。 次の図は結合の構文を示しています。 結合 .< 列名 > 表名 7-440 ページ 関係型 演算子 7-434 ページ < 別名 > . < 列名 > 表名 7-440 ページ < 別名 > ビュー名 7-444 ページ ビュー名 7-444 ページ シノニム名 7-438 ページ シノニム名 7-438 ページ < 別名 > FROM 節で割り当てられた別名です。 < 列名 > いずれかの表内の列の名前です。 2 表結合 次の例は 2 表結合を示しています。 図 7-110 2 表結合の例 SELECT order_num, lname, fname FROM customer, orders WHERE customer.customer_num = orders.customer_num ただし、2 表が結合された列を選択する必要はありません。 7-282 IBM Informix SQL リファレンス・ガイド WHERE 節 複数表結合 複数表結合は 3 表以上の結合です。 その構造は 2 表結合の構造と類似してい ますが、WHERE 節で複数ペアの表に対する結合条件を持つ点が異なります。 他の表の列が同じ名前を持っている場合は、それらを区別するために、 その 名前の前にそれと関連する表名または表別名を入れる必要があります ( た とえば、table.column)。 表名の構文については、7-440 ページの『表名』 を参照 してください。 次の複数表結合は、品目を注文した顧客の会社名のほか、その品目の在庫 番号と製造者コードも作成します。 図 7-111 複数表結合の例 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 セルフ結合 表をそれ自身と結合することができます。そのためには、FROM 節で表名 を 2 回リストして、それに 2 つの異なる表別名を割り当てる必要がありま す。これらの別名を使用して、WHERE 節内の “2 つ ” の表を参照します。 次の例は、stock 表でのセルフ結合を示しています。この例は、単価を 2.5 倍したものより大きな単価の在庫品目のペアを検索します。x および y 文 字は、stock 表のそれぞれの別名です。 図 7-112 セルフ結合の例 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 外部結合 次の外部結合は、顧客から注文があった場合に、顧客の会社名と、関連す る注文番号をすべてリストします。注文がなかった場合は、会社名は引き 続きリストされますが、注文番号として NULL 値が戻されます。 構文 7-283 GROUP BY 節 図 7-113 外部結合の例 SELECT company, order_num FROM customer c, OUTER orders o WHERE c.customer_num = o.customer_num 外部結合の詳細については、IBM Informix SQL チュートリアル・ガイド を参照 してください。 GROUP BY 節 GROUP BY 節は、各グループごとに単一の結果行を作成するために使用し ます。グループとは、リストされた各列の値が同じである行のセットです。 , GROUP BY < 列名 > + < 列名 > 表名 7-440 ページ . ビュー名 7-444 ページ . シノニム名 7-438 ページ . < 選択番号 > 列の名前、または SELECT 節の中の関係演算子によって結合 された一組の列の名前です。BYTE 型または TEXT 型の列をイ ンクルードしないでください。 < 選択番号 > SELECT 節の中の列または式の配置を表す整数です。 GROUP BY 節を使用すると、SELECT 節に入力できるデータが制限されます。 GROUP BY 節を使用する場合は、選択した各列を GROUP BY リストに入れな ければなりません。集計関数と 1 つ以上の列式を選択リストで使用する場 合は、集合式または時刻式の一部として使用しない、すべての列名を GROUP BY 節に含めなければなりません。定数式または BYTE または TEXT 列式を GROUP BY リストに含めないでください。BYTE または TEXT 列を選 択した場合は、GROUP BY 節を使用することはできません。 7-284 IBM Informix SQL リファレンス・ガイド GROUP BY 節 次の例は、集計式に含まれていない 1 つの列を指名します。total_price 列 は集計関数の引数として現れるので、それを GROUP BY リストに含めない でください。COUNT および SUM キーワードは各グループに適用されます が、照会セット全体には適用されません。 図 7-114 GROUP BY 節の例 SELECT order_num, COUNT(*), SUM(total_price) FROM items GROUP BY order_num ある列が選択リストの列式でスタンドアロンであれば、それを GROUP BY 節で使用する必要があります。ある列が算術演算子で他の列と結合されて いる場合は、個々の列ごとにグループ化することも、選択番号を使用して 結合式ごとにグループ化することもできます。 選択番号の使用 GROUP BY 節で 1 つ以上の整数を使用して列式を表すことができます。次の 例の最初の SELECT 節は、GROUP BY の選択番号 order_date および paid_date - order_date を使用します。ただし、選択番号表記を使用する以 外に、結合式別にグループ化する方法はありません。2 番目の SELECT 節で は、2 と paid_date - order_date 式を置き換えることはできません。 図 7-115 GROUP BY 節での選択番号の例 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 選択番号 ( または列番号 ) が必要になるのは、UNION または UNION ALL キーワードによって SELECT 文が結合され、互換列の異なる名前が同じ位 置に現れている場合です。 GROUP BY 節の NULL GROUP BY 節によって指定された列に NULL 値が入っている各行は、単一 のグループに属していると見なされます。つまり、すべての NULL 値が一 緒にグループ化されます。 構文 7-285 HAVING 節 HAVING 節 HAVING 節は、1 つ以上の限定条件をグループに適用するために使用しま す。 HAVING 条件 7-350 ページ 次の例では、それぞれの条件がグループの 1 つの計算済みプロパティーと、 グループの別の計算済みプロパティーまたは定数とを比較します。最初の SELECT 文は、計算済み式 COUNT(*) と定数 2 を比較する HAVING 節を使用 します。この照会は、3 品目以上のすべての注文に関する品目当たりの平 均合計価格を戻します。2 番目の SELECT 文は、顧客が同一月に 2 回以上電 話を掛けてきた場合の、顧客名と電話してきた月をリストします。 図 7-116 計算済み値を持つ HAVING 節の使用 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 ( 通年 フォーマット )、および cust_code を戻し、 それらを、120 より小さな customer_num を持つ顧客から掛かってきたすべての電話呼び出しについて call_code 別にグループ化します。 図 7-117 列値を持つ HAVING 節の使用 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 個以上の行が含まれている限り、表 内のすべての値の平均価格を戻します。 7-286 IBM Informix SQL リファレンス・ガイド HAVING 節 図 7-118 GROUP BY 節を持たない HAVING 節の使用 SELECT AVG(total_price) FROM items HAVING COUNT(*) > 10 構文 7-287 ORDER BY 節 ORDER BY 節 ORDER BY 節は、1 つ以上の列に含まれている値によって照会結果をソート するために使用します。 , ORDER BY < 列名 > 表名 7-440 ページ . ビュー名 7-444 ページ . シノニム名 7-438 ページ . ASC DESC < 選択番号 > < 表示ラベル > < 列名 > 照会結果をソートするための基準となる、SELECT 節の列の 名前です。 < 表示 ラベル > 選択リストの列または式に使用される表示ラベルです。 < 選択番号 > SELECT 節の中の列または式の配置を表す整数です。 SELECT 節で指定された列による整列、または列式が入っている式による整 列しか行うことができません。唯一の例外は集計関数です。集計関数は、 ORDER BY 節では使用できません。 次の照会は、orders 表から注文日と出荷日を明示的に選択し、照会を注文 日で整列します。デフォルトでは、照会結果は昇順で整列されます。 図 7-119 列を明示的に選択するときの ORDER BY 節の使用 SELECT order_date, ship_date FROM orders ORDER BY order_date 次の照会では、order_date 列が SELECT * によって暗黙的に選択されるた め、order_date を ORDER BY 節で使用することができます。 7-288 IBM Informix SQL リファレンス・ガイド ORDER BY 節 図 7-120 列を暗黙的に選択するときの ORDER BY 節の使用 SELECT * FROM orders ORDER BY order_date 導出列による整列 導出列で整列するには、次の例に示されているように、SELECT 節で表示ラ ベルを指定します。 図 7-121 導出列による整列 SELECT paid_date - ship_date span, customer_num FROM orders ORDER BY span 昇順および降順 ASC および DESC キーワードを使用して、昇順 ( 最小値から開始 ) または降 順 ( 最大値から開始 ) を指定することができます。デフォルトの順序は昇順 です。 DATE および DATETIME データ型の場合、 「最小」は時間的に最も早いこと を意味し、「最大」は時間的に最も遅いことを意味します。文字データ型の 場合は、ASCII 照合順序が使用されます。照合順序のリストについては、 7-435 ページを参照してください。 ORDER BY 節の NULL NULL 値の順序は非 NULL 値よりも小さくなります。ASC 順序を使用する と、NULL 値は非 NULL 値の前に来ます。DESC 順序を使用すると、NULL 値は最後になります。 入れ子にした整列 複数列を ORDER BY 節にリストすると、照会は多重ソートによって整列さ れます。ソートの第 1 レベルは最初の列に基づきます。2 番目の列は 2 次レ ベルのソートを決定します。たとえば、次の照会は、cust_calls 表内のすべ ての行を選択してから、それらを call_code 内で call_code および call_dtime によって整列します。 構文 7-289 INTO TEMP 節 図 7-122 多重ソート SELECT * FROM cust_calls ORDER BY call_code, call_dtime 選択番号の使用 列名の場所に、SELECT 節で項目位置を参照する 1 つ以上の整数を入力する ことができます。選択番号を使用して式別に整列することができます。た とえば、次の照会は、paid_date- order_date および customer_num 式別に整 列します。 図 7-123 多重ソートでの選択番号の使用 SELECT order_num, customer_num, paid_date - order_date FROM orders ORDER BY 3, 2 選択番号が ORDER BY 節で必要になるのは、SELECT 文を UNION または UNION ALL キーワードで結合する場合に、同じ位置の互換列が異なる名前 を持っているときです。 DECLARE による ORDER BY 節 I4GL ORDER BY 節を持つ SELECT 文にカーソルを関連付けるために、FOR UPDATE 節を持つ DECLARE 文を使用することはできません。♦ ESQL INTO TEMP 節 INTO TEMP < 一時表名 > WITH NO LOG < 一時表名 > 表の単純名です。7-440 ページの表名セグメントで説明されて いるどの拡張構文も使用することはできません。7-403 ペー ジの識別子セグメントで説明されている規則に従ってくださ い。 INTO TEMP 節は、照会結果が含まれている一時表を作成します。 7-290 IBM Informix SQL リファレンス・ガイド INTO TEMP 節 一時表は、常に、ルート DB 領域に配置されています。一時表の初期エク ステントと次のエクステントは、常に 8 ページです。 一時表が消失するのは、ユーザーのプログラムが終了したとき、または一 時表に対して DROP TABLE 文を出したときです。データベースがロギング を持っていない場合や、データベースはロギングを持っているが、WITH NO LOG キーワードを指定しないで一時表を作成した場合は、現行データ ベースをクローズしたときに一時表が消失します。 同じ照会結果を複数回使用する場合は、一時表が時間を節約します。さら に、INTO TEMP 節を使用すれば、多くの場合、より明確でより分かりやす い SELECT 文を作成することができます。ただし、一時表のデータは静的 になります。つまり、一時表を作成するために使用する表に変更を加えて も、そのデータは更新されません。 一時表の列名は、SELECT 節で指名された列名です。単純列式以外のすべて の式に対して表示ラベルを提供する必要があります。列または式の表示ラ ベルは、一時表では列名になります。列式に表示ラベルを提供しないと、 一時表は選択リストから取得した列名を使用します。たとえば、次の照会 は、2 つの列 customer_num および slowdate を持つ pushdate 表を作成しま す。 図 7-124 一時表の作成 SELECT customer_num, call_dtime + 5 UNITS DAY FROM cust_calls INTO TEMP pushdate 一時表にインデックスを書き込むことができます。 INTO TEMP 節および INTO I4GL ESQL INTO TEMP 節を持つ INTO オプションを使用しないでください。使用する と、プログラム変数に結果が戻されず、sqlcode 変数が負の値に設定されま す。各製品の sqlcode 変数が次に示されています。 4GL ESQL/C ESQL/COBOL STATUS SQLCA.SQLCODE sqlca.sqlcode SQLCODE SQLCODE OF SQLCA ♦ 構文 7-291 UNION 演算子 WITH NO LOG オプション WITH NO LOG キーワードを使用した場合は、一時表に対する操作はトラン ザクション・ログ操作にインクルードされません。このオプションを使用 して、トランザクション・ロギングのオーバーヘッドを削減することがで きます。 UNION 演算子 UNION 演算子を 2 つの SELECT 文の間に入れて、複数の照会を単一の照会 に結合します。UNION 演算子を使用して、複数の SELECT 文をまとめてス トリング化することができます。対応する項目は同じ名前でなくても構い ません。 結合した SELECT に対する制限 UNION 演算子に接続できる照会には、次のようないくつかの制限がありま す。 ! 各照会の SELECT 節に含まれる項目の数は同じでなければならず、 各 SELECT 節内の対応する項目は互換性のあるデータ型を持ってい なければならない。 ! ORDER BY 節を使用する場合、その節は、最後の SELECT 節の次に 配置しなければならず、識別子ではなく、整数によって整列され た、項目を参照しなければならない。整列操作は、設定操作が完了 した後に行われる。 I4GL ESQL ! 副照会の内部で、またはビューの定義で UNION 演算子を使用する ことはできない。 ! 複合照会が正確に 1 つの行を戻すということが確認でき、かつカー ソルを使用していない場合を除き、INTO 節を照会に使用すること はできない。この場合、INTO 節は、最初の SELECT 文に入っていな ければならない。♦ UNION 演算子の結果を一時表に入れるには、INTO TEMP 節を最後の SELECT 文に入れます。 ISQL 表示される列名は、最初の SELECT 文の列名または表示ラベルです。♦ 7-292 IBM Informix SQL リファレンス・ガイド 参考資料 結合した SELECT の重複行 UNION 演算子だけを使用する場合は、行の完全セットから重複行が削除さ れます。つまり、各列の同一値が複数の行に含まれている場合は、1 行の みが保持されます。UNION ALL 演算子を使用する場合は、選択したすべて の行が戻されます ( 重複行は削除されません )。たとえば、次の照会は、 UNION ALL 演算子を使用して、2 つの SELECT 文を結合しますが、重複の削 除は行いません。この照会は、1990 年の第 1 四半期から 1991 年の第 1 四半 期までの間に受けたすべての電話のリストを戻します。 図 7-125 UNION ALL 演算子による 2 つの SELECT 文の接続 SELECT customer_num, call_code FROM cust_calls WHERE call_dtime BETWEEN DATETIME (1990-1-1) YEAR TO DAY AND DATETIME (1990-3-31) YEAR TO DAY UNION ALL SELECT customer_num, call_code FROM cust_calls WHERE call_dtime BETWEEN DATETIME (1991-1-1)YEAR TO DAY AND DATETIME (1991-3-31) YEAR TO DAY 重複の削除を行いたい場合は、ALL キーワードを指定せずに、UNION 演算 子を照会で使用してください。上の例では、customer_num と call_code の組 み合わせ 101B というデータが両方の SELECT 文で戻された場合、UNION 演 算子がその組み合わせを 1 回だけリストに出しました。( 各 SELECT 文から 重複を削除したい場合は、7-265 ページに示されているように、SELECT 節 で DISTINCT キーワードを使用してください。) 参考資料 IBM Informix SQL チュートリアル・ガイド では、外部結合の説明を参照してく ださい。 構文 7-293 SET CONSTRAINTS SET CONSTRAINTS 目的 SET CONSTRAINTS 文は、ログ機能付きのデータベースで実効確認をオフや オンに切り替えるために使用します。 構文 OL + SET CONSTRAINTS ALL IMMEDIATE , DEFERRED 制約名 7-365 ページ 使用法 デフォルトの制約確認モードは IMMEDIATE です。SET CONSTRAINTS 文を IMMEDIATE に設定すると、実効確認がオンに切り替わり、指定されたすべ ての制約が各 INSERT、UPDATE、または DELETE 文の終了時に検査されま す。制約エラーが発生した場合は、この文は実行されません。 SET CONSTRAINTS 文を DEFERRED に設定すると、実効確認がオフに切り替 わり、指定されたすべての制約は、トランザクションがコミットされるま で検査されません。トランザクションのコミット中に制約エラーが発生し た場合は、トランザクションがロールバックされます。ログ機能付きデー タベースでは、制約は DEFERRED にしか設定できません。 SET CONSTRAINTS 文の継続時間は、それが実行されるトランザクションで す。SET CONSTRAINTS 文をトランザクションの外部で実行することはでき ません。COMMIT または ROLLBACK WORK 文が正常に終了した場合は、す べての制約の制約モードが IMMEDIATE に復帰します。 DEFERRED から実効確認に復帰するには、SET CONSTRAINTS を IMMEDIATE に設定するか、COMMIT または ROLLBACK 文をトランザクションで使用し てください。 7-294 IBM Informix SQL リファレンス・ガイド 参考資料 列 (NOT NULL 制約が指定されていない ) または列のセットに対して明示的 に NOT NULL 制約を据え置くことはできません。ただし、主キー制約の検 査を据え置く場合は、その列または列のセットに対する NOT NULL 制約の 検査も据え置かれます。すべての NOT NULL 制約の検査を据え置くには、 すべての制約を据え置く必要があります。 参考資料 本書では、CREATE TABLE 文を参照してください。 構文 7-295 SET DEBUG FILE TO SET DEBUG FILE TO 目的 SET DEBUG FILE TO 文は、ストアード・プロシージャーの実行時トレース出 力を保持するためのファイルを指名するために使用します。 構文 DB ESQL + SET DEBUG FILE TO "< ファイル名 > " < 変数名 > WITH APPEND < 文字式 > < 文字式 > 使用可能なファイル名を評価する任意の式です。 < ファイル 名> トレース文出力を含むファイルのフル パスおよびファイル名 です。 < 変数名 > トレース文出力を含むファイルのフル パスおよびファイル名 が含まれている文字変数です。 使用法 この文は、プロシージャー TRACE 文の出力を filename で示されたファイル に出すことを示します。WITH APPEND オプションは、そのファイルが存在 する場合、それに追加することを示します。WITH APPEND キーワードを使 用しない場合は、このファイルは、同じファイル名を指定して別の SET DEBUG FILE TO 文を出したときに上書きされます。 7-296 IBM Informix SQL リファレンス・ガイド 参考資料 STAR INET ローカル・データベース上の単純ファイル名を指定して SET DEBUG FILE TO 文を起動すると、出力ファイルは現行ディレクトリーに配置されます。現 行のデータベースが他のデータベース・サーバーにある場合は、出力ファ イルは、データベース・サーバーがあるマシン上のホーム・ディレクト リーに配置されます。デバッグ・ファイルに対して絶対パス名を指定する と、データベース・サーバーがあるマシン上の指定ディレクトリーおよび ファイルに入れられます。ディレクトリーへの書き込み権限がない場合は、 エラーが戻されます。♦ SET DEBUG FILE TO 文によってオープンされたファイルをクローズするに は、別のファイル名を指定して別の SET DEBUG FILE TO 文を出してくださ い。そうすると、最初のファイルの内容を編集することができます。 プロシージャーの外部で SET DEBUG FILE TO 文を使用して、プロシー ジャーのトレース出力をファイルに送信することができます。この文をプ ロシージャーの内部で使用して独自の出力をリダイレクトすることもでき ます。 次の例は、SET DEBUG FILE TO 文の出力を debugging.out というファイルに 送信します。 SET DEBUG FILE TO "debugging" || ".out" 参考資料 本書では、セクション 8-14 ページの『プロシージャーのデバッグ』および 8-79 ページの TRACE 文を参照してください。 IBM Informix SQL チュートリアル・ガイド では、ストアード・プロシージャー の説明を参照してください。 構文 7-297 SET DESCRIPTOR SET DESCRIPTOR 目的 SET DESCRIPTOR 文は、次の 3 つのインスタンスで値をシステム記述子領域 に割り当てるために使用します。 ! システム記述子領域で記述を提供する項目の数に一致するように、 システム記述子領域の COUNT フィールドを設定する。( これらの 項目は、通常、WHERE 節の項目です。) ! システム記述子領域で記述を提供する各値に対して項目記述子 フィールドを設定する。( これらの項目は、通常、WHERE 節の項目 です。) ! DESCRIBE 文を使用して、SELECT または INSERT 文のフィールドを 充てんした後に、項目記述子フィールドの内容を修正する。 7-298 IBM Informix SQL リファレンス・ガイド 構文 構文 ESQL SET DESCRIPTOR " < 記述子 > " COUNT = <値> < カウント 変数 > < 記述子 変数 > VALUE < 項目 番号 > , 項目記述子 情報 < 項目 番号 変数 > 項目 記述子情報 = TYPE < リテラル整数 > < 整数ホスト 変数 > LENGTH PRECISION SCALE NULLABLE INDICATOR DATA ITYPE IDATA ILEN NAME = リテラル番号 7-427 ページ リテラル日時 (DATETIME) 型 7-421 ページ リテラル時間隔 (INTERVAL) 型 7-424 ページ 引用符付きストリング 7-431 ページ < データ変数 > < カウント 変数 > システム記述子領域で記述する回数を指定するリテラル整数 を保持する変数です。その値は、システム記述子領域の項目 記述子の数 ( システム記述子領域を割り当てるときに設定さ れる ) 以下でなければなりません。 < データ 変数 > 設定するフィールドに適した情報が含まれているホスト変数 です。 < 記述子 > 現在割り当てられているシステム記述子領域を識別するスト リングです。 構文 7-299 使用法 < 記述子 変数 > 現在割り当てられているシステム記述子領域を識別するスト リングが含まれている埋め込み変数名です。 < 整数ホスト 示されたフィールドに適した整数値が含まれている変数の名 変数 > 前です。TYPE フィールドについては、整数コードとデータ 型の間の対応関係が 7-301 ページの 図 7-127 に示されていま す。 < 項目番号 > 記述子領域内のいずれかの項目を表す符号なし整数です。 < 項目番号 変数 > 記述子領域内のいずれかの項目を表す符号なし整数が含まれ ている整ホスト変数の名前です。 < リテラル 整数 > 項目のデータ型を表す正の非ゼロ整数です。整数コードと データ型の対応関係が 7-301 ページの 図 7-127 に示されてい ます。 <値> システム記述子領域で記述する回数を指定するリテラル整数 です。その値は、システム記述子領域の項目記述子の数 ( シ ステム記述子領域を割り当てるときに設定される ) 以下でな ければなりません。 使用法 識別されたいずれかのシステム記述子フィールドへの割り当てを実行中に エラーが発生した場合は、その変数の型に応じて、識別されたすべての フィールドの内容はゼロまたは NULL に設定されます。 COUNT オプション COUNT オプションは、システム記述子領域で使用する項目の数を設定する ために使用します。 使用する項目の数より多い項目をシステム記述子領域に割り当てた場合 は、COUNT フィールドを実際に使用する項目の数に設定する必要がありま す。たとえば、図 7-126 の文のシーケンス (IBM Informix ESQL/C を使用して 表示 ) をプログラムで使用することができます。 7-300 IBM Informix SQL リファレンス・ガイド 使用法 図 7-126 ESQL/C を使用してシステム記述子の COUNT フィールドを設定する例 EXEC SQL BEGIN DECLARE SECTION; INT count, itemno, type, length; CHAR chval[21]; EXEC SQL END DECLARE SECTION; ALLOCATE DESCRIPTOR 'desc_100'; /*allocates for 100 items*/ count = 2; EXEC SQL SET DESCRIPTOR 'desc_100' COUNT = :count; VALUE オプション VALUE オプションは、システム記述子領域の特定の項目に関する値をホス ト変数からフィールドに割り当てるために使用します。記述を提供する項 目の値 ( たとえば、WHERE 節のパラメーター ) を割り当てることもできる し、DESCRIBE 文の処理中にデータベース・サーバーによって記述された項 目の値を修正することもできます。 TYPE フィールドの設定 図 7-127 に示されているコードのセットを使用して、各項目の TYPE の値 を設定します。 図 7-127 データ型整定数のリスト SQL データ型 整数値 CHAR 0 SMALLINT 1 INTEGER 2 FLOAT 3 SMALLFLOAT 4 DECIMAL 5 SERIAL 6 DATE 7 (2 の 1) 構文 7-301 使用法 SQL データ型 整数値 MONEY 8 DATETIME 10 BYTE 11 TEXT 12 VARCHAR 13 INTERVAL 14 (2 の 2) 図 7-128 は、ESQL/C における TYPE フィールドの設定方法を示しています。 図 7-128 ESQL/C を使用した TYPE 設定の例 main() { $int count, itemno, type, length; ... $ALLOCATE DESCRIPTOR 'desc1' WITH MAX 5; ... $SET DESCRIPTOR "desc1" VALUE 2 TYPE = 5; type = 2; itemno = 3; $SET DESCRIPTOR "desc1" VALUE $itemno TYPE = $type; } -xopen オプションを使用してコンパイルしない場合は、標準の Informix SQL コードが TYPE に割り当てられます。通常モードと X/Open モードを混 合しないようにしてください。混合すると、エラーになります。たとえば、 特定の型が X/Open モードのもとでは定義されていないが、通常モードのも とでは定義されている場合、SET DESCRIPTOR 文を実行するとエラーになる ことがあります。 7-302 IBM Informix SQL リファレンス・ガイド 使用法 X/Open プログラムでの TYPE フィールドの設定 X/O X/Open モードでは、TYPE フィールドのデータ型に対して X/Open セットの 整数コードを使用する必要があります。データ型ごとの X/Open コードが 図 7-129 に示されています。 図 7-129 X/Open データ型コード SQL データ型 整数値 CHAR 1 SMALLINT 4 INTEGER 5 FLOAT 6 DECIMAL 3 SET DESCRIPTOR 文で ILENGTH、IDATA、または ITYPE フィールドを使用す ると、警告メッセージが出ます。この警告メッセージは、これらのフィー ルドが、システム記述子領域にとって標準の X/Open フィールドでないこと を示しています。♦ DATA フィールドの設定 DATA フィールドを設定するときは、適切なデータの型 (CHAR または VARCHAR の場合は文字ストリング、INTEGER の場合は整数、など ) を指定 する必要があります。 DATA 以外の値を設定すると、DATA は未定義になります。ある項目に対し て TYPE が設定されていない場合は、その項目に対して DATA フィールドを 設定することはできません。ある項目に対して TYPE フィールドを文字型 に設定する場合は、LENGTH フィールドも設定する必要があります。文字 項目に対して LENGTH フィールドを設定しないと、エラーになります。 構文 7-303 使用法 DECIMAL または MONEY 型の使用 DECIMAL または MONEY 型に対して TYPE フィールドを設定し、デフォル ト値以外の小数点以下桁数または精度を使用したい場合は、SCALE および PRECISION フィールドを設定してください。DECIMAL または MONEY 項目 に対して LENGTH フィールドを設定する必要はありません。LENGTH フィー ルドは、提供された SCALE および PRECISION に適宜設定されます。 DATETIME または INTERVAL 型の使用 TYPE フィールドに DATETIME または INTERVAL 値を設定する場合は、DATA フィールドを DATETIME または INTERVAL リテラルとして設定することも、 文字ストリングとして設定することもできます。文字ストリングを使用す る場合は、LENGTH フィールドをエンコードされた修飾子の値に設定する 必要があります。 E/C DATETIME または INTERVAL 文字ストリングのエンコードされた修飾子を決 定するには、datetime.h ヘッダー・ファイルに日時 (DATETIME) 型および 時間隔 (INTERVAL) 型マクロを使用してください。 DATA を DATETIME または INTERVAL のホスト変数に設定する場合は、 LENGTH をエンコードされた修飾子整数に明示的に設定する必要はありま せん。♦ E/CO DATETIME または INTERVAL 文字ストリングのエンコードされた修飾子を決 定するには、ECO-IQL ルーチンを使用します。♦ INDICATOR フィールドの設定 NULL 値をシステム記述子領域に入れたい場合は、INDICATOR フィールド を -1 に設定し、DATA フィールドを設定しないでください。 INDICATOR フィールドを 0 ( データが NULL でないことを示す ) に設定する 場合は、DATA フィールドを設定する必要があります。 ITYPE フィールドの設定 ITYPE フィールドには、標識変数のデータ型を示す整定数が必要です。 TYPE フィールドの場合と同じセットの定数を使用してください。それらの 定数が図 7-127 にリストされています。 7-304 IBM Informix SQL リファレンス・ガイド 参考資料 DESCRIBE 文によって設定された値の修正 システム記述子領域の内容が DESCRIBE 文によって設定された後に、それ らを修正することができます。 E/CO SELECT または INSERT 文で DESCRIBE 文を使用したら、TYPE フィールドが 11 または 12 ( データ型が TEXT であるか、BYTE であるかを示す ) のどちら に設定されているかを調べる必要があります。TYPE に 11 または 12 が含ま れている場合は、SET DESCRIPTOR 文を使用して、TYPE を 116 にリセットし て FILE 型を示す必要があります。♦ 参考資料 本書では、動的 SQL 分の詳細について、ALLOCATE DESCRIPTOR、 DEALLOCATE DESCRIPTOR、DECLARE、DESCRIBE、EXECUTE、FETCH、GET DESCRIPTOR、OPEN、PREPARE、 および PUT 文を参照してください。 システム記述子領域の詳細については、第 6 章、 『記述子の使用』を参照し てください。 構文 7-305 SET EXPLAIN SET EXPLAIN 目的 SET EXPLAIN 文は、照会の実行で必要な作業のメジャーを取得するために 使用します。 構文 + SET EXPLAIN OFF ON 使用法 SET EXPLAIN 文は、データベース・サーバー最適化フェーズで実行されま す。このフェーズは、照会の開始時に行われます。カーソル関連の照会の 場合は、照会はカーソルのオープン時に開始されます。 SET EXPLAIN ON 文を出すと、後続のすべての照会のアクセス手順とオプ ティマイザーによって選択されたパスが、sqexplain .out という名前でファ イルの現行ディレクトリーに渡されて格納されます。このファイルがすで に存在している場合は、後続の出力がそれに追加されます。 SET EXPLAIN ON 文は、ユーザーが別の SET EXPLAIN 文を出すまで、または プログラムが終了するまで有効です。 SET EXPLAIN 出力 SET EXPLAIN 出力ファイルには、照会のコピー、データベース・サーバー・ オプティマイザーによって選択された計画、および処理する作業量の見積 値が入っています。オプティマイザーは、インデックスの存在と型、およ び各表内の行数に基づいて、照会の最も効率的な実行方法としてこの計画 を選択しています。 7-306 IBM Informix SQL リファレンス・ガイド SET EXPLAIN 出力 作業の見積値は、1 つパスのコストと別のパスのコストを比較するために 使用できる重み付けの合計値です。作業の見積値は任意の単位で表されま す。単一のディスク・アクセスが 1 つの単位になり、それを基準として他 のアクションが評価されます。ただし、合計値は直接、時間に変換されず、 照会のための作業とそれに使用されるリソースとの間には直接的な相関関 係はありません。一般に、照会の見積値が高くなると、見積値の低い照会 よりも実行時間が長くなる傾向があります。 数字による見積もりに加え、出力ファイルには次の情報も含まれています。 ! 戻される行の推定数 ! オプティマイザーが表にアクセスする順序 ! オプティマイザーが各表を読み取るために使用する以下のいずれか のメソッド ( アクセス・パス )。 ! SEQUENTIAL SCAN 行を順々に読み取ります。 INDEX PATH 1 つ以上のインデックスを走査します。 AUTOINDEX PATH 一時インデックスを作成します。 SORT SCAN 先行の結合または表走査の結果をソートします。 MERGE JOIN 入れ子ループ結合ではなく、ソート・マージ結合 を使用します。 フィルターとして機能するテーブル列 ( 複数の場合もある )、および フィルター操作をインデックスを介して行うかどうか 出力ファイルでは、表所有者の名前が表名の前に示されます。 結合がインクルードされている照会に関して戻された情報は正確でないこ とがあります。結合内の列がインデックス付けされている場合は、情報の 信頼性は高まりますが、まだ不正確な部分があります。 オプティマイザーは実行のための最適パスを選択して、可能な最速の表結 合を作成します。つまり、入れ子ループ結合、ソート / マージ結合、また はこの両者を組み合わせたものです。ソート / マージ結合を使用すると、 SORT SCAN および MERGE JOIN の語で始まる 2 行が 出力ファイルに現れま す。 構文 7-307 SET EXPLAIN 出力 SORT SCAN セクションは、前の結合または表走査の結果のソートをソート / マージ結合に備えて実行することを示します。このセクションには、ソー ト・キーを形成する列のリストが含まれています。列の順序はソートの順 序です。インデックスの場合と同様に、デフォルトの順序は 昇順 です。可 能であれば、要求された任意の ORDER BY または GROUP BY 節をサポート するようにこの順序を調整します。 MERGE JOIN セクションは、前の結合 / 表ペアに対して、入れ子ループ結合 ( 暗黙の ) ではなく、ソート / マージ結合を使用することを示します。この セクションには、ソート / マージ結合を制御するフィルターのリストが含 まれており、また該当する場合は、他のすべての結合フィルターのリスト も含まれています。たとえば、フィルター A.c1= B.c1 および A.c2 < B.c2 を持 つ表 A と表 B の結合は、最初の表を 「Merge Filters」の下に、2 番目の表を 「Other Join Filters」の下にリストします。 STAR INET SET EXPLAIN 文をホーム・マシンで起動すると、出力ファイルは現行ディ レクトリーに配置されます。現行のデータベースが他のマシン上にある場 合は、出力ファイルは引き続きローカル・マシンに送られます。 また出力ファイルには、次のように、6 番目の型の表アクセスを含めるこ とができます。 REMOTE PATH ♦ SE 他のデータベースにアクセスします ( 分散データベース のみ )。 IBM Informix SE データベース・サーバーが生成する照会処理統計の数は、 IBM Informix OnLine データベース・サーバーから提供される統計の数より も少なくなります。その結果、IBM Informix OnLine を使用している場合は、 IBM Informix SE を使用している場合よりも、コストと戻される行数に関する 見積もりが正確になります。結合をインクルードする照会について戻され る見積もりは非常に不正確になる傾向があります。♦ 次の出力例は、IBM Informix OnLine を使用して SET EXPLAIN ON 文を出した ときに表示される出力を表しています。 最初の 2 つの例には、複数表照会のための 2 つの項目が含まれており、こ こには SORT SCAN 行と MERGE JOIN 行が示されています。ただし、いずれ の場合も、SORT MERGE を選択しなければ、自動作成されたインデックス・ パス を使用して、2 番目の表が走査されたはずです。 7-308 IBM Informix SQL リファレンス・ガイド SET EXPLAIN 出力 図 7-130 複数表項目と MERGE JOIN の出力例 QUERY: ----------select i.stock_num from items i, stock s, manufact m where i.stock_num = s.stock_num and i.manu_code = s.manu_code and s.manu_code = m.manu_code Estimated Cost: 52 Estimated # of Rows Returned: 130 1) rdtest.m: SEQUENTIAL SCAN SORT SCAN: rdtest.m.manu_code 2) rdtest.s: SEQUENTIAL SCAN SORT SCAN: rdtest.s.manu_code MERGE JOIN: Merge Filters: rdtest.m.manu_code = rdtest.s.manu_code 3) rdtest.i: INDEX PATH (1) Index Keys: stock_num manu_code Lower Index Filter: (rdtest.i.stock_num = rdtest.s.stock_num AND rdtest.i.manu_code = rdtest.s.manu_code) QUERY: ----------select stock.description from stock, stock2 where stock.description = stock2.description and stock.unit_price < stock2.unit_price Estimated Cost: 15 Estimated # of Rows Returned: 370 1) rdtest.stock: SEQUENTIAL SCAN SORT SCAN: rdtest.stock.description 2) rdtest.stock2: SEQUENTIAL SCAN SORT SCAN: rdtest.stock2.description MERGE JOIN Merge Filters: rdtest.stock2.description = rdtest.stock.description Other Join Filters: rdtest.stock.unit_price < rdtest.stock2.unit_price 次の出力例には、customer 表から取得した簡単な照会と複雑な照会の項目 が含まれています。 構文 7-309 SET EXPLAIN 出力 図 7-131 簡単な照会と複雑な照会の SET EXPLAIN の結果 QUERY: ----------SELECT fname, lname, company FROM customer Estimated Cost: 3 Estimated # of Rows Returned: 28 1) joe.customer: SEQUENTIAL SCAN QUERY: -----SELECT fname, lname, company FROM customer WHERE company MATCHES "Sport*" AND customer_num BETWEEN 110 AND 115 ORDER BY lname; Estimated Cost: 4 Estimated # of Rows Returned: 1 Temporary Files Required For: Order By 1) joe.customer: INDEX PATH Filters: joe.customer.company MATCHES 'Sport*' (1) Index Keys: customer_num Lower Index Filter: joe.customer.customer_num >= 110 Upper Index Filter: joe.customer.customer_num <= 115 次の出力例は、複数表照会のための項目を持つ出力ファイルから取得した ものです。 図 7-132 複数表照会の SET EXPLAIN の結果 QUERY: ----------SELECT * FROM customer, orders, items WHERE customer.customer_num = orders.customer_num AND orders.order_num = items.order_num Estimated Cost: 20 Estimated # of Rows Returned: 69 1) joe.orders: SEQUENTIAL SCAN 2) joe.customer: INDEX PATH (1) Index Keys: customer_num Lower Index Filter: joe.customer.customer_num = joe.orders.customer_num 3) joe.items: INDEX PATH (1) Index Keys: order_num Lower Index Filter: joe.items.order_num 7-310 IBM Informix SQL リファレンス・ガイド = joe.orders.order_num 参考資料 参考資料 IBM Informix SQL チュートリアル・ガイド では、SET EXPLAIN の説明を参照し てください。 構文 7-311 SET ISOLATION SET ISOLATION 目的 SET ISOLATION 文は、同一行を同時にアクセスしようとするいくつかのプ ロセス間の並行性の度合いを定義するために、IBM Informix OnLine データ ベース・サーバーで使用します。 構文 OL + SET ISOLATION TO DIRTY READ COMMITTED READ CURSOR STABILITY REPEATABLE READ 使用法 データベース排他レベルは、行をデータベースから検索するときの並行性 に影響を与えます。IBM Informix OnLine は、共有ロックを使用して、デー タにアクセスしようとするいくつかのプロセス間の 4 つの排他レベルをサ ポートします。 特定のデータベースのデフォルト排他レベルは、データベース型に従って データベースを作成するときに確立されます。各データベース型のデフォ ルト排他レベルは次のとおりです。 DIRTY READ ロギングなしのデータベースにおけるデフォルトの排他レベ ル COMMITTED ANSI 準拠でない、ログ機能付きデータベースにおけるデフォ READ ルトの排他レベル REPEATABLE ANSI 準拠データベースにおけるデフォルトの排他レベル READ 7-312 IBM Informix SQL リファレンス・ガイド 排他レベル デフォルトのレベルは、ユーザーが SET ISOLATION 文を出すまで有効に なっています。SET ISOLATION 文を実行すると、新規排他レベルは、ユー ザーが別の SET ISOLATION 文を出すか、またはプログラムが終了するまで、 有効になっています。 排他レベルは、データを更新または削除するプロセスを妨げません。更新 または削除プロセスでは、常に、変更する行の排他ロックが必要です。 排他レベル 以下の定義は、各排他レベルの重要な特性を説明しています。これらの排 他レベルは、最も低い排他レベルから最も高い排他レベルへリストされて います。 DIRTY READ まったく排他を行いません。単純読み込みは、照会に使用す る静的表の場合に適しています。単純読み込み排他レベルを 使用すれば、照会で幻行 を戻すことができます。つまり、ト ランザクション内で挿入または変更した非コミット行が後で ロールバックされます。その他の排他レベルでは幻行にアク セスすることはできません。トランザクションを持たない データベースで使用できる排他レベルは、単純読み込みだけ です。 COMMITTED 検索するすべての行が、検索時に表でコミットされることを READ 保証します。ただし、その場合でも、ロックは獲得されませ ん。1 つのプロセスがある行を使用しているときに、他のプ ロセスは、その行に対する排他ロックを獲得し、行のデータ を修正または削除することができます。コミット読み込み は、ANSI 準拠でない、ログ機能付きデータベースにおけるデ フォルトの排他レベルです。 構文 7-313 排他レベルの影響 CURSOR STABILITY 選択した行に対する共有ロックを獲得します。他のプロセス もその行に対する共有ロックを獲得できますが、どのプロセ スもその行のデータを修正するための排他ロックを獲得する ことはできません。ユーザーが他の行を取り出すかカーソル をクローズすると、IBM Informix OnLine は共有ロックをアン ロックします。 REPEATABLE トランザクション中に選択したすべての行に対する共有ロッ READ クを獲得します。他のプロセスも選択した行に対する共有 ロックを獲得できますが、どのプロセスもトランザクション 中に選択した行を修正することはできません。トランザク ション中に照会を反復すると、同じ情報を再読み取りしま す。共有ロックが解放されるのは、トランザクションがコ ミットまたはロールバックされたときだけです。繰り返し可 能読み込みは、ANSI 準拠データベースにおけるデフォルトの 排他レベルです。 排他レベルの影響 ロギングなしのデータベースにデータベース排他レベルを設定することは できません。この種のデータベースでの検索はすべて単純読み込みとして 行われます。 バイナリー・ラージ・オブジェクト (BLOB) 検索で取得したデータは、デー タベース排他レベルに応じて異なります。単純読み込みまたはコミット読 み込みの排他レベルでは、プロセスは、削除された ( 削除がまだコミット されていない場合 ) か、または削除中の BLOB を読み取ることができます。 つまり、これらの排他レベルでは、アプリケーションで削除済みの BLOB を読み取ることができる特定の条件が存在します。 ISQL STAR IBM Informix SQL および DB-Access は、明示的なカーソルを使用しません。 コミット読み込み排他レベルとカーソル安定性排他レベルは、同じような 効果を持っていますが、カーソル安定性を起動した場合のほうが検索はよ り低速になります。♦ データベースがオープンされた後でのみ、クライアント・マシンから SET ISOLATION 文を出すことができます。♦ INET 7-314 IBM Informix SQL リファレンス・ガイド 参考資料 I4GL ESQL トランザクションでスクロール・カーソルを使用する場合、排他レベルを 繰り返し可能読み込みに設定するか、またはトランザクション時に表全体 をロックすることにより、一時表とデータベース表との間の一貫性を保持 することができます。 トランザクションで保留付きスクロール・カーソルを使用する場合は、一 時表とデータベース表の間の一貫性を保持することはできません。表レベ ル・ロックまたは繰り返し可能読み込みによって設定されたロックは、ト ランザクションが完了したときにアンロックされますが、保留付きスク ロール・カーソルは、トランザクションの終了を超えてオープン状態に なっています。したがって、トランザクションが終了したらすぐに解放済 みの行を修正することができます。これにより、一時表で検索したデータ が実際のデータと矛盾する可能性が生じます。♦ 参考資料 本書では、CREATE DATABASE および SET LOCK MODE 文を参照してくださ い。 IBM Informix SQL チュートリアル・ガイド では、排他レベルの説明を参照して ください。 構文 7-315 SET LOCK MODE SET LOCK MODE 目的 SET LOCK MODE 文は、ロックされた行または表へアクセスしようとするプ ロセスをデータベース・サーバーにどのように処理させるかを定義するた めに使用します。 構文 + SET LOCK MODE TO WAIT OL <秒> NOT WAIT <秒> あるプロセスがアンロックを待機している最大秒数です。 使用法 ロックされた行または表にプロセスがアクセスしようとしているときに、 以下のような方法でデータベース・サーバーの応答を送信することができ ます。 SE NOT WAIT 操作を即時に終了し、エラー・コードを戻します。これはデ フォルトの条件です。 WAIT アンロックされるまでプロセスを一時停止します。 WAIT < 秒 > アンロックされるか、または待ち時間 ( 秒で指定 ) が終了す るまで、プロセスを一時停止します。待機後もロックが残っ ている場合は、操作を終了し、エラー・コードを戻します。 IBM Informix SE は < 秒 > オプションをサポートしません。プロセスにアン ロックを待機させると決定した場合は、待ち時間を限定することはできま せん。♦ 7-316 IBM Informix SQL リファレンス・ガイド WAIT キーワード ロック・モードは排他ロックには効果がありません。排他モードでロック されている行、表、またはデータベースにプロセスがアクセスしようとす ると、操作は終了し、エラー・コードが戻されます。 SE SET LOCK MODE オプションは、カーネル・ロックを使用するマシンで使用 できます。使用しているマシンでカーネル・ロックを使用するかどうかを 決定するには、データベース・ファイルを保持しているディレクトリーを 調べてください。ディレクトリーに .lok 拡張子を持つファイルが含まれて いる場合は、システムはカーネル・ロックを使用しておらず、SET LOCK MODE オプションは使用できません。♦ WAIT キーワード データベース・サーバーは、ユーザーが WAIT オプションを要求したとき に、デッドロックが発生しないようにユーザーを保護します。プロセスを 一時停止する前に、データベース・サーバーは、プロセスの一時停止に よってデッドロックが発生するかどうかを調べます。データベース・サー バーは、デッドロックの可能性を検出すると、操作を終了して ( 待機指示 を破棄 ) エラーを戻します。デッドロックの疑いがある場合または実際に デッドロックが発生した場合、データベース・サーバーはエラーを戻しま す。 < 秒 > を指定せずに WAIT オプションを指定して作成された無制限の待ち 時間を使用する際には、細心の注意が必要です。上限が指定されておらず、 何らかのロックを設定したプロセスがそのアンロックに失敗した場合は、 一時停止しているプロセスが無限の待ち状態に入ることがあります。これ は真のデッドロック状態ではないため、データベース・サーバーは修正処 置を取りません。 STAR データベースがオープンされた後でのみ、クライアント・マシンから SET LOCK MODE 文を出すことができます。♦ INET STAR DBA は、システム全体に適用される < 秒 > のデフォルト値を設定します。 SETLOCK MODE 文を使用して上限を設定する場合は、その値は、待ち時間 がシステム・デフォルトより短い場合にのみ適用されます。♦ 構文 7-317 参考資料 参考資料 本書では、LOCK TABLE、UNLOCK TABLE、および SET ISOLATION MODE 文 を参照してください。 IBM Informix SQL チュートリアル・ガイド では、SET LOCK MODE の説明を参 照してください。 7-318 IBM Informix SQL リファレンス・ガイド SET LOG SET LOG 目的 SET LOG 文は、IBM Informix OnLine データベース・ロギング・モードをバッ ファー付きトランザクション・ロギングからバッファーなしトランザク ション・ロギングへ、またはその逆へ変更するために使用します。 構文 OL + SET LOG BUFFERED 使用法 トランザクション・ロギングは、データベースを作成するとき、または既 存のデータベースにロギングを追加するときに起動します。これらのトラ ンザクション・ログは、バッファー付きにもバッファーなしにもできます。 トランザクション・ログのデフォルトの条件は、バッファーなしロギング です。トランザクションが終了するとすぐに、IBM Informix OnLine データ ベース・サーバーはトランザクションをディスクに書き込みます。バッ ファーなしロギングを使用しているときにシステム障害が発生した場合は、 完了しているすべてのトランザクションを復旧させてください。 バッファー付きロギングを使用すれば、最低限の効率向上を得られますが、 多少のリスクも発生します。システム障害が発生した場合、IBM Informix OnLine データベース・サーバーは、バッファーに入れられた完了トランザ クションを復旧させることはできません。 SET LOG 文は、トランザクション・ロギング・モードをバッファーなしロ ギングに変更します。SET BUFFERED LOG 文は、トランザクション・ロギン グ・モードをバッファー付きロギングに変更します。 SET LOG 文は、現行セッションのみのモードを再定義します。DBA が DBMonitor を使用して設定するデフォルト・モードは、未変更のままです。 構文 7-319 参考資料 STAR ANSI バッファー方式オプションは外部表からの検索操作に影響を与えません。 ログ機能付きのデータベースのみが、ログ機能付きの他のデータベースに アクセスできますが、それらのデータベースがバッファー付き ロギングを 使用しているか、バッファーなしロギングを使用しているかは関係ありま せん。♦ ANSI 準拠データベースはバッファー付きログを使用できません。♦ 参考資料 本書では、CREATE DATABASE および START DATABASE 文を参照してくださ い。 7-320 IBM Informix SQL リファレンス・ガイド SET OPTIMIZATION SET OPTIMIZATION 目的 SET OPTIMIZATION 文は、高レベルまたは低レベルのデータベース・サー バー最適化を指定するために使用します。 構文 + SET OPTIMIZATION HIGH LOW 使用法 SET OPTIMIZATION 文はいつでも実行できます。最適化レベルはデータベー ス間で有効ですが、現行のデータベース・サーバー内でのみ適用されます。 SET OPTIMIZATION 文を実行すると、新規最適化レベルは、ユーザーが別の SET OPTIMIZATION 文を入力するまで、またはプログラムが終了するまで有 効です。 デフォルトのデータベース・サーバー最適化レベル HIGH は、ユーザーが 別の SET OPTIMIZATION 文を出すまで有効です。LOW オプションは、あま り高度ではないが、より高速の最適化アルゴリズムを起動します。 SET OPTIMIZATION HIGH 文によって起動されたアルゴリズムは、高度なコ スト・ベースのストラテジーで、妥当なすべての選択肢を検証し、最適の 全体的代替方法を選択します。大規模結合の場合、このアルゴリズムは必 要以上のオーバーヘッドを生じることがあります。極端な場合、メモリー 不足になることがあります。 構文 7-321 参考資料 SET OPTIMIZATION LOW 文によって起動される代替アルゴリズムは、ありそ うにない結合ストラテジーを早期の段階で除去し、最適化中に使用される 時間とリソースの量を減らします。ただし、低レベルの最適化を指定すれ ば、アルゴリズムの早期の段階で最適化ストラテジーが考慮の対象から外 されているので、最適化ストラテジーが選択されないというリスクが生じ ます。 STAR INET 次の例は、ネットワーク全体にまたがる最適化を示しています。 central デー タベース ( マシン 1 上 ) は LOW 最適化を行い、western データベース ( マシ ン 2 上 ) は HIGH 最適化を行います。western データベースが central データ ベースと同じマシン上にあれば、 このデータベースは LOW 最適化を行いま す。 図 7-133 IBM Informix STAR ネットワーク全体にまたがる SET OPTIMIZATION 文の例 set optimization low; database central; select * from stock; close database; database western@rockies; select * from stock; 図 7-134 IBM Informix NET ネットワーク全体にまたがる SET OPTIMIZATION 文の例 set optimization low; database central; select * from stock; close database; database //rockies/western; select * from stock; ♦ 参考資料 IBM Informix SQL チュートリアル・ガイド では、照会の最適化の説明を参照し てください。 7-322 IBM Informix SQL リファレンス・ガイド START DATABASE START DATABASE 目的 START DATABASE 文は、トランザクションの記録を開始したり、データ ベースを ANSI 準拠にしたり、既存のトランザクション・ログ・ファイルの 名前を変更したりするために、IBM Informix SE データベース・サーバーで使 用します。 構文 SE + START DATABASE データベース 名 7-367 ページ WITH LOG IN "< パス名 >" MODE ANSI < パス名 > トランザクション・ログ・ファイルのパス名で、引用符で囲 まれています。 使用法 START DATABASE 文を使用するには、以下のすべての条件を満たしていな ければなりません。 ! DBA アクセス権を持っている。 ! 現行のデータベースはない。 ! < パス名 > に指定されたディレクトリーが存在している。 保護機能を最大化するために、データベースと同じ記憶装置上にないトラ ンザクション・ログの位置を指定してください。 CLOSE DATABASE 文を出してから、トランザクション・ログを作成し、開 始してください。START DATABASE 文は、他のプロセスによるアクセスを 防止するために、データベースに排他ロックを掛けます。別のプロセスが データベースを使用している場合は ( データベースを読み取っているだけ の場合でも )、START DATABASE 文は失敗します。 構文 7-323 MODE ANSI キーワード START DATABASE 文が実行された後、データベースはロックされたままに なります。データベースが使用できる状態になっていることを確認したら、 CLOSE DATABASE 文を実行して、排他ロックを削除してください。 DATABASE 文を使ってデータベースを再オープンします。 MODE ANSI キーワード ANSI MODE ANSI キーワードは、データベースを ANSI 準拠にするために使用しま す。ANSI 準拠データベースは、ANSI 規格に準拠しないデータベースとは異 なる、トランザクション処理およびオブジェクト命名規則に従っています。 次の例は、stores5 という ANSI 準拠データベースを開始します。 START DATABASE stores5 WITH LOG IN "/u/myname/stores5.log" MODE ANSI ♦ トランザクション・ログ名の変更 トランザクション・ログの名前や位置を変更する場合は、データベースを アーカイブする直前に START DATABASE 文を出してください。START DATABASE 文では、トランザクション・ログへの新規パスを指定します。 参考資料 本書では、CREATE DATABASE および ROLLFORWARD DATABASE 文を参照し てください。 IBM Informix SQL チュートリアル・ガイド では、トランザクション処理の説明 を参照してください。 7-324 IBM Informix SQL リファレンス・ガイド UNLOAD UNLOAD 目的 UNLOAD 文は、SELECT 文で検索した行を ASCII オペレーティング・システ ム・ファイルに書き込むために使用します。 構文 I4GL DB ISQL + UNLOAD TO " < ファイル名 > I4GL < ファイル名 変数 > " " DELIMITER < 区切り文字 > " SELECT 文 7-263 ページ I4GL < 区切り文字 変数 > < 区切り 文字 > フィールド間の区切り文字として働く引用符付き文字です。 デフォルトの区切り文字は垂直バー (| = ASCII 124) または DBDELIMITER 環境変数 ( 設定されている場合 ) の値です。 < 区切り文字 フィールド間の区切り文字として使用する文字が含まれてい 変数 > る文字変数です。デフォルトの区切り文字は垂直バー (| = ASCII 124) または DBDELIMITER 環境変数 ( 設定されている場 合 ) の値です。 < ファイル 名> ファイルの名前を指定する引用符付きストリング定数です。 SELECT 文に検索された行はこのファイルに書き込まれます。 < ファイル名 ファイル名が含まれている CHARACTER または VARCHAR 変 変数 > 数です。SELECT 文に検索された行はこのファイルに書き込 まれます。 構文 7-325 使用法 使用法 UNLOAD 文を使用するには、SELECT 文で選択したすべての列に対して Select アクセス権を持っていなければなりません。データベース・レベル アクセス権と表レベル・アクセス権については、7-178 ページの GRANT 文 を参照してください。 SELECT 文は、リテラル SELECT 文で構成することも、SELECT 文が含まれて いる文字変数の名前で構成することもできます。(7-263 ページの SELECT 文 を参照してください。) I4GL PREPARE 文を使用して UNLOAD 文をプリプロセッサーで処理することはで きません。♦ UNLOAD TO ファイル UNLOAD TO ファイルには、表から検索した選択行が含まれています。 次の表は、IBM Informix 4GL、IBM Informix SQL、および DB-Access によって行 われる出力の書式設定方法を示しています。 図 7-135 UNLOAD 文のデータ型と出力フォーマット データの型 出力フォーマット 文字 文字 (CHAR) 型フィールドに区切り文字が含まれていれ ば、IBM Informix 製品は、自動的にそれをバックスラッ シュでエスケープして、特殊文字として解釈されないよ うにします。(LOAD 文を使用して行を表に挿入する場合 は、円記号は自動的に除去されます。) 後続の空白文字は 自動的にクリップされます。 日付 DATE 値は、yyyy/mm/dd として表されます。ここで、mm は月 (January= 1、など )、dd は日、yyyy は年を示します。 ただし、DBDATE 環境変数が設定され、他のフォーマッ トが指定されている場合を除きます。 MONEY MONEY 値は、先行の通貨記号を付けないでアンロード されます。 NULL NULL 列は、区切り文字間に文字を挿入しないでアン ロードされます。 (2 の 1) 7-326 IBM Informix SQL リファレンス・ガイド 使用法 データの型 出力フォーマット 番号 番号データ型は、先行ブランクを付けないで表示されま す。 INTEGER または SMALLINT ゼロは 0 として表され、 FLOAT、SMALLFLOAT、DECIMAL、または MONEY ゼ ロは 0.00 として表されます。 時刻 DATETIME および INTERVAL 値は文字フォームで表さ れ、そのフィールド桁と区切り文字のみを示します。出 力には、型仕様も修飾子もインクルードされません。 yyyy-mm-dd hh:mi:ss.fff のパターンが使用され、データの一 部でないフィールドは省略されます。 (2 の 2) バックスラッシュをフィールド区切り記号または UNLOAD 区切り記号とし て使用しないでください。この文字はエスケープ文字として働き、次の文 字をデータの一部として解釈するように UNLOAD コマンドに通知します。 VARCHAR または BLOB データ型が含まれているファイルをアンロードする 場合は、以下の点に注意してください。 ! BYTE 項目は、16 進数ダンプ・フォーマットで書き込まれ、空白ま たは新規行は追加されません。したがって、BYTE 項目が含まれた アンロード・ファイルの論理長は非常に長くなるため、印刷や編集 が非常に困難になります。 ! 後書きの空白文字は、VARCHAR フィールドに保持されます。 ! UNLOAD TO ファイル内の区切り文字として、0-9、a-f、A-F、空白、 タブ、またはバックスラッシュを使用しないでください。 次の文は、customer 表から行をアンロードし ( この場合、customer_num の 値は 138 以上 )、それらの行を 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 構文 7-327 参考資料 DELIMITER 節 DELIMITER 節は、出力ファイルの行上の各列に含まれているデータを分離 する区切り文字を識別するために使用します。この節を省略すると、 IBM Informix 4GL、IBM Informix SQL、および DB-Access が DBDELIMITER 環境 変数を検査します。 DBDELIMITER 変数が設定されていなければ、デフォルトの区切り文字は 垂直バー (| = ASCII 124) です。DBDELIMITER 環境変数の設定方法について は、第 4 章、『環境変数』を参照してください。 次の文は、セミコロン (;) を区切り文字として指定します。 UNLOAD TO "cust.out" DELIMITER ";" SELECT fname, lname, company, city FROM customer 参考資料 本書では、LOAD および SELECT 文を参照してください。 7-328 IBM Informix SQL リファレンス・ガイド UNLOCK TABLE UNLOCK TABLE 目的 UNLOCK TABLE 文は、LOCKTABLE 文によってすでにロックされている表を アンロックするために、トランザクションなしデータベースで使用します。 構文 + UNLOCK TABLE 表名 7-440 ページ シノニム名 7-438 ページ 使用法 表を所有している場合や、表に対する Select アクセス権を持っている場合 は、直接認可または PUBLIC の認可により表をロックすることができます。 ユーザーは自分がロックした表のみをアンロックすることができます。他 のプロセスによってロックされた表はアンロックできません。 < 表名 > は、アンロックする表の名前または表のシノニムのいずれかです。 ビューまたはビューのシノニムを指定しないでください。 一度に 1 つしかロックを表に適用できません。 トランザクションなしデータベース内の表のロック・モードを変更するに は、まず、UNLOCK TABLE 文を使用して表をアンロックし、次に、新規の LOCK TABLE 文を出します。 UNLOCK TABLE 文をトランザクション内で出すと、この文は失敗します。 トランザクション内で設定された表ロックは、トランザクションが完了す ると自動的にアンロックされます。 ANSI UNLOCK TABLE を ANSI 準拠データベース内で出さないでください。 UNLOCK TABLE 文をトランザクション内で出すと、この文は失敗しますが、 トランザクションは、常に、ANSI 準拠データベース内で有効です。♦ 構文 7-329 参考資料 参考資料 本書では、COMMIT WORK、ROLLBACK WORK、および LOCK TABLE 文を参 照してください。 7-330 IBM Informix SQL リファレンス・ガイド UPDATE UPDATE 目的 UPDATE 文は、表またはビューの 1 つ以上の行の 1 つ以上の列の値を変更す るために使用します。 構文 UPDATE 表名 7-440 ページ SET SET 節 7-334 ページ I4GL ESQL シノニム 名 7-438 ページ < カーソル 名> 条件 7-350 ページ WHERE ビュー名 7-444 ページ CURRENT OF < カーソル 名> カーソル識別子です。 使用法 表のデータを更新するには、表を所有するか、または表に対する Update ア クセス権を持っていなければなりません (7-178 ページの GRANT 文を参照し てください )。ビューのデータを更新するには、必須の Update アクセス権 を持ち、かつビューが、7-332 ページの『ビューによる行の更新』で示して いる要件を満たしていなければなりません。 WHERE 節を省略すると、ターゲット表のすべての行が更新されます。 DB ISQL WHERE 節を省略し、かつ対話モードの場合は、IBM Informix SQL および DB-Access は、ユーザーがすべての行を変更することを確認するまで、 UPDATE 文を実行しません。ただし、この文がコマンド・ファイルに含ま れていて、かつ、IBM Informix SQL または DB-Access をコマンド行から実行 している場合は、この文は即時に実行されます。♦ 構文 7-331 ビューによる行の更新 ビューによる行の更新 ビューに対する Update アクセス権を持っている場合は、単一表 ビューを介 してデータを更新することができます (7-178 ページの GRANT 文を参照し てください )。それを行うには、SELECT 文の定義を 1 つの表だけから 選択 し、以下のいずれのエレメントもそれに含めないでください。 ! DISTINCT キーワード ! GROUP BY 節 ! 導出値 ( 仮想列とも呼ばれる ) ! 集合値 データ整合性制約を使用すれば、ユーザーが、ビューを定義する SELECT 文に適合しない基礎表の値を更新するのを防止することができます。詳細 については、7-98 ページの CREATE VIEW 文の WITH CHECK OPTION に関す る説明を参照してください。 基礎表に固有行が含まれている場合でも、ビューには重複行が現れること がありますので、ビューを介して表を更新するときには細心の注意が必要 です。たとえば、ビューが items 表に定義されていて、order_num および total_price 列だけが含まれている場合に、同じ注文の 2 つの品目が同じ合 計価格を持っていれば、ビューには重複行が含まれます。この場合、この 2 つの重複合計価格値のいずれかを更新する場合、どちらの品目価格が更 新されたか判別できません。 トランザクションなしデータベースの行の更新 トランザクションなしデータベースの行を更新する場合は、更新した行を 復元するための明示的なアクションを実行しなければなりません。たとえ ば、UPDATE 文がいくつかの行を更新した後で失敗した場合は、正常に更新 された行は表に残ります。失敗した更新を自動的に復旧させることはでき ません。 7-332 IBM Informix SQL リファレンス・ガイド トランザクション付きデータベースの行の更新 トランザクション付きデータベースの行の更新 トランザクション付きデータベースの行を更新し、トランザクションを使 用する場合は、ROLLBACK WORK 文を使用して更新を元に戻すことができ ます。更新の前に BEGIN WORK 文を実行せず、更新が失敗した場合は、更 新の開始以降に行われたすべてのデータベースの変更が、データベース・ サーバーによって自動的にロールバックされます。 ANSI ANSI 準拠データベースの行を更新する場合は、トランザクションは暗黙的 であり、すべてのデータベース変更がトランザクションの内部で行われま す。この場合、UPDATE 文が失敗したら、ROLLBACK WORK 文を使用して更 新を元に戻すことができます。♦ ロックに関する考慮事項 IBM Informix OnLine データベース・サーバーを使用している場合、更新す る行を選択すると、更新プロセスは更新ロックを獲得します。更新ロック を使用すれば、他のプロセスは、更新する行を読み取る ( または、共有 す る ) ことができますが、更新または削除することはできません。更新を行 う直前に、更新プロセスは共有ロックを排他ロックに促進 します。排他 ロックは、アンロックされるまで、他のプロセスが行の内容を読み取った り修正したりできないようにします。 IBM Informix OnLine では、 行またはページに対して一度に 1 つの更新ロック しか使用できません ( ロックの型は、CREATE TABLE または ALTER TABLE 文 で選択したロック・モードに応じて異なります )。 更新プロセスは、 他のプロ セスからの共有ロックを持つ行やページに対する更新ロックを獲得できま すが、ユーザーは、 他のプロセスがそれをアンロックするまで、更新ロックを 共有から排他へ促進することはできません ( 更新は行われません )。 単一の更新によって影響を受ける行が非常に多い場合は、同時ロックの最 大数として設定している限度を超えることがあります。このような状態に なった場合は、UPDATE 文当たりのトランザクション数を縮小するか、また はページ (IBM Informix OnLine データベース・サーバーのみ ) または表全体 をロックしてからこの文を実行することができます。 SE UPDATE 文を実行すると、表の個々の行が自動的にロックされます。この 機能は、IBM Informix SE で実行される選択プロセスが行の排他ロックに遭う 可能性を増やします。その結果、処理中の並行性が削減される場合があり ます。♦ 構文 7-333 SET 節 SET 節 SET 節 , <列 名> = 式 ( サブセット ) 7-335 ページ ( SELECT 文 ( サブセット ) 7-335 ページ , , , <列 名> ( ) ) = ( * I4GL 表名 7-440 ページ .* ビュー名 7-444 ページ .* シノニム名 7-438 .* ) 式 ( サブセット ) 7-335 ページ ( SELECT 文 ( サブセット ) 7-335 ページ ) I4GL < レコード.* 変数 > ページ * < 表名 > のすべての列を更新することを示します。 < 列名 > 更新する列を指名します。SERIAL データ型の列を更新するこ とはできません。 < レコード 変数 > 4GL プログラム・レコードに含まれている値で列を更新する ことを示します。 SET 節は、更新する列を識別し、各列に値を割り当てます。この節は、単 一の列と単一の式をペアにしたり、複数の列をリストしてそれらを対応す る式と等しくなるように設定します。 7-334 IBM Informix SQL リファレンス・ガイド SET 節 SET 節によるすべての列の選択 I4GL < シノニム名 >、< 表名 >、< ビュー名 >、または < レコード変数 > に .* 拡張子を使用して、更新するすべての列を選択することができます。♦ SET 節で使用できる式のサブセット 集計関数で構成された式を SET 節で使用することはできません。構文と使 用法の詳しい説明については、7-375 ページの式のセグメントを参照してく ださい。 SET 節で使用できる SELECT 文のサブセット SET 節で使用した SELECT 文は、行内の情報の 複数列 を戻すことができま す。ただし、SELECT 文は、表内の情報の 複数行 を戻すことはできません。 構文と使用法の詳しい説明については、7-263 ページの SELECT 文を参照し てください。 単一列と単一式のペア 任意の数の単一列、単一式のペアを UPDATE 文にインクルードすることが できます。 次の例は、単一列と単一式のペアによる SET 節のフォームを示しています。 図 7-136 単一列と単一式のペアによる 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 構文 7-335 SET 節 複数式と等しい複数列 SET 節には、更新する一連の列をリストするための次の 2 つのオプション が用意されています。 ! 各列を明示的にリストし、すべての列をコンマで区切り、小括弧で 囲む。 ! アスタリスク表記 (*) を使用して < 表名 > 内のすべての列を暗黙的 にリストする。 SET 節を完了するには、各列を明示的にリストし、すべての列をコンマで 区切り、小括弧で囲まなければなりません。式リストには、SQL 副照会を インクルードすることができます。この副照会は、明示的または暗黙的に 指名された列の数が、等号の後の式 ( 複数の場合もある ) によって作成され た値の数と等しい場合に限り、複数値の単一行を戻します。 次の例は、複数列と複数式がペアになった SET 節のフォームを示していま す。 図 7-137 複数列と複数式のペアによる 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/1990") WHERE col4 = 1001 7-336 IBM Informix SQL リファレンス・ガイド SET 節 I4GL IBM Informix 4GL は、暗黙アスタリスク表記 (*) の代替方式 < 表名 .*> を提 供します。IBM Informix 4GL は、SET 節を完了する式のリストを作成するた めの 2 番目のオプションも提供します。< レコード変数 >.* 表記で、4GL レ コード変数に含まれた値のフル セットと等しくなるようにリスト列を設定 することができます。 4GL UPDATE 文が構文ルールに準拠している限り、上記の追加エレメントを この文の他の SET 節オプションと結合することができます。SERIAL 列が含 まれている表内のすべての列を更新したい場合は、SERIAL 列を更新できな くても、SET 節のレコード変数フォームを使用することができます。4GL は、SET 節にレコード変数を含む UPDATE 文を実行する場合、< レコード変 数 >.* によって作成された式リスト内のすべての SERIAL 列とそれに対応す る値を自動的にスキップします。♦ 次の 4GL 例は、このフォームの SET 節を示しています。 図 7-138 IBM Informix 4GL における SET 節内のレコード変数の例 DEFINE p_cust RECORD LIKE customer.* tmp_cust RECORD LIKE customer.* LET upd_stmt = "SELECT * FROM customer ", "WHERE customer_num = ? FOR UPDATE" PREPARE upd_prep from upd_stmt DECLARE upd_cur cursor for upd_prep { . . . Prompt here for p_cust search criteria. } OPEN upd_cur USING p_cust.customer_num FETCH upd_cur INTO p_cust.* IF STATUS = NOTFOUND THEN ERROR "No entry for customer number ", p_cust.customer_num, "." ELSE LET tmp_cust.* = p_cust.* { saves current values in case } { user aborts the update } { . . . Prompt here for new customer table values. } LET int_flag = false INPUT BY NAME p_cust.fname thru p_cust.phone WITHOUT DEFAULTS IF NOT int_flag THEN { User did not press Interrupt key. } UPDATE customer SET customer.* = p_cust.* 構文 7-337 WHERE 節 ELSE { int_flag is true: user pressed INTERRUPT key } LET int_flag = false LET p_cust.* = tmp_cust.* ERROR "Update cancelled." END IF { int_flag test} END IF { status = notfound on upd_cur } WHERE 節 WHERE 節は、更新する行を限定できるようにします。WHERE 節を省略す ると、表内のすべての行が更新されます。 WHERE 節は標準の検索条件からなっています。( 詳細については、7-263 ページの SELECT 文を参照してください。) 次の例は、UPDATE 文内の WHERE 条件を示しています。この例の文は、customer 表の各行に含まれた 3 つの列 (state、zipcode、および phone) を更新します。この表には、 new_address という名前の新規アドレスの表に、対応する項目をもってい ます。 図 7-139 UPDATE 文内での WHERE 条件の使用 UPDATE customer SET (state, zipcode, phone) = (SELECT state, zipcode, phone FROM new_address WHERE new_address.cust_num = customer.cust_num) WHERE customer.cust_num IN (SELECT cust_num FROM new_address) 7-338 IBM Informix SQL リファレンス・ガイド WHERE CURRENT OF 節 WHERE CURRENT OF 節 I4GL ESQL CURRENT OF キーワードを使用して、カーソルのアクティブ・セットの現 在行を更新することができます。ただし、その行に集合がインクルードさ れている場合は、カーソルで行を更新することはできません。CURRENT OF 節で指定されたカーソルには、列名のみを含めることができます。UPDATE 文はカーソルを次の行へ進めないため、現在行の位置は未変更のままです。 FOR UPDATE キーワードで作成されたカーソルに UPDATE 文を関連付けれ ば、CURRENT OF キーワードの効果を制限することができます。(7-108 ペー ジの DECLARE 文を参照してください。) 更新する列を指定せずにカーソル を作成した場合は、後続の UPDATE...WHERE CURRENT OF 文の任意の列を更 新できます。ただし、カーソルを作成した DECLARE 文が、FOR UPDATE 節 に 1 つ以上の列を指定している場合は、後続の UPDATE...WHERE CURRENT OF 文の列のみの更新に制限されます。DECLARE 文の FOR UPDATE 節で列を 指定することの利点は、速度です。DECLARE 文に列が指定されている場 合、IBM Informix SE および IBM Informix OnLine は、通常、より迅速に更新を 行うことができます。♦ 次の IBM Informix 4GL 例は、 WHERE 節の WHERE CURRENT OF フォームを示し ています。この例では、10 % のディスカウントを受ける顧客について更新を 実行します。構文解析を 1 回しか実行しないようにするために、 UPDATE 文が WHILE ループの外部で PREPARE 文によって処理されます。 ( 詳細について は、7-221 ページの PREPARE 文を参照してください。) 図 7-140 IBM Informix 4GL プログラムにおける WHERE 節の WHERE CURRENT OF フォーム の例 PREPARE sel_stmt FROM "SELECT * FROM customer ", "WHERE cust_num between ? and ? FOR UPDATE" DECLARE x CURSOR FOR sel_stmt OPEN x USING low, high PREPARE u FROM "UPDATE customer SET discount = 0.1", "WHERE CURRENT OF x" WHILE TRUE FETCH x INTO r_cust.* IF STATUS = NOTFOUND THEN EXIT WHILE END IF LET ptext = "Update ", r_cust.fname CLIPPED, " ", 構文 7-339 参考資料 r_cust.lname CLIPPED, "?" PROMPT ptext FOR CHAR yn IF yn = "y" THEN EXECUTE u END IF END WHILE CLOSE x ヒント : UPDATE カーソルを使用すれば、UPDATE 文では行えない更新を 実行することができます。UPDATE カーソルは、FOR UPDATE キーワードで 宣言された SELECT 文に関連付けられた順カーソルです。UPDATE カーソル の詳細については、7-112 ページを参照してください。 参考資料 本書では、DECLARE、INSERT、OPEN、および SELECT 文を参照してくださ い。 IBM Informix SQL チュートリアル・ガイド では、UPDATE 文の説明を参照して ください。 7-340 IBM Informix SQL リファレンス・ガイド UPDATE STATISTICS UPDATE STATISTICS 目的 UPDATE STATISTICS 文は、検索ストラテジーとストアード・プロシージャー を最適化するために使用される、システム・カタログ表のデータを更新す るために使用します。 構文 + UPDATE STATISTICS FOR TABLE 表名 7-440 ページ シノニム名 7-438 ページ FOR PROCEDURE プロシー ジャー名 7-429 ページ 使用法 UPDATE STATISTICS 文を出すと、IBM Informix OnLine は、検索ストラテジー を最適化するために使用される systables、syscolumns、および sysindexes システム・カタログ表内のデータを再計算します。データベース・サー バーはこの統計データを自動的には更新しません。UPDATE STATISTICS 文を 出すと、更新プロセスがトリガーされます。 構文 7-341 統計データの更新時期 UPDATE STATISTICS を使用することによっても、sysprocplan システム・カ タログ表のプロシージャーに関する最適化実行計画を更新することができ ます。あるプロシージャーで参照されたいずれかのオブジェクトが変更さ れた場合は、そのプロシージャーが実行されるたびに、データベース・ サーバーがその実行計画を最適化します。プロシージャーを実行する前に、 UPDATE STATISTICS 文を使用してプロシージャーを最適化すると、実行時 間が節約できて、有効な場合があります。 UPDATE STATISTICS 文には現行データベースが必要です。FOR TABLE 節また は FOR PROCEDURE 節を省略すると、現行データベース内のすべての表と プロシージャーに関する統計データが更新されます。 表名を指定せずに FOR TABLE キーワードを使用すると、現行データベース 内のすべての表に関する統計データが更新されます。プロシージャー名を 指定せずに FOR PROCEDURE キーワードを使用すると、現行データベース 内のすべてのストアード・プロシージャーに関する統計データが更新され ます。 現行データベースの外部にある表またはプロシージャーに関する最適化統 計データは更新できません。 SE UPDATE STATISTICS 文を出すと、IBM Informix SE は、検索ストラテジーを最 適化するために使用される、systables システム・カタログ表のデータを再 計算します。♦ 統計データの更新時期 システム・カタログ統計の更新は、表に対して大幅な修正を行うとき、ま たは 1 つ以上のプロシージャーによって使用される表に変更を加え、かつ 実行時のプロシージャーの再最適化をデータベース・サーバーに実行させ たくないときに行います。 ユーザーのアプリケーションが原因で特定の表に大きなばらつきがある場 合は、照会の効率を改善するために、UPDATE STATISTICS 文を使用して、シ ステム・カタログ表を定期的に更新する必要があります。 参考資料 IBM Informix SQL チュートリアル・ガイド では、UPDATE STATISTICS の説明を 参照してください。 7-342 IBM Informix SQL リファレンス・ガイド WHENEVER WHENEVER 目的 WHENEVER 文は、他の SQL 文を実行しているときに発生するエラーと警告 をトラップするために使用します。 構文 I4GL ESQL WHENEVER SQLERROR CONTINUE NOT FOUND + GO TO < ラベル > GOTO :< ラベル > + SQLWARNING I4GL WARNING STOP I4GL E/CO CALL < 関数名 > E/CO ERROR PERFORM < パラグラフ名 > I4GL ANY < 関数名 > エラーまたは警告条件が発生したときに呼び出される埋め込 み言語関数または IBM Informix 4GL 関数の名前です。 < ラベル > エラーまたは警告条件が発生したときにプログラムが制御を 転送する先の文ラベルです。ラベルが符号なし整数であれ ば、文は ANSI 準拠構文に従います。ラベルが符号なし整数 以外の識別子であれば、文は Informix の拡張機能です。 < パラグラフ COBOL パラグラフの名前です。 名> 構文 7-343 使用法 使用法 WHENEVER 文の使用は、すべての SQL 文の後にエラー検査ルーチンを入れ るのと同じことです。エラーや警告を探すためにユーザーのプログラムで WHENEVER 文を使用しない場合にエラーが発生したら、プログラムの実行 が停止します。 WHENEVER 文の範囲は、ソース・モジュール内の文の格納場所から、同一 ソース・モジュール内の同一例外条件 (SQLERROR、SQLWARNING、など ) を持つ WHENEVER 文までです。ソース・モジュールに他の WHENEVER 文 が含まれていない場合は、文は、プログラムまたはモジュールが終了する まで有効です。 たとえば、次の ESQL/C プログラムは 3 つの WHENEVER 文を持ち、そのう ちの 2 つは WHENEVER SQLERROR 文です。行 6 では、CONTINUE キーワー ドが指定されています。行 10 では、STOP が SQLERROR と一緒に使用され ます。行 6 の後で、かつ行 10 の前で発生したエラーは、無視されます。行 10 の後で、かつプログラムの残りの場合は、発生したすべての SQL エラー はプログラムを終了させます。 図 7-141 WHENEVER SQLERROR をリセットする ESQL/C プログラム 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 main() { long char_num; $ DATABASE test; $ WHENEVER SQLERROR CONTINUE; printf("\n\nGoing to try first insert\n\n"); $ INSERT INTO test_color VALUES ("green"); $ WHENEVER NOT FOUND CONTINUE; $ WHENEVER SQLERROR STOP; printf("\n\nGoing to try second insert\n\n"); $ INSERT INTO test_color VALUES ("blue"); $ CLOSE DATABASE; printf("\n\nProgram over\n\n"); } 7-344 IBM Informix SQL リファレンス・ガイド SQLERROR キーワード SQLERROR キーワード SQLERROR キーワードを使用する場合は、失敗した SQL 文は、すべて WHENEVER 文の指示に従って処理されます。sqlcode 変数がゼロより小さい と、エラーが発生します。各製品で使用される sqlcode 変数の仕様が次に表 にリストされています。 4GL ESQL/C ESQL/COBOL SQLCA.SQLCODE STATUS sqlca.sqlcode SQLCODE SQLCODE OF SQLCA 次の文では、SQL エラーが発生するたびに、それを無視します。 WHENEVER SQLERROR CONTINUE WHENEVER SQLERROR 文をプログラムで使用しない場合で、かつ、コンパ イル時に、そのプログラムがアクセスするデータベースが ANSI 準拠でなけ れば、WHENEVER SQLERROR のデフォルトは STOP になります。 ANSI I4GL WHENEVER SQLERROR 文をプログラムで使用しない場合で、かつ、コンパ イル時に、そのプログラムがアクセスするデータベースが ANSI 準拠であれ ば、WHENEVER SQLERROR のデフォルトは CONTINUE になります。♦ WHENEVER SQLERROR は、SQL 文の後のエラーの検査をするほか、Screen I/O 文および VALIDATE 文の後のエラー検査も行います。♦ ANY オプション I4GL ANY オプション ANY キーワードを使用すると、式の評価後に status 変数が設定されます。 この設定は、変数が SQL 文、Screen I/O 文、または VALIDATE 文の外部に あっても行われます。♦ SQLWARNING キーワード SQLWARNING キーワードを使用すると、警告を生成するすべての SQL 文 が、WHENEVER SQLWARNING 文によって指示されたアクションを実行しま す。警告が出ると、SQLAWARN レコードの先頭のフィールドが W に設定さ れます。 構文 7-345 NOT FOUND キーワード 次の文は、警告条件が発生するたびに実行を停止させます。 WHENEVER SQLWARNING STOP NOT FOUND キーワード NOT FOUND キーワードを使用すると、SELECT および FETCH 文は、他の SQL 文と異なる方法で処理されます。NOT FOUND キーワードは次の場合を 検査します。 ! FETCH 文がアクティブ・セットの先頭行または最終行を越えて行 を取得しようとする場合 ! SELECT 文が行を戻さない場合 いずれの場合も、sqlcode 変数は 100 に設定されます。各 IBM Informix 製品 における sqlcode 変数の名前については、7-345 ページの『SQLERROR キー ワード』を参照してください。 次の文は、NOT FOUND 条件が発生するたびに no_rows 関数を呼び出しま す。 WHENEVER NOT FOUND CALL no_rows I4GL NOT FOUND と NOTFOUND は、どちらも同じ条件を示しますが、互いに代 替使用することはできません。NOTFOUND (1 語 ) は状態変数に使用し、 NOT FOUND (2 語 ) は WHENEVER 文と一緒に使用します。♦ WARNING キーワード I4GL WARNING は SQLWARNING. のシノニムです。♦ ERROR キーワード I4GL ERROR は SQLERROR. のシノニムです。♦ E/CO GOTO キーワード GOTO 節は、ラベルで示された文に制御を転送するために使用します。GO TO キーワードは GOTO のシノニムです。 7-346 IBM Informix SQL リファレンス・ガイド GOTO キーワード I4GL GOTO キーワードの後に指定されたラベルは、WHENEVER 文と同じ FUNCTION、REPORT、または MAIN プログラム・ブロックに入っていなけ ればなりません。♦ たとえば、次の IBM Informix 4GL コードの WHENEVER 文は、NOT FOUND 条 件が発生するたびに missing: というラベルの文に制御を転送します。 FUNCTION query_data() ... FETCH FIRST a_curs INTO p_customer.* WHENEVER NOT FOUND GO TO :missing ... LABEL missing: MESSAGE "No customers found." SLEEP 3 MESSAGE "" END FUNCTION I4GL モジュールに複数のプログラム・ブロックが含まれている場合は、エラー 条件を再定義しなければならないことがあります。たとえば、モジュール に 3 つの関数が含まれていて、最初の関数に、WHENEVER...GOTO 文とそれ に対応する LABEL 文がインクルードされていると仮定します。コンパイル が最初の関数から次の関数へ移動したとき、エラー条件は引き続きそのラ ベルを参照します。しかし、ラベルはもう定義されていません。コンパイ ラーが SQL 文を読み取ったときに、エラー条件 ( たとえば、WHENEVER ERROR CONTINUE に対する ) が再定義されていないと、コンパイル・エ ラーが発生します。 別の WHENEVER 文を出してエラー条件をリセットすることもできれば、同 じラベル名を持つラベル付き文を各関数に指定することもでき、また CALL 節を使用して別個の関数を呼び出すこともできます。♦ ESQL プログラムに複数の関数が含まれている場合は、エラー条件を再定義しな ければならないことがあります。たとえば、モジュールに 3 つの関数が含 まれていて、最初の関数に、WHENEVER...GOTO 文とそれに対応するラベル 付き文がインクルードされていると仮定します。コンパイルが最初の関数 から次の関数へ移動したとき、エラー条件は引き続きそのラベルを参照し ます。しかし、ラベルはもう定義されていません。コンパイラーが SQL 文 を読み取ったときに、エラー条件 ( たとえば、WHENEVER SQLERROR CONTINUE に対する ) が再定義されていないと、コンパイル・エラーが発生 します。 別の WHENEVER 文を出してエラー条件をリセットすることもできれば、同 じラベル名を持つラベル付き文を各関数に指定することもでき、また CALL 節を使用して別個の関数を呼び出すこともできます。♦ 構文 7-347 CALL 節 CALL 節 CALL 節は、名前付き関数に制御を転送するために使用します。関数名の後 に小括弧を付けないでください。変数を関数に渡すことはできません。 次の文は、プログラムがエラー条件を検出した場合に、error_recovery と いう関数を実行します。 WHENEVER SQLERROR CALL error_recovery CALL キーワードを使用してストアード・プロシージャーの名前を指定する ことはできません。ストアード・プロシージャーを呼び出したい場合は、 CALL 節を使用して、EXECUTE PROCEDURE 文が入っている関数を実行して ください。 CONTINUE キーワード CONTINUE キーワードは、プログラムにアクションをとらないように指示 するために使用します。このキーワードを使用して、前に指定したオプ ションをオフにすることができます。 STOP キーワード STOP キーワードは、プログラムを即時に終了するために使用します。次の 文は、データベース・サーバーが警告を出したときに、プログラム実行を 終了します。 WHENEVER SQLWARNING STOP 参考資料 本書では、EXECUTE PROCEDURE および FETCH 文を参照してください。 IBM Informix 4GL Reference Manual では、CALL、DEFER、FOREACH、GOTO、 IF、および LABEL 文を参照してください。 埋め込み言語製品のユーザー・マニュアルでは、エラー検査に関する章を 参照してください。 7-348 IBM Informix SQL リファレンス・ガイド セグメント セグメント セグメントは、構文図から抽出された構文のエレメントです。分かりやす くするためと使いやすくするために各セグメントを別々に説明します。 下記のセグメントは複数の文で共通に使用されるもので、次のセクション で収集されます。 ! 条件 ! 制約名 ! データベース名 ! データ型 ! DATETIME フィールド修飾子 ! 式 ! 識別子 ! インデックス名 ! INTERVAL フィールド修飾子 ! リテラル DATETIME ! リテラル INTERVAL ! リテラル番号 ! プロシージャー名 ! 引用符付きストリング ! 関係演算子 ! シノニム名 ! 表名 ! ビュー名 構文 7-349 条件 条件 目的 条件セグメントは、データが特定の資格を満たしているかどうかを判別す るために使用します。条件セグメントは、次のように使用できます。 ! ALTER TABLE または CREATE TABLE 文でチェック制約として ! WHERE 節内の DELETE 文で ! WHERE 節および HAVING 節の中の SELECT 文で ! WHERE 節の中の UPDATE 文で ! SPL を使用している場合、IF 文で ! SPL を使用している場合、WHILE 文で 構文 AND OR 比較条件 7-351 ページ NOT 副照会の条件 7-360 ページ 使用法 条件とは、1 つ以上の検索条件の集合であり、オプションで、論理演算子 AND または OR によって接続されます。検索条件は以下のカテゴリーに入 ります。 ! 比較条件 ( フィルターまたは論理式とも呼ばれます ) ! 副照会を持つ条件 7-350 IBM Informix SQL リファレンス・ガイド 条件に対する制限 条件に対する制限 条件を SELECT 文の HAVING 節または副照会の HAVING 節で使用する場合 は、その条件には集計関数のみを含めることができます。DELETE、 SELECT、または UPDATE 文の WHERE 節の一部である比較条件に、集計関 数を使用することはできません。 NOT 演算子オプション 条件を NOT キーワードで始めると、NOT が満たす条件が偽である場合にの みテストが真になります。NOT が満たす条件が不明 ( 決定に NULL を使用 ) であれば、NOT 演算子は効果を持ちません。次の真理値表は NOT の効果を 示しています。文字 T は真の条件を表し、F は偽の条件を表し、? は不明の 条件を表します。算術演算子を使用する式の一部が NULL であれば、不明 の値が示されます。 NOT T F ? F T ? 比較条件 ( 論理式 ) 5 種類の比較条件があります。つまり、関係演算子、BETWEEN、IN、 ISNULL、および LIKE と MATCHES です。比較条件は単一の真または偽の結 果に評価されるので、比較条件はしばしば論理式と呼ばれます。各比較条 件の構文が次の図で要約されており、詳しい説明が図の後に続いています。 構文 7-351 比較条件 ( 論理式 ) 関係演算子 7-434 ページ 式 7-375 ページ 式 7-375 ページ 式 7-375 ページ BETWEEN NOT 式 7-375 ページ + 式 7-375 ページ , 式 7-375 ページ リテラル 番号 7-427 ページ リテラル 日時 7-421 ページ リテラル 間隔 7-424 ページ 引用符付き ストリング 7-431 ページ ( IN AND NOT ) TODAY USER CURRENT 表名 7-440 ページ . ビュー名 7-444 ページ . シノニム 名 7-438 ページ .. OL SITENAME DBSERVERNAME < 列名 > IS NULL NOT LIKE < 列名 > 表名 7-440 ページ . ビュー名 7-444 ページ . シノニム名 .. 7-438 日時修飾子 7-373 ページ NOT + MATCHES ページ 7-352 IBM Informix SQL リファレンス・ガイド 引用符付き ストリング 7-431 ページ ESCAPE "< 文字 (CHAR) >" 比較条件 ( 論理式 ) 関係演算子条件 式 7-375 ページ 関係演算子 7-434 ページ 式 7-375 ページ 関係演算子条件の例を次に示します。 図 7-142 関係演算子条件の例 city[1,3] = "San" o.order_date > "6/12/86" WEEKDAY(paid_date) = WEEKDAY(CURRENT-31 UNITS day) YEAR(ship_date) < YEAR (TODAY) quantity <= 3 customer_num <> 105 customer_num != 105 ある行に対していずれかの式が NULL であれば、その条件は偽に評価され ます。たとえば、paid_date が NULL 値であれば、その行を検索するために 次のどの文も使用することはできません。 図 7-143 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 条件については、後のセクションで詳しく説明します。 図 7-144 IS NULL 条件の例 SELECT customer_num, order_date FROM orders WHERE paid_date IS NULL 構文 7-353 比較条件 ( 論理式 ) BETWEEN 条件 式 7-375 ページ BETWEEN 式 7-375 ページ AND 式 7-375 ページ NOT BETWEEN テストが真であるためには、BETWEEN キーワードの左側にある 式の値が、BETWEEN キーワードの右側にある 2 つの式の値の包括的範囲に 入っていなければなりません。NULL 値はこの条件を満たしません。この 範囲を定義する式には NULL を使用することはできません。 BETWEEN 条件の例を次に示します。 図 7-145 BETWEEN 条件の例 order_date BETWEEN "6/1/90" and "9/7/90" 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 7-354 IBM Informix SQL リファレンス・ガイド 比較条件 ( 論理式 ) IN 条件 , 式 7-375 ページ ( IN NOT リテラル 番号 7-427 ページ ) リテラル 日時 7-421 ページ リテラル 間隔 7-424 ページ 引用符付き ストリング 7-431 ページ TODAY USER CURRENT 日時 修飾子 7-373 ページ OL SITENAME DBSERVERNAME IN 条件は、IN 語の左側にある式が項目のリストにインクルードされている 場合に満たされます。NOT オプションは、式が項目のリストに含まれてい ない場合に満たされる検索条件を生成します。NULL 値はこの条件を満た しません。 IN 条件の例を次に示します。 図 7-146 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) I4GL ESQL TODAY は実行時に評価されます。CURRENT は、単一の SELECT の場合に、 カーソルをオープンしたとき、または照会を実行したときに評価されま す。♦ 構文 7-355 比較条件 ( 論理式 ) USER 関数を使用する場合は、大文字小文字の区別に注意してください。こ の関数は、minnie と Minnie を異なる値として受け取ります。 IS NULL 条件 IS NULL 条件は、NULL 値が存在しているかどうかの検査を行います。その 構文は次のとおりです。 < 列名 > 表名 7-440 ページ . ビュー名 7-444 ページ . シノニム 名 7-438 ページ . < 別名 > . IS NULL NOT < 別名 > 列が含まれている表の別名です。 < 列名 > 検査対象列の名前です。 IS NULL 条件が満たされるのは、列に NULL 値が含まれている場合です。IS NOT NULL オプションを使用する場合にこの条件が満たされるのは、列に非 NULL 値が含まれているときです。次の例は IS NULL 条件を示しています。 WHERE paid_date IS NULL 7-356 IBM Informix SQL リファレンス・ガイド 比較条件 ( 論理式 ) LIKE および MATCHES 条件 LIKE または MATCHES 条件は、一致する文字ストリングをテストします。 このテストの構文は次のとおりです。 < 列名 > 表名 7-440 ページ ビュー名 7-444 ページ シノニム 名 7-438 ページ < 別名 > . LIKE NOT + 引用符付き ストリング 7-431 ページ ESCAPE "< 文字 (CHAR) >" MATCHES . . . < 別名 > 列が含まれている表の別名です。 < 文字 > 引用符で囲まれた単一文字です。 < 列名 > 列の名前です。 検索条件が満たされるのは、左側の列の値が、引用符付きストリングに よって指定されたパターンと一致するときです。ストリングにワイルド カード文字を使用することができます。NULL 値はこの条件を満たしませ ん。 引用符付きストリングでリテラル引用符と一致させるために二重引用符 (") のみを使用できます。ESCAPE キーワードは使用できません。"""" と書けば、 他の任意のパターンと突き合わせる際に、引用符文字を ESCAPE 文字とし て使用することができます。 NOT オプション NOT オプションを使用すれば、左側の列が非 NULL 値を含み、引用符付き ストリングによって指定されたパターンと一致しないときに、検索条件を 満足することができます。たとえば、次の条件は、lname 列内の文字 Baxter で始まるすべての行を除外します。 WHERE lname NOT LIKE "Baxter%" WHERE lname NOT MATCHES "Baxter*" 構文 7-357 比較条件 ( 論理式 ) LIKE オプション LIKE を使用する場合は、次のワイルドカード文字を引用符付きストリング で使用することができます。 % % 記号はゼロ以上の文字と一致します。 _ アンダースコアーは任意の単一文字と一致します。 \ 円記号は、次の文字の特別の意味を削除します (\% または \_ と書いて、% または _ と突き合わせるために使用します )。 円記号をエスケープ文字として使用することは、ANSI 準拠 SQL の Informix 機能拡張です。 次の条件は、“tennis” というストリングを単独で、またはより長いストリン グ ( たとえば、“tennis ball” または “tabletennis paddle”) の一部として、テス トします。 WHERE description LIKE "%tennis%" 次の条件は、アンダースコアーが含まれているすべての記述をテストしま す。アンダースコアーはワイルドカード文字であるため、円記号が必要で す。 WHERE description LIKE "%\_%" MATCHES オプション MATCHES キーワードを使用する場合は、次のワイルドカード文字を引用符 付きストリングで使用することができます。 * アスタリスク記号は、ゼロ以上の文字と一致します。 ? 疑問符は任意の単一文字と一致します。 [...] 大括弧の中の文字は、[a-z] などの文字範囲を含め、囲まれた 任意の文字と一致します。脱字記号は、大括弧の中の先頭文 字として (^) が付いているもので、リストされていない任意 の文字と一致します。つまり、[^abc] は、a、b、または c の いずれでもない文字と一致します。 \ 円記号は、次の文字の特別の意味を削除します (\* または \? と書いて、* または ? と突き合わせるために使用します )。 7-358 IBM Informix SQL リファレンス・ガイド 比較条件 ( 論理式 ) 次の条件は、“tennis” というストリングを単独で、またはより長いストリン グ ( たとえば、“tennis ball” または “tabletennis paddle”) の一部として、テス トします。 WHERE description MATCHES "*tennis*" 次の条件は “Frank” および “frank” という名前で真です。 WHERE fname MATCHES "[Ff]rank" 次の条件は、“F” または “f” のいずれかで始まるすべての名前で真です。 WHERE fname MATCHES "[Ff]*" LIKE での ESCAPE ESCAPE 節を使用すれば、アンダースコアー (_) またはパーセント記号 (%) を引用符付きストリングにインクルードして、それらがワイルドカードと 解釈されないようにすることができます。z をエスケープ文字として使用す る場合は、ストリング内の文字 z_ は 文字 _ を表します。同様に、文字 z% は文字 % を表します。最終的に、ストリング内の文字 zz は文字 z を表しま す。次の文は、company 列にアンダースコアーが含まれている行を customer 表から取り出します。 SELECT * FROM customer WHERE company LIKE "%z_%" ESCAPE "z" MATCHES での ESCAPE ESCAPE 節を使用すれば、疑問符 (?)、アスタリスク (*)、および左または右 大括弧 ([]) を引用符付きストリングにインクルードして、それらがワイル ドカードと解釈されないようにすることができます。z をエスケープ文字と して使用する場合は、ストリング内の文字 z? は文字 ? を表します。同様に、 文字 z* は文字 * を表します。最終的に、ストリング内の文字 zz は文字 z を 表します。次の文は、company 列に疑問符文字が含まれている行を customer 表から取り出します。 SELECT * FROM customer WHERE company LIKE "*z?*" ESCAPE "z" 構文 7-359 副照会での条件 副照会での条件 条件内で SELECT 分を使用することができます。この方法は副照会と呼ば れます。SELECT 文で副照会を使用して、以下のことを行うことができま す。 ! 式と他の SELECT 文の結果を比較する ! 式が他の SELECT 文の結果にインクルードされているかどうかを判 別する ! 他の SELECT 文によっていずれかの行が選択されたかどうかを調べ る 副照会が、外部 SELECT 文によって評価される現在行に依存している場合 があります。この場合、副照会は相互関連副照会になります。 副照会条件には 3 種類があります。それぞれの副照会条件について、構文 と例を示します。 副照会で使用できる SELECT のサブセット 副照会は、使用されるコンテキストに応じて、単一値、無値、または値の セットを戻すことができます。副照会が値を戻す場合は、単一列のみを選 択する必要があります。副照会が単に行 ( 複数の場合もある ) の存在を調べ るだけの場合は、任意の数の行または列を選択することができます。副照 会に ORDER BY 節を含めることはできません。SELECT 文のすべての構文が 7-263 ページに示されています。 IN 副照会 式 7-375 ページ IN NOT ( SELECT ( サブセット 7-360 ページ ) IN 副照会条件は、副照会によって選択された 1 つ以上の値と式の値が一致 する場合に真になります。副照会は 1 つの列しか戻してはなりませんが、 複数の行を戻すことができます。IN キーワードは =ANY シーケンスと同等 です。NOT IN キーワードは !=ALL シーケンスと同等です。7-362 ページの ALL/ANY/SOME セクションを参照してください。 次の条件は、野球グラブが含まれない注文の注文番号を検出します (stock_num =1)。 7-360 IBM Informix SQL リファレンス・ガイド 副照会での条件 図 7-147 IN 副照会の例 WHERE order_num NOT IN (SELECT order_num FROM items WHERE stock_num = 1) IN 副照会は行の存在をテストするので、副照会結果の重複行はメインの照 会の結果に影響を与えません。したがって、UNIQUE または DISTINCT キー ワードを副照会に含めても、照会結果に影響を与えません。ただし、重複 のテストを行わないと、照会の実行に必要な時間が削減されることがあり ます。 EXISTS 副照会 EXISTS ( SELECT ( サブセット ) 7-360 ページ ) NOT EXISTS 副照会条件は、副照会が行を戻した場合に真と評価されます。 EXISTS 副照会では、1 つ以上の列を戻すことができます。副照会には常に、 メイン照会内の表列への参照が含まれています。集計関数を EXISTS 副照会 で使用する場合は、常に少なくとも 1 つの行を戻します。 SELECT 文を EXISTS 副照会付きで使用した次の例は、注文を受けたことが ない ( したがって、items 表にリストされていない ) すべての項目の在庫番 号とメーカー・コードを戻します。この SELECT 文では EXISTS 副照会を使 用するのが適切です。それは、副照会を使用して items の stock_num と manu_code の両方をテストするからです。 図 7-148 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 * を使用することもできます。 構文 7-361 副照会での条件 ALL/ANY/SOME 副照会 式 7-375 ページ 関係 演算子 7-434 ページ ( SELECT ( サブセット ) 7-360 ページ ) ALL ANY SOME ALL 副照会から戻されたすべての値に関する比較が真である場合 に、検索条件が真であることを示すキーワードです。副照会 が値を戻さない場合は、条件は真になります。 ANY 戻された値の少なくとも 1 つに関する比較が真である場合 に、検索条件が真であることを示すキーワードです。副照会 が値を戻さない場合は、検索条件は偽になります。 SOME ANY の別名です。 次の例の最初の条件は、各 total_price が、注文番号 1023 のすべての品目の 合計価格より大きいかどうかをテストします。2 番目の条件は、MAX 集計 関数を使用して同じ結果を出します。 図 7-149 ALL 副照会および同等の集合副照会の例 total_price > ALL (SELECT total_price FROM items WHERE order_num = 1023) total_price > (SELECT MAX(total_price) FROM items WHERE order_num = 1023) 次の条件は、合計価格が注文番号 1023 の少なくとも 1 つの品目の合計価格 より大きいときに真になります。最初の条件は ANY キーワードを使用し、 2 番目の条件は MIN 集計関数を使用します。 図 7-150 ANY 副照会および同等の集合副照会の例 total_price > ANY (SELECT total_price FROM items WHERE order_num = 1023) total_price > (SELECT MIN(total_price) FROM items WHERE order_num = 1023) 7-362 IBM Informix SQL リファレンス・ガイド AND または OR を持つ条件 NOT キーワードを ANY 副照会付きで使用すると、式がどの副照会値につい ても真でないかどうかがテストされます。たとえば、次の条件は、 total_price 式が、選択したどの値よりも大きくないときに真になります。 つまり、total_price が注文番号 1023 のどの合計価格よりも大きくないとき に真になります。 図 7-151 ANY 副照会での NOT キーワードの例 NOT total_price > ANY (SELECT total_price FROM items WHERE order_num = 1023) ANY、ALL、または SOME キーワードの省略 副照会が正確に 1 つの値だけを戻すことが分かっている場合は、その副照 会で ANY、ALL、または SOME キーワードを省略することができます。 ANY、ALL、または SOME キーワードを省略し、副照会が複数の値を戻した 場合は、エラーになります。次の例の副照会は集計関数を使用しているの で、1 行しか戻しません。 SELECT order_num FROM items WHERE stock_num = 9 AND quantity = (SELECT MAX(quantity) FROM items WHERE stock_num = 9) AND または OR を持つ条件 単純条件を論理演算子 AND または OR と結合することができます。次の SELECT 文には、WHERE 節における複合条件の例が含まれています。 図 7-152 単純条件と AND または OR との結合 SELECT customer_num, order_date FROM orders WHERE paid_date > "1/1/90" 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") 構文 7-363 AND または OR を持つ条件 次の真理値表は、AND および OR 演算子の効果を示しています。文字 T は 真の条件を表し、F は偽の条件を表し、? は不明値を表します。不明値は、 論理演算子を使用する式の一部が NULL の場合に生じます。 AND T F ? OR T F ? T F ? T F ? F F F ? F ? T F ? T T T T F ? T ? ? 論理式が UNKNOWN と評価した場合は、この条件は満たされません。 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 が TRUE であるため、AND 表は条件全体の真理値が UNKNOWN であることを示しています。したがって、この行は選択されま せん。この条件が、AND ではなく、OR を使用した場合は、この条件は真に なります。 7-364 IBM Informix SQL リファレンス・ガイド 制約名 制約名 目的 制約名構文は、構文ダイアグラムで制約名を参照するときに必ず使用され ます。制約名セグメントは次の文に現れます。 ! ALTER TABLE ! CREATE TABLE ! SET CONSTRAINTS 構文 < 所有者 >. OL 識別子 7-403 ページ < データベース > <@ サーバー> < データベース > 制約が含まれたデータベースの名前です。 < 所有者 > 制約の所有者のユーザー名です。ANSI 標準準拠のデータベー スを使用する場合は、自分が所有していない制約に対して owner. 規則を使用しなければなりません。 < サーバー > < データベース > が常駐する IBM Informix OnLine データベー ス・サーバーの名前です。アットマーク (@) は、データベー ス・サーバー名を示すために使用しなければならないリテラ ル文字です。 使用法 制約の実際の名前は SQL 識別子です。 表を作成する場合、制約の <. 名前 > はデータベース内で固有でなければな りません。 構文 7-365 使用法 ANSI 表を作成する場合、< 所有者 . 名前 > 条件はデータベース内で固有でなけ ればなりません。 < 所有者 . 名前 > には大文字小文字の区別があります。詳細については、 7-442 ページの ANSI 準拠データベースにおける大文字小文字の区別の説明 を参照してください。♦ 7-366 IBM Informix SQL リファレンス・ガイド データベース名 データベース名 目的 データベース名構文は、構文ダイアグラムでデータベース名を参照すると きに必ず使用されます。データベース名セグメントは次の文で使用されま す。 ! CREATE DATABASE ! DATABASE ! DROP DATABASE ! ROLLFORWARD DATABASE ! START DATABASE 構文 識別子 7-403 ページ OL OL @ "<//DB I4GL ESQL SE <DB 名 > <DB サー バー名 > サーバー名 /DB 名 >" < 変数名 > "<//DB サーバー名 / ディレクトリー・ パス /DB 名 >" データベースそれ自身の名前です。 構文 7-367 使用法 <DB サーバー名 > データベースが常駐するデータベース・サーバーの名前で す。 < ディレクト リー・パス > .dbs ディレクトリーの親ディレクトリーへのデータベー ス・ディレクトリーのパスです。 < 変数名 > データベースの名前が含まれている、プログラム変数また はホスト変数です。 使用法 単純データベース名は SQL 識別子です ( 7-403 ページを参照 )。データベー スを作成する場合、データベースに割り当てる名前は最高 18 文字にするこ とができます。データベース名には大文字小文字の区別はありません。 次の例はデータベース仕様を示しています。 empinfo@personnel <@DB サーバー名 > オプション データベース・サーバー名を使用する場合は、名前と @ との間にスペース を入れないでください。たとえば、次の文は、training データベース・ サーバーの stores5 データベースに有効です。 DATABASE stores5@training データベース・サーバー名を指定すれば、他のデータベース・サーバー上 のデータベースを自分の現行データベースとして選択することができます。 <DB サーバー名 > を使用して現行データベース・サーバーを指名すること ができます。ただし、これは余分の情報になります。 <//DB サーバー名 /DB 名 > オプション 代替指名方式を使用する場合は、次の例に示されているように、引用符、 スラッシュ、および名前の間にスペースを入れないでください。 DATABASE "//training/stores5" 7-368 IBM Informix SQL リファレンス・ガイド < 変数名 > オプション <@DB サーバー名 > オプションの場合と同様に、データベース・サーバー 名を指定すれば、他のデータベース・サーバー上のデータベースを自分の 現行データベースとして選択することができます。ローカル・データベー スを指名するには、<DB サーバ名 > を <DB 名 > と一緒に使用します。 < 変数名 > オプション I4GL ESQL I4GL SE I4GL ESQL データベースの名前を保持するために、4GL または埋め込み言語プログラ ム内で変数を使用することができます。♦ データベース名を関数または MAIN プログラム・ブロック内に保持するた めに、変数を使用することができます。データベース名を保持するために 変数を使用できないのは、DATABASE 文を使用して、LIKE データベース列 が定義されているグローバル変数を定義する場合です。♦ 現行ディレクトリーにも、DBPATH 環境変数によって指定されたディレク トリーにも常駐していないデータベースを指定したい場合は、DATABASE キーワードの後ろに、データベースの絶対パス名 (.dbs 拡張子を除く ) に評 価されるプログラム変数を指定する必要があります。♦ <//DB サーバー名 / ディレクトリー・パス /DB 名 > オプション SE INET IBM Informix NET を使用する場合は、別のデータベース・サーバー上のデー タベースを指定することができます。引用符、スラッシュ、および名前の 間にスペースを入れないでください。次のデータベース名は、business データベース・サーバーに常駐する stores5 データベースを記述していま す。 //business/u/acctng/demo/stores5 ♦ 構文 7-369 データ型 データ型 目的 データ型セグメントは、列または値のデータ型を指定しなければならない ときは必ず使用します。データ型セグメントは次の文で使用されます。 ! ALTER TABLE ! CREATE PROCEDURE ! CREATE TABLE 構文 7-370 IBM Informix SQL リファレンス・ガイド 構文 CHAR ( CHARACTER ) < サイズ > (1) + DATE + DATETIME DATETIME フィールド修飾子 7-373 ページ DECIMAL ( DEC ) < 精度 > , < 小数点 16 NUMERIC 以下桁数 > FLOAT < 浮動 > < 精度 > ( DOUBLE PRECISION ) INTEGER INT + INTERVAL + INTERVAL フィールド修飾子 7-419 ページ MONEY ( ) < 精度 > ,2 16 , スケール + SERIAL (1) (< 開始 >) + SMALLFLOAT REAL SMALLINT OL + TEXT IN BYTE TABLE <BLOB 領域 > OL + VARCHAR ( ) < 最大 > , < 予約 > ,0 構文 7-371 使用法 <BLOB 領域 > すでに存在している BLOB 領域の名前です。 < 浮動精度 > 1 ~ 14 の整数です。< 浮動精度 > は無視されます。 < 最大 > VARCHAR 最大可能長です。 < 精度 > 10 進数型または金額 (MONEY) 型の有効数字の総数です。1 ~ 16 の整数です。 < 予約 > 実際のデータが < 予約 > より短い場合でも、VARCHAR 用に 予約されているスペースの量です。 < 小数点以下 桁数 > 小数点の右側の桁数です。 < サイズ > 列内の文字数です。 < 開始 > SERIAL 列内の値の開始番号です。 使用法 詳細については、第 3 章、『データ型』のすべてのデータ型の説明を参照し てください。 7-372 IBM Informix SQL リファレンス・ガイド DATETIME フィールド修飾子 DATETIME フィールド修飾子 目的 DATETIME フィールド修飾子は、DATETIME 列または値に最大および最小時 間単位を指定します。DATETIME フィールド修飾子は次のセグメントで使 用します。 ! データ型 ! 式 ( 定数式の ) 構文 YEAR MONTH TO YEAR DAY TO MONTH HOUR TO DAY MINUTE TO HOUR SECOND TO MINUTE FRACTION TO SECOND TO FRACTION (3) (< 桁数 >) < 桁数 > 小数部を何桁の精度で測定するかを示す、1 ~ 5 桁の単一整数 です。 構文 7-373 使用法 使用法 最初の 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 桁の 10 進数で表した秒の小数部です。デフォルトの小 数点以下桁数は 3 桁です (1/1000 秒 )。 DATETIME 修飾子の例を次に示します。 図 7-153 DATETIME 修飾子の例 DAY TO MINUTE YEAR TO MINUTE DAY TO FRACTION(4) MONTH TO MONTH 7-374 IBM Informix SQL リファレンス・ガイド 式 式 式とは、データベースまたはデータベース・サーバーに含まれている、ま たはそこから派生したデータの 1 つ以上の断片です。式セグメントは、次 の文とセグメントで使用されます。 ! SELECT ! 条件セグメント内の DELETE ! 条件セグメント内の UPDATE ! SPL 式 構文 7-375 構文 構文 + * / | | 列式 7-377 ページ _ + 定数式 7-380 ページ 関数式 7-387 ページ 集合式 7-263 ページ < 変数名 > ( < 変数名 > 式 ) 値が含まれているプログラム変数またはホスト変数の名前で す。 使用法 いくつかの式を結合するには、それらを加算、減算、乗算、および除算の 算術演算子で接続します。 集計関数を副照会で使用するのでない限り、WHERE 節の一部ある条件内で 集計式を使用することはできません。 7-376 IBM Informix SQL リファレンス・ガイド 連結演算子 連結演算子 連結演算子 (||) を使用して 2 つの式を連結することができます。たとえば、 次は、いくつかの可能な連結式の組み合わせを示したものです。最初の例 は、zipcode 列を lname 列の先頭の 3 文字と連結します。2 番目の例は、.dbg 接尾辞を file_variable というホスト変数の内容に連結します。3 番目の例 は、TODAY 関数によって戻された値と Date ストリングを連結します。 lname[1,3] || zipcode $file_variable || ".dbg" "Date:" || TODAY ESQL 専用文では連結演算子は使用できません。ESQL 専用文は次のとおり です。 ALLOCATE DESCRIPTOR FETCH CLOSE FLUSH DEALLOCATE DESCRIPTOR FREE DECLARE GET DESCRIPTOR DESCRIBE OPEN EXECUTE PREPARE EXECUTE IMMEDIATE PUT 構文 7-377 列式 列式 構文の構文は次のとおりです。 < 列名 > 表名 7-440 ページ . < 別名 > . I4GL + <[ 最初、最後 ]> ROWID @ ビュー名 7-444 ページ . シノニム名 7-438 ページ . < 別名 > SELECT および FROM 節を除く、任意の節の SELECT 文で使用 されます。これは FROM 節で設定された表の代替名です。 < 列名 > 選択する列の名前です。 < 最初 > 列の先頭文字の位置です (CHAR、VARCHAR、または TEXT)。 < 最後 > 選択する部分の最後の文字の位置です。 列式のいくつかの例を次に示します。 図 7-154 列式の例 company items.price cat_advert [1,15] 必要に応じ、表名または別名を使用して、同じ名前を持つが、異なる表に 含まれている、列を見分けます。たとえば、次の SELECT 文は、customer および orders 表の customer_num を使用して、列名の前に表名を入れます。 7-378 IBM Informix SQL リファレンス・ガイド 列式 図 7-155 同じ名前の複数列を見分けるための表名および別名の使用 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、および TEXT 列で使用することができま す。文字部分列は、式に含まれている開始および終了文字位置を示します。 たとえば、customer 表の lname 列の値が Greenburg であれば、次の式は burg の値に評価されます。 fname[6,9] 行 ID の使用 表の各行と関連する行 ID を行のプロパティーとして使用することができま す。行 ID は、基本的には、非表示列です。行 ID は各行ごとに固有ですが、 必ずしも順次ではありません。 SE 行 ID は順次であり、各表の 1 から始まります。♦ 次の例は、SELECT 文での ROWID キーワードの使用を示しています。 図 7-156 SELECT 文での ROWID キーワードの使用 SELECT *, ROWID FROM customer SELECT fname, ROWID FROM customer ORDER BY ROWID アットマークの使用 I4GL プログラム変数が列と同じ名前を持っている場合は、列目の前にアット マーク (@) を付けなければなりません。列名を持つ表名、ビュー名、また は別名をインクルードする場合は、@ 符号は不要です。♦ 次の例は、@ 符号を前に付けた列式を示しています。 構文 7-379 定数式 図 7-157 @ 符号を前に付けた列式の例 SELECT @fname, @lname INTO fname, lname FROM customer WHERE customer_num = 119 SELECT stock_num, manu_code FROM stock WHERE @stock_num >= stock_num INSERT INTO customer (@fname, @lname) VALUES (fname,lname) 定数式 定数式の構文は次のとおりです。 引用符付き ストリング 7-431 ページ USER OL + SITENAME DBSERVERNAME リテラル番号 7-427 ページ + TODAY CURRENT DATETIME フィールド 修飾子 7-373 ページ リテラル DATETIME 7-421 ページ リテラル間隔 7-424 ページ <n> UNITS < 日時単位 > < 日時単位 > 間隔精度を指定するために使用される単位の 1 つです。つま り、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、また は FRACTION です。 <n> 整数リテラル数値です。 定数式の例を次に示します。 7-380 IBM Informix SQL リファレンス・ガイド 定数式 図 7-158 定数式の例 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 式としての引用符付きストリング 式としての引用符付きストリングの例を次に示します。 図 7-159 式としての引用符付きストリングの例 SELECT "The first name is ", fname FROM customer INSERT INTO manufact VALUES ("SPS", "SuperSport") UPDATE cust_calls SET res_dtime = "1990-1-1 10:45" WHERE customer_num = 120 AND call_code = "B" USER 関数 USER 関数は、現行ユーザー、つまり、プロセスを実行している人のログイ ン名を含むストリングを戻します。 次の文は、USER 関数の使用方法を示しています。 図 7-160 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 構文 7-381 定数式 USER 関数は、ユーザー ID の大文字小文字を変更しません。式で USER を使 用し、現在のユーザーが Robertm であるとすると、USER 関数は robertm ではなく、Robertm を戻します。ユーザーを列のデフォルト値として指定 した場合は、列は CHARACTER または VARCHAR 型であり、また少なくとも 8 文字の長さでなければなりません。 ANSI ANSI 準拠データベースの場合、所有者名を引用符で囲まないと、表所有者 の名前は大文字で格納されます。USER キーワードを条件の一部として使用 する場合は、格納したユーザー名の大文字小文字と、USER 関数によって戻 された値の大文字小文字が一致していなければなりません。♦ SITENAME および DBSERVERNAME 関数 SITENAME および DBSERVERNAME 関数は、現行のデータベースが常駐する IBM Informix OnLine ファイルの tbconfig ファイルに定義された、データ ベース・サーバー名を戻します。この 2 つの関数名は同義です。DBSERVERNAME 関数を使用して、表の格納場所の決定、表への情報の入力、およ び表からの情報の抽出を行うことができます。DBSERVERNAME を単純文字 フィールドに挿入したり、それを列のデフォルト値として使用したりでき ます。DBSERVERNAME を列のデフォルト値として指定した場合は、列は CHARACTER または VARCHAR 型で、かつ少なくとも 18 文字の長さでなけ ればなりません。 次の例では、最初の文は、customer 表が常駐するデータベース・サーバー の名前を戻します。WHERE 節では照会が制限されていないため、表内のす べての行の DBSERVERNAME を戻します。DISTINCT キーワードを SELECT 節に追加すると、照会は DBSERVERNAME を 1 度だけ戻します。2 番目の文 は、現行のサイト名が入っている行を表に追加します。3 番目の文は、 site_col に現行システムのサイト名を持つ、すべての行を戻します。最後の 文は、customer 表の会社名を現行システムの名前に変更します。 図 7-161 式としての DBSERVERNAME の例 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 7-382 IBM Informix SQL リファレンス・ガイド 定数式 式としてのリテラル番号 式としてのリテラル番号の例を次に示します。 図 7-162 式としてのリテラル番号の例 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 関数の使用法を 示したものです。 図 7-163 式としての 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 値を戻しま す。 CURRENT DATETIME フィールド 修飾子 7-373 ページ 構文 7-383 定数式 日時 (DATETIME) 型修飾子を指定しないと、デフォルトの修飾子は YEAR TO FRACTION(3) になります。CURRENT 関数は、リテラル DATETIME( 7-421 ページを参照 ) を使用できる任意のコンテキストで使用できます。 CURRENT を列のデフォルト値として指定する場合は、その列は DATETIME 型で、かつ CURRENT の修飾子が列の修飾子と一致していなければなりま せん。単一の文の中で CURRENT キーワードを複数個指定すると、各呼び出 し点で同じ値が戻されることがあります。各実行のたびに、CURRENT 関数 が明確な値を提供してくれているのかどうか信頼できなくなります。 戻された値は、システム・クロックから受け取られます。 CURRENT 関数は、文に指定された物理的な順序で実行されないことがあり ます。文の実行の開始点、終了点、特定の時点などをマークするために CURRENT 関数を使用しないでください。 使用しているプラットフォームに、現在時刻を秒単位以下の精度で戻すシ ステム呼び出しが備えられていない場合は、CURRENT 関数は FRACTION フィールドについてゼロの値を戻します。 次の例では、最初の文は CURRENT 関数を WHERE 条件で使用します。2 番 目の文は CURRENT 関数を DAY 関数の入力として使用します。最後の照会 は、call_dtime 値が 1990 の始めから現行インスタントまでの範囲に入る行 を選択します。 図 7-164 式としての CURRENT 関数の使用 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 "1990-1-1 00:00:00" AND CURRENT 7-384 IBM Informix SQL リファレンス・ガイド 定数式 式としてのリテラル DATETIME 式としてのリテラル DATETIME の例を次に示します。 図 7-165 式としてのリテラル DATETIME の使用 SELECT DATETIME (1991-12-6) YEAR TO DAY FROM customer UPDATE cust_calls SET res_dtime = DATETIME (1990-07-07 10:40) YEAR TO MINUTE WHERE customer_num = 110 AND call_dtime = DATETIME (1990-07-07 10:24) YEAR TO MINUTE SELECT * FROM cust_calls WHERE call_dtime = DATETIME (1995-12-25 00:00:00) YEAR TO SECOND 式としてのリテラル INTERVAL 式としてのリテラル INTERVAL の例を次に示します。 図 7-166 式としてのリテラル 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 日を 追加しています。 構文 7-385 定数式 UNITS キーワード UNITS キーワードを使用すれば、単一間隔の表示、特定の間隔値または日 時値の増加 / 削減などを行うことができます。UNITS キーワードでは、次の 構文を使用します。 <n> UNITS < 日時単位 > < 日時単位 > 間隔精度を指定するために使用される単位の 1 つです。つま り、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、また は FRACTION です ( 単位が YEAR または式が年月間隔の場合。 それ以外の場合は、日時間隔になります )。 <n> 選択した日時単位と比較できるリテラル数値です ( たとえ ば、DAY の場合は 2 桁 )。 <n> が整数でなければ、使用時に、最も近い整数に切り捨てられます。<n> の値は、選択した日時単位として適切なものでなければなりません。たと えば、“2001-10-31 00:00” に 1 か月を加えると、11 月 31 日になります。11 月は 30 日しかないため、<n> の値は適切でなく、エラーが戻されます。 次の例では、最初の SELECT 文は、UNITS キーワードを使用して、5 日だけ 増やしたすべてのメーカー・リードタイムを選択します。2 番目の SELECT 文は、31 日以上前に受けた電話呼び出しをすべて検出します。WHERE 節の 式が 99 ( 最大日数 ) より大きな値を戻した場合は、その照会は失敗します。 最後の文は、ANZA メーカーのリードタイムを 2 日増やします。 図 7-167 式としての UNITS キーワードの使用 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" 7-386 IBM Informix SQL リファレンス・ガイド 関数式 関数式 関数式は引数を取ります。関数式の構文は次のとおりです。 + ( DAY < 日付 / 日時式 > ) MONTH WEEKDAY YEAR ( DATE ) , < 最初 > MDY ( LENGTH , < 月整数式 > < 日整数式 > < 日付 / 日時式 > ( ) < 日付 / 日時式 > ( EXTEND < 非日付式 > , TO < 最後 > ) < 年整数式 > ) 引用符付きストリング 7-431 ページ I4GL ESQL < 変数名 > < 列名 > 表名 7-440 ページ ( HEX ROUND ( 式 7-375 ページ . ) < 整数式 > ) , < 桁数 > ,0 TRUNC ( 式 7-375 ページ ) , < 桁数 > ,0 構文 7-387 関数式 < 日付 / 日時式 > 7-375 ページに定義されている式で、DATE または DATETIME 値に評価されます。 < 日整数式 > 7-375 ページに定義されている式で、当該月に該当する 整数 1 ~ 28、29、30、または 31 に評価されます。 < 桁数 > 式を何桁に丸めるかを示す +32 ~ -32 の整数です。 < 最初 > DATETIME 値のラージ修飾子です。 < 整数式 > 7-375 ページに定義されている式で、整数に変換できま す。 < 最後 > DATETIME 値のスモール修飾子です。 < 月整数式 > 7-375 ページに定義されている式で、月に該当する 1 ~ 12 の整数に評価されます。 < 非日付式 > 7-375 ページに定義されている式で、DATE データ型に変 換できる、CHARACTER、DATETIME、または INTEGER 値 に評価されます。 < 変数名 > 長さが評価されるプログラム変数またはホスト変数で す。 < 年整数式 > 7-375 ページに定義されている式で、1 ~ 9999 の 4 桁の 整数に評価されます。 関数式は、次の 3 つの関数ファミリーからなっています。 時刻関数 長さ関数 変換関数 DATE() LENGTH() HEX() DAY() ROUND() EXTEND() TRUNC() MDY() MONTH() WEEKDAY() YEAR() 関数式のいくつかの例を次に示します。 7-388 IBM Informix SQL リファレンス・ガイド 関数式 図 7-168 関数式の例 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)) DAY、MONTH、WEEKDAY、および YEAR 関数 以下に示すとおり、これらの 4 つの関数の構文はすべて同じです。 + DAY ( < 日付 / 日時式 > ) MONTH WEEKDAY YEAR < 日付 / 日時 7-375 ページに定義されている式で、DATE または DATETIME 式> 値に評価されます。 DAY 関数 DAY 関数は、日を表す整数を戻します。たとえば、次の WHERE 節は、 DAY 関数を CURRENT 関数と一緒に使用して、列値と現在の日を比較しま す。 WHERE DAY(order_date) > DAY(CURRENT) MONTH 関数 MONTH 関数は、その DATE 型または DATETIME 引数の月部分と対応する整 数を戻します。たとえば、次の照会は、注文を受けた月を示す数値 (1 ~ 12) を戻します。 SELECT order_num, MONTH(order_date) FROM orders 構文 7-389 関数式 WEEKDAY 関数 WEEKDAY 関数は、曜日を表す整数を戻します。ゼロは日曜日を表し、1 は 月曜日を表します。たとえば、次の照会は、現在日と同じ曜日に支払が あったすべての注文をリストします。 SELECT * FROM orders WHERE WEEKDAY(paid_date) = WEEKDAY(CURRENT) YEAR 関数 YEAR 関数は、年を表す 4 桁の整数を戻します。次の照会は、ship_date が 現在年の年初以前の注文をリストします。 SELECT order_num, customer_num FROM orders WHERE year(ship_date) < YEAR(TODAY) 同様に、DATE 値は単純なカレンダー日付であるため、< 最後 > 修飾子が DAY より小さな INTERVAL 値で DATE 値を加算または減算することはできま せん。このような場合は、DATE 値を DATETIME 値に変換してください。 DATE 関数 DATE 関数は、ユーザーがそれを呼び出すときに使用した文字式に対応する DATE 型値を戻します。DATE 関数の構文は次のとおりです。 + DATE ( < 非日付式 > ) < 非日付式 > 7-375 ページに定義されている式で、DATE データ型に変換で きる CHARACTER、DATETIME、または INTEGER 値に評価さ れます。 引数は、DATE 値 ( 通常、CHAR、DATETIME、または INTEGER 値 ) に変換で きる任意の式にすることができます。たとえば、次の 2 つの WHERE 節は同 じ目的を持っています。つまり、ストリングを日付に変換することです。 WHERE order_date < DATE("12/31/90") WHERE order_date < DATE(365) 7-390 IBM Informix SQL リファレンス・ガイド 関数式 EXTEND 関数 EXTEND 関数は、DATETIME または DATE 値の精度を調整します。その構文 は次のとおりです。 + EXTEND ( < 日付 / 日時式 > ) , < 最初 > TO < 最後 > < 日付 / 日時式 > 7-375 ページに定義されている式で、DATE または DATETIME 値に評価されます。 < 最初 > 結果の中の最初のフィールドを指定する修飾子です。こ の修飾子は、< 最初 > が < 最後 > より大きい場合、7-373 ページに定義されている任意の DATETIME 修飾子にするこ とができます。 < 最後 > 結果の中の最後のフィールドを指定する修飾子です。 この式は、DATE 値の引用符付きストリング表現であってはなりません。 < 最初 > および < 最後 > 修飾子を指定しないと、デフォルト修飾子は YEAR TO FRACTION(3) になります。 修飾子で指定されていないフィールドが式に含まれていれば、不要な フィールドは廃棄されます。 式の中のフィールドより大きな ( つまり、より重要な ) フィールドが < 最 初 > 修飾子によって指定されていれば、CURRENT 関数によって戻された値 が新規フィールドに入力されます。< 最後 > 修飾子が式の中のフィールド より小さな ( つまり、より重要でない ) フィールドを指定している場合は、 新規フィールドには定数値が入力されます。欠落した MONTH または DAY フィールドには 1 が入力され、欠落した HOUR から FRACTION までの フィールドには 0 が入力されます。 次の例で、最初の EXTEND 呼び出しは YEAR TO SECOND の call_dtime 列値 に評価されます。2 番目の例は、リテラル DATETIME を拡張して、それから 間隔を減算できるようにします。必ずしもすべての修飾子が同じではない INTERVAL 値に DATETIME 値を加算したり、INTERVAL 値から INTERVAL 値 を減算したりする場合は、DATETIME 値を指定して EXTEND 関数を使用す る必要があります。 構文 7-391 関数式 図 7-169 EXTEND 関数の例 EXTEND (call_dtime, YEAR TO SECOND) EXTEND (DATETIME (1989-8-1) YEAR TO DAY, YEAR TO MINUTE) - INTERVAL (720) MINUTE (3) TO MINUTE MDY 関数 MDY 関数は、月、日、および年を表す整数に評価される 3 つの式を使用し て、DATE 型値を戻します。MDY の構文は次のとおりです。 + MDY ( < 月整数式 > , < 日整数式 > , < 年整数式 > ) < 日整数式 > 7-375 ページに定義されている式で、当該月に該当する整数 1 ~ 28、29、30、または 31 に評価されます。 < 月整数式 > 7-375 ページに定義されている式で、月に該当する 1 ~ 12 の 整数に評価されます。 < 年整数式 > 7-375 ページに定義されている式で、4 桁の整数に評価されま す。 最初の式は、月の数値 (1 ~ 12) を表す整数に評価されます。 2 番目の式は、日の数値 ( その月に該当する 1 ~ 28、29、30、または 31) を 表す整数に評価されます。 3 番目の式は、年を表す 4 桁の整数に評価されます。3 番目の式では、2 桁 の省略形は使用できません。次の UPDATE 文は、注文番号 8052 に関連する paid_date を現在月の初日と等しくなるように設定します。 UPDATE orders SET paid_date = MDY(MONTH(TODAY), 1, YEAR(TODAY)) WHERE po_num = "8052" 7-392 IBM Informix SQL リファレンス・ガイド 関数式 LENGTH 関数 LENGTH 関数は、末尾スペースを含まない文字列の長さを戻します。TEXT または BYTE 列では、LENGTH 関数は列に含まれたバイトの総数を戻しま す。 + LENGTH 引用符付き ストリング 7-431 ページ ( I4GL ESQL ) < 変数名 > < 列名 > 表名 7-440 ページ . < 列名 > 列の名前です。 < 変数名 > 文字ストリングが含まれているプログラム変数またはホスト 変数です。 LENGTH 関数では 1 つの引数しか使用できません。ただし、次の例に示され ているように、式内でいくつかの LENGTH 値を結合することができます。 SELECT customer_num, LENGTH(fname) + LENGTH(lname) LENGTH("How many bytes is this?") FROM customer WHERE LENGTH(company) > 10 I4GL ESQL LENGTH 関数を使用して、文字変数の長さを戻すことができます。♦ HEX 関数 HEX 関数は、整数式の 16 進数エンコードを戻します。 HEX < 整数式 > ( < 整数式 > ) 7-375 ページに定義されている式で、整数に変換できます。 次の SELECT 文は、HEX 関数のいくつかの使用例を示しています。 SELECT HEX(customer_num), HEX(zipcode), HEX(ROWID), HEX(LENGTH(fname)) FROM customer 構文 7-393 関数式 次の例は、orders 表に含まれている各列のデータ型と列長を 16 進形式で表 示します。MONEY および DECIMAL 列については、最下位ビットとその次 に低いビットから小数点以下桁数と精度を決定することができます。 VARCHAR 列については、最下位ビットとその次に低いビットから最大領域 と最小領域を決定することができます。( エンコードされた情報の詳細につ いては、2-13 ページの『SYSCOLUMNS』を参照してください。) SELECT colname, HEX(coltype), HEX(collength) FROM syscolumns C, systables T WHERE C.tabid = T.tabid AND T.tabname = "orders" 次の例は、現行データベースのすべての表とそれに対応する表領域番号を 16 進形式でリストします。この例は特に有用です。なぜならば、16 進数の 2 つの最上位ビットが DB 領域番号を構成していて、かつそれを使用して、 tbcheck 出力の表を識別するからです。 SELECT tabname, HEX(partnum) FROM systables 次の例に示されているように、式内でいくつかの HEX 値を結合することが できます。 SELECT HEX(order_num + 1) FROM orders ROUND 関数 ROUND 関数は式の丸め値を戻します。 ROUND ( 式 7-375 ページ ) ,< 桁数 > ,0 < 桁数 > 式を何桁に丸めるかを示す +32 ~ -32 の整数です。 式は数値であるか、または数値に変換できるものでなければなりません。 7-394 IBM Informix SQL リファレンス・ガイド 関数式 桁数の指示を省略すると、値はゼロの桁または 1 の桁に丸められます。正 の桁値は小数点の右側を丸めることを示し、負の桁値は小数点の左側を丸 めることを示します。 式: 24536.8746 ROUND (24536.8746, -2) = 24500.00 ROUND (24536.8746, 0) = 24537.00 -2 0 2 ROUND (24536.8746, 2) = 24536.87 SELECT order_num , ROUND(total_price) FROM items WHERE ROUND(total_price) = 124.00 ROUND 関数の引数として MONEY データ型を使用し、ゼロの桁へ丸めると、 値は .00 と表示されます。たとえば、次の SELECT 文は、INTEGER 値と MONEY 値を丸めます。この文は、items の各行ごとに 125 と丸めた価格を xxx.00 形式で表示します。 SELECT ROUND(125.46), ROUND(total_price) FROM items TRUNC 関数 TRUNC 関数は、数値式の切り捨てられた値を戻します。 TRUNC ( 式 7-375 ページ ) , < 桁数 > ,0 < 桁数 > 式を何桁に切り捨てるかを示す +32 ~ -32 の整数です。 式は、数値であるか、または数値式に変換できる形式でなければなりませ ん。桁数の指示を省略すると、値はゼロの桁または 1 の桁に切り捨てられ ます。正の桁値は小数点の右側を切り捨てることを示し、負の桁値は小数 点の左側を切り捨てることを示します。 式: 24536.8746 TRUNC (24536.8746, -2) =24500 TRUNC (24536.8746, 0) = 24536 TRUNC (24536.8746, 2) = 24536.87 -2 0 2 構文 7-395 関数式 TRUNC 関数の引数として MONEY データ型を使用し、ゼロの桁へ切り捨て ると、.00 桁が除去されます。たとえば、次の SELECT 文は、MONEY 値と INTEGER 値を切り捨てます。この文は、items の各行ごとに 125 と切り捨て た価格を xxx 形式で表示します。 SELECT TRUNC(125.46), TRUNC(total_price) FROM items 7-396 IBM Informix SQL リファレンス・ガイド 集計式 集計式 集計式は、集計関数を使用して、選択したデータベース・データを要約し ます。 集計関数式の構文は次のとおりです。 COUNT (*) ( AVG DISTINCT MAX < 列名 > 表名 7-440 ページ UNIQUE MIN ) . SUM COUNT AVG MAX 式 ( サブセット ) 7-398 ページ ( ) ALL MIN SUM < 列名 > 列の名前です。 < 最初 > DATETIME 値のラージ修飾子です。 < 最後 > DATETIME 値のスモール修飾子です。 集計関数は照会した行のセット 1 つにつき 1 つの値を戻します。SELECT 文 における集計関数の例を次に示します。 図 7-170 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 構文 7-397 集計式 集計式で使用できる式のサブセット 集計関数の引数そのものに集計関数を含めることはできません。たとえば、 MAX(AVG(order_num)) を使用することはできません。集計関数が副照会に 含まれていない限り、それを WHERE 節で使用することはできません。集計 関数を BYTE または TEXT 列に使用することはできません。式の詳細な構文 については、7-375 ページを参照してください。 行セットにおける重複のインクルードと除外 DISTINCT キーワードは、指定された列の固有値にのみ関数を適用させま す。UNIQUE キーワードは、DISTINCT キーワードの同義語です。 ALL キーワードは、DISTINCT キーワードと対応するものです。ALL キー ワードを指定すると、指定された列または式から選択されたすべての値 ( すべての重複値も含む ) が計算に使用されます。 COUNT(*) キーワード COUNT (*) キーワードは、WHERE 節を満たす行の数を戻します。次の照会 は在庫中の Hero 製品の数量を検索します。 SELECT COUNT(*) FROM stock WHERE manu_code = "HRO" SELECT 文に GROUP BY 節が含まれている場合は、COUNT(*) キーワードは 各グループ内の値の数を反映しています。たとえば、次の文はファースト ネームでグループ化されています。同じ名前が複数回現れた場合は行が選 択されます。 SELECT fname, COUNT(*) FROM customer GROUP BY fname WHERE COUNT(*) > 1 1 つ以上の行の値が NULL であれば、WHERE 節でカウント内の NULL 列を 明示的に省略していない限り、COUNT(*) キーワードには NULL 列がインク ルードされます。 7-398 IBM Informix SQL リファレンス・ガイド 集計式 AVG キーワード AVG キーワードは、指定された列または式に含まれているすべての値の平 均値を戻します。AVG キーワードは数値列にしか適用できません。 DISTINCT キーワードを使用した場合、平均値は、指定された列または式内 の明確な値のみを対象にして算出されます。次の照会は、ヘルメットの平 均価格を検索します。 SELECT AVG(unit_price) FROM stock WHERE stock_num = 110 すべてのヘルメットの単価が異なるため、DISTINCT キーワードを使用して も、この照会では効果がありません。 指定された列のすべての値が 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 を戻します。 MIN キーワード MIN キーワードは、列または式内で最も低い値を戻します。DISTINCT を使 用しても、結果が変更されることはありません。 SELECT MIN(unit_price) FROM stock 指定された列のすべての値が NULL である場合を除き、NULL は無視され ます。すべての列値が NULL であれば、MIN キーワードはその列について NULL を戻します。 構文 7-399 集計式 SUM キーワード SUM キーワードは、指定された列または式に含まれているすべての値の合 計を戻します。DISTINCT キーワードを使用した場合、合計は、指定された 列または式内の明確な値のみを対象にして算出されます。 SELECT SUM(total_price) FROM items WHERE order_num = 1013 指定された列のすべての値が NULL である場合を除き、NULL は無視され ます。すべての列値が NULL であれば、SUM キーワードはその列について NULL を戻します。 SUM キーワードは文字列では使用できません。 COUNT キーワード COUNT キーワードは、列または式内の異なる値の数を戻します。COUNT 関 数が NULL を検出すると、それらは無視されます。 SELECT COUNT (DISTINCT item_num) FROM items 指定された列のすべての値が NULL である場合を除き、NULL は無視され ます。すべての列値が NULL であれば、COUNT キーワードはその列につい てゼロを戻します。 集計関数の動作の要約 次の表は、集計関数のアクションを要約したものです。次のような照会が 構築されているとします。 SELECT a_number FROM testtable WHERE a_number < 10 この場合は、次の値が戻されます。 a_number 2 2 2 3 3 4 (null) 7-400 IBM Informix SQL リファレンス・ガイド 集計式 また、リストされた各関数ごとにそれぞれ以下の結果が生じます。 関数 結果 COUNT(*) 7 AVG 2.67 AVG (DISTINCT) 3 MAX 4 MAX(DISTINCT) 4 MIN 2 MIN(DISTINCT) 2 SUM 16 SUM(DISTINCT) 9 COUNT(DISTINCT) 3 たとえば、次の照会は値 3 を戻します。 SELECT AVG(DISTINCT a_number) FROM testtable WHERE a_number < 10 集計関数によるエラー検査 I4GL ESQL 集計関数は、常に、1 つの行を戻します。行を選択しないと、集計関数は NULL を戻します。COUNT (*) キーワードを使用して、行が選択されている かどうかを判別でき、また、標識変数を使用して、選択された行が空であ るかどうかを判別できます。カーソルを集計関数に関連付けて、ある行を 取り出すと、常に 1 つの行が戻されます。このため、最初の取り出しで、 データの終わりを示す 100 が sqlcode 変数に戻されることはありません。♦ 構文 7-401 式での算術演算子の使用 式での算術演算子の使用 式と算術演算子を結合して複雑な式を作成することができます。集計関数 を使用する式と列式を結合することはできません。次の例では、算術演算 子を使用しています。 図 7-171 算術演算子の例 quantity * total_price price * 2 doubleprice 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 値を 1 つ以上の INTERVAL 値と結合する場合は、INTERVAL 値の すべてのフィールドが DATETIME 値に入っていなければなりません。暗黙 的な EXTEND 関数は実行されません。また、YEAR ~ MONTH 間隔を DAY ~ SECOND 間隔と一緒に使用することもできません。 7-402 IBM Informix SQL リファレンス・ガイド 識別子 識別子 目的 識別子セグメントは、データベースの名前を指定するために、次のセグメ ントで使用します。 ! 制約名 ! データベース名 ! インデックス名 ! シノニム名 ! 表名 ! ビュー名 ! プロシージャー名 構文 < 文字 > < 文字 > < 桁数 > < アンダー スコアー> < 桁数 > 0 ~ 9 の整数です。 < 文字 > a から Z までの大文字または小文字です。 < アンダー スコアー > アンダースコアー (_) 文字です。 構文 7-403 使用法 使用法 識別子には最高 18 文字を含めることができます。 アプリケーション開発支援ツールの予約語を識別子として宣言しないでく ださい。 ヒント : エラーを起こした文とは関係がないと考えられるエラー・メッ セージが出た場合は、その文で予約語を識別子として使用していないかど うか調べてください。 7-404 IBM Informix SQL リファレンス・ガイド 使用法 以下のリストは、すべての ANSI 予約語を示しています。これらの予約語の いずれかを識別子として使用し、実行時またはコンパイル時に、 DBANSIWARN を設定するか、または -ansi フラグを指定すると、警告が出 ます。 all and any as asc authorization avg begin between by char character check close cobol commit continue count create current cursor dec decimal declare delete desc distinct double end escape exec exists fetch float for found from go goto group having in indicator insert int integer into is language like max min module not null numeric of on open option or order pascal pli precision primary procedure privileges public real rollback schema section select set smallint some sql sqlcode sqlerror sum table to union unique update user values view whenever where with work 構文 7-405 潜在的なあいまいさと構文エラー 潜在的なあいまいさと構文エラー 現在は、ほとんどすべての単語を SQL 識別子として使用できますが、構文 上のあいまいさが生じる可能性があります。あいまいな文は、望ましい結 果を出さないことがあります。このセクションでは、潜在的な落とし穴の いくつかとその回避策について概説します。 列名としての関数の使用 最初の 2 つの例は、SELECT 文で関数を列名として使用するための回避策を 示しています。この方式は、集計関数 (AVG、COUNT、MAX、MIN、SUM)、 LENGTH 関数、時刻関数 (DATE、DAY、MDY、MONTH、WEEKDAY、YEAR)、 および日時関数 (CURRENT および EXTEND) に適用されます。 このように avg を列名として使用すると、データベース・サーバーが avg を、列名としてではなく、集計関数と解釈するので、次の文は失敗します。 SELECT avg FROM mytab -- fails この回避策は、表名を列名にインクルードして、あいまいさを除去してい ます。 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/89") SELECT user,current,today FROM mytab データベース・サーバーは、SELECT 文の user、current、および today を SQL 関数 USER、CURRENT、および TODAY と解釈します。したがって、 SELECT 文は、josh、11:30:30、1/22/89 を戻さないで、現行ユーザー名、現在 時刻、および現在日付を戻します。 7-406 IBM Informix SQL リファレンス・ガイド 列名としての関数の使用 表の実際の列を選択合したい場合は、SELECT 文を次の 2 つのいずれかの方 法で書く必要があります。 SELECT mytab.user, mytab.current, mytab.today FROM mytab; または $SELECT * FROM mytab; 列名としてのキーワードの使用 SELECT 文や他の SQL 文でキーワードを列名として使用するための特定の回 避策があります。場合によっては、複数の回避策があります。 列名としての ALL、DISTINCT、または UNIQUE の使用 最初の 2 つの例は、ALL ( または DISTINCT または UNIQUE) キーワードを SELECT 文で使用するための回避策を示しています。 このように all を列名として使用すると、データベース・サーバーが all を、 列名としてではなく、キーワードと解釈するので、次の文は失敗します。 SELECT all FROM mytab -- fails この例は、ALL キーワードを列名 all と一緒に使用するための回避策を示し ています。 SELECT ALL all FROM mytab 次の例は、CREATE TABLE 文で UNIQUE または DISTINCT キーワードを列名 として使用するための 2 つの回避策を示しています。 このように unique を列名として使用すると、データベース・サーバーが unique を、列名としてではなく、キーワードと解釈するので、次の文は失 敗します。 CREATE TABLE mytab (unique INTEGER) -- fails 次の回避策は 2 つの SQL 文を使用します。最初の文は mycol 列を作成し、2 番目の文は mycol 列を unique に名前変更します。 CREATE TABLE mytab (mycol INTEGER) RENAME COLUMN mytab.mycol TO unique 構文 7-407 列名としての関数の使用 次の回避策も 2 つの SQL 文を使用します。最初の文は mycol 列を作成し、2 番目の文は表を変更し、unique 列を追加し、mycol 列を削除します。 CREATE TABLE mytab (mycol INTEGER) ALTER TABLE mytab ADD (unique integer) DROP (mycol) 列名としての INTERVAL または DATETIME の使用 次の例は、SELECT 文で INTERVAL ( または DATETIME) キーワードを列名と して使用するための 2 つの回避策を示しています。 このように interval を列名として使用すると、データベース・サーバーが interval をキーワードと解釈し、その後に INTERVAL 修飾子が続くものと見 なすため、次の文は失敗します。 SELECT interval FROM mytab -- fails 次の回避策は、列名と一緒に表名を指定して、あいまいさを除去していま す。 SELECT mytab.interval FROM mytab; もう 1 つの回避策は、次のように、表名に所有者名をインクルードします。 SELECT josh.mytab.interval FROM josh.mytab; 7-408 IBM Informix SQL リファレンス・ガイド 表名としてのキーワードの使用 列名としての行 ID の使用 どの表も rowid という仮想列を持っています。あいまいになるのを回避す るために、rowid を列名として使用しないでください。次のアクションは エラーを起こします。 ! rowid という名前の列を持つ表またはビューを作成する ! rowid という名前の列を追加して表を変更する ! 列の名前を rowid に変更する ただし、rowid という用語は表名として使用できます。例を示します。 CREATE TABLE rowid (column INTEGER, date DATE, char CHAR(20)) 表名としてのキーワードの使用 次の例は、STATISTICS または OUTER キーワードを表名として使用する場合 の所有者命名に関する回避策を示しています。この回避策は、STATISTICS または OUTER をビュー名またはシノニムとして使用する場合にも適用され ます。 このように statistics を表名として使用すると、データベース・サーバーが それを、UPDATE 文の中の表名としてではなく、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 構文 7-409 キーワード AS を使用する回避策 キーワード AS を使用する回避策 場合によっては、文があいまいでなく構文が正しくても、データベース・ サーバーが構文エラーを戻すことがあります。上述のとおり、このような 数多くの状況における既存の構文上の回避策を示しました。キーワード AS を使用して、例外状況に対する回避策を講ずることができます。 キーワード AS は、列ラベルまたは表の別名の前で使用できます。キーワー ド AS は、SQL に対する Informix の拡張機能です。 これは列ラベルをキーワード AS と共に使用する構文です。 column-name AS display-label FROM table-name これは表の別名をキーワード AS と共に使用する構文です。 SELECT select-list FROM table-name AS table-alias AS を列ラベルと共に使用 次の回避策の例では、列ラベルをキーワード AS と共に使用します。最初の 例のペアは、キーワード UNITS ( または YEAR、MONTH、DAY、HOUR、 MINUTE、SECOND、または FRACTION) を列ラベルとして使用する方法を示 しています。 このように units を列名として使用すると、データベース・サーバーがそれ を mycol という列の DATETIME 修飾子と解釈するので、次の文は失敗しま す。 SELECT mycol units FROM mytab この文は、キーワード AS をインクルードする回避策を使用します。 $SELECT mycol AS units FROM mytab; 次の例は、キーワード AS または FROM を列ラベルとして使用する方法を示 しています。 このように as を列ラベルとして使用すると、データベース・サーバーが from を識別するための as を列ラベルと解釈し、この結果、必須の FROM 節 を見つけなくなるので、次の文は失敗します。 SELECT mycol as from mytab -- 失敗 7-410 IBM Informix SQL リファレンス・ガイド キーワード AS を使用する回避策 この文は、キーワード AS を反復する、回避策を使用します。 SELECT mycol AS as from mytab このように from を列名として使用すると、データベース・サーバーが最初 の from の後に表名が続くものと見なすので、次の文は失敗します。 SELECT mycol from FROM mytab -- 失敗 この回避策は、キーワード 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 -- 失敗 この回避策は、キーワード AS を使用して、order を表の別名として識別し ます。 SELECT * FROM mytab AS order; 次の例のペアは、キーワード WITH を表の別名として使用する方法を示し ています。 このように with を表の別名として使用すると、データベース・サーバーが キーワードを WITH CHECK OPTION 構文の一部と解釈するので、次の文は失 敗します。 SELECT * FROM mytab with -- 失敗 この回避策は、キーワード AS を使用して、with を表の別名として識別しま す。 $SELECT * FROM mytab AS with; 次の例のペアは、キーワード CREAT ( または GRANT) を表の別名として使 用する方法を示しています。 構文 7-411 カーソル名としてのキーワードの取り出し このように create を表の別名として使用すると、データベース・サーバー がキーワードを、表、シノニム、ビューなどのエンティティーを作成する ための構文の一部と解釈するので、次の文は失敗します。 $SELECT * FROM mytab create -- 失敗 この回避策は、キーワード AS を使用して、create を表の別名として識別し ます。 $SELECT * FROM mytab AS create; カーソル名としてのキーワードの取り出し SQL プログラムでキーワードを識別子として使用する場合に発生する構文 上のあいまいさについて、回避策がないという状況が時々見られることが あります。 次の例では、プリプロセッサーが構文をスクロール・カーソルに関連する ものと解釈し、next の後にカーソル名が続くものと見なすので、FETCH 文 は構文エラーになります。この状態は、キーワード NEXT、PREVIOUS、 PRIOR、FIRST、LAST、CURRENT、RELATIVE、または ABSOLUTE をカーソ ル名として使用すると必ず発生します。 $DECLARE next CURSOR FOR SELECT customer_num, lname FROM customer; $ OPEN next; $FETCH next INTO $cnum, $lname; プロシージャー変数名としてのキーワードの使用 以下のいずれかのキーワードをプロシージャー内の変数識別子として使用 すると、あいまいな構文が作成されることがあります。 CURRENT OFF DATETIME ON GLOBAL PROCEDURE INTERVAL SELECT NULL 7-412 IBM Informix SQL リファレンス・ガイド プロシージャー変数名としてのキーワードの使用 CURRENT、DATETIME、INTERVAL、および NULL の INSERT での使 用 CURRENT、DATETIME、INTERVAL、または NULL キーワードをプロシー ジャーの名前として使用し、それを INSERT 文で使用すると、文の構文が混 乱します。これに対する回避策はありません。 たとえば、日時の値を列に挿入するときに <datetime> という変数を定義す ると、構文エラーになります。この例を次に示します。 CREATE PROCEDURE problem() . . . DEFINE null INT; LET null = 3; INSERT INTO tab VALUES (null); -- エラー。3 ではなく NULL を挿入 条件での NULL および SELECT の使用 名前 <null> または <select> を持つ変数を定義した場合に、IN キーワードを 使用する条件でそれを使用すると、あいまいになります。次の例は、問題 の原因となる 3 つの条件を IF 文、SELECT 文の SELECT 節、および WHILE 条 件で示しています。 図 7-172 変数名としての <select> および <null> の使用 CREATE PROCEDURE problem() . . . DEINE 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; 構文 7-413 プロシージャー変数名としてのキーワードの使用 変数 <select> を IN リストで使用することができます。ただし、この変数が リストの先頭エレメントでないことが前提です。たとえば、次の例は、回 避策を使用して、図 7-172 の IF 文を訂正します。 IF x IN (10, select, 12) THEN LET y = 1; -- problem if <null> を変数名として使用し、それを IN 条件で使用するための回避策はあ りません。 トレースでの <on>、<off>、または <procedure> の使用 <on>、<off>、または <procedure> というプロシージャー変数を定義し、そ れを TRACE 文で使用しようとしても、これらの変数の値はトレースされま せん。それどころか、TRACE ON、TRACE OFF、または TRACE PROCEDURE 文が実行されます。これらの変数の値をトレースするには、それらをより 複雑な式にしてください。図 7-173 はあいまいな構文と回避策を示してい ます。 図 7-173 TRACE での <on>、<off>、および <procedure> のあいまいな使用と明確な使用 DEFINE on, off, procedure INT; TRACE TRACE TRACE TRACE on; 0+ on; off; ""||off; -- あいまい -- ok -- あいまい -- ok TRACE procedure;-- あいまい TRACE 0+procedure;-- ok 変数名としての GLOBAL の使用 変数を <global> の名前で定義しようとすると、定義操作は失敗します。 図 7-173 に示されている構文は、グローバル変数を定義する構文と矛盾し ます。これに対する回避策はありません。 図 7-174 <global> のあいまいな使用 DEFINE global INT; -- 失敗 ; 7-414 IBM Informix SQL リファレンス・ガイド カーソル名としての EXECUTE、SELECT、または WITH の使用 カーソル名としての EXECUTE、SELECT、または WITH の使用 EXECUTE、SELECT、または WITH キーワードをカーソルの名前として使用 しないでください。FOREACH 文でこれらのキーワードのいずれかをカーソ ル名として使用すると、カーソル名は FOREACH 文のキーワードと解釈され ます。これに対する回避策はありません。 たとえば、次の文は機能しません。 DEFINE execute INT; FOREACH execute FOR SELECT col1 -- エラー。FOREACH EXECUTE と解釈 PROCEDURE INTO var1 FROM tab1; -- WHILE および FOR 文での SELECT 文 SELECT 文を WHILE または FOR ループで使用するときに、それを小括弧で 囲む必要がある場合は、BEGIN...END ブロック内に SELECT 文全体を囲って ください。たとえば、次の例の場合、最初の WHILE 文の SELECT 文はプロ シージャー var1 の呼び出しと解釈されます。2 番目の WHILE 文は正しく解 釈されます。 DEFINE var1, var2 INT; WHILE var2 = var1 (SELECT col1 INTO var3 FROM TAB -- エラー。call var 1 () に見える 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 構文 7-415 ON EXCEPTION 文での SET キーワード ON EXCEPTION 文での SET キーワード キーワード SET で始まる文を ON EXCEPTION 文の中で使用する場合は、そ れを BEGIN...END ブロックの中に入れてください。この種の文には、次の ものがあります。 SET CONSTRAINTS SET LOCK MODE SET DEBUG FILE SET LOG SET EXPLAIN SET OPTIMIZATION SET ISOLATION ON EXCEPTION IN (-107) SET LOCK MODE TO WAIT; -- エラー。 「Lock」という値はない END EXCEPTION ON EXCEPTION IN (-107) BEGIN SET LOCK MODE TO WAIT; -- ok END END EXCEPTION 参考資料 IBM Informix SQL チュートリアル・ガイド では、所有者命名の説明を参照して ください。 7-416 IBM Informix SQL リファレンス・ガイド インデックス名 インデックス名 目的 インデックス名セグメントは、構文図でインデックス名を参照するときに 必ず使用されます。インデックス名セグメントは次の文に現れます。 ! ALTER INDEX ! CREATE INDEX ! DROP INDEX 構文 OL < 所有者 >. . 識別子 7-403 ページ ; < データベース > @ <DB サーバー名 > < データベース > インデックスが常駐するデータベースの名前です。 <DB サーバー名 > データベース が常駐する IBM Informix OnLine データ ベース・サーバーの名前です。アットマーク (@) は、 データベース・サーバー名を示すために使用しなけれ ばならないリテラル文字です。 < 所有者 > インデックスの所有者のユーザー名です。ANSI 標準準 拠のデータベースを使用する場合は、自分が所有して いないインデックスに対して owner. 規則を使用しなけ ればなりません。 使用法 インデックスの実際の名前は SQL 識別子です。 インデックスを作成する場合、< 名前 > はデータベース内で固有でなけれ ばなりません。 構文 7-417 使用法 ANSI < 所有者 . 名 > は大文字小文字の区別があります。詳細については、7-442 ページの ANSI 準拠データベースにおける大文字と小文字の区別の説明を参 照してください。♦ 7-418 IBM Informix SQL リファレンス・ガイド INTERVAL フィールド修飾子 INTERVAL フィールド修飾子 目的 INTERVAL フィールド修飾子は、INTERVAL 値の単位を指定するために使用 します。INTERVAL フィールド修飾子はデータ型セグメントで使用されま す。 構文 YEAR (<y 精度 >) TO YEAR (4) MONTH (< 精度 >) TO MONTH (2) DAY (< 精度 >) TO DAY (2) HOUR (< 精度 >) TO HOUR (2) MINUTE (< 精度 >) TO MINUTE (2) SECOND (< 精度 >) TO SECOND (2) FRACTION TO FRACTION (<f 精度 >) (3) 構文 7-419 使用法 <f 精度 > 小数部フィールドで使用できる最大桁数です。デフォルトは 3 、最大は 5 です。 < 精度 > 間隔が保持できる月、日、時間、または分の最大数の桁数で す。デフォルトは 2 、最大は 9 です。 <y 精度 > 間隔が保持できる年の最大数の桁数です。デフォルトは 4 、 最大は 9 です。 使用法 次の 2 つの INTERVAL データ型の例は、どちらも YEAR TO MONTH 型です。 最初の例は、年フィールドの精度を 3 としているので、最高 999 年と 11 か 月の間隔を保持できます。2 番目の例は、年フィールドでデフォルトの精 度を使用するので、最高 9,999 年と 11 か月の間隔を保持できます。 YEAR (3) TO MONTH YEAR TO MONTH 値に 1 つのフィールドしか含めたくない場合は、最初の修飾子と最後の修 飾子が同じになります。たとえば、まる 1 年の間隔は、最高 99,999 年に対 して、YEAR TO YEAR または YEAR (5) TO YEAR として修飾されます。 次の例は、INTERVAL 修飾子のいくつかの形式を示しています。 図 7-175 INTERVAL 修飾子の例 YEAR(5) TO MONTH DAY (5) TO FRACTION(2) DAY TO DAY FRACTION TO FRACTION (4) 参考資料 本書では、算術演算および関係演算における INTERVAL データの使用法に ついて、3-24 ページの『DATE、DATETIME、および INTERVAL を使用した 演算の範囲』を参照してください。 7-420 IBM Informix SQL リファレンス・ガイド リテラル DATETIME リテラル DATETIME 目的 リテラル DATETIME セグメントは、DATETIME 値として使用されます。リテ ラル DATETIME セグメントは、次の文およびセグメントで使用されます。 ! INSERT 文 ! SELECT 文 ! UPDATE 文 ! 条件セグメント ! 式セグメント 構文 7-421 構文 構文 ( DATETIME DATETIME フィールド修飾子 7-373 ページ ) 10 進数 (NUMERIC) 型日付 10 進数 <yyyy> <mo> <dd> < スペース > <hh> : <mi> : <ss> . <f> <yyyy> 最高 4 桁の年です。2 桁を使用する場合は、年の先頭部分と して 19 が想定されます ( たとえば、1993)。 <mo> 最高 2 桁の月です。 <dd> 最高 2 桁の日です。 < スペース > 文字どおり、スペース・キーを押して作成されるスペースで す。 <hh> 最高 2 桁の時間です。 7-422 IBM Informix SQL リファレンス・ガイド 使用法 <mi> 最高 2 桁の分です。 <ss> 最高 2 桁の秒です。 <f> 最高 5 桁の秒の小数部です。INTERVAL 修飾子の小数部部分 に指定された精度によって決まります。 使用法 リテラル DATETIME 値の例を次に示します。 図 7-176 リテラル DATETIME 値の例 DATETIME (89-3-6) YEAR TO DAY DATETIME (09:55:30.825) HOUR TO FRACTION DATETIME (92-5) YEAR TO MONTH 次に、EXTEND 関数で使用したリテラル DATETIME 値の例を示します。 EXTEND (DATETIME (1989-8-1) YEAR TO DAY, YEAR TO MINUTE) - INTERVAL (720) MINUTE (3) TO MINUTE 構文 7-423 リテラル INTERVAL リテラル INTERVAL 目的 リテラル INTERVAL セグメントは、次の文およびセグメントで使用されま す。 ! INSERT 文 ! UPDATE 文 ! 条件セグメント ! 式セグメント 7-424 IBM Informix SQL リファレンス・ガイド 構文 構文 ( INTERVAL ) 10 進数 INTERVAL フィールド修飾子 7-419 ページ 10 進数 <yyyy> <mo> <dd> < スペース > <hh> : <mi> : <ss> . <f> <yyyy> 年の数です。許容最大桁数は 4 です。ただし、これが先頭の フィールドであり、かつ、精度の指定が INTERVAL フィール ド修飾子による指定と異なる場合を除きます。 <mo> 月の数です。許容最大桁数は 2 です。ただし、これが先頭の フィールドであり、かつ、精度の指定が INTERVAL フィール ド修飾子による指定と異なる場合を除きます。 <dd> 日の数です。許容最大桁数は 2 です。ただし、これが先頭の フィールドであり、かつ、精度の指定が INTERVAL フィール ド修飾子による指定と異なる場合を除きます。 < スペース > 文字どおり、スペース・キーを押して作成されるスペースで す。 構文 7-425 使用法 <hh> 時間の数です。許容最大桁数は 2 です。ただし、これが先頭 のフィールドであり、かつ、精度の指定が INTERVAL フィー ルド修飾子による指定と異なる場合を除きます。 <mi> 分の数です。許容最大桁数は 2 です。ただし、これが先頭の フィールドであり、かつ、精度の指定が INTERVAL フィール ド修飾子による指定と異なる場合を除きます。 <ss> 秒の数です。許容最大桁数は 2 です。ただし、これが先頭の フィールドであり、かつ、精度の指定が INTERVAL フィール ド修飾子による指定と異なる場合を除きます。 <f> 最高 5 桁の秒の小数部です。INTERVAL フィールド修飾子の 小数部部分に指定された精度によって決まります。 使用法 リテラル INTERVAL 値の例を次に示します。 図 7-177 リテラル INTERVAL 値の例 INTERVAL (3-6) YEAR TO MONTH INTERVAL (09:55:30.825) HOUR TO FRACTION INTERVAL (40 5) DAY TO HOUR 7-426 IBM Informix SQL リファレンス・ガイド リテラル番号 リテラル番号 目的 リテラル番号は定数で、整数番号または非整数 ( 浮動 ) 番号のいずれかで す。リテラル番号セグメントは、次の文とセグメントで使用されます。 ! INSERT 文 ! UPDATE 文 ! 条件セグメント ! 式セグメント 構文 < 桁数 > . + - < 桁数 > . < 桁数 > < 桁数 > E < 桁数 > 0 ~ 9 の整数です。 使用法 リテラル番号には埋め込みコンマは含まれていません。小数点を示すため にコンマを使用することはできません。リテラル番号の前に正符号または 負符号を付けることができます。整数には小数点は含まれていません。整 数の例を次に示します。 10 -27 25567 構文 7-427 使用法 浮動および 10 進数値には、小数点や指数表現が含まれています。浮動およ び 10 進数値の例を次に示します。 123.456 1.23456e2 123456.0e-3 リテラル番号を MONEY 値として使用する場合は、その前に金額 (MONEY) 型記号を付けたり、コンマを入れたりしないでください。 7-428 IBM Informix SQL リファレンス・ガイド プロシージャー名 プロシージャー名 目的 プロシージャー名セグメントは、構文図でプロシージャー名を参照すると きに必ず使用されます。プロシージャー名セグメントは次の文に現れます。 ! CREATE PROCEDURE ! DROP PROCEDURE ! EXECUTE PROCEDURE 構文 OL < 所有者 >. . 識別子 7-403 ページ ; < データベース > @ <DB サーバー名 > < データベース > プロシージャーが常駐するデータベースの名前です。 <DB サーバー名 > データベース が常駐する IBM Informix OnLine データ ベース・サーバーの名前です。アットマーク (@) は、 データベース・サーバー名を示すために使用しなけれ ばならないリテラル文字です。 < 所有者 > プロシージャーの所有者のユーザー名です。ANSI 準拠 データベースを使用する場合は、自分が所有していな いプロシージャーに対して owner. 規則を使用しなけれ ばなりません。 使用法 プロシージャーの実際の名前は SQL 識別子です。 プロシージャーを作成する場合、プロシージャーの < 名前 > はデータベー ス内で固有でなければなりません。 構文 7-429 使用法 ANSI プロシージャーを作成する場合、< 所有者 . 名前 > 条件はデータベース内 で固有でなければなりません。 < 所有者 . 名前 > には大文字小文字の区別があります。詳細については、 7-442 ページの ANSI 準拠データベースにおける大文字小文字の区別の説明 を参照してください。♦ 同一名を持つプロシージャーおよび SQL 関数 同じ名前のプロシージャーを SQL 関数として作成し、その名前をユー ザー・プロシージャー内のプロシージャー名として明示的に定義すると、 その名前による呼び出しはすべてそのプロシージャーに対して行われます。 つまり、そのプロシージャーが定義されている文ブロック内でシステム関 数を使用することはできません。 たとえば、次のプロシージャーは、2 つの length 関数を使用します。プロ シージャーが初めて length 関数を呼び出すとき、その関数は LENGTH とい う SQL 関数です。プロシージャーによる 2 回目の length 関数呼び出しは、 length がプロシージャーとして定義されている BEGIN...END ブロック内で 行われます。length の 2 回目の呼び出しでは、実際に、length というユー ザー作成プロシージャーが使用されます。 CREATE PROCEDURE test_len() RETURNING INT, INT; DEFINE c INT; DEFINE d INT; LET c = (SELECT length(fname) FROM customer WHERE customer_num = 101); BEGIN DEFINE length PROCEDURE; LET d = length(5); END RETURN c, d; END PROCEDURE; 7-430 IBM Informix SQL リファレンス・ガイド 引用符付きストリング 引用符付きストリング 目的 引用符付きストリング・セグメントは、次の文とセグメントで使用されま す。 ! INSERT 文 ! SELECT 文 ! 条件セグメント ! 式セグメント ( 定数式の ) 構文 " " < 文字 > ' "" ' < 文字 > " < 文字 > ASCII 文字です。 使用法 定数は単一行に書かなければなりません。つまり、埋め込み改行は使用で きません。 構文 7-431 ストリングでの引用符の使用 ストリングでの引用符の使用 二重引用符で区切られたストリング定数では、一重引用符は特別の意味を 持っていません。同様に、一重引用符で区切られたストリングでは、二重 引用符は特別の意味を持っていません。たとえば、次のストリングは有効 です。 "Nancy’s puppy jumped the fence" 'Billy told his kitten, "no!"' ストリング中に二重引用符をインクルードするには、次のストリングに示 されているように、二重引用符の前に別の二重引用符を付けます。 "Enter ""y"" to select this row" ストリングとしての DATETIME および INTERVAL 値 DATETIME および INTERVAL データを、 「リテラル DATETIME」および「リ テラル INTERVAL」セグメント ( それぞれ、7-421 ページおよび 7-424 ペー ジを参照 ) に記述されている形式で入力することもできれば、引用符付き ストリングとして入力することもできます。文字ストリングとして入力さ れた有効リテラルは、自動的に DATETIME または INTERVAL 値に変換され ます。次の INSERT 文は、引用符付きストリングを使用して INTERVAL およ び DATETIME データを入力します。 INSERT INTO cust_calls(call_dtime) VALUES ("1992-5-4 10:12:11") INSERT INTO manufact(lead_time) VALUES ("14") 引用符付きストリングの値のフォーマットは、列の修飾子によって指定さ れているフォーマットと正確に一致しなければなりません。上例の最初の 文の場合、INSERT 文を有効にするには、call_dtime を YEAR TO MINUTE 修 飾子で定義する必要があります。 条件における LIKE および MATCHES 条件に LIKE または MATCHES キーワードが含まれている引用符付きストリ ングには、ワイルドカード文字をインクルードすることができます。ワイ ルドカード文字の使用法について詳しくは、7-350 ページの「条件」セグメ ントを参照してください。 7-432 IBM Informix SQL リファレンス・ガイド 引用符付きストリングとしての値の挿入 引用符付きストリングとしての値の挿入 引用符付きストリングである値を挿入する場合は、以下の規則を守ってく ださい。 ! CHAR、VARCHAR、DATE、DATETIME、および INTERVAL 値を引用符 で囲みます。 ! DATE 値を mm/dd/yyy フォーマットで設定するか、またはそれが設 定済みであれば、DBSET によって指定されているフォーマットで設 定します。 ! PREPARE を除くすべての文では、引用符付きストリングの最大長 は 256 バイトです。PREPARE 文での引用符付きストリングの最大 長は 2048 バイトです。 ! 10 進数値を持つ数字には小数点が含まれていなければなりません。 10 進数値標識としてコンマを使用することはできません。 ! MONEY データの前にドル記号を付けたり、コンマをインクルード したりしてはなりません。 ! 列が NULL 値を受け入れる場合にのみ、NULL をプレースホルダー としてインクルードすることができます。 構文 7-433 関係演算子 関係演算子 目的 関係演算子は、2 つの式を定量的に比較するために使用します。関係演算 子セグメントは条件セグメントで使用されます。 構文 関係演算子は次の形式を取ります。 < <= > = >= <> != < より小。 <= より小か等しい。 > より大。 = 等しい。 >= より大か等しい。 <> 等しくない。 != 等しくない。 使用法 DATE および DATETIME 式の場合は、より大 は時間的に後のことを意味しま す。 7-434 IBM Informix SQL リファレンス・ガイド 使用法 INTERVAL 式の場合は、より大 は時間の範囲がより広いことを意味します。 文字式の場合は、より大 は、ASCII 照合順序で後 であることを意味します。 この場合、小文字が大文字の後になり、どちらも数字の後になります。下 図は、7 ビット ASCII 照合順序を示したものです。 数字 文字 数字 文字 数字 文字 0 ^@ 43 + 86 V 1 ^A 44 , 87 W 2 ^B 45 - 88 X 3 ^C 46 . 89 Y 4 ^D 47 / 90 Z 5 ^E 48 0 91 [ 6 ^F 49 1 92 \ 7 ^G 50 2 93 ] 8 ^H 51 3 94 ^ 9 ^I 52 4 95 _ 10 ^J 53 5 96 ` 11 ^K 54 6 97 a 12 ^L 55 7 98 b 13 ^M 56 8 99 c 14 ^N 57 9 100 d 15 ^O 58 : 101 e 16 ^P 59 ; 102 f 17 ^Q 60 < 103 g 18 ^R 61 = 104 h 19 ^S 62 > 105 i (3 の 1) 構文 7-435 使用法 数字 文字 数字 文字 数字 文字 20 ^T 63 ? 106 j 21 ^U 64 @ 107 k 22 ^V 65 A 108 l 23 ^W 66 B 109 m 24 ^X 67 C 110 n 25 ^Y 68 D 111 o 26 ^Z 69 E 112 p 27 esc 70 F 113 q 28 ^\ 71 G 114 r 29 ^] 72 H 115 s 30 ^^ 73 I 116 t 31 ^_ 74 J 117 u 75 K 118 v 32 33 ! 76 L 119 w 34 " 77 M 120 x 35 # 78 N 121 y 36 $ 79 O 122 z 37 % 80 P 123 { 38 & 81 Q 124 | 39 ' 82 R 125 } 40 ( 83 S 126 ~ (3 の 2) 7-436 IBM Informix SQL リファレンス・ガイド 使用法 数字 文字 数字 文字 数字 文字 41 ) 84 T 127 del 42 * 85 U ^X = CTRL-X (3 の 3) 構文 7-437 シノニム名 シノニム名 目的 シノニム名セグメントは、構文図でシノニム名を参照するときに必ず使用 されます。プロシージャー名セグメントは次の文に現れます。 ! CREATE AUDIT ! CREATE INDEX ! CREATE SYNONYM ! CREATE VIEW ! DELETE ! DROP AUDIT ! DROP SYNONYM ! DROP TABLE ! DROP VIEW ! INSERT ! LOCK TABLE ! RECOVER TABLE ! RENAME COLUMN ! REVOKE ! SELECT ! UNLOCK TABLE ! UPDATE ! UPDATE STATISTICS 7-438 IBM Informix SQL リファレンス・ガイド 構文 構文 識別子 7-403 ページ OL < 所有者 >. . ; < データベース > @ <DB サーバー名 > < データベース > シノニムが常駐するデータベースの名前です。 <DB サーバー名 > データベース が常駐する IBM Informix OnLine データ ベース・サーバーの名前です。アットマーク (@) は、 データベース・サーバー名を示すために使用しなけれ ばならないリテラル文字です。 < 所有者 > シノニムの所有者のユーザー名です。ANSI 準拠 データ ベースを使用する場合は、自分が所有していないシノ ニムに対して owner. 規則を使用しなければなりません。 使用法 シノニムの実際の名前は SQL 識別子です。 シノニムを作成する場合、シノニムの < 名前 > はデータベース内で固有で なければなりません。 ANSI シノニムを作成する場合、< 所有者 . 名前 > 条件はデータベース内で固有 でなければなりません。 < 所有者 . 名前 > には大文字小文字の区別があります。詳細については、 7-442 ページの ANSI 準拠データベースにおける大文字と小文字の区別の説 明を参照してください。♦ 構文 7-439 表名 表名 目的 表名セグメントは、表の名前を指定するために次の文で使用します。 ! ALTER TABLE ! CREATE AUDIT ! CREATE INDEX ! CREATE SYNONYM ! CREATE TABLE ! DELETE ! DROP AUDIT ! DROP TABLE ! GRANT ! INSERT ! LOCK TABLE ! RECOVER TABLE ! RENAME COLUMN ! REVOKE ! SELECT ! UNLOCK TABLE ! UPDATE ! UPDATE STATISTICS 7-440 IBM Informix SQL リファレンス・ガイド 構文 構文 OL < 所有者 >. . 識別子 7-403 ページ + : < データベース > @ <DB サーバー名 > < データベース > 表が常駐するデータベースの名前です。 <DB サーバー名 > データベース が常駐する IBM Informix OnLine データ ベース・サーバーの名前です。アットマーク (@) は、 データベース・サーバー名を示すために使用しなけれ ばならないリテラル文字です。 < 所有者 > 表の所有者のユーザー名です。ANSI 準拠データベース を使用する場合は、自分が所有していない表に対して owner. 規則を使用しなければなりません。 使用法 次の例は表仕様を示しています。 empinfo@personnel:emp_names 表を作成または名前変更する場合は、表の < 名前 > がデータベース内で固 有であることを確認してください。 ANSI 表を作成または名前変更する場合は、< 所有者 > と < 名前 > の組み合わせ がデータベース内で固有であることを確認してください。 ANSI 準拠データベースでは、所有者でない限り、表名に < 所有者 >. がイ ンクルードされていなければなりません。システム・カタログ表の場合は、 所有者は informix です。♦ 構文 7-441 ANSI 準拠データベースにおける大文字と小文字の区別 ANSI 準拠データベースにおける大文字と小文字の区 別 ANSI 所有者名が引用符で囲まれていない限り、データベース・サーバーは、所 有者名を大文字にシフトしてから文を実行します。所有者名を入力したと おりに読み込みたい場合は、名前の所有者部分を引用符で囲んでください。 たとえば、次の最初の文で示されている名前 cathl は、CATHL にシフト アップされてから使用され、一方、2 番目の文内の名前 nancy はシフト アップされません。 SELECT * FROM cathl.customer SELECT * FROM "nancy".customer 暗黙所有者を大文字にした表を作成しても問題はなく、所有者の実際のロ グイン名も大文字になります。たとえば、ユーザーが BROWN であり、次 の文でビューを作成すると仮定とします。 CREATE VIEW newcust AS SELECT fname, lname FROM customer WHERE state = "NJ" ユーザー BROWN は、ビュー上で次の SELECT 文を実行できます。 SELECT * FROM brown.newcust SELECT * FROM newcust SELECT * FROM systables WHERE tabname = newcust AND owner = USER この例の最初の照会で、データベース・サーバーは自動的に brown をシフ トアップしてから SELECT 文を実行します。2 番目の照会で、データベー ス・サーバーは、すでにシフトアップされている所有者名 BROWN を戻し ます。3 番目の照会で、USER は、格納されているログイン名 ( この場合は、 大文字 ) を戻します。 ユーザーが nancy で、次の文を使用すると、ビューには名前 NANCY.njcust が表示されます。 CREATE VIEW nancy.njcust AS SELECT fname, lname FROM customer WHERE state = "NJ" ユーザーが nancy で、次の文を使用すると、ビューには名前 nancy.njcust が表示されます。 CREATE VIEW "nancy".njcust AS SELECT fname, lname FROM customer WHERE state = "NJ" 7-442 IBM Informix SQL リファレンス・ガイド 参考資料 次の SELECT 文は、名前 NANCY.njcust と、nancy.njcust の実際の所有者名と 表名を突き合わせようとするので、この文は失敗します。 SELECT * FROM nancy.njcust ♦ 参考資料 IBM Informix SQL チュートリアル・ガイド では、所有者命名の説明を参照して ください。 構文 7-443 ビュー名 ビュー名 目的 ビュー名セグメントは、ビューの名前を指定するために次の文で使用しま す。 ! CREATE SYNONYM ! CREATE VIEW ! DELETE ! DROP VIEW ! GRANT ! INSERT ! REVOKE ! SELECT ! UPDATE 構文 OL + < 所有者 >. . : < データベース > @ <DB サーバー名 > 7-444 IBM Informix SQL リファレンス・ガイド 識別子 7-403 ページ 使用法 < データベース > ビューが常駐するデータベースの名前です。 <DB サーバー名 > データベース が常駐する IBM Informix OnLine データ ベース・サーバーの名前です。アットマーク (@) は、 データベース・サーバー名を示すために使用しなけれ ばならないリテラル文字です。 < 所有者 > ビューの所有者のユーザー名です。ANSI 準拠データ ベースを使用する場合は、自分が所有していない ビューに対して owner. 規則を使用しなければなりませ ん。 使用法 プレフィックス < 所有者 .> はオプションです。しかし、それを使用する と、データベース・サーバーは < 所有者 > の正当性を調べません。ビュー を作成する場合は、ビューの < 名前 > は、データベースにすでに存在して いるすべての表、シノニム、およびビューで固有でなければなりません。 ANSI ビューを作成する場合は、ビューの < 所有者 . ビュー名 > は、データベー スにすでに存在しているすべての表、シノニム、およびビューで固有でな ければなりません。 < 所有者 . 名 > には大文字と小文字の区別があります。詳細については、 7-442 ページの ANSI 準拠データベースにおける大文字小文字の区別の説明 を参照してください。♦ 参考資料 IBM Informix SQL チュートリアル・ガイド では、ビューおよびセキュリティー の説明を参照してください。 構文 7-445 参考資料 7-446 IBM Informix SQL リファレンス・ガイド ストアード・プロシー ジャーおよび SPL 概要 . . . . . . . . . . . . 第 . . . . . . . . 8-5 ストアード・プロシージャーと SPL の概要 . ストアード・プロシージャーの機能 . . SQL とストアード・プロシージャーの関係 . . . . . . . . . . . . . . . . . . . 8-5 . 8-6 . 8-6 ストアード・プロシージャーの作成と使用 . . . . . . . . DB-Access の使用によるプロシージャーの作成 . . . . . . 埋め込み言語製品の使用によるプロシージャーの作成 . . . . プロシージャーのコメント化とドキュメント化 . . . . . . コンパイル時エラーの診断 . . . . . . . . . . . . DB-Access の使用によるプロシージャー内の構文エラーの検出 埋め込み言語製品の使用によるプロシージャー内の構文エラー の検出 . . . . . . . . . . . . . . . コンパイル時警告の表示 . . . . . . . . . . . . . テキストまたはマニュアルの生成 . . . . . . . . . . プロシージャー・テキストの表示 . . . . . . . . . プロシージャー・マニュアルの表示 . . . . . . . . プロシージャーの実行 . . . . . . . . . . . . . プロシージャーのデバッグ . . . . . . . . . . . . プロシージャーの再作成 . . . . . . . . . . . . . 8-7 8-7 8-8 8-8 8-9 8-9 ストアード・プロシージャーに対するアクセス権 . . . 作成時のアクセス権 . . . . . . . . . . . 実行時のアクセス権 . . . . . . . . . . . アクセス権と所有者アクセス権付きプロシージャー . アクセス権と DBA アクセス権付きプロシージャー . アクセス権と入れ子にしたプロシージャー . . . アクセス権の取り消し . . . . . . . . . . 8-16 8-17 8-17 8-17 8-18 8-19 8-19 . . . . . . . . . . . . . . . . . . . . . 8-9 8-10 8-11 8-11 8-11 8-11 8-14 8-16 8 章 変数と式 . . . . . . . . . 変数 . . . . . . . . . 変数のフォーマット. . . . 広域変数と局所変数. . . . 変数の定義 . . . . . . 変数のデータ型 . . . . . 変数の範囲 . . . . . . 変数 / キーワードのあいまいさ 式 . . . . . . . . . . 変数への値の割り当て . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . プログラムの流れの制御 . . . . . . . . . . . . . 分岐 . . . . . . . . . . . . . . . . . . ループ . . . . . . . . . . . . . . . . . . 関数処理 . . . . . . . . . . . . . . . . . プロシージャー内でのプロシージャーの呼び出し . . . . プロシージャー内からのオペレーティング・システム・コマン ドの実行 . . . . . . . . . . . . . . プロシージャーの再帰呼び出し . . . . . . . . . プロシージャーとの情報のやり取り . . 結果の戻り . . . . . . . . 戻り値の指定. . . . . . . 値の戻り . . . . . . . . プロシージャーからの複数値の戻り 例外処理 . . . . . . . . . エラーのトラップと復旧 . . . ON EXCEPTION 文の制御範囲 . . ユーザー生成の例外 . . . . . SQL エラーのシミュレート. . 入れ子コードを終了するための SPL 文の構文 CALL . CONTINUE DEFINE . EXIT . FOR . . FOREACH IF . . .8-19 .8-19 .8-20 .8-20 .8-20 .8-21 .8-21 .8-22 .8-23 .8-25 .8-25 .8-26 .8-26 .8-28 .8-28 .8-28 .8-29 . . . . . . . . .8-29 . . . . . . . . .8-29 . . . . . . . . .8-29 . . . . . . . . .8-30 . . . . . . . . .8-30 . . . . . . . . . . RAISE . . . . . . . . . . . . . . . EXCEPTION . . . . . . . . . . . . . . . の使用. . . . . . . .8-32 .8-32 .8-33 .8-34 .8-34 .8-35 . . . . . . . . . . . . . . . . . .8-36 . . . . . . . . . . . . . . . . . .8-37 . . . . . . . . . . . . . . . . . .8-40 . . . . . . . . . . . . . . . . . .8-41 . . . . . . . . . . . . . . . . . .8-49 . . . . . . . . . . . . . . . . . .8-51 . . . . . . . . . . . . . . . . . .8-55 . . . . . . . . . . . . . . . . . .8-59 8-2 IBM Informix SQL リファレンス・ガイド LET . . . . . . . . . . . . . . . . . . . ON EXCEPTION . . . . . . . . . . . . . . . . RAISE EXCEPTION . . . . . . . . . . . . . . . RETURN . . . . . . . . . . . . . . . . . . SYSTEM . . . . . . . . . . . . . . . . . . TRACE . . . . . . . . . . . . . . . . . . WHILE . . . . . . . . . . . . . . . . . . . 8-63 8-66 8-72 8-74 8-77 8-79 8-83 ストアード・プロシージャーおよび SPL 8-3 8-4 IBM Informix SQL リファレンス・ガイド 概要 ストアード・プロシージャーは、SQL 動作の制御に使用できる有効なツー ルです。この章では、SQL と Informix ストアード・プロシージャー言語 (SPL) を使用してストアード・プロシージャーを作成する手順を説明しま す。その作成方法を学ぶための援助として、実用的なストアード・プロ シージャーのサンプルが示されています。 各 SPL 文の構文が、本章の末尾に記載されています。各文の構文には、使 用上の注意とその文の例が示されています。 ストアード・プロシージャーと SPL の概要 SQL の場合、ストアード・プロシージャーはユーザー定義の関数です。 データベースに対する RESOURCE アクセス権を持つユーザーは、だれでも ストアード・プロシージャーを作成することができます。ストアード・プ ロシージャーを作成すると、そのストアード・プロシージャーは、データ ベースのオブジェクトとして実行可能フォーマットでデータベースに格納 されます。ストアード・プロシージャーを使用すれば、SQL で実行できるす べての関数を実行できるほか、SQL 単独で実行できる関数を拡張することもで きます。 ストアード・プロシージャーは、SQL および SPL 文を使用して作成します。 SPL 文は、CREATE PROCEDURE および CREATE PROCEDURE FROM 文の中で しか使用できません。これらの文は、DB-Access および埋め込み言語製品で 使用できます。 ストアード・プロシージャーおよび SPL 8-5 ストアード・プロシージャーの機能 ストアード・プロシージャーの機能 ストアード・プロシージャーを使用して広範囲の目的を達成することがで きます。たとえば、データベース・パフォーマンスの改善、アプリケー ション作成の単純化、データ・アクセスの制限またはモニターなどです。 ストアード・プロシージャーは実行可能フォーマットで格納されるため、 それを使用すれば、頻繁に反復されるタスクを実行してパフォーマンスを 改善することができます。直接的な SQL コードではなく、ストアード・プ ロシージャーを使用することで、構文解析、妥当性検査、および照会の最 適化の反復操作をバイパスすることができます。 ストアード・プロシージャーはデータベースのオブジェクトであるため、 ストアード・プロシージャーは、データベースで稼働するすべてのアプリ ケーションで使用できます。複数のアプリケーションが同一ストアード・ プロシージャーを使用できるため、アプリケーションの開発時間が短縮さ れます。 DBA アクセス権を持っていないユーザーでも DBA アクセス権を使用して実 行できる、ストアード・プロシージャーを作成することができるので、 データベースのデータへのアクセスを制限したり制御したりできます。あ るいは、ストアード・プロシージャーは、どのユーザーが特定の表または データにアクセスするかをモニターすることもできます。 SQL とストアード・プロシージャーの関係 ストアード・プロシージャーを使用して、SQL のデータ操作文に値を指定 することができます。たとえば、これらの値を表に挿入したり、照会での 条件の一部、または UPDATE 文の一部として使用したりできます。 あるいは、ストアード・プロシージャーを使用して、SQL 文を非表示にす ることもできます。ストアード・プロシージャーをインプリメントすれば、 データベース・ユーザーのタスクを単純化することができます。すべての ユーザーに SQL の使用法を学ばせなくても、 1 人の熟練した SQL ユーザーが ストアード・プロシージャーを作成して SQL の動作をカプセル化し、他の ユーザーにプロシージャーがデータベースに格納されていることを知らせ れば、これらのユーザーはそのストアード・プロシージャーを実行するこ とができます。 8-6 IBM Informix SQL リファレンス・ガイド ストアード・プロシージャーの作成と使用 ストアード・プロシージャーの作成と使用 ストアード・プロシージャーを作成するには、プロシージャーの一部とし て実行したい SQL 文を CREATE PROCEDURE 文の文ブロックの中に挿入しま す。SPL 文を使用して、プロシージャー内の操作の流れを制御します。こ れらの追加の文には、IF、FOR、その他があり、それについての説明が本章 の末尾に記載されています。CREATE PROCEDURE および CREATE PROCEDURE FROM 文の説明は、第 7 章、 『構文』にあります。 DB-Access の使用によるプロシージャーの作成 DB-Access を使用してストアード・プロシージャーを作成するには、文ブ ロックの文の一部であるすべての文を含め、CREATE PROCEDURE 文を出し ます。たとえば、顧客アドレスを読み取るプロシージャーを作成するには、 図 8-1 に示されているような文を使用することができます。 図 8-1 顧客表から読み取るプロシージャー CREATE PROCEDURE read_address (lastname CHAR(15)) -- one argument RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(15),CHAR(2), CHAR(5); -- 6 items DEFINE DEFINE DEFINE DEFINE p_lname,p_fname, p_city CHAR(15); --define each procedure variable p_add CHAR(20); p_state CHAR(2); p_zip CHAR(5); SELECT fname, address1, city, state, zipcode INTO p_fname, p_add, p_city, p_state, p_zip FROM customer WHERE lname = lastname; RETURN p_fname, lastname, p_add, p_city, p_state, p_zip; --6 items END PROCEDURE DOCUMENT "This procedure takes the last name of a customer as", --brief description "its only argument. It returns the full name and address of", "the customer." WITH LISTING IN "/acctng/test/listfile" -- compile-time warnings go here ; -- end of the procedure read_address ストアード・プロシージャーおよび SPL 8-7 埋め込み言語製品の使用によるプロシージャーの作成 埋め込み言語製品の使用によるプロシージャーの作成 埋め込み言語製品を使用してストアード・プロシージャーを作成するには、 CREATE PROCEDURE 文のテキストをファイルに入れます。CREATE PROCEDURE FROM 文を使用し、そのファイルを参照してプロシージャーを コンパイルします。たとえば、顧客名を読み取るためのプロシージャーを 作成するには、図 8-1 に示されているような文を使用して、それをファイ ルに格納することができます。ファイルの名前が read_add_source であれ ば、次の文が read_address プロシージャーをコンパイルします。 CREATE PROCEDURE FROM "read_add_source"; 図 8-2 は、上の SQL 文を ESQL/C プログラムで示したものです。 図 8-2 read_address プロシージャーを ESQL/C プログラムでコンパイルして格納する SQL 文 /* This program creates whatever procedure is in * * the file "read_add_source". */ #include <stdio.h> $include sqlca; $include sqlda; $include datetime; /* Program to create a procedure from the pwd */ main() { $ database play; $create procedure from "read_add_source"; } プロシージャーのコメント化とドキュメント化 図 8-1 の read_address には、コメントと DOCUMENT 節がインクルードされ ています。コメントはプロシージャーのテキストに組み込まれています。 二重ハイフン (--) の後の文字はコメントと見なされます。二重ハイフンは、 行の先頭または中間でも使用できます。 プロシージャーの別個の要約をインクルードするには、DOCUMENT 節を使 用します。DOCUMENT 節のデータを取り出すには、sysprocbody システム・ カタログ表を照会します。DOCUMENT 節の読み取りについて詳しくは、本 章で後述する「プロシージャー・マニュアルの表示」セクションを参照し てください。 8-8 IBM Informix SQL リファレンス・ガイド コンパイル時エラーの診断 コンパイル時エラーの診断 CREATE PROCEDURE または CREATE PROCEDURE FROM 文を出した場合、プ ロシージャーの本体に構文エラーが含まれていると、文は失敗します。 データベース・サーバーはプロシージャーのテキストの処理を停止し、エ ラーの位置を戻します。 DB-Access の使用によるプロシージャー内の構文エラーの検出 DB-Access を使用して作成したプロシージャーに構文エラーが含まれている と、QUERY-LANGUAGE メニューの Modify オプションを選択したときに、 カーソルが問題の構文を指します。 埋め込み言語製品の使用によるプロシージャー内の構文エラー の検出 埋め込み言語製品を使用して作成したプロシージャーに構文エラーが含ま れていると、CREATE PROCEDURE 文は失敗します。データベース・サー バーは、SQLCA の SQLCODE フィールドを負の数値に設定し、SQLERRD 配 列の 5 番目のエレメントをファイル・オフセット文字に設定します。各製 品の SQLCA フィールドが、次の表に示されています。 ESQL/C ESQL/COBOL sqlca.sqlcode SQLCODE SQLCODE OF SQLCA sqlca.sqlerrd[4] SQLERRD[5] OF SQLCA 図 8-3 は、プロシージャー作成時に発生する構文エラーのトラップ方法を 示したものです。この図は、エラーが発生したファイルへのオフセットの 表示方法も示しています。 ストアード・プロシージャーおよび SPL 8-9 コンパイル時警告の表示 図 8-3 ESQL/C の使用によるプロシージャー作成の失敗の検査 #include <stdio.h> $include sqlca; $include sqlda; $include datetime; /* Program to create a procedure from procfile in pwd */ main() { long char_num; $ database play; $create procedure from "procfile"; if (sqlca.sqlcode != 0 ) { printf("\nSqlca.sqlcode = %ld\n", sqlca.sqlcode); char_num = sqlca.sqlerrd[4]; printf("\nError in creating read_address. Check character position %ld\n", char_num); 図 8-3 では、CREATE PROCEDURE FROM 文が失敗すると、プログラムは、構 文エラーが検出された文字位置に加え、メッセージも表示します。 コンパイル時警告の表示 データベース・サーバーが潜在的な問題を検出したのに、プロシージャー が構文上正しい場合は、リスト・ファイルに警告が入ります。このリスト を使用してプロシージャーの潜在的な問題を確認してから、それを実行す ることができます。 プロシージャーに関するコンパイル時警告のリストを取得するには、次の 例に示されているように、CREATE PROCEDURE 文の WITH LISTING IN 節を 使用します。 CREATE PROCEDURE read_address (lastname CHAR(15)) -- one argument RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(15), CHAR(2), CHAR(5); -- 6 items . . . WITH LISTING IN "/acctng/test/listfile" -- compile-time warnings go here ; -- end of the procedure read_address IBM Informix STAR または IBM Informix NET を使用している場合は、リスト・ ファイルは、データベースが常駐するマシン上に作成されます。このファ イルの絶対パス名とファイル名を指定すれば、このファイルは指定の場所 に作成されます。リスト・ファイルの相対パス名を指定すれば、ファイル はそのマシン上のホーム・ディレクトリーに作成されます。( ホーム・ディ レクトリーがない場合は、ファイルはルート・ディレクトリーに作成され ます。) 8-10 IBM Informix SQL リファレンス・ガイド テキストまたはマニュアルの生成 プロシージャーを作成したら、WITH LISTING IN 節に指定されているファイ ルを表示して、その中の警告を見ることができます。 テキストまたはマニュアルの生成 プロシージャーを作成すると、そのプロシージャーは sysprocbody システ ム・カタログ表に格納されます。sysprocbody システム・カタログ表には、 実行可能プロシージャーのほか、オリジナルの CREATE PROCEDURE 文のテ キストとマニュアル・テキストも含まれています。 プロシージャー・テキストの表示 プロシージャーのテキストを生成するには、sysprocbody システム・カタロ グ表からデータ列を選択します。次の SELECT 文は read_address プロシー ジャー・テキストを読み取ります。 SELECT data FROM informix.sysprocbody WHERE datakey = "T" -- find text lines AND procid = (SELECT procid FROM informix.sysprocedure WHERE informix.sysprocedure.procname = "read_address") プロシージャー・マニュアルの表示 プロシージャーのマニュアル・テキストのみを表示したい場合は、次の SELECT 文を使用してマニュアル・ストリングを読み取ることができます。 マニュアル行は、CREATE PROCEDURE 文の DOCUMENT 節のマニュアル行で す。 SELECT data FROM informix.sysprocbody WHERE datakey = "D" -- find documentation lines AND procid = (SELECT procid FROM informix.sysprocedures WHERE informix.sysprocedure.procname = "read_address") プロシージャーの実行 プロシージャーを実行するには 3 つの方法があります。SQL 文 EXECUTE PROCEDURE を使用することもできるし、LET または CALL SPL 文のいずれ かを使用することもできます。 ストアード・プロシージャーおよび SPL 8-11 プロシージャーの実行 プロシージャーを実行するには EXECUTE PROCEDURE 文を使用します。 read_address プロシージャーを使用して “Putnum” という顧客のフルネーム とアドレスを確認するには、次の文を使用します。 EXECUTE PROCEDURE read_address ("Putnum"); read_address プロシージャーは値を戻すので、あるプロシージャーを埋め 込み言語プログラムまたは他のプロシージャーから実行する場合は、ホス ト変数を指定して INTO を使用して、データを受け取る必要があります。た とえば、ESQL/C プログラムで read_address プロシージャーを実行するに は、図 8-4 に示されているコード・セグメントを使用します。 図 8-4 ESQL/C の使用によるプロシージャーの実行 #include <stdio.h> $include sqlca; $include sqlda; $include datetime; /* Program to execute a procedure in the database named "play" */ main() { $ char lname[16], fname[16], address[21]; $ char city[16], state[3], zip[6]; $ database play; $EXECUTE PROCEDURE read_address ("Putnum") INTO $lname, $fname, $address, $city, $state, $zip; if (sqlca.sqlcode != 0 ) printf("\nFailure on execute"); } 別のプロシージャーの中のプロシージャーを実行する場合は、CALL または LET 文を使用してそのプロシージャーを実行することができます。 read_address プロシージャーを持つ CALL 文を使用するには、図 8-5 に示さ れているコードを使用することができます。 8-12 IBM Informix SQL リファレンス・ガイド プロシージャーの実行 図 8-5 CALL 文による他のプロシージャー内のプロシージャーの呼び出し CREATE PROCEDURE address_list () DEFINE p_lname, p_fname, p_city CHAR(15); DEFINE p_add CHAR(20); DEFINE p_state CHAR(2); DEFINE p_zip CHAR(5); . . . CALL read_address ("Putnum") RETURNING p_fname, p_lname, p_add, p_city, p_state, p_zip; . . . -- use the returned data some way END PROCEDURE; 図 8-6 は、プロシージャー呼び出しを介してプロシージャー変数に値を割 り当てるために LET 文を使用する例を示したものです。 図 8-6 LET 文によるプロシージャー呼び出しからの値の割り当て CREATE PROCEDURE address_list () DEFINE p_lname, p_fname, p_city CHAR(15); DEFINE p_add CHAR(20); DEFINE p_state CHAR(2); DEFINE p_zip CHAR(5); . . . LET p_fname, p_lname,p_add, p_city, p_state, p_zip = read_address ("Putnum"); . . . -- use the returned data some way END PROCEDURE; ストアード・プロシージャーおよび SPL 8-13 プロシージャーのデバッグ プロシージャーのデバッグ プロシージャーを正常に作成して実行した場合に、論理エラーが発生する ことがあります。論理エラーがプロシージャーに含まれている場合は、 TRACE 文を使用してエラーを検出することができます。次のプロシー ジャー・エンティティー値をトレースすることができます。 ! 変数 ! プロシージャー引数 ! 戻り値 ! SQL エラー・コード ! ISAM エラー・コード トレースされた値のリストを生成するには、まず、SQL 文の SET DEBUG FILE を使用して、トレース出力を入れるファイルを命名します。プロシー ジャーを作成するときに、TRACE 文をそのフォームの 1 つにインクルード します。 TRACE 出力のフォームを指定するには、次の 3 つの方法があります。 TRACE ON SQL 文以外のすべての文をトレースします。変数の内容は、 使用する前に出力されます。プロシージャー呼び出しと戻り 値もトレースされます。 TRACE PROCEDURE プロシージャー呼び出しと戻り値のみをトレースします。 TRACE 式 リテラルまたは式を出力します。必要な場合は、式の値を計 算してからファイルに送信します。 図 8-7 は、あるバージョンの read_address プロシージャーで TRACE 文を使 用する方法を示したものです。この例で示したいくつかの SPL 文について は説明していませんが、この例全体に目を通すと、TRACE 文がプロシー ジャー実行のモニターに役立つことが分かります。 8-14 IBM Informix SQL リファレンス・ガイド プロシージャーのデバッグ 図 8-7 TRACE 文によるプロシージャー実行のモニター CREATE PROCEDURE read_many (lastname CHAR(15)) RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(15),CHAR(2), CHAR(5); DEFINE DEFINE DEFINE DEFINE DEFINE p_lname,p_fname, p_city CHAR(15); p_add CHAR(20); p_state CHAR(2); p_zip CHAR(5); lcount, i INT; LET lcount = 1; TRACE ON; -- Every expression will be traced from here on TRACE "Foreach starts"; -- A trace statement with a literal FOREACH SELECT fname, lname, address1, city, state, zipcode INTO p_fname, p_lname, p_add, p_city, p_state, p_zip FROM customer WHERE lname = lastname RETURN p_fname, p_lname, p_add, p_city, p_state, p_zip WITH RESUME; LET lcount = lcount + 1; -- count of returned addresses END FOREACH; TRACE "Loop starts"; -- Another literal FOR i IN (1 TO 5) BEGIN RETURN i , i+1, i*i, i/i, i-1,i with resume; END END FOR; END PROCEDURE ; トレースされたプロシージャーを実行するたびに、SET DEBUG FILE 文を使 用してユーザー指定のファイルに項目が追加されます。デバッグ項目を見 るには、任意のテキスト・エディターを使用して出力ファイルを表示して ください。 次のリストは、図 8-7 のプロシージャーによって生成された出力の一部を 示しています。トレースされたそれぞれの文の次に、その内容を説明して います。 TRACE ON エコーイングされた TRACE ON 文。 TRACE Foreach starts トレースされた式。この場合は、リテラル・ ストリング Foreach starts。 start select cursor FOREACH ループを処理するためにカーソル がオープンされていることの通知。 ストアード・プロシージャーおよび SPL 8-15 プロシージャーの再作成 select cursor iteration SELECT カーソルの各反復の開始を知らせ る通知。 expression:(+lcount, 1) 実行された式 (lcount+1) は 2 に評価されます。 let lcount = 2 各 LET 文が値でエコーイングされます。 プロシージャーの再作成 プロシージャーがデータベースに含まれている場合は、DROP PROCEDURE 文を使用してそれを明示的に削除しないと、同じ名前を持つ他のプロシー ジャーを作成することはできません。プロシージャーをデバッグし、同じ プロシージャー名で再度 CREATE PROCEDURE 文を使用しようとすると、既 存のプロシージャーをデータベースから削除しない限り、その文は失敗し ます。 ストアード・プロシージャーに対するアクセス 権 プロシージャーには 2 つの型があります。つまり、DBA アクセス権付きプ ロシ-ジャーと所有者アクセス権付きプロシージャーです。プロシー ジャーの作成者は、そのプロシージャーの型を決定します。プロシー ジャーの型は、そのプロシージャーを実行するユーザーのアクセス権に影 響を与えます。 プロシージャーは、それが作成されたデータベースに常駐します。それは データベース・オブジェクトであるため、ユーザーにはプロシージャーの 作成と実行を行うための特定のアクセス権が必要です。DBA アクセス権付 きプロシージャーの場合、GRANT SQL 文を使用して、プロシージャーに対 する EXECUTE アクセス権を他のユーザーに付与することができます。 所有者アクセス権付きプロシージャーの場合は、GRANT 文を使用して、プ ロシージャーによって参照されるオブジェクトに対するアクセス権もユー ザーに付与する必要があります ( それらのオブジェクトがプロシージャー の所有者によって所有されておらず、かつ、プロシージャー所有者が WITH GRANT OPTION 文によってアクセス権を付与されていない場合 )。 8-16 IBM Informix SQL リファレンス・ガイド 作成時のアクセス権 作成時のアクセス権 表やビューの場合と同様に、プロシージャーを作成するには、データベー スに対する RESOURCE アクセス権が必要です。プロシージャーの作成時に は、他のデータベース・オブジェクト ( 表、ビュー、など ) の存在は検査さ れません。 デフォルトでは、所有者アクセス権付きプロシージャーを作成すると、 PUBLIC は EXECUTE アクセス権を取得します。DBA プロシージャーを作成 すると、デフォルトで、所有者と、DBA 状態を持つ他のユーザーだけが EXECUTE アクセス権を取得します。 ANSI 準拠データベースでは、デフォルトで、所有者と、DBA 状態を持つ他 のユーザーだけが、DBA アクセス権付きプロシージャーと所有者アクセス 権付きプロシージャーの両方に対する EXECUTE アクセス権を取得します。 実行時のアクセス権 プロシージャーの所有者、DBA 状態を持つユーザー、または EXECUTE ア クセス権を持つユーザーはプロシージャーを実行できます。データベー ス・サーバーは、デフォルトで、プロシージャーを実行するユーザーが実 行時の基礎オブジェクトに対する正しいアクセス権を持っているかどうか を調べます。 あるプロシージャーを実行するユーザーは、そのプロシージャーが実行さ れている間、データベースに対する RESOURCE アクセス権を付与されま す。 アクセス権と所有者アクセス権付きプロシージャー 所有者アクセス権付きプロシージャーを実行すると、被参照側オブジェク トの存在が検査されます。また、プロシージャーを実行すると、被参照側 オブジェクトに対するアクセス権も検査されます。 ストアード・プロシージャーおよび SPL 8-17 実行時のアクセス権 プロシージャーを実行するすべてのユーザーは、プロシージャーの所有者 から適切なアクセス権を付与されていなければなりません。自分が所有す るオブジェクトのみを参照するプロシージャーを実行する場合は、アクセ ス権の競合は発生しません。被参照側オブジェクトを所有していないとき に、SELECT 文と CREATE TABLE 文が含まれているプロシージャーを実行す る場合、エラーを発生させないでプロシージャーを実行するためには Select アクセス権を持っていなければなりません。あるいは、プロシー ジャーの所有者が WITH GRANT OPTION 文で適切なアクセス権を付与されて いなければなりません。図 8-7 の場合、プロシージャーの所有者は、WITH GRANT オプションで SELECT アクセス権を付与されていなければなりませ ん。GRANT 文を使用して、自分が所有するプロシージャーに対する EXECUTE アクセス権を他のユーザーに付与する場合は、自分が所有し、 かつプロシージャーで参照されるオブジェクトに対するすべての適切なア クセス権を暗黙的に付与します。 プロシージャーの実行中に作成される非修飾オブジェクトは、プロシー ジャーを実行するユーザーではなく、プロシージャーの所有者によって所 有されます。たとえば、所有者アクセス権付きストアード・プロシー ジャーの中の次の行は、2 つの表を作成します。このプロシージャーを tony が所有していて、ユーザー marty がそのプロシージャーを実行する場 合、最初の表 gargantuan は tony によって所有されます。2 番目の表 tiny は、libby によって所有されます。 CREATE PROCEDURE tryit() . . . CREATE TABLE gargantuan (col1 INT, col2 INT, col3 INT); CREATE TABLE libby.tiny (col1 INT, col2 INT, col3 INT); END PROCEDURE アクセス権と DBA アクセス権付きプロシージャー DBA アクセス権付きプロシージャーを実行するとき、プロシージャーを実 行するユーザーは、プロシージャーを実行している間、DBA のアクセス権 を所有します。DBA アクセス権付きプロシージャーは、まず、現行ユー ザーが DBA アクセス権を付与されているものとして機能し、次に手動でプ ロシージャーの各文を実行し、最後に、DBA アクセス権を取り消します。 DBA プロシージャーの実行中に作成されたオブジェクトは、プロシー ジャーのデータ定義文で所有者を別のユーザーに明示的に指定していない 限り、プロシージャーを実行するユーザーによって所有されます。 8-18 IBM Informix SQL リファレンス・ガイド アクセス権の取り消し DBA または DBA アクセス権を持つユーザーだけが、DBA アクセス権付きプ ロシージャーを作成できます。 アクセス権と入れ子にしたプロシージャー DBA アクセス権付き状態は、呼び出し先プロシージャーによって継承され ません。DBA アクセス権付きプロシージャーが所有者アクセス権付きプロ シージャーを実行する場合、所有者アクセス権付きプロシージャーは、 DBA プロシージャーとして実行されません。所有者アクセス権付きプロ シージャーは、DBA アクセス権付きプロシージャーを呼び出し、DBA アク セス権付きプロシージャー内の文は、任意の DBA アクセス権付きプロシー ジャー内と同じように実行されます。 アクセス権の取り消し プロシージャーの所有者は、ユーザーから EXECUTE アクセス権を取り消 すことができます。あるユーザーがプロシージャーに対する EXECUTE ア クセス権を失うと、そのユーザーによって EXECUTE アクセス権を付与さ れたすべてのユーザーからも EXECUTE アクセス権が取り消されます。 変数と式 このセクションでは、SPL の変数を定義し、使用する方法について説明し ます。SPL 式と SQL 式の違いについても、このセクションで説明します。 変数 ストアード・プロシージャーで変数を使用するには、いくつかの方法があ ります。変数は、データベース照会または他の SQL 文の、定数が必要な任 意の場所で使用できます。SPL 文で変数を使用して、値の割り当てと計算、 照会から戻された行の数の把握、ループの実行、その他のタスクの処理な どを行うことができます。 変数の値はメモリーに保持されます。したがって、その変数はデータベー ス・オブジェクトではありません。このため、トランザクションをロール バックしても、プロシージャー変数の値は復元されません。 ストアード・プロシージャーおよび SPL 8-19 変数 変数のフォーマット 変数は SQL 識別子のルールに従います。( 識別子の構文と注意事項につい ては、7-403 ページを参照してください。) 変数の定義が済んだら、必要に 応じ、それをプロシージャーの任意の場所で使用することができます。 埋め込み言語製品を使用する場合は、変数を特殊記号で開始する必要はあ りません ( 埋め込み言語製品のホスト変数とは異なります )。 広域変数と局所変数 変数は、局所にも広域にも定義できます。デフォルトでは、変数は局所で す。この両者の違いについて、概要を示します。 局所 局所変数は、それが定義されているプロシージャーの中でし か使用できません。コンパイル時にデフォルト値を局所変数 に割り当てることはできません。 広域 広域変数は、同じデータベースの同じユーザー・セッション によって実行される他のプロシージャーで使用できます。広 域変数の値はメモリーに格納されます。広域環境は、特定の データベース・サーバーの特定のセッション内で実行される すべてのプロシージャー、たとえば、埋め込み言語プログラ ムによって実行されるすべてのプロシージャー、または DB-Access セッションで実行されるすべてのプロシージャーが 使用するメモリーです。セッションが終了すると、変数の値 は消失します。 広域変数には、コンパイル時にデフォルト値を割り当てる必 要があります。 広域変数の最初の定義は、変数を広域環境に挿入します。異 なるプロシージャーにおける同じ変数の後続の定義は、単に 変数を広域環境にバインドするだけです。 変数の定義 変数の定義は DEFINE 文を使用して行います。ある変数をプロシージャーの 引数リストにリストする場合、その変数は暗黙的に定義されますので、そ れを DEFINE 文で正式に定義する必要はありません。変数に値 (NULL もあ る ) を割り当てないと、それを使用することはできません。 8-20 IBM Informix SQL リファレンス・ガイド 変数 変数のデータ型 変数は、データベース表内の列で使用できる任意のデータ型 (ただし、 SERIAL を除く ) として定義できます。次の例は、定義済みプロシージャー 変数のいくつかのケースを示しています。 DEFINE x INT; DEFINE name CHAR(15); DEFINE this_day DATETIME YEAR TO DAY ; ある変数を TEXT または BYTE データ用に定義すると、その変数には実際の データは含まれません。その代わり、その変数はそのデータを指すポイン ターとして働きます。ただし、このプロシージャー変数は、他の任意のプ ロシージャー変数と同じように使用されます。TEXT または BYTE 変数を定 義するときは、REFERENCES という語 ( これらの変数にデータが含まれてい ないことを強調する ) を使用しなければなりませんが、単にデータを参照 するだけにします。次の例は、TEXT および BYTE 変数の定義を示していま す。 DEFINE ttt REFERENCES TEXT; DEFINE bbb REFERENCES BYTE; 変数の範囲 変数は、それが定義されている文ブロックの中で有効です。変数は、その 文ブロック内に入れ子になっている文ブロックの中ででも有効です。ただ し、それが同じ名前の変数の再定義によってマスクされている場合を除き ます。 図 8-8 のプロシージャーの先頭部分では、整変数 x、y、および z が定義さ れ、初期化されます。BEGIN および END 文は、整変数 x および q、および CHAR 変数 z が定義されている入れ子文ブロックにマークします。入れ子ブ ロック内では、再定義された変数 x がオリジナルの変数 x をマスクします。 END 文が終了すると、入れ子ブロックの終わりがマークされ、x のオリジ ナルの値が再度使用可能になります。 図 8-8 入れ子文ブロックによる変数のマスキング CREATE PROCEDURE scope() DEFINE x,y,z INT; LET x = 5; LET y = 10; LET z = x + y; --z is 15 BEGIN DEFINE x, q INT; DEFINE z CHAR(5); LET x = 100; ストアード・プロシージャーおよび SPL 8-21 変数 LET q = x + y; -- q = 110 LET z = "silly"; -- z receives a character value END LET y = x; -- y is now 5 LET x = z; -- z is now 15, not "silly" END PROCEDURE 変数 / キーワードのあいまいさ 変数をキーワードとして定義すると、あいまいさが発生することがありま す。識別子に関する次のルールは、変数、プロシージャー名、およびシス テム関数名のあいまいさを回避するのに役立ちます。 ! 定義済み変数が最も高い優先順位を取る。 ! DEFINE 文で定義されたプロシージャーが、SQL 関数よりも優先順 位が高い。 ! SQL 関数は、既存のプロシージャーよりも優先順位が高いが、プロ シージャーとして識別されない (DEFINE 文を使用 )。 場合によっては、変数の名前を変更しなければならないことがあります。 たとえば、集計関数の名前である count や max を定義することはできませ ん。あいまいな使用が発生する可能性があるキーワードを、7-403 ページの 『識別子』に示しています。 変数と列名 列名の場合と同じ識別子をプロシージャー変数に対して使用すると、デー タベース・サーバーは、その識別子のインスタンスを変数であると見なし ます。識別子を列名として使用するには、列名を表名で修飾してください。 次の例では、プロシージャー変数 lname が列名と同じです。次の SELECT 文では、customer.lname が列名であり、lname が変数名です。 CREATE PROCEDURE table_test() DEFINE lname CHAR(15); LET lname = "Miller"; SELECT customer.lname FROM customer INTO lname WHERE customer_num = 502. . . . 8-22 IBM Informix SQL リファレンス・ガイド 式 変数と SQL 関数 SQL 関数の場合と同じ識別子をプロシージャー変数に対して使用すると、 データベース・サーバーは、識別子のインスタンスを変数であると見なし、 SQL 関数の使用を認めません。変数が定義されているコード・ブロック内 では SQL 関数を使用できません。次の例は、user という変数が定義されて いるプロシージャー内のブロックを示しています。この定義は、 BEGIN...END ブロック内での USER 関数の使用を認めません。 CREATE PROCEDURE user_test() DEFINE name CHAR(10); DEFINE name2 CHAR(10); LET name = user; -- the SQL function BEGIN DEFINE user CHAR(15); -- disables user function LET user = "Miller"; LET name = user; -- assigns "Miller" to variable name END . . . LET name2 = user; -- SQL function again プロシージャー名と SQL 関数 プロシージャー名と SQL 関数名間のあいまいさについては、7-429 ページの 『プロシージャー名』を参照してください。 式 集合式を除く、任意の SQL 式をストアード・プロシージャーで使用するこ とができます。SQL 式の全構文と注意事項が、7-375 ページに示されていま す。 SQL 式を使用できるだけでなく、プロシージャーによって式として、また は式の一部として、戻されたプロシージャー変数と値も使用することがで きます。 ストアード・プロシージャーおよび SPL 8-23 式 SPL 式 式セグメント 7-375 ページ | | + * < プロシー ジャー変数名 > ( / ) SPL 式 , プロシー ジャー名 7-429 ページ SPL 式 ( < 呼び出し先 変数 > ) = < 呼び出し先 呼び出し先プロシージャーによって使用される 1 つの引数の 変数 > 名前です。 < プロシー ジャー 変数名 > プロシージャーで定義されている有効変数の名前です。 代表的な SPL 式のいくつかの例を次に示します。 var1 var1 + var2 + 5 read_address("Miller") read_address(lastname = "Miller") get_duedate(acct_num) + 10 UNITS DAY fname || ""|| lname "(415)" || get_phonenum(cust_name) 8-24 IBM Informix SQL リファレンス・ガイド プログラムの流れの制御 変数への値の割り当て プロシージャー変数に値を割り当てるには、次の 4 つの方法があります。 ! LET 文を使用する ! SELECT...INTO 文を使用する ! CALL 文を RETURNING 節が入ったプロシージャーと一緒に使用する ! EXECUTE PROCEDURE...INTO 文を使用する LET 文を使用して、1 つ以上の変数に値を割り当てます。次の例は、LET 文 のいくつかの形式を示しています。 LET a = b + a; LET a, b = c, d; LET a, b = (SELECT fname, lname FROM customer WHERE customer_num = 101); LET a, b = read_name(101); SELECT 文を使用して、データベースから変数に直接、値を割り当てます。 次の例の文は、上例の 3 番目の LET 文と同じタスクを実行します。 SELECT fname, lname into a, b FROM customer WHERE customer_num = 101 CALL または EXECUTE PROCEDURE 文を使用して、プロシージャーによって 戻された値を 1 つ以上のプロシージャー変数に割り当てます。次の例の 2 つの文は、read_address プロシージャーから取り出したフルアドレスを指 定のプロシージャー変数に戻します。 EXECUTE PROCEDURE read_address("Smith") INTO p_fname, p_lname, p_add, p_city, p_state, p_zip; CALL read_address("Smith") RETURNING p_fname, p_lname, p_add, p_city, p_state, p_zip; プログラムの流れの制御 SPL には、ストアード・プロシージャーの流れを制御できるようにしたり、 実行時に取得したデータに基づいて意思決定を行えるようにするいくつか の文が含まれています。これらのプログラムの流れを制御する文について は、本章のこのセクションの概要説明を参照してください。それらの構文 と詳しい説明は、8-36 ページの『SPL 文の構文』を参照してください。 ストアード・プロシージャーおよび SPL 8-25 分岐 分岐 IF 文を使用して、ストアード・プロシージャーに論理分岐を形成します。 IF 文は、まず、条件を評価し、条件が真であれば、この文の THEN 部分に 含まれている文ブロックが実行されます。条件が真でなければ、実行は次の 文へ移ります。ただし、ELSE 節または ELIF (else if) 節が IF 文にインクルー ドされている場合を除きます。図 8-9 は、IF 文の 1 つの例を示しています。 図 8-9 IF 文の使用 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 result = -1; ELSE result = 0; END IF RETURN result; END PROCEDURE -- str_compare ループ SPL には、3 つのループ・メソッドがあり、それらは次のいずれかの文で実 行されます。 FOR 制御ループを開始します。終了が保証されます。 FOREACH 複数の行をデータベースから選択して操作できるようにしま す。カーソルを暗黙的に宣言してオープンします。 WHILE ループを開始します。終了は保証されません。 8-26 IBM Informix SQL リファレンス・ガイド ループ ループから出るには 4 つの方法があり、それらは次のいずれかの文で実行 されます。 CONTINUE 現在の識別済みループに残っている文をスキップし、その ループの次の反復を開始します。 EXIT 現在の識別済みループを終了します。実行は、ループの後の 最初の文から再開されます。 RETURN プロシージャーを終了します。戻り値が指定されている場合 は、終了後にその値が戻されます。 RAISE EXCEP- ループの本体で例外がトラップ ( キャッチ ) されなかった場 TION 合に、ループを終了します。 これらの文の構文と使用について詳しくは、8-36 ページの『SPL 文の構文』 を参照してください。 ストアード・プロシージャーおよび SPL 8-27 関数処理 関数処理 あるプロシージャー内から他のプロシージャーを呼び出したり、オペレー ティング・システム・コマンドを実行したりできます。 プロシージャー内でのプロシージャーの呼び出し CALL 文または SQL 文 EXECUTE PROCEDURE を使用して、あるプロシー ジャーから他のプロシージャーを実行します。図 8-10 は、CALL 文を使用 して read_name プロシージャーを呼び出しています。 図 8-10 CALL 文によるプロシージャーの呼び出し CREATE PROCEDURE call_test() RETURNING CHAR(15), CHAR(15); DEFINE fname, lname CHAR(15); CALL read_name("Putnum") RETURNING fname, lname; IF fname = "Eileen" THEN RETURN "Jessica", lname; ELSE RETURN fname, lname; END IF END PROCEDURE プロシージャー内からのオペレーティング・システム・コマン ドの実行 SYSTEM 文を使用して、プロシージャー内からシステム呼び出しを実行し ます。図 8-11 は、echo コマンドの呼び出しを示しています。 図 8-11 SYSTEM 文によるプロシージャーからのシステム呼び出し CREATE DBA PROCEDURE delete_customer(cnum INT) DEFINE username CHAR(8); DELETE FROM customer WHERE customer_num = cnum; IF username = "acctclrk" THEN SYSTEM "echo 'Delete from customer by acctclrk' >> /mis/records/updates" ; END IF END PROCEDURE -- delete_customer 8-28 IBM Informix SQL リファレンス・ガイド プロシージャーとの情報のやり取り プロシージャーの再帰呼び出し プロシージャーは自分自身を呼び出すことができます。プロシージャーを 再帰的に呼び出す場合の制限はありません。 プロシージャーとの情報のやり取り プロシージャーを作成するとき、引数リストを指定してプロシージャーに 情報を渡すかどうかを決定します。プロシージャーに必要な各情報ごとに、 1 つの引数とその引数のデータ型を指定します。 たとえば、プロシージャーに単一の整数情報を渡す必要がある場合は、次 のようなプロシージャー・ヘッディングを指定することができます。 CREATE PROCEDURE safe_delete(cnum INT) 結果の戻り 1 つ以上の値を戻すプロシージャーには、情報の転送を行うための 2 行の コードが含まれていなければなりません。戻すデータ型を記述し、値を明 示的に戻す必要があります。 戻り値の指定 プロシージャーの名前と入力パラメーターを指定したらすぐに、戻す必要 がある各値のデータ型を指定した RETURNING 節をインクルードする必要が あります。次の例は、入力として 1 つの整数を必要とし、1 つの整数と 1 つ の 10 バイト文字値を戻すプロシージャーのヘッダー ( 名前、パラメー ター、および RETURNING 節 ) を示したものです。 CREATE PROCEDURE get_call(cnum INT) RETURNING INT, CHAR(10); ストアード・プロシージャーおよび SPL 8-29 結果の戻り 値の戻り RETURNING 節を使用して、戻す値の型を指定したら、プロシージャーの任 意のポイントで RETURN 文を使用して、RETURNING 節にリストされている ものと同じ番号とデータ型を戻すことができます。次の例は、get_call プロ シージャーから情報を戻す方法を示したものです。 CREATE PROCEDURE get_call(cnum INT) RETURNING INT, CHAR(10); DEFINE ncalls INT, o_name CHAR(10); . . . RETURN ncalls, o_name; . . . END PROCEDURE プロシージャーからの複数値の戻り データベースから複数値を戻す選択をプロシージャーで実行する場合や、 ループ内から値を戻す場合は、RETURN 文で WITH RESUME キーワードを使 用する必要があります。RETURN...WITH RESUME 文を使用すると、値 ( 複数 の場合もある ) が呼び出し側プログラムまたはプロシージャーに戻されま す。呼び出し側プログラムがこの値を受け取ると、RETURN...WITH RESUME 文のすぐ後の文に実行が戻ります。 図 8-12 は、カーソル的プロシージャーの例です。この例では、FOREACH ループと FOR ループから値が戻されます。このプロシージャーには FOREACH ループが含まれているため、これはカーソル的プロシージャーと 呼ばれます。 8-30 IBM Informix SQL リファレンス・ガイド 結果の戻り 図 8-12 FOREACH ループと FOR ループから値を戻すプロシージャー CREATE PROCEDURE read_many (lastname CHAR(15)) RETURNING CHAR(15), CHAR(15), CHAR(20), CHAR(15),CHAR(2), CHAR(5); DEFINE DEFINE DEFINE DEFINE DEFINE DEFINE p_lname,p_fname, p_city CHAR(15); p_add CHAR(20); p_state CHAR(2); p_zip CHAR(5); lcount INT ; i INT ; LET lcount = 0; TRACE ON; CREATE VIEW myview AS SELECT * FROM customer; TRACE "Foreach starts"; FOREACH SELECT fname, lname, address1, city, state, zipcode INTO p_fname, p_lname, p_add, p_city, p_state, p_zip FROM customer WHERE lname = lastname RETURN p_fname, p_lname, p_add, p_city, p_state, p_zip WITH RESUME; LET lcount = lcount +1; END FOREACH; FOR i IN (1 TO 5) BEGIN RETURN "a", "b", "c", "d", "e" WITH RESUME; END END FOR; END PROCEDURE このプロシージャーを実行すると、指定されたラストネームを持つ各人物 の名前とアドレスが戻されます。このほか、文字のシーケンスも戻されま す。呼び出し側プロシージャーまたは呼び出し側プログラムは、複数の戻 り値を必要とするため、カーソルまたは FOREACH 文を使用して複数の戻り 値を処理しなければなりません。 ストアード・プロシージャーおよび SPL 8-31 例外処理 例外処理 データベース・サーバーからプロシージャーに戻された、またはプロシー ジャーによって引き起こされたすべての例外 ( またはエラー ) を、ON EXCEPTION 文を使用してトラップすることができます。RAISE EXCEPTION 文を使用すれば、プロシージャー内で例外を生成することができます。 エラーのトラップと復旧 ON EXCEPTION 文は、すべてのエラーをトラップするためのメカニズムを備 えています。 エラーをトラップするには、文のグループを文ブロックに入れ、その文ブ ロックの前に ON EXCEPTION 文を付けます。ON EXCEPTION 文の後のブロッ クでエラーが発生した場合は、復旧アクションを取ることができます。 図 8-13 は、BEGIN...END ブロック内の ON EXCEPTION 文の例を示したもので す。 図 8-13 BEGIN...END ブロック内の ON EXCEPTION 文 BEGIN DEFINE c INT; ON EXCEPTION IN ( -206, -- table does not exist -217 -- column does not exist ) SET err_num IF err_num = -206 THEN CREATE TABLE t (c INT); iNSERT INTO t VALUES (10); -- continue after the insert statement ELSE ALTER TABLE t ADD(d INT); LET c = (SELECT d FROM t); -- continue after the select statement. END IF END EXCEPTION WITH RESUME INSERT INTO t VALUES (10); -- will fail if t does not exist LET c = (SELECT d FROM t); END -- will fail if d does not exist 8-32 IBM Informix SQL リファレンス・ガイド ON EXCEPTION 文の制御範囲 エラーが発生すると、SPL インタープリターは、エラーをトラップする最 深部の ON EXCEPTION 宣言を検索します。ただし、エラーをトラップした 後、最初に行うアクションは、エラーのリセットです。エラー・アクショ ン・コードの実行が完了し、実行された ON EXCEPTION 宣言に WITH RESUME キーワードがインクルードされていると、エラーを生成した文の 次の 文の実行が自動的に再開されます。ON EXCEPTION 宣言に WITH RESUME キーワードがインクルードされていないと、現行ブロックの実行 は完了します。 ON EXCEPTION 文の制御範囲 ON EXCEPTION 文が有効な文ブロックは、ON EXCEPTION 文の後の文ブロッ ク、その文ブロックに入れ子になったすべての文ブロック、および ON EXCEPTION 文の後のすべての文ブロックです。この文は、ON EXCEPTION 文が含まれた文ブロックでは 無効 です。 図 8-14 の疑似コードは、プロシージャー内で例外が有効になる場合を示し ています。つまり、示されているいずれかのブロックで 201 エラーが発生 すると、a201 というラベルが付いたアクションが行われます。 図 8-14 ON EXCEPTION 文がプロシージャー内で有効になる場合を示す疑似コード CREATE PROCEDURE scope() DEFINE i INT; . . . BEGIN -- begin statement block . . . ON EXCEPTION IN (201) -- do action a201 END EXCEPTION BEGIN -- statement block aa -- do action, a201 valid END BEGIN -- statement block bb -- do action, a201 valid END WHILE i < 10 -- do something, a201 is END WHILE A here here valid here ストアード・プロシージャーおよび SPL 8-33 ユーザー生成の例外 END BEGIN -- begin statement block B -- do something -- a201 is NOT valid here END END PROCEDURE ユーザー生成の例外 次の疑似コード例に示されているように、RAISE EXCEPTION 文を使用して ユーザー独自のエラーを生成することができます。この例では、ON EXCEPTION 文が、2 つの変数 esql および eisam を使用して、データベース・ サーバーによって戻されたエラー番号を保持しています。エラーが発生し、 SQL エラー番号が -206 であれば、IF 節で定義されたアクションが取られま す。それ以外のいずれかの SQL エラーが発生した場合は、このエラーが BEGIN...END ブロックから取り出され、このブロックが含まれているブロッ クに渡されます。 BEGIN ON EXCEPTION SET esql, eisam -- trap all errors IF esql = -206 THEN -- table not found -- recover somehow ELSE RAISE exception esql, eisam ; -- pass the error up END IF END EXCEPTION -- do something END SQL エラーのシミュレート 次の例に示されているように、SQL エラーをシミュレートするためにエ ラーを生成することができます。ここでは、ユーザーが pault であれば、こ のユーザーが実際に UPDATE アクセス権を持っている場合でも、ストアー ド・プロシージャーは、このユーザーがそのアクセス権を持っていない場 合と同様に機能します。 BEGIN IF user = "pault" THEN RAISE EXCEPTION -273; END IF END 8-34 IBM Informix SQL リファレンス・ガイド -- deny Paul update privilege ユーザー生成の例外 入れ子コードを終了するための RAISE EXCEPTION の使用 図 8-15 に示されているように、RAISE EXCEPTION 文を使用して深い入れ子 から抜け出ることができます。最深部の条件が真であれば (aa が負であれ ば )、例外が発生し、実行がこのブロックの END の次にあるコードにジャ ンプします。この場合、実行は TRACE 文にジャンプします。 図 8-15 RAISE EXCEPTION 文による入れ子ループからの抜け出し BEGIN ON EXCEPTION IN (1) END EXCEPTION WITH RESUME -- do nothing significant (cont) BEGIN FOR i IN (1 TO 1000) FOREACH select ..INTO aa FROM t IF aa < 0 THEN RAISE EXCEPTION 1 ; -- emergency exit END IF END FOREACH END FOR RETURN 1; END --do something; -- emergency exit to -- this statement. TRACE "Negative value returned" RETURN -10; END BEGIN...END ブロックが単一の 文であることを忘れないでください。エ ラーがブロック内のどこかで発生し、トラップがブロックの外部で行われ た場合は、実行の再開時に、ブロックの残りがスキップされ、次の文から 実行が再開されます。 このエラーのためのトラップがブロック内のどこかで入れ子になっている 場合を除き、エラー条件は呼び出しが含まれているブロックに戻され、さ らにそのブロックが入っているすべてのブロックに戻されます。エラーを 処理するように設定された ON EXCEPTION 文がない場合は、プロシー ジャーの実行が停止し、そのプロシージャーを実行しているプログラムま たはプロシージャーに対するエラーが作成されます。 ストアード・プロシージャーおよび SPL 8-35 SPL 文の構文 SPL 文の構文 この章の残りの部分では、SPL の文について説明します。各文の構文と使 用法が、例と一緒に示されています。構文ダイアグラムで使用される記号 の説明については、13 ページの『構文規則』を参照してください。 8-36 IBM Informix SQL リファレンス・ガイド CALL CALL 目的 CALL 文は、ストアード・プロシージャー内から特定のプロシージャーを実 行するために使用します。 構文 CALL プロシー ジャー名 7-429 ページ ( ) ; , 引数 , RETURNING < プロシー ジャー変数 > 引数 < パラメー ター名 > SPL 式 8-23 ページ = SELECT 文 ( サブセット ) 8-38 ページ < パラメー ター名 > その CREATE PROCEDURE 文によって定義されたパラメーター の名前です。 < プロシー ジャー 変数 > その CREATE PROCEDURE 文によって定義された変数の名前で す。 使用法 CALL 文は、procedure name というプロシージャーを起動します。CALL 文 は、EXECUTE PROCEDURE 文と同じ動作をします。ただし、前者はスト アード・プロシージャー内からしか使用できません。 ストアード・プロシージャーおよび SPL 8-37 引数の指定 引数の指定 呼び出し先プロシージャーが予期する数より多くの引数が CALL 文に含ま れていると、エラーが戻されます。 呼び出し先プロシージャーが予期する数より少ない引数が CALL 文で指定 されていると、それらの引数は欠落していると見なされます。デフォルト 値が指定されていれば、欠落した引数は、対応するデフォルト値に初期化 されます。( 7-59 ページの CREATE PROCEDURE を参照してください。) この 初期化は、プロシージャー本体内の最初の実行可能文の前で行われます。 引数が欠落していて、デフォルト値が指定されていない場合は、それらの 引数は UNDEFINED の値に初期化されます。UNDEFINED の値を持つ変数を 使用しようとすると、エラーになります。 プロシージャー引数は、名前または位置でプロシージャー引数パラメー ターに結合されますが、名前と位置の両方では結合されません。つまり、 parameter name = 構文は、1 つの CALL 文で指定されたすべての引数に使用 するか、またはどの引数にも使用しないかのいずれかです。 たとえば、次の両方のプロシージャー呼び出しは、文字引数 t、n、および d をこの順序で必要とするプロシージャーに対して有効です。 CALL add_col (t="customer", d ="integer", n = "newint"); CALL add_col("customer","newint","integer"); プロシージャー引数で使用できる SELECT のサブセッ ト SELECT 文が正しい型と長さの値を正確に 1 つ戻す限り、それをプロシー ジャーの引数として使用できます。( 詳細については、7-263 ページ以降の SELECT 文に関する説明を参照してください。) 8-38 IBM Informix SQL リファレンス・ガイド 呼び出し先プロシージャーからの入力の受け取り 呼び出し先プロシージャーからの入力の受け取り RETURNING 節は、プロシージャー呼び出しからの戻り値を受け取る < プロ シージャー変数 > を指定します。RETURNING 節を省略した場合は、呼び出 し先プロシージャーは値を戻してはなりません。 次の例は、2 つのプロシージャー呼び出しを示しています。1 つは、値が戻 されないプロシージャー呼び出し (no_args) であり、他の 1 つは、3 つの値 が戻されるプロシージャー呼び出し (yes_args) です。3 つの整変数は、 yes_args からの戻り値を受け取るように定義されています。 CREATE PROCEDURE not_much() DEFINE i, j, k INT; CALL no_args (10,20); CALL yes_args (5) RETURNING i, j, k; END PROCEDURE 参考資料 本書では、EXECUTE PROCEDURE 文を参照してください。 ストアード・プロシージャーおよび SPL 8-39 CONTINUE CONTINUE 目的 CONTINUE 文は、識別された型の最深部ループの次回反復を開始するため に使用します。 構文 CONTINUE FOR ; WHILE FOREACH 使用法 CONTINUE 文が見つかると、示された型の最深部ループ内に残っている文 がスキップされます。実行は、次回反復のループのトップから続けられま す。たとえば、次のプロシージャーの場合、値 3 ~ 15 が testtable 表に挿入 されます。値 3 ~ 9 および 13 ~ 15 もプロセスに戻されます。値 11 は戻さ れません。その理由は、CONTINUE FOR 文に到達し、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 文は、示されたループが見つからない場合にエラーを生成しま す。 8-40 IBM Informix SQL リファレンス・ガイド DEFINE DEFINE 目的 DEFINE 文は、プロシージャーで使用される変数を宣言し、それらの変数に データ型を割り当てるために使用します。 構文 , DEFINE < 変数 名> GLOBAL SQL データ型 ( サブセット ) 8-42 ページ OL REFERENCES デフォルト 値 DEFAULT ; DEFAULT NULL BYTE TEXT , SQL データ型 ( サブセット ) 8-42 ページ < 変数 名> OL BYTE REFERENCES TEXT 表名 7-440 ページ LIKE . <列> シノニム名 7-438 ページ ビュー名 7-444 ページ PROCEDURE <列> 表内の列の名前です。 < 変数名 > 定義するプロシージャー変数の名前です。 ストアード・プロシージャーおよび SPL 8-41 使用法 デフォルト 値 リテラル番号 7-427 ページ 引用符付きストリング 7-431 ページ リテラル時間隔 (INTERVAL) 型 7-424 ページ リテラル日時 (DATETIME) 型 7-421 ページ CURRENT 7-383 ページ DATETIME フィールド 修飾子 7-373 ページ USER TODAY NULL OL DBSERVERNAME SITENAME 使用法 DEFINE 文は実行可能文ではありません。DEFINE 文は、プロシージャー・ ヘッダーの後で、かつ他の文の前に置かなければなりません。変数は、そ れが定義されている文ブロック内の任意の場所で使用できます。つまり、 定義された変数の範囲はそれが定義されている文ブロックです。 SQL データ型サブセット SQL データ型サブセットには、SERIAL、TEXT、および BYTE 以外のすべて の SQL データ型が含まれます。 8-42 IBM Informix SQL リファレンス・ガイド TEXT および BYTE 変数の定義 TEXT および BYTE 変数の定義 TEXT および BYTE 変数を使用するには、REFERENCES キーワードを使用し ます。TEXT および BYTE 変数には実際のデータは含まれておらず、単に データを指すポインターが含まれているだけです。REFERENCES キーワー ドは、プロシージャー変数が単なるポインターであることを示す注意書き です。TEXT および BYTE データ型の使用法は、他の変数の場合とまったく 同じです。 再宣言または再定義 同一文ブロック内で同一変数を 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 ストアード・プロシージャーおよび SPL 8-43 広域変数の宣言 広域変数の宣言 GLOBAL 修飾子は、GLOBAL キーワードの後の変数リストが他のプロシー ジャーで使用可能であることを示します。これらの変数の型は、広域環境 の変数の型と一致していなければなりません。広域環境は、特定のセッ ション (DB-Access セッションまたは埋め込み言語プログラム・セッション ) 内で実行されるすべてのプロシージャーが使用するメモリーです。広域変 数の値はメモリーに格納されます。 広域変数は、現行セッションで実行されている各プロシージャー間で共有 されます。広域変数はデータベースには保存されないため、現行セッショ ンがクローズすると、広域変数は消失します。 広域変数は、リモート・データベース・サーバーで実行される各プロシー ジャー間では共有されません。広域プロシージャー変数は、データベー ス・サーバーとアプリケーション開発支援ツール間では共有されません。 広域変数の最初の宣言により、広域環境に変数が設定されます。後続の広 域宣言では、単に変数と広域環境のバインドだけが行われ、その時点での 変数の値が設定されます。次の 2 つのプロシージャー例 proc1 と proc2 につ いて考えます。どちらのプロシージャーも、次のように、広域変数 gl_out を定義しています。 CREATE PROCEDURE proc1() . . . DEFINE GLOBAL gl_out INT DEFAULT 13; . . . LET gl_out = gl_out + 1; END PROCEDURE; CREATE PROCEDURE proc2() . . . DEFINE GLOBAL gl_out INT DEFAULT 23; DEFINE tmp INT; . . . LET tmp = gl_out . . . END PROCEDURE; 8-44 IBM Informix SQL リファレンス・ガイド 広域変数の宣言 まず、proc1 が呼び出され、gl_out が 13 に設定され、次に 14 に増えます。 その後で proc2 が呼び出されると、gl_out の値がすでに定義済みであるこ とが分かり、デフォルト値 23 は適用されません。次に、proc2 は、既存の 値 14 を tmp に割り当てます。proc2 が最初に呼び出されたとすれば、 gl_out は 23 に設定されたはずであり、また 23 が tmp に割り当てられたは ずです。後で proc1 を呼び出しても、デフォルト値 13 は適用されません。 デフォルト値の指定 リテラル値または 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 SITENAME または DBSERVERNAME SITENAME または DBSERVERNAME によって戻された値をデフォルトとして 使用する場合は、変数を少なくとも 18 文字の CHAR または VARCHAR 値に しなければなりません。 USER USER をデフォルトとして使用する場合は、変数を少なくとも 8 文字の CHAR または VARCHAR 値にしなければなりません。 ストアード・プロシージャーおよび SPL 8-45 広域変数の宣言 CURRENT CURRENT をデフォルトとして使用する場合は、変数を DATETIME 値にしな ければなりません。変数が YEAR TO FRACTION キーワードで修飾されてい る場合は、修飾子のない CURRENT を使用することができます。変数が他の 修飾子のセットを使用する場合は、CURRENT をデフォルト値として使用す るときに同じ修飾子を提供する必要があります。たとえば、次の DEFINE 文は、修飾子を持つ DATETIME 値を定義し、一致する修飾子を持つ CURRENT を使用しています。 DEFINE GLOBAL d_var DATETIME YEAR TO MONTH DEFAULT CURRENT YEAR TO MONTH; TODAY TODAY をデフォルトとして使用する場合は、変数を DATE 値にしなければ なりません。 TEXT および BYTE TEXT または BYTE 変数に使用できるデフォルト値は NULL だけです。たと えば、次のプロシージャーは TEXT 型の l_blob 広域変数呼び出しを定義し ます。 CREATE PROCEDURE use_text() DEFINE i INT; DEFINE GLOBAL l_blob REFERENCES TEXT DEFAULT NULL; END PROCEDURE 広域変数の宣言 非広域 ( 局所 ) 変数では、デフォルトを使用できません。次の例は、代表的 な局所変数の定義を示しています。 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 8-46 IBM Informix SQL リファレンス・ガイド 広域変数の宣言 LIKE 列の変数の宣言 LIKE 節を使用する場合、< 変数名 > は、< 表 > の < 列 > の型と同じ型とし て定義されます。LIKE データベース列として定義された変数の型は実行時 に解決されます。したがって、< 列 > と < 表 > は、コンパイル時になくて も構いません。 PROCEDURE 型としての変数の宣言 PROCEDURE 型は、現行の範囲で、< 変数名 > がユーザー定義のプロシー ジャー呼び出しであり、SQL 関数呼び出しでも、システム関数呼び出しで もないことを示します。たとえば、次の文は、length をプロシージャーと して定義し、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_blob() DEFINE i INT; DEFINE l_blob REFERENCES BYTE; END PROCEDURE --use_blob ストアード・プロシージャーおよび SPL 8-47 広域変数の宣言 TEXT または BYTE 型の変数をプロシージャーに渡すと、データがデータ ベース・サーバーに渡され、ルート DB 領域に格納されます。ユーザーは、 そのデータが入っているファイルの格納場所や名前を知っている必要はあ りません。BYTE または TEXT 操作で必要になるのは、プロシージャーに定 義した BYTE または TEXT 変数の名前だけです。 8-48 IBM Informix SQL リファレンス・ガイド EXIT EXIT 目的 EXIT 文は、FOR、FOREACH、または WHILE ループの実行を停止するために 使用します。 構文 FOR EXIT ; WHILE FOREACH 使用法 EXIT 文は、指定された型 (WHILE、FOR、または FOREACH) の最深部ループ を終了させます。実行は、ループの外部の最初の文から再開されます。 EXIT 文が指定のループを検出できなければ、この文は失敗します。 すべてのループの外部で使用すると、EXIT 文はエラーを生成します。 次の例では、EXIT FOR 文が使用されます。FOR ループでは、j が 6 になった ときに、WHILE ループの IF 条件 i = 5 が真になります。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; ストアード・プロシージャーおよび SPL 8-49 使用法 IF i = 5 THEN EXIT FOR; END IF END WHILE END FOR END PROCEDURE 8-50 IBM Informix SQL リファレンス・ガイド FOR FOR 目的 FOR 文は、ループの終了を保証したい場合に制御 ( 確定 ) ループを開始する ために使用します。FOR 文は、式または範囲演算子を使用して、ループの 有限反復回数を設定します。 構文 , FOR < 変数名 > IN ( < 左式 > < 右式 > TO ) 文 ブロック 7-64 ページ END FOR ; < インクリ メント式 > STEP , <式> = < 左式 > < 右式 > TO STEP < インクリ メント式 > <式> 数値または文字値です。< 式 > のデータ型は < 変数名 > の データ型と一致していなければなりません。SELECT 文の出 力を < 式 > として使用することができます。 < インクリ メント式 > 変数名をインクリメントさせる正または負の量。インクリメ ント式をゼロに評価することはできません。 ストアード・プロシージャーおよび SPL 8-51 使用法 < 左式 > ある範囲の先頭の式です。左式は < 変数名 > のデータ型と一 致していなければなりません。 < 右式 > ある範囲の末尾の式です。 < 変数名 > すでに定義されていて、この文ブロックの中で有効な変数で す。 使用法 すべての式を計算してから、FOR 文の実行が開始されます。1 つ以上の式が 変数で、それらの値がループ中に変更されても、その変更はループの反復 には影響を与えません。 FOR ループが終了するのは、< 変数名 > が、式リストまたは範囲の各エレ メントの値を連続して受け取ったとき、または EXIT FOR 文を検出したとき です。 FOR 文の本体内の割り当てで、< 変数名 > を修正しようとすると、エラー が生成されます。 TO キーワードの使用による範囲の定義 TO キーワードは範囲演算子を暗黙指定します。つまり、範囲は < 左式 > と < 右式 > によって定義され、インクリメントの数は、STEP < インクリメン ト式 > オプションで暗黙的に設定されます。TO キーワードを使用する場合 は、< 変数 > が INT または SMALLINT データ型でなければなりません。次 の例は、2 つの同等な FOR 文を示しています。どちらも TO キーワードを使 用して範囲を定義します。最初の文は IN キーワードを使用し、2 番目の文 は等号 (=) を使用しています。どちらの文もループを 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 8-52 IBM Informix SQL リファレンス・ガイド 使用法 STEP オプションを省略すると、< 右式 > が < 左式 > より小さい場合に、< インクリメント式 > に -1 の値が与えられ、< 右式 > が < 左式 > より大き い場合に、+1 の値が与えられます。< インクリメント式 > を指定する場合 は、< 右式 > が < 左式 > より小さければ、その値は負であり、< 右式 > が < 左式 > より大きければ、その値は正でなければなりません。次の例の 2 つの文は同等です。最初の文では、STEP インクリメントが明示的に指定さ れています。2 番目の文では、STEP インクリメントが暗黙的に 1 になって います。 FOR index IN (12 to 21 STEP 1) -- statement block END FOR FOR index = 12 TO 21 -- statement block END FOR < 変数名 > の値は、< 左式 > の値に初期化されます。後続の反復では、< インクリメント式 > が < 変数名 > の値に追加され、< 変数名 > の値がまだ < 左式 > と < 右式 > の間にあるかどうかを判別するための検査が行われま す。両者の間にある場合は、次の反復が行われます。そうでない場合は、 ループが終了するか、または、他の範囲が指定されている場合は、変数が、 次の範囲の最初のエレメントの値を取ります。 単一の FOR 文における複数範囲の指定 次の例は、各方向ごとに異なるインクリメント値を使用して、ループを前 方および後方にトラバースする文を示しています。 FOR index_var IN (15 to 21 STEP 2, 21 to 15 STEP -3) -- statement body END FOR 範囲としての式リストの使用 < 変数名 > の値は、指定された最初の < 式 > の値に初期化されます。後続 の反復では、< 変数名 > は、次の < 式 > の値を取ります。リストの最後の 式を使用すると、ループは停止します。 IN リストで範囲演算子が使用されていない限り、IN リストの式は数値に限 定されません。次の例は、文字式リストを使用しています。 FOR c IN ("hello", (SELECT name FROM t), "world", v1, v2) INSERT INTO t VALUES (c); END FOR ストアード・プロシージャーおよび SPL 8-53 使用法 次の FOR 文は、数値式リストの使用を示しています。 FOR index IN (15,16,17,18,19,20,21) -- statement block END 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 8-54 IBM Informix SQL リファレンス・ガイド FOREACH FOREACH 目的 FOREACH ループは、複数の行を選択したり操作したりするために使用しま す。 構文 SELECT...INTO 文 8-57 ページ FOREACH < カー ソル 名> 文ブロック 7-64 ページ END FOREACH ; WITH HOLD FOR WITH HOLD EXECUTE PROCEDURE プロシー ジャー名 7-429 ページ ( ) , INTO < 変数 名> , < 変数 名> SPL 式 ( サブ セット ) 8-58 ページ = < カーソル名 > SELECT... INTO 文の名前として指定する識別子です。 < 変数名 > プロシージャー変数の名前です。 ストアード・プロシージャーおよび SPL 8-55 使用法 使用法 FOREACH ループは、プロシージャー的にはカーソルの使用と同じです。 FOREACH 文を実行すると、データベース・サーバーは次のアクションを取 ります。 1. カーソルを宣言して、暗黙的にオープンする。 2. FOREACH ループ内に含まれている照会から最初の行を取得するか、 または呼び出し先プロシージャーから最初の値のセットを取得す る。 3. 変数リストの各変数に、SELECT 文または呼び出し先プロシー ジャーによって作成されたアクティブ・セットの対応値を割り当て る。 4. 文ブロックを実行する。 5. 各反復ごとに SELECT 文または呼び出し先プロシージャーから次の 行を取り出す。ステップ 3 を繰り返す。 6. SELECT 文または呼び出し先プロシージャーを満足する行がなくな ると、ループを終了する。ループが終了したら、暗黙的なカーソル をクローズする。 文ブロックには追加の FOREACH 文を含めることができるので、カーソルを 入れ子にすることができます。入れ子にできるカーソルの数には制限はあ りません。 複数の行または値のセットを戻すプロシージャーは、カーソル的プロシー ジャー と呼ばれます。 次のプロシージャーは、FOREACH 文の 3 つの型、つまり、SELECT...INTO 節 を持つもの、明示的に指定されたカーソルを持つもの、およびプロシー ジャー呼び出しを持つものを示しています。 8-56 IBM Informix SQL リファレンス・ガイド SELECT...INTO 文の使用 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 カーソルは、以下のいずれかの条件が発生するとクローズされま す。 ! カーソルによって行が戻されなくなった。 ! カーソルが HOLD 仕様を持たない SELECT カーソルであり、 COMMIT または ROLLBACK 文を使用してトランザクションを完了 した。 ! 制御を FOREACH 文の外部に渡す EXIT 文が実行された。 ! FOREACH 文の本体の中でトラップされない例外が発生した。( 8-66 ページの ON EXCEPTION 文を参照。) ! このカーソル的プロシージャー (FOREACH ループ内の ) を実行して いる呼び出し側プロシージャーのカーソルが、何らかの理由でク ローズされた。 SELECT...INTO 文の使用 FOREACH 文の中の SELECT 文には INTO 節がインクルードされていなけれ ばなりません。UNION および ORDER BY 節もインクルードすることができ ます。INTO TEMP 節を使用することはできません。SELECT 文の構文は、7263 ページに示されています。 変数リストの各変数の型とカウント数は、SELECT...INTO 文によって戻され たそれぞれの値と一致しなければなりません。 ストアード・プロシージャーおよび SPL 8-57 FOREACH ループでのプロシージャーの呼び出し HOLD カーソル WITH HOLD キーワードは、トランザクションがクローズ ( コミットまたは ロールバック ) されても、カーソルをオープン状態にしておくことを指定 します。 カーソル名で示された行の更新または削除 < カーソル名 > の現在行を更新または削除するには、WHERE CURRENT OF < カーソル名 > 節を使用します。 FOREACH ループでのプロシージャーの呼び出し 呼び出し先プロシージャーはゼロまたはそれ以上の値を戻すことができま す。 変数リストの各変数の型とカウント数は、呼び出し先プロシージャーに よって戻されたそれぞれの値と一致しなければなりません。 プロシージャー・パラメーターで使用できる式のサブセット 任意の SPL 式をプロシージャー・パラメーターとして使用することができ ます。副照会またはプロシージャー呼び出しを使用する場合は、その副照 会またはプロシージャーは、該当する型とサイズの単一値を戻さなければ なりません。SPL 式の構文について詳しくは、8-23 ページを参照してくだ さい。 8-58 IBM Informix SQL リファレンス・ガイド IF IF 目的 IF 文は、プロシージャー内に分岐を作成するために使用します。 構文 IF 条件 7-350 ページ THEN ELIF 条件 7-350 ページ END IF ; IF 文リスト 8-61 ページ THEN IF 文リスト 8-61 ページ ELSE IF 文リスト 8-61 ページ 使用法 IF 節で指定した条件が評価されます。結果が真であれば、THEN キーワード の後の文が実行されます。結果が偽で、ELIF 節がある場合は、ELIF 節の後 の文が実行されます。ELIF 節がないか、または ELIF 節の条件が真でなけれ ば、ELIF キーワードの後の文が実行されます。 次の例では、プロシージャーが、ELIF 節と ELSE 節の両方を持つ IF 文を使 用しています。IF 文は、2 つのストリングを比較し、1 を表示して、アル ファベット順で最初のストリングが 2 番目のストリングの前に来ることを 示すか、または -1 を表示して、アルファベット順で最初のストリングが 2 番目のストリングの後に来ることを示します。両方のストリングが同じで あれば、ゼロが戻されます。 ストアード・プロシージャーおよび SPL 8-59 使用法 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 result = -1; ELSE result = 0; END IF RETURN result; END PROCEDURE -- str_compare ELIF 節 ELIF 節は、評価する 1 つ以上の追加条件を指定するために使用します。 ELIF 節を指定し、IF 条件が偽であれば、ELIF 条件が評価されます。ELIF 条 件が真であれば、ELIF 節の後の文が実行されます。 ELSE 節 ELSE 節が実行されるのは、前の真の条件が IF 節またはどの ELIF 節にも含 まれていない場合です。 IF 文の条件 IF 文の条件は、WHILE 文の条件の場合と同様に評価されます。 条件に含まれているすべての式は NULL に評価され、この条件は自動的に 真でなくなります。特に、 1. 式 x が NULL に評価されます。したがって、x は当然真でなくなり ます。さらに、not (x) も真ではありません。 2. x が真になる演算子は IS NULL 演算子のみです。つまり、x IS NULL は真であり、x IS NOT NULL は真ではありません。 条件内の式が UNKNOWN 値を持っていれば ( 未初期化変数を使用したた め )、即時エラーになります。文は終了し、例外が発生します。 8-60 IBM Informix SQL リファレンス・ガイド 使用法 IF 文リスト BEGIN 文ブロック 7-64 ページ END CALL 文 8-37 ページ CONTINUE 文 8-40 ページ EXIT 文 8-49 ページ FOR 文 8-51 ページ FOREACH 文 8-55 ページ IF 文 8-59 ページ LET 文 8-63 ページ RAISE EXCEPTION 文 8-72 ページ RETURN 文 8-74 ページ SYSTEM 文 8-77 ページ TRACE 文 8-79 ページ WHILE 文 8-83 ページ SQL 文 ストアード・プロシージャーおよび SPL 8-61 使用法 IF 文で使用できる SQL 文のサブセット 以下のリストに示された文を除く、文ブロックの任意の SQL 文を使用する ことができます。 ! CHECK TABLE ! CLOSE DATABASE ! CREATE DATABASE ! CREATE PROCEDURE ! DATABASE ! INFO ! LOAD ! OUTPUT ! REPAIR TABLE ! ROLLFORWARD DATABASE ! START DATABASE ! UNLOAD SELECT 文を使用できるのは、INTO TEMP 節を使用して、SELECT 文の結果 を一時表に挿入する場合だけです。 8-62 IBM Informix SQL リファレンス・ガイド LET LET 目的 LET 文は、値を変数に割り当てるために使用します。また、LET 文を使用 して、プロシージャー内でプロシージャーを呼び出し、戻り値を変数に割 り当てることもできます。 構文 , , LET < 変数名 > , = プロシー ジャー名 7-429 ページ ( < 呼び出し 先変数 > = SPL 式 8-23 ページ ) ; , SPL 式 8-23 ページ < 呼び出し先 呼び出し先プロシージャーのプロシージャー変数です。 変数 > < 変数名 > プロシージャー変数です。 使用法 値を単一変数に割り当てる場合、それは単純代入 と呼ばれます。値を複数 の変数に割り当てる場合、それは複合代入 と呼ばれます。 実行時には、SPL 式 の値が最初に計算されます。可能な場合は、計算結果 の値が < 変数名 > の型に変換されて、割り当てが行われます。変換が可能 でなければ、エラーが生成され、< 変数名 > の値が未定義になります。 ストアード・プロシージャーおよび SPL 8-63 使用法 複合代入は複数の式を複数の変数に割り当てます。式リストの 式 のカウン ト数と型は、変数リストの対応する変数のカウント数と型に一致していな ければなりません。 次の例は、値をプロシージャー変数に割り当てるいくつかの 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 < プロシージャー変数 > 文を使用することと同じです。SELECT 文を使用し て、= 演算子の左側の 1 つ以上の値に値を割り当てることができます。次の 例は、LET 文で 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 LET 文は SELECT...INTO 文と同等であるため、このプロシージャーの次の 2 つの文は同じ結果を出します。 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 ループで囲む必 要があります。 8-64 IBM Informix SQL リファレンス・ガイド 使用法 LET 文でのプロシージャーの呼び出し LET 文でプロシージャーを呼び出し、戻り値を変数に割り当てることがで きます。LET 文にプロシージャー呼び出しがインクルードされていると、 この文は指定されたプロシージャーを起動します。プロシージャーが引数 のデフォルト値を持っていない場合は、LET 文のプロシージャーに必要な すべての引数を指定してください。 < 変数名 > = 構文を呼び出し先プロシージャーのいずれかのパラメーター に使用する場合は、それをすべてのパラメーターに使用する必要がありま す。 < 変数名 > は、プロシージャー呼び出しからの戻り値を受け取ります。プ ロシージャーは、複数の値を < 変数名 > のリストに戻すことができます。 複数の行を戻すプロシージャーは FOREACH ループで囲む必要があります。 次の例は、プロシージャー呼び出しを含む 2 つの有効な LET 文を示してい ます。3 番目の LET 文は無効です。なぜならば、この文は 2 つのプロシー ジャーの出力を加算して、2 つの変数 a および b に割り当てようとするから です。この LET 文は、簡単に 2 つの有効な 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 8-65 ON EXCEPTION ON EXCEPTION 目的 ON EXCEPTION 文は、特定のエラーまたはエラーのセットに対して取るアク ションを指定するために使用します。 構文 文 ブロック 7-64 ページ ON EXCEPTION , IN SET <SQL エラー 変数 > ( END EXCEPTION ; < エラー 番号 > ) WITH RESUME , <ISAM エラー 変数 > , < エラー・ データ 変数 > < エラー・ データ 変数 > SQL エラーによって戻されたストリングが入っているリテラ ル・ストリングまたは変数です。 < エラー 番号 > SQL エラー番号、または RAISE EXCEPTION 文によって作成さ れたエラー番号で、トラップの対象になります。 <ISAM エラー 発生した例外の ISAM エラー番号を受け取る整変数です。 変数 > <SQL エラー 発生した例外の SQL エラー番号を受け取る整変数です。 変数 > 8-66 IBM Informix SQL リファレンス・ガイド 使用法 使用法 ON EXCEPTION 文は、RAISE EXCEPTION 文と組み合わさって、SPL のための エラー・トラッピングと復旧メカニズムを提供します。ON EXCEPTION 文 は、プロシージャー実行時にトラップするエラーのリストを定義し、ト ラップをトリガーするときに取るアクション ( 文ブロック内で ) を指定しま す。IN 節を省略すると、すべてのエラーがトラップされます。 1 つの文ブロック内で複数の ON EXCEPTION 文を使用することができます。 ON EXCEPTION 文の範囲は、ON EXCEPTION 文の後の文ブロック、その文ブ ロック内に入れ子にされたすべての文ブロック、および ON EXCEPTION 文 の後のすべての文ブロックです。 トラップする例外は、システム定義例外の場合も、ユーザー定義例外の場 合もあります。 例外をトラップすると、エラー状態がクリアされます。 ISAM エラーを受け取る変数を指定し、付随する ISAM エラーが発生しな かった場合は、その変数にゼロが戻されます。戻されたエラー・テキスト を受け取る変数を指定し、それがなかった場合は、その変数に空のストリ ングが入れられます。 ストアード・プロシージャーおよび SPL 8-67 使用法 ON EXCEPTION 文の配置 ON EXCEPTION 文は宣言文であり、実行可能文ではありません。このため、 プロシージャーのすべての実行可能文の前と、すべての DEFINE 文の後で、 ON EXCEPTION 文を使用する必要があります。 次の例は、ON EXCEPTION 文の正しい配置を示しています。ON EXCEPTION 文は、DEFINE 文の後で、かつプロシージャーの本体の前で使用されます。 このプロシージャーは、値のセットを表に挿入します。表がない場合は、 表が作成され、値が挿入されます。この挿入の後、プロシージャーは、表 内の行の総数も戻します。 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 文の最後の宣言を検索します。これは、IN 節にエラー番号を持つ ON EXCEPTION 文の場合もあれば、IN 節を持たない ON EXCEPTION 文の場合もあります。関連のある ON EXCEPTION 文がなけれ ば、エラー・コードが呼び出し側 ( プロシージャー、アプリケーション、 または対話型ユーザー ) に戻され、実行が打ち切られます。 8-68 IBM Informix SQL リファレンス・ガイド IN 節を使用した特定の例外のトラップ 次の例は、同じエラー番号を持つ 2 つの ON EXCEPTION 文を使用しますの で、エラー番号 691 を 2 つの異なるレベルのネスティングでトラップする ことができます。 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 IN 節を使用した特定の例外のトラップ トラップがトリガーされるのは、SQL エラー・コードまたは ISAM エラー・ コードのいずれかが、< エラー番号 > のリストの例外コードと一致した場 合です。リストの検索は、左から開始され、最初の一致で停止します。 IN 節を持たない ON EXCEPTION 文と、 IN 節を持つ 1 つ以上の ON EXCEPTION 文の組み合わせを使用して、デフォルトのトラッピング状態をセット アッ プすることができます。たとえば、以下の例の文シーケンスは、次のよう な最終結果を得ます。つまり、「エラーのテスト。エラー -210、-211、また は -212 の場合は、アクション A を実行してください。-300 の場合は、アク ション B を実行してください。その他のエラーの場合は、アクション C を 実行してください。」 ストアード・プロシージャーおよび SPL 8-69 SET 節でのエラー情報の受け取り CREATE PROCEDURE ex_test () . . . 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 . . . SET 節でのエラー情報の受け取り SET 節を使用している場合に、例外が発生すると、SQL エラー番号と ( オプ ションで ) ISAM コードが、SET 節で指定された変数に挿入されます。 < エラー・データ変数 > を指定した場合は、データベース・サーバーに よって戻されたすべてのエラー・テキストが < エラー・データ変数 > に入 れられます。エラー・テキストには、問題の表や列名などの情報が含まれ ます。 WITH RESUME キーワードを持つプロシージャーの強制 続行 8-68 ページの例は、WITH RESUME キーワードを使用して、ON EXCEPTION 文の文ブロックの後で、実行を LET x = SELECT COUNT(*) FROM emp_list 文 ( エラーを起こした行の後の行 ) から続行することを示しています。このプ ロシージャーの場合、これは、エラーが発生しても、販売員名のカウント 数が表示されることを意味します。 8-70 IBM Informix SQL リファレンス・ガイド WITH RESUME キーワードを持つプロシージャーの強制続行 例外発生後のプロシージャー実行の継続 WITH RESUME キーワードを ON EXCEPTION 文にインクルードしていない と、例外が発生した後、次に実行される文は、以下のとおり、ON EXCEPTION 文の配置によって異なります。 ! BEGIN および END キーワードを持つ ON EXCEPTION 文が文ブロック に含まれている場合は、その BEGIN...END ブロックの後の最初の文 ( それがある場合 ) から実行が再開されます。つまり、ON XCEPTION 文の範囲の後から実行が再開されます。 ! ON EXCEPTION 文がループ (FOR、WHILE、FOREACH) に含まれてい る場合は、ループの残りがスキップされ、ループの次の反復から実 行が再開されます。 ! ON EXCEPTION 文がいずれの文またはブロックにも含まれておら ず、プロシージャー自体にのみ含まれている場合は、引数を指定し ていない RETURN 文を実行して、プロシージャーが終了します。つ まり、プロシージャーが正常終了状態を値なしで戻します。 ON EXCEPTION 文ブロック内でのエラー 無限ループを発生させないようにするために、エラー・トラップの文ブ ロックを実行しているときにエラーが発生した場合、別のトラップの検索 には現行のトラップはインクルードされていません。 ストアード・プロシージャーおよび SPL 8-71 RAISE EXCEPTION RAISE EXCEPTION 目的 RAISE EXCEPTION 文は、エラーの生成をシミュレートするために使用しま す。 構文 RAISE EXCEPTION ; <SQL エラー > , <ISAM エラー > , < エラー・ テキスト > < エラー・ テキスト > SQL エラーによって戻されたストリングが含まれている、 引用符付きストリングまたは変数です。 <ISAM エラー > 有効な ISAM エラー番号である整数値に評価される、SPL 式 です。 <SQL エラー > 有効な SQL エラー番号である整数値に評価される、SPL 式 です。 使用法 RAISE EXCEPTION 文を使用してエラーをシミュレートします。生成された エラーは、ON EXCEPTION 文によってトラップすることができます。 <ISAM エラー > 式を省略すると、例外が発生したときに、ISAM エラー・ コードがゼロに設定されます。( エラー・テキスト・フィールドを使用した い場合に、ISAM エラー番号部分を指定していないと、<ISAM エラー > がゼ ロに設定されることがあります。) たとえば、次の文はエラー番号 99999 を 発生し、指定したテキストを戻します。 RAISE EXCEPTION -99999, 0, "You broke the rules"; 8-72 IBM Informix SQL リファレンス・ガイド 使用法 発生する例外は、システム定義例外の場合も、ユーザー定義例外の場合も あります。 次の例では、a の値が負であれば、例外 99999 が発生します。例外 99999 を トラップする ON EXCEPTION 文がこのコードのどこかに含まれているべき です。 FOREACH SELECT c1 INTO a FROM t IF a < 0 THEN RAISE EXCEPTION 99999-- emergency exit END IF END FOREACH 例外の範囲と互換性についての詳細は、ON EXCEPTION 文を参照してくださ い。 ストアード・プロシージャーおよび SPL 8-73 RETURN RETURN 目的 RETURN 文は、プロシージャーが呼び出し側モジュールに戻す値を指定す るために使用します。 構文 ; RETURN , SPL 式 8-23 ページ WITH RESUME 使用法 RETURN 文は、ゼロまたはそれ以上の値を呼び出し側プロセスに戻します。 プロシージャーのすべての RETURN 文は、そのプロシージャーを定義した CREATE PROCEDURE 文の RETURNING 節と整合していなければなりません。 RETURN 文 ( 存在している場合 ) の値の数と型が、CREATE PROCEDURE 文の RETURNING 節にリストされている数と型に一致していなければなりませ ん。1 つ以上の値を RETURNING 節に指定している場合でも、値を戻さない ようにすることができます。式を持たない RETURN 文を使用しているが、 呼び出し側のプロシージャーまたはプログラムが 1 つ以上の戻り値を必要 とする場合、その指定は、必要な数の NULL 値を呼び出し側プログラムに 戻すことと同じです。 8-74 IBM Informix SQL リファレンス・ガイド WITH RESUME キーワード 次の例では、プロシージャーに 2 つの受け入れ可能な 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 文は、値を戻さないで終了します。 WITH RESUME キーワード RETURN 文を実行した後で WITH RESUME キーワードを使用すると、このプ ロシージャーの次回の呼び出し ( 次の FETCH または FOREACH 文で ) は、 RETURN 文の次の文から開始されます。プロシージャーが RETURN WITH RESUME 文を実行する場合は、呼び出し側のプロシージャーまたはプログ ラムの FOREACH ループからそれを呼び出す必要があります。 ESQL プロシージャーが RETURN WITH RESUME 文を実行する場合は、埋め込み言 語で書かれたアプリケーションの FETCH 文を使用して、それを呼び出すこ とができます。♦ 次の例は、他のプロシージャーから呼び出すことができるカーソル的プロ シージャーを示しています。RETURN i WITH RESUME 文が各値を呼び出し側 プロシージャーに戻した後、次回に sequence を呼び出すと、sequence の次 の行が実行されます。backwards が 0 と等しければ、呼び出し側プロシー ジャーには値が戻されず、sequence の実行は停止します。 ストアード・プロシージャーおよび SPL 8-75 WITH RESUME キーワード 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 8-76 IBM Informix SQL リファレンス・ガイド SYSTEM SYSTEM 目的 SYSTEM 文は、オペレーティング・システム・コマンドをプロシージャー 内から実行できるようにするために使用します。 構文 SYSTEM " < 文字式 > " ; < 文字変数 > < 文字式 > ユーザー実行可能オペレーティング・システム・コマンドで ある任意の式です。 < 文字 変数 > 有効なオペレーティング・システム・コマンドが含まれてい る変数です。 使用法 提供された < 式 > が文字式でなければ、< 式 > が文字式に変換されてか ら、オペレーティング・システム・コマンドが作成されます。完全な文字 式がオペレーティング・システムに渡され、オペレーティング・システ ム・コマンドとして実行されます。 SYSTEM 文で指定したオペレーティング・システム・コマンドは、バック グラウンドでは実行できません。データベース・サーバーは、オペレー ティング・システムがコマンドの実行を完了するのを待って、次のプロ シージャー文へ進みます。 プロシージャーは、コマンドによって戻された値 ( 複数の場合もある ) を使 用することはできません。 オペレーティング・システム・コマンドが失敗した場合、つまり、オペ レーティング・システムがコマンドの非ゼロ状態を戻した場合は、例外が 発生し、戻されたオペレーティング・システム状態には、ISAM エラー・ コードと、該当する SQL エラー・コードが示されます。 ストアード・プロシージャーおよび SPL 8-77 使用法 SYSTEM 文が含まれた DBA アクセス権付きストアード・プロシージャーと 所有者アクセス権付きストアード・プロシージャーの場合、オペレーティ ング・システム・コマンドは、プロシージャーを実行するユーザーの権限 で実行されます。 次の例は、SYSTEM 文の使用法を示したものです。 CREATE PROCEDURE sensitive_update() . . . LET mailcall = "mail headhoncho < alert" -- code that evaluates if operator tries to execute a certain -- command, then send email to system administrator SYSTEM mailcall . . . END PROCEDURE -- sensitive_update その他の文の場合と同様に、二重パイプ記号 (||) を使用して、次のように、 式と SYSTEM 文を連結することができます。 CREATE PROCEDURE sensitive_update2() . . . -- code that evaluates if operator tries to execute a certain -- command, then send email to system administrator SYSTEM "mail -s violation" ||user1 || " " || user2 || " < violation_file" . . . END PROCEDURE 8-78 IBM Informix SQL リファレンス・ガイド TRACE TRACE 目的 TRACE 文は、デバッグ出力の生成を制御するために使用します。 構文 ON TRACE ; OFF PROCEDURE SPL 式 8-23 ページ 使用法 TRACE 文は、SET DEBUG FILE 文によって指定されたファイルに送信する出 力を生成します。 トレースは、次のすべての項目の現行値を出力します。 ! 変数 ! プロシージャー引数 ! 戻り値 ! SQL エラー・コード ! ISAM エラー・コード 実行された各 TRACE 文の出力は別々の行に示されます。 出力を入れるための DEBUG ファイルを最初に指定せずに TRACE 文を使用 すると、エラーが生成されます。 ストアード・プロシージャーおよび SPL 8-79 使用法 トレース 状態 は、呼び出し先プロシージャーによって継承されます。つま り、呼び出し先 プロシージャーは、呼び出し側プロシージャーと同じト レース状態 (ON、OFF、または PROCEDURE) を取ります。呼び出し先プロ シージャーは独自のトレース状態を設定することができますが、その状態 は呼び出し側プロシージャーへは戻されません。 STAR INET トレース状態は、リモート・データベース・サーバーで実行されるプロ シージャーによっては継承されません。♦ TRACE ON ON キーワードを指定すると、すべての文がトレースされます。変数の値 ( 式などの ) は、使用する前に出力されます。トレースを ON に切り替える ことは、プロシージャー呼び出しとプロシージャー本体の文の両方をト レースすることを意味します。 TRACE OFF OFF キーワードを指定すると、すべてのトレースがオフに切り替わります。 TRACE PROCEDURE PROCEDURE キーワードを指定すると、プロシージャー呼び出しと戻り値の みがトレースされ、プロシージャーの本体はトレースされません。 式の出力 引用符付きストリングまたは式を持つ TRACE 文を使用して、出力ファイル の値やコメントを表示することができます。式がリテラル式でなければ、 式を評価してから出力ファイルに書き込みます。 先にプロシージャーで TRACE OFF 文を使用した場合でも、式を持つ TRACE 文を使用することができます。ただし、SET DEBUG 文を使用してトレース 出力ファイルを設定しておく必要があります。 8-80 IBM Informix SQL リファレンス・ガイド 使用法 次の例は、式を持つ TRACE 文を使用しています。 CREATE PROCEDURE tracing () DEFINE i INT; BEGIN ON EXCEPTION IN (1) END EXCEPTION; -- do nothing TRACE OFF; SET DEBUG FILE TO "/tmp/foo.trace"; TRACE "Forloop starts"; FOR i IN (1 TO 1000) BEGIN TRACE "FOREACH starts"; 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 PROCEUDRE 次の例は、追加の TRACE 文を示しています。 CREATE PROCEDURE testproc() DEFINE i INT; TRACE OFF; SET DEBUG FILE TO "/tmp/test.trace"; 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 "/tmp/test2.trace"; END PROCEDURE; ストアード・プロシージャーおよび SPL 8-81 トレース出力の表示 トレース出力の表示 トレース出力を見るには、エディターまたはユーティリティーを使用して ファイルの内容を表示するか、または読み取ります。 8-82 IBM Informix SQL リファレンス・ガイド WHILE WHILE 目的 WHILE 文は、プロシージャー内で不確定ループを設定するために使用しま す。 構文 WHILE 条件 7-350 ページ 文ブロック 7-64 ページ END WHILE ; 使用法 条件は、ループの開始時に 1 回評価されます。それ以降、条件は、各反復 の開始時に評価されます。文ブロックは、条件が真である限り実行されま す。ループが終了するのは、条件が真でないと評価されたときです。 条件に含まれているすべての式が NULL と評価された場合は、ユーザーが 明示的に IS NULL 条件をテストしていない限り、条件が自動的に真でなく なります。 未初期化変数を参照したために、条件内の式に UNKNOWN 値が含まれてい る場合は、即時エラーになります。この場合は、ループが終了し、例外が 発生します。 CREATE PROCEDURE simp_while() DEFINE i INT; DEFINE pf_name CHAR(15); WHILE EXISTS (SELECT fname INTO pf_name 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 8-83 使用法 8-84 IBM Informix SQL リファレンス・ガイド 付録 特記事項 本書は米国 IBM が提供する製品およびサービスについて作成 したものであり、本書に記載の製品、サービス、または機能が 日本においては提供されない場合があります。日本で利用可能 な製品、サービス、および機能については、日本 IBM の営業 担当員にお尋ねください。本書で IBM 製品、プログラム、ま たはサービスに言及していても、その IBM 製品、プログラム、 またはサービスのみが使用可能であることを意味するものでは ありません。これらに代えて、IBM の知的所有権を侵害するこ とのない、機能的に同等の製品、プログラム、またはサービス を使用することができます。ただし、IBM 以外の製品とプログ ラムの操作またはサービスの評価および検証は、お客様の責任 で行っていただきます。 IBM は、本書に記載されている内容に関して特許権 ( 特許出願 中のものを含む ) を保有している場合があります。本書の提供 は、お客様にこれらの特許権について実施権を許諾することを 意味するものではありません。実施権についてのお問い合わせ は、書面にて下記宛先にお送りください。 〒 106-0032 東京都港区六本木 3 -2-31 IBM World Trade Asia Corporation Licensing A 以下の保証は、国または地域の法律に沿わない場合は、適用されません。 IBM およびその直接または間接の子会社は、本書を特定物として現存するままの状 態で提供し、商品性の保証、特定目的適合性の保証および法律上の瑕疵担保責任を 含むすべての明示もしくは黙示の保証責任を負わないものとします。国または地 域によっては、法律の強行規定により、保証責任の制限が禁じられる場合、 強行規定の制限を受けるものとします。 本書は定期的に見直され、必要な変更 ( たとえば、技術的に不適切な記述 や誤植など ) は本書の次版に組み込まれます。IBM は予告なしに、随時、 この文書に記載されている製品またはプログラムに対して、改良または変 更を行うことがあります。 本書において IBM 以外の Web サイトに言及している場合がありますが、便 宜のため記載しただけであり、決してそれらの Web サイトを推奨するもの ではありません。それらの Web サイトにある資料は、この IBM 製品の資料 の一部ではありません。それらの Web サイトは、お客様の責任でご使用く ださい。 IBM は、お客様が提供するいかなる情報も、お客様に対してなんら義務も 負うことのない、自ら適切と信ずる方法で、使用もしくは配布することが できるものとします。 本プログラムのライセンス保持者で、(i) 独自に作成したプログラムとその 他のプログラム(本プログラムを含む)との間での情報交換、および (ii) 交 換された情報の相互利用を可能にすることを目的として、本プログラムに 関する情報を必要とする方は、下記に連絡してください。 IBM Corporation J46A/G4 555 Bailey Avenue San Jose, CA 95141-1003 U.S.A. 本プログラムに関する上記の情報は、適切な使用条件の下で使用すること ができますが、有償の場合もあります。 本書で説明されているライセンス・プログラムまたはその他のライセンス 資料は、IBM 所定のプログラム契約の契約条項、IBM プログラムのご使用 条件、またはそれと同等の条項に基づいて、IBM より提供されます。 A-2 IBM Informix SQL リファレンス・ガイド この文書に含まれるいかなるパフォーマンス・データも、管理環境下で決 定されたものです。そのため、他の操作環境で得られた結果は、異なる可 能性があります。一部の測定が、開発レベルのシステムで行われた可能性 がありますが、その測定値が、一般に利用可能なシステムのものと同じで ある保証はありません。さらに、一部の測定値が、推定値である可能性が あります。実際の結果は、異なる可能性があります。お客様は、お客様の 特定の環境に適したデータを確かめる必要があります。 IBM 以外の製品に関する情報は、その製品の供給者、出版物、もしくはそ の他の公に利用可能なソースから入手したものです。IBM は、それらの製 品のテストは行っておりません。したがって、他社製品に関する実行性、 互換性、またはその他の要求については確証できません。IBM 以外の製品 の性能に関する質問は、それらの製品の供給者にお願いします。 IBM の将来の方向または意向に関する記述については、予告なしに変更ま たは撤回される場合があり、単に目標を示しているものです。 表示されている IBM の価格は IBM が小売り価格として提示しているもの で、現行価格であり、通知なしに変更されるものです。卸価格は、異なる 場合があります。 本書には、日常の業務処理で用いられるデータや報告書の例が含まれてい ます。より具体性を与えるために、それらの例には、個人、企業、ブラン ド、あるいは製品などの名前が含まれている場合があります。これらの名 称はすべて架空のものであり、名称や住所が類似する企業が実在している としても、それは偶然にすぎません。 特記事項 A-3 著作権使用許諾 : 本書には、様々なオペレーティング・プラットフォームでのプログラミン グ手法を例示するサンプル・アプリケーション・プログラムがソース言語 で掲載されています。お客様は、サンプル・プログラムが書かれているオ ペレーティング・プラットフォームのアプリケーション・プログラミン グ・インターフェースに準拠したアプリケーション・プログラムの開発、 使用、販売、配布を目的として、いかなる形式においても、IBM に対価を 支払うことなくこれを複製し、改変し、配布することができます。このサ ンプル・プログラムは、あらゆる条件下における完全なテストを経ていま せん。従って IBM は、これらのサンプル・プログラムについて信頼性、利 便性もしくは機能性があることをほのめかしたり、保証することはできま せん。お客様は、IBM のアプリケーション・プログラミング・インター フェースに準拠したアプリケーション・プログラムの開発、使用、販売、 配布を目的として、いかなる形式においても、IBM に対価を支払うことな くこれを複製し、改変し、配布することができます。 それぞれの複製物、サンプル・プログラムのいかなる部分、またはすべて の派生した創作物には、次のように、著作権表示を入れていただく必要が あります。 © ( お客様の会社名 ) ( 西暦年 ). このコードの一部は、IBM Corp. の サンプル・プログラムから取られています。 © Copyright IBM Corp. ( 年を入れる ). All rights reserved. この情報をソフトコピーでご覧になっている場合は、写真やカラーの図表 は表示されない場合があります。 A-4 IBM Informix SQL リファレンス・ガイド 商標 商標 AIX; DB2; DB2 Universal Database; Distributed Relational Database Architecture; NUMA-Q; OS/2, OS/390, および OS/400; IBM Informix®; C-ISAM®; Foundation.2000TM; IBM Informix® 4GL; IBM Informix® DataBlade® Module; Client SDKTM; CloudscapeTM; CloudsyncTM; IBM Informix® Connect; IBM Informix® Driver for JDBC; Dynamic ConnectTM; IBM Informix® Dynamic Scalable ArchitectureTM (DSA); IBM Informix® Dynamic ServerTM; IBM Informix® Enterprise Gateway Manager (Enterprise Gateway Manager); IBM Informix® Extended Parallel ServerTM; i.Financial ServicesTM; J/FoundationTM; MaxConnectTM; Object TranslatorTM; Red Brick Decision ServerTM; IBM Informix® SE; IBM Informix® SQL; InformiXMLTM; RedBack®; SystemBuilderTM; U2TM; UniData®; UniVerse®; wintegrate® は、IBM Coporation の商標です。 Java およびすべての Java 関連の商標およびロゴは、Sun Microsystems, Inc. の米国およびその他の国における商標または登録商標です。 Windows、Windows NT および Excel は、Microsoft Corporation の米国および その他の国における商標です。 UNIX は、The Open Group がライセンスしている米国およびその他の国にお ける登録商標です。 本書で使用しているその他の会社名、製品名およびサービス名はそれぞれ 各社の商標または登録商標です。 特記事項 A-5 商標 A-6 IBM Informix SQL リファレンス・ガイド 用語集 用語集 アーカイブ (archiving) あるデータベースのすべてのデータとインデックスを、その データベースの格納メディアから新規のメディア ( 通常、テー プまたは物理デバイス ) にコピーすること。 アクセス・モー ド (access mode) オープン・ファイルに対する読み取りアクセスおよび書き込み アクセスを決定するオープン・ファイルの状態。 アクセス権 (access privileges) データベース・ユーザーが特定のデータベース、表、または列 で実行する許可を与えられた動作の型。Informix データベー ス・サーバーは、システム・ファイルに対するオペレーティン グ・システムのアクセス権とは独立した、独自のデータベー ス・アクセス権のセットを持っている。 アクセス権 (permission) 一部のオペレーティング・システムでは、ファイルやディレク トリーにアクセスする権限を指す。 アクセス権 (privilege) データベースの内容を使用または変更する権限。 アクセス方法 (access method) 格納域から行を取得したり、格納域に行を挿入したりするため に使用されるプロシージャー。SET EXPLAIN 文では、アクセ ス方法は、照会における表アクセスの型を指す。たとえば、 INDEX PATH に対する SEQUENTIAL SCAN。 アクティブ・ セット (active set) カーソルに関連する照会を満足する行のコレクション。 アプリケーショ ン・ツール・プ ロセス (application tool process) ユーザー・インターフェースを提供し、データベース・サーバーまたは IBM Informix NET 製品のいずれかと通信するプロセス。 アプリケーショ ン・プログラム (application program) 1 つ以上のデータベース管理タスクを実行するファイル、または論理的に 関連するファイルのセット。 アプリケーショ ン・プロダク ティビティー・ ツール (application productivity tools) アプリケーションの作成に使用されるツール ( フォームやレポート )。 アプリケーショ ン開発支援ツー ル (application development tool) 開発者がデータベースの作成や管理のために使用する IBM Informix SQL、 IBM Informix 4GL、および IBM Informix ESQL などのソフトウェアを指す用 語。このソフトウェアを使用すれば、ユーザーは、指示やデータをデータ ベース・サーバーに送ったり、データベース・サーバーから情報を受け 取ったりできる。アプリケーション開発支援ツールは、「フロントエンド」 と呼ばれることもある。 アンロック (unlock) ロックされたオブジェクト ( データベース、表、ページ、または行 ) を解放 すること。たとえば、ある表をロックすると、他のユーザーは、その表が ロックされている間、表内の行の追加、削除、更新、または表示 ( 排他 ロックの場合 ) を行うことができない。ユーザーまたはプログラムがその 表をアンロックすると、他のユーザーは再度アクセスを許可される。 一意キー (unique key) 「主キー (primary key)」を参照。 一意性制約 (unique constraint) 列または列のセット内の各項目に一意な値が含まれていることを指定する。 一時的 (temporary) プログラム実行が終了したとき、またはオンライン・セッションが終了し たときに削除される任意のファイル、インデックス、または表の属性。 2 IBM Informix SQL リファレンス・ガイド 印刷可能文字 (printable character) 端末またはプリンターに表示できる文字。A-Z、a-z、0-9、および句読点が 含まれる。「制御文字 (control character)」を参照。 インストール (installation) ソフトウェアをいずれかの磁気媒体 ( テープ、カートリッジ、フロッピー・ ディスクなど ) からコンピューターにロードし、それを使用できるように 準備すること。 インタープリ ター (interpreter) 一度に 1 つずつ文を読み取り、デコードし、実行するプログラム。イン デックス (index) データの行を指すポインターが入っているファイル。イン デックスは、行の整列を高速化し、データベース照会のパフォーマンスを 最適化することができる。 インデックスの クラスター化 (cluster an index) 特定のインデックスに従って、表の物理データを変更すること。 ウィンドウ (window) 画面上の長方形の領域。そこでは、バックグラウンド・プログラムのコン テキストを残さないでアクションを取ることができる。打ち切る (abort) ア クティブ・プロセスが完了する前にそれに割り込むこと。データの状態は、 プロセスを開始する前の状態と同じでない場合がある。 エクステント (extent) IBM Informix OnLine の表領域に割り当てられたディスク領域の連続したセ グメント。プログラマーは、表の初期エクステント・サイズも、表に割り 当てられたすべての後続エクステントのサイズも指定することができる。 エラー・トラッ ピング (error trapping) 実行時エラーを予想し、それに対応するプログラム内のコード。 エラー・メッ セージ (error message) 画面に表示された、またはファイルに書き込まれたメッセージで、アク ションの失敗または不正な仕様のいずれかを記述している。各エラーは指 定番号 ( 通常は負 ) によって識別される。 エラー・ログ (error log) プログラムが実行されるたびにエラー情報を受け取るファイル。 オープン (open) リソースを利用できるにすること。たとえば、ファイルをアクセスするた めの準備、カーソルの活動化、ウィンドウの開始など。 用語集 3 大文字と小文字 の区別 (case sensitivity) 大文字と小文字の区別をする条件。IBM Informix プログラムを実行する場 合は注意が必要である。特定のコマンドとそのオプションは大文字と小文 字を区別する。つまり、それらは大文字と小文字で示された同じ文字に対 して異なる反応を示す。 オフセット (offset) ディスク上のチャンクの物理的位置を指定するために、IBM Informix OnLine で使用される用語。オフセットは、チャンクを開始する前に、指定 されたデバイス ( つまり、指定されたディスク・パーティション ) にインデ ントされる KB 数である。1 つのオフセットの許容最大値は 2 テラバイトで ある。 カーソル (cursor) 行グループと関連付けられた識別子。概念上は、現在行を指すポインター。 カーソルは、SELECT 文で使用したり ( カーソルを照会によって戻された 行に関連付ける )、INSERT 文で使用したり ( カーソルをバッファーに関連 付けて、複数行をグループとして挿入する ) できる。SELECT カーソルは、 行情報の順次のみの抽出 ( 通常カーソル ) または非順次抽出 ( スクロール・ カーソル ) のために宣言される。さらに、SELECT カーソルを、更新 ( 更新 済み行や削除済み行に対する制御ロックを開始する ) または保留 ( トラン ザクションが完了してもカーソルをクローズしない ) のために宣言するこ ともできる。ESQL/C および ESQL/COBOL においては、カーソルを動的に することができる。つまり、カーソルを識別子または文字 / ストリング変 数にすることができる。「カーソル」という用語は、ビデオ端末の位置標識 も表す。 カーソルのク ローズ (close a cursor) 照会から取得した行のアクティブ・セットとカーソルの間の関連を削除す ること。 カーネル (kernel) 各プロセスを制御し、リソースの割り当てを制御する UNIX オペレーティ ング・システムの一部。 階層 (hierarchy) ツリー状になったデータ構造体で、一部のデータ・グループが他のデー タ・グループの下に付き、(1) 1 つのグループのみ ( ルート と呼ぶ ) が最高 位に位置し、(2) ルート 以外の各グループは自分より高位の 1 つのグループ のみに関連している。 外部キー (foreign key) 表の一意または主キーを参照する列または列のセット。すべての外部キー 列に非 NULL 値が含まれている場合は、外部キー列のすべての項目と一致 する項目が一意または主列に含まれていなければならない。 4 IBM Informix SQL リファレンス・ガイド 外部結合 (outer join) 照会における主表と従表の非対称結合。それにより、結合制限は従表また は「外部表」にのみ適用される。主表の行は結合を考慮せずに抽出される が、外部表から取得した行は、結合条件も満たした場合にのみインクルー ドされる。外部表から取得した行と一致しない主表の行は、外部表の行で はなく、NULL の行を受け取る。 外部表 (external table) 現行データベースに入っていないデータベース表。 仮数 (mantissa) 浮動小数点数の有効数字。通常、0 と 1 の間の数字で表される。 仮想列 (virtual column) データベースに格納されていない情報の導出列。たとえば、SELECT 文で 仮想列を作成するには、単一列を算術的に操作する ( たとえば、既存の値 に定数を掛ける ) か、複数列を結合する ( たとえば、2 つの列の値を加算す る )。 環境変数 (environment variable) 割り当て済み値を持つ変数で、オペレーティング・システムによって管理 され、すべてのシステムで使用される。 関係 (relation) 「表 (table)」を参照。 関数 (function) 「プログラム・ブロック (program block)」を参照。 キー (key) データの行を見つけるために使用される情報の断片。キーは、検索する情 報の断片を定義するほか、表の情報を処理する順序も定義する。たとえば、 last_name 列を customer 表に索引付けすることにより、特定の顧客を見つけ 出したり、それらの顧客を、ラストネームのアルファベット順、または逆 順に処理したりできる。 キーワード (keyword) プログラムにとって意味がある単語。たとえば、SELECT という語は、 データベース照会に関連する SQL のキーワードである。 記述子 (descriptor) 引用符付きストリングまたは埋め込み変数で、割り当て済みシステム記述 子領域または sqlda 構造体を識別する。記述子は、IBM Informix 4GL および IBM Informix 埋め込み言語製品により、SQL 文管理に使用される。 「識別子 (identifier)」を参照。 用語集 5 行 (row) データベース表内の単一のエンティティーに関する情報の関連項目のグ ループ。たとえば顧客情報の表の場合、行には、単一の顧客に関する情報 が入っている。行は「レコード (record)」または「タプル (tuple)」とも呼ば れる。( スクリーン・フォームでは、行 が画面上の行を指すこともある。) 強制常駐 (forced residency) UNIX が IBM Informix OnLine 共有メモリー・セグメントをメモリー内に常 駐させることを強制実行するオプションで、UNIX がこれらのセグメント からディスクにスワッピングするのを防止する。( このオプションは、すべ ての UNIX システムで利用できるわけではない。) 共有メモリー (shared memory) 複数のプロセスがメモリー内の共通データ領域にアクセスできるようにす る。各プロセスごとにディスクから共通データを再読み取りする必要がな いため、ディスク 入出力 が減り、パフォーマンスが向上する。 共有ロック (shared lock) 同一オブジェクトに対して複数のプロセスが獲得できるロック。共有ロッ クは、複数ユーザーによるより大きな並行性を考慮に入れている。した がって、2 人のユーザーが 1 つの行に対してロックを掛けている場合、3 人 目のユーザーは、両方のユーザー ( 最初のユーザーだけでなく ) そのロック を解放するまでその行の内容を変更できない。共有ロック・ストラテジー は、DIRTY READ を除くすべてのプロセス排他設定レベルで使用される。 局所変数 (local variable) 自分が定義されているモジュールでのみ意味がある変数。「変数 (variable)」 および「参照範囲 (scope of reference)」を参照。 区切り記号 (delimiter) 入力フィールドの境界、または列や行の終端記号。フォーム仕様では、 フィールド区切り記号は大括弧 ([ ]) で、フィールドのサイズを決定する。 一部のファイルや PREPARE 文で処理したオブジェクトには、それぞれ文 の間にセミコロン (;) が必要。 組み込み SQL (embedded SQL) ホスト言語内に配置される SQL 文。Informix は、C および COBOL の SQL をサポートする。 クライアント (client) ファイル・サーバーまたはデータベース・サーバーのリソースを使用する ネットワーク上のコンピューター。 クライアント / サーバー・アー キテクチャ (client/server architecture) ユーザー・インターフェースとデータベース・サーバーがネットワーク上 の別個のノードまたはプラットフォームに常駐できるようにするハード ウェアおよびソフトウェア設計。 6 IBM Informix SQL リファレンス・ガイド クライアント / サーバー処理 (client/server processing) 関連するコンピューターの処理能力を利用して、アプリケーションをネッ トワーク上の複数のコンピューターで稼働できるようにする機能。 警告 (warning) データベース・サーバーまたはコンパイラーによって検出された状態で、 構文が正しくないか、または問題の発生が考えられること。警告は、必ず しも実行するコードの機能に影響を与えるわけではない。 結合 (join) 複数の表から取得した情報を、何らかの情報の共通ドメインに基づいて組 み合わせること。ある表から取得した行が他の表から取得した行と結合さ れるのは、対応する行の情報が結合基準を満たしたときである。たとえば、 customer_number 列が、customer 表と orders 表の両方に存在する場合は、 customer_number に基づいて、各 customer 行と、関連するすべての orders 行 を結合する照会を構築することができる。「デカルト (Cartesian product)」お よび「外部結合 (outer join)」を参照。 現在行 (current row) 最後に取得した、照会のアクティブ・セットの行。 広域変数 (global variable) プログラム内の任意のモジュールまたは関数からアクセスできる値を持つ 変数。「変数 (variable)」および「参照範囲 (scope of reference)」を参照。 高可用性 (high availability) システムがデータの障害や消失に抵抗できること。高可用性には、高速復 旧やミラーリングなどの機能が含まれる。「フォールト・トレランス ( 耐故 障性 ) (fault tolerance)」と呼ばれる場合もある。 更新記録 (audit trail) IBM Informix SE データベース・サーバーの表に対するすべての変更の履 歴。 更新記録ログ (audit trail log) 表に対するすべての変更の履歴が入っているファイル。アーカイブ・デー タベースから始まり、更新記録ログは、IBM Informix SE データベース・ サーバーの表に対する後続のすべての変更を再構築することができます。 更新前イメージ (before-image) 変更を加える前の行、ページ、またはその他の項目のイメージ。 更新ロック (update lock) SELECT...FOR UPDATE 中に獲得される増進可能なロック。更新ロックは、 実際に更新が行われるまで共有ロックのように動作する。更新が行われる と、排他ロックになる。更新ロックは、あるオブジェクトに対して一度に 1 つの更新ロックしか獲得できないという点で、共有ロックとは異なる。 用語集 7 構成ファイル (configuration file) 構成データが入っているファイルで、IBM Informix OnLine が初期化時に使 用する。構成ファイルは、次のように指定される。$INFORMIXDIR/etc/$TBCONFIG. 定数 (constant) 変化しないデータ要素または値。 高速復旧 (fast recovery) IBM Informix OnLine が、任意の時点で、オフラインから静止モードへの動 作モードの変更をインプリメントする自動的なフォールト・トレラント機 能。高速復旧の目的は、システム障害が発生した場合に、最小限の作業ロ スで OnLine を物理的および論理的一貫性を持つ状態に戻すことである。 固定長文字 (fixchar) IBM Informix ESQL/C プログラムで提供される文字データ型。文字ストリン グの長さが固定で、必要な場合はブランクでパッドされ、NULL 終端子は 付かない。 コマンド・ファ イル (command file) 1 つ以上の文またはコマンド ( たとえば、SQL 文やプログラミング・コード のシーケンスなど ) を含むシステム・ファイル。 コメント (comment) プログラム・ファイル、レポート仕様、またはスクリーン・フォームの中 の情報で、コンピューターによって処理はされないが、プログラムをド キュメント化する。コメントであることを示すために、シャープ記号 (#)、 ブレース ({ })、アスタリスク (*) などの特殊文字を使用する。 コンパイル時エ ラー (compiletime errors) プログラム・ソース・コードを実行可能フォームに変換するときに発生す るエラー。「実行時エラー (run-time errors)」を参照。 サーバー番号 (server number) データベース管理者が、初期化時に IBM Informix OnLine に割り当てる 0 ~ 255 の一意な番号。同一マシン上に複数の IBM Informix OnLine データベー ス・サーバーがインストールされている場合は、それぞれのデータベー ス・サーバーは一意な番号を持っていなければなりません。 サーバー名 (server name) データベース管理者が、初期化時に IBM Informix OnLine に割り当てる一意 な名前。外部表やデータベースを識別するにはデータベース・サーバー名 を使用する。 差分アーカイブ (incremental archiving) IBM Informix OnLine における 3 レベルのアーカイブ・システムで、最後の アーカイブ以降に変更されたデータ部分のみをアーカイブすることができ るオプションを提供する。 8 IBM Informix SQL リファレンス・ガイド 参照制約 (referential constraint) 1 つの表内の列間の関係、またはいくつかの表間の関係を定義する。参照 制約は、被参照列と参照列間の 1 対多の関係を持っている。被参照列は、 主キーまたは一意性制約の一部でなければならない。参照列は NULL 値を 含むことができるが、すべての列が非 NULL である場合、参照列内のすべ ての非 NULL 値は、被参照列内の値と一致しなければならない。参照列は 「外部キー」とも呼ばれる。 参照範囲 (scope of reference) 識別子が適用され、アクセスが可能なプログラムの部分。範囲サイズには、 ローカル ( 識別子は単一プログラム・ブロック内でのみ適用される )、モ ジュラー ( 識別子は単一モジュール全体を通して適用される )、およびグ ローバル ( 識別子はプログラム全体を通して適用される ) の 3 つがある。識 別子は、前もって宣言しておかないと参照できません。たとえば、モ ジュール識別子は、それを宣言したモジュール内の文が出てくるまで参照 できません。 残余ページ (remainder page) 単一行から取得したデータで埋められた追加ページ。IBM Informix OnLine は、行のデータを初期ページに収容できないときに残余ページを使用する。 残余ページは、必要に応じ、追加されるか埋められる。オリジナルのペー ジ項目には、残余ページを指すポインターが含まれている。 「ホーム・ペー ジ (home page)」を参照。 式 (expression) 単純な数字または英字定数から、より複雑な一連の値、関数、引用符付き ストリング、演算子、およびキーワードに至るすべてのもの。ブール (BOOLEAN) 式には、論理演算子 (>、<、=、!=、IS NULL、など ) が含まれ ていて、TRUE、FALSE、または UNKNOWN として評価される。算術式に は、演算子 (+、-、¥、/、など ) が含まれていて、数値として評価される。 識別子 (identifier) 文字、数字、およびアンダースコアー (_) のシーケンスで、データベース、 表、列、スクリーン・フォーム、プログラム変数、カーソル、関数、イン デックス、ウィンドウ、メニュー、シノニム、別名、ビュー、PREPARE 文 で処理したオブジェクト、制約、レポート、またはプロシージャー名の名 前を表す。 シグナル (signal) 2 つのプロセス間の通信手段として使用される特殊文字または文字のセッ ト。たとえば、ユーザーまたはプログラムがプロセス実行の割り込みまた は一時停止を行いたいときに、シグナルが送信されます。「割り込み (interrupt)」を参照。 システム・カタ ログ (system catalog) データベース自体に関する情報が入っている DATABASE 文。たとえば、 データベース内の表または列の名前、表内の行の数、インデックスおよび データベース・アクセス権に関する情報、などが入っている。 用語集 9 システム記述子 領域 (system descriptor area) SQL で使用される記述子で、動的 SQL 文で使用されるデータベース列また はホスト変数に関する記述情報が入っている。システム記述子領域は、 ESQL/C および ESQL/COBOL で使用することができる。 システム呼出し (system call) オペレーティング・システムによって提供される関数を呼び出すこと。 実行 (execute) プログラムまたは指示のセットを行動に移すこと。 実行可能ファイ ル (executable file) プログラムとして実行できるコンパイル済みのコードが入っているバイナ リー・ファイル。UNIX シェル・スクリプトまたは DOS バッチ・ファイル を指す場合もある。 実行時エラー (run-time errors) プログラム実行時に発生するエラーのこと。 「コンパイル時エラー (compiletime errors)」を参照。 実行時環境 (run-time environment) プログラム実行時に使用できるハードウェアおよびオペレーティング・シ ステム・サービス。 シノニム (synonym) 表に割り当てられた名前で、その表のオリジナルの名前に代わって使用さ れる。シノニムは、オリジナルの表名を置き換えるものではなく、代わり に、その表の別名として機能する。 射影 (projection) 一意な行を保持する単一表の列から垂直方向サブセットを取ること。射影 は、SELECT 文の SELECT 節に含まれている選択リストを介して行われ、 表内の一部の列とすべての行を戻す。「選択 (selection)」および「結合 (join)」を参照。 集計関数 (aggregate functions) 表の 1 つ以上の行に含まれている列の値に基づいて、単一値を戻す関数。 たとえば、照会またはレポートにおける式の総数、合計、平均、最大、ま たは最小。集計関数は、「集合関数」または「算術関数」と呼ばれることも ある。 主キー (primary key) 表内の各行を一意的に識別する列または列のセットから取得した情報。主 キーは「一意キー (unique key)」とも呼ばれる。 主キー制約 (primary key constraint) 列または列のセット内の各項目に非 NULL の一意な値が含まれていること を指定する。 出力 (output) コンピューターが、照会やレポート要求などに応じて作成する結果。 10 IBM Informix SQL リファレンス・ガイド 主表 (dominant table) 「外部結合 (outer join)」を参照。 照会 (query) 特定の基準に合致するデータを抽出するための要求。 小数点以下桁数 (scale) DECIMAL 表記における小数点の右側の桁数。数値 1437.2350 の小数点以下 桁数は 4 である ( 小数点の右側が 4 桁 )。「精度 (precision)」を参照。 状態変数 (status variable) プログラム実行のある局面の状態を示すプログラム変数。状態変数は、し ばしば、エラー番号を格納したり、エラーの発生を示すフラグとして機能 する。 初期化 (initialize) 開始値を割り当てること。 所有者アクセス 権付き (ownerprivileged) ユーザーに関連するアクセス権ではなく、オブジェクトの所有者に保持さ せるアクセス権を指す用語。 スキーマ (schema) データベースまたは表の構造体のリスト。表のスキーマは、列の名前、そ のデータ型および長さ ( 該当する場合 )、インデックス機能、その他表の構 造体に関する情報などをリストする。 スクリーン・ フォーム (screen form) 端末の画面上に表示されるデータ入力フォーム。ユーザーは、フォーム上 のブランク部分にデータを入力する。 スタック (stack) プログラムが使用するデータ要素の一時記憶域用に予約されているメモ リー領域。( 複数のスタックが存在することもある。) スタックは、通常、 関数に渡す引数など、プログラムに直接使用できるデータを保持している。 項目は、挿入されている順序と逆の順序でスタックから削除される。「プッ シュ (push)」および「ポップ (pop)」を参照。 スタック演算子 (stack operator) プログラムがスタックの値を操作できるようにする演算子。 ストアード・プ ロシージャー (stored procedure) Informix プログラムにおいて、SQL 文と一緒に使用される関数を指す用語。 ストアード・プロシージャーは、SQL および SPL 文を使用して作成され る。このプロシージャーは、実行可能フォームでデータベースに格納され る。 用語集 11 ストアード・プ ロシージャー言 語 (Stored Procedure Language) Informix によって開発された、ストアード・プロシージャーで使用するた めの言語。 ストリング (string) 単一の単位として操作される文字のセット ( 通常、英数字 )。ストリング は、単語 (‘‘Smith’’ など )、番号を表す数字のセット (‘‘19543’’ など )、また はその他の任意の文字のコレクションからなっている。ストリングは、通 常、単一引用符または二重引用符で囲まれている。また、IBM Informix ESQL/C プログラムで、データ型としても使用できる。この場合、文字ス トリングは、末尾ブランクが除去され、NULL で終了している。 制御文字 (control character) 特定のコンテキストに現れて、制御機能 ( たとえば、カーソルの移動や データの読み取りを行う場合にデバイスを制御する操作 ) を開始、変更、 または停止する文字。プログラムにおいては、CTRL キーと他のキーを一 緒に使用して、何らかのプログラミング・アクション ( たとえば、CTRLW を入力して IBM Informix 製品のオンライン・ヘルプを取得する ) を行う ことができる。制御文字は「制御キー」と呼ばれることもある。「印刷可能 文字 (printable character)」を参照。 精度 (precision) 実数の有効数字の合計数 ( 小数点の左側と右側の両方 )。たとえば、数字 1437.2305 の精度は 8 である。「小数点以下桁数 (scale)」を参照。 制約 (constraint) どの種類のデータを表に挿入できるか、または更新できるかを制限するこ と。 「チェック制約 (check constraint)」、 「主キー制約 (primary key constraint)」 、 「参照制約 (referential constraint)」 、および「一意性制約 (unique constraint)」 も参照。 セマフォー (semaphore) ユーザー・プロセスをウェイクさせるシグナルを出す UNIX 通信デバイス。 セルフ結合 (self-join) 表とそれ自身の結合。セルフ結合は、表が SELECT 文 ( いくつかの異なる 別名を持つ ) で複数回使用され、それ自身と結合されたときに行われます。 宣言文 (declarative statement) オブジェクトの記述または定義 ( たとえば、プログラム変数の定義 ) を行う プログラム言語文。「プロシージャー文 (procedural statement)」を参照。 選択 (selection) 特定の条件を満たす単一表の行の水平方向サブセットを指す用語。選択は、 SELECT 文の WHERE 節を介して行われ、表内の一部の行とすべての列を 戻す。「射影 (projection)」および「結合 (join)」を参照。 12 IBM Informix SQL リファレンス・ガイド ソース・ファイ ル (source file) コンパイル済みプログラムを生成するためのソースとして使用する指示 (ASCII テキストでの ) が入っているファイル。 属性 (attribute) スクリーン・フォームのフィールドのデータを表示または検証するメソッ ドの修飾子。 タイムアウト (timeout) 要求側プロセスのロック待機時間が、指定された最大時間制限を超えたた めに、ロック要求が打ち切られる時点。IBM Informix OnLine では、プログ ラム開発者は、SET LOCK MODE 文を使用して時間制限を設定することが できる。データベース管理者は、複数の IBM Informix STAR システム間で、 操作のための時間制限を設定する。 対話型 (interactive) ユーザーからの入力を受け入れ、処理し、出力を画面、ファイル、または プリンターに作成するプログラム。 タプル (tuple) 「行 (row)」を参照。 単一選択 (singleton select) 単一行を戻す SELECT 文。 チェック制約 (check constraint) INSERT または UPDATE 文を実行しているときに、データを表列に割り当 てるために満たさなければならない条件。チェック制約は検索条件を使用 して定義される。 チェックポイン ト (checkpoint) IBM Informix OnLine 操作時における、ディスク上のページと共有メモ リー・バッファー・プール内のページが同期化された時点のこと。チェッ クポイントは、論理ログに書き込まれた特殊なレコードによってマークさ れる。 チャンク (chunk) IBM Informix OnLine 用の連続した大容量のディスク・スペース・セクショ ン。チャンクは、UNIX ディスク・パーティションと対応できる。指定さ れたチャンクのセットは、DB 領域または BLOB 領域を定義する。 直列化可能トラ ンザクション (serializable transactions) 「反復読込み (REPEATABLE READ)」を参照。 用語集 13 データ型 (data type) 表変数またはプログラム変数の各列に割り当てられた記述子で、その表変 数またはプログラム変数に保持させるデータの型。Informix データ型には、 SMALLINT、INTEGER、SERIAL、SMALLFLOAT、FLOAT、DECIMAL、 MONEY、DATE、DATETIME、INTERVAL、CHAR、VARCHAR、TEXT、 および BYTE がある。 データ整合性 (data integrity) 複数のユーザーが同一データを同時に変更しようとした場合に、データ破 壊が起こらないようにするプロセス。データ整合性の制御には、ロックと トランザクション処理が使用される。 データベース (database) 特定の組織に有用な、または特定の目的に使用される情報のコレクション ( 表に含まれている )。 データベース・ アプリケーショ ン (database application) 特定のデータ操作およびレポート作成タスクを実行するために、データ ベース管理技法を適用するプログラム。 データベース・ サーバー・プロ セス (database server process) 実際にデータベース・ファイルを操作するデータベース管理システムの部 分。このプロセスは、SQL 文をデータベース・アプリケーションから受け 取り、構文解析し、データへのアプローチを最適化し、データベースから データを取得し、データをアプリケーションに戻す。データベース・サー バーは「バックエンド」または「データベース・エンジン」とも呼ばれる。 データベース・ ディクショナ リー (database dictionary) データベースの構造を記録するためにデータベース管理プログラムが使用 する表のコレクション。データベースに関する情報はデータベース・ディ クショナリーで管理される。データベース・ディクショナリーは「デー タ・ディクショナリー」または「システム・カタログ」とも呼ばれる。 データベース管 理システム (database management system (DBMS)) アプリケーション開発支援ツールおよびデータベース・サーバーを含め、 データベースの作成および管理に必要なすべてのコンポーネント。 データベース管 理者 (Database Administrator (DBA)) データベースの内容と使用に責任を持つ個人。データベースのクローズ (close a database) データベースの「現行」状態を解放すること。一時点では 1 つの現行データベースしか存在できない。 データベースの 復元 (restore a database) 「データベースの復旧 (recover a database)」を参照。 14 IBM Informix SQL リファレンス・ガイド データベースの 復旧 (recover a database) システム障害または他の破壊イベントが発生した後に、データベースを以 前の状態に復元すること。復旧では、データベースがクラッシュ直前の状 態に復元される。これは「データの復元 (data restore)」とも呼ばれる。 ディスク構成 (disk configuration) ディスクの空間の構成。ディスク入出力 (disk I/O) メモリーとディスク間で データの転送を行うプロセス。 デカルト積 (Cartesian product) あるセットの各メンバーと他のセットの各メンバーをペアにしたセット。 デカルト積は、表の間の結合条件を指定しない場合に、複数表照会を行っ た結果作成される。「結合 (join)」を参照。 デッドロック (deadlock) 各プロセスが他のプロセスによるロックの保持を待機しているため、複数 のプロセスが先へ進めない状態。IBM Informix OnLine は、デッドロック状 態の発生の可能性をモニターし、それを防止するために、デッドロックに なると予想されるロック要求出したプロセスにエラー・メッセージを送信 する。複数システムにまたがる分散照会では、IBM Informix STAR がデッド ロックを制御している。「複数サイト・デッドロック (multisite deadlock)」 を参照。 デバッガー (debugger) プログラムを分析し、プログラム・ロジックのエラーを検出し、突き止め るソフトウェア製品。IBM Informix 4GL Interactive Debugger は 4GL ソース 言語デバッガーで、プログラム・ロジックのトレース、定義済みポイント での実行の停止など、広範囲にわたるプログラミング・ツールをサポート している。「ブレークポイント (breakpoint)」および「トレース・ポイント (tracepoint)」を参照。 デバッグ・ファ イル (debug file) デバッグ用の出力を受け取るファイル。デフォルト (default) ユーザーがア クションを明示的に指定しなかった場合のプログラムの動作方法。 デフォルト値 (default value) 明示的な値を指定しなかった場合に列に挿入される値。デフォルト値を列 に割り当てるには、ALTER TABLE および CREATE TABLE 文を使用する。 動作モード (operating mode) IBM Informix OnLine の操作状態を指す用語。動作モードには、オフライン、 静止、オンライン、シャットダウン、および復旧の 5 つのモードがある。 動的文 (dynamic statements) プログラムの作成時ではなく、プログラムの実行時に作成される SQL 文。 動的文の作成には、IBM Informix 4GL および IBM Informix 埋め込み言語製 品の PREPARE 文が使用される。 用語集 15 トランザクショ ン (transaction) 単一の作業単位として扱われる 1 つ以上の SQL 文のコレクション。トラン ザクション内のいずれかの文が失敗すると、トランザクション全体がロー ルバック ( キャンセル ) されることがある。トランザクションが正常終了す ると、作業はコミットされ、トランザクションで行われたデータベースに 対するすべての変更が受け入れられる。 トランザクショ ン・ログ (transaction log) 「論理ログ (logical log)」を参照。トレース (trace) プログラム変数、引数、 式、などの値の実行リストをストアード・プロシージャーで保持すること。 トレース・ポイ ント (tracepoint) デバッガーによって指定された名前付きオブジェクトで、プログラマーは、 それを文、プログラム・ブロック、または変数に関連付けることができる。 トレース・ポイントに達すると、デバッガーは、関連付けられた文、プロ グラム・ブロック、または変数に関する情報を表示し、プログラマーに よって指定されたすべてのオプション・コマンドを実行する。トレース・ ポイントが有効になるようにしておかなければならない。「デバッガー (debugger)」を参照。 入力 (input) 外部ソースから ( たとえば、キーボード、ファイル、または他のプログラ ム ) から受け取り、プログラムによって処理される情報。 排他アクセス (exclusive access) ユーザーが情報に対する独占的なアクセス権を持っていること。他のユー ザーは、データベースまたは表を使用できない。 排他レベル (level of isolation) 「プロセス排他設定 (process isolation)」を参照。 排他ロック (exclusive lock) 単一のプロセスがオブジェクト ( 行、ページ、表、またはデータベース ) に 掛けるロックで、他のプロセスはこのオブジェクトに対していかなる種類 のロックも取得することはできない。バイト (byte) ストレージの単位。1 つ の文字とほぼ対応している。K バイトは 1024 バイト。M バイトは 106 バイ ト。(BYTE と大文字で示されている場合は、Informix データ型を指す。) 配列 (array) 同一型の項目のセット。配列の個々のメンバーは「エレメント」と呼ばれ、 通常、配列内のエレメントの位置を示す整引数によって区別される。Informix 配列は、最高 3 次元にすることができる。 16 IBM Informix SQL リファレンス・ガイド 破損したイン デックス (corrupted index) 表と正確に対応しないインデックス。 破損したデータ ベース (corrupted database) 表やインデックスに不完全または無効なデータが含まれたデータベース。 パターン (pattern) 識別可能なまたは繰り返し可能な一連の文字または記号。 バックアップ (backup) コンピューター障害やその他の事故の発生に備えて、コンピューター・ ファイルを他のデバイスに複写して既存の作業を保存すること。 パッドする (pad) 行、ストリング、またはフィールドの先頭または末尾の空の場所を埋める こと。通常、スペースまたはブランクが使用される。 バッファー (buffer) プログラムが一時的にデータを格納するコンピューター・メモリーの部分。 一般に、データは、バッファーに読み込まれたり、バッファーからディス クに書き込まれる。 バッファー付き ログ (buffered log) トランザクションがいつコミットまたはロールバックされるかに関係なく、 バッファーがいっぱいになるまでトランザクションをメモリー・バッ ファーに保持する。IBM Informix OnLine ではこのオプションが用意されて いるので、これを利用すればディスク書き込み回数が減り操作が速くなる。 パラメーター (parameter) 指定されたアプリケーションの定数値に与えられる変数。一般にサブルー チンでは、パラメーターは、そのルーチンに渡された引数値を使用する。 反転表示 (highlight) 画面上の場所をマークする長方形の逆転表示域。反転表示は、しばしば、 メニュー上の現行オプションまたは編集セッションでの現行文字を示す。 端末が強調表示を行えない場合は、しばしば現行オプションが不等号括弧 内に表示され、現行文字はにはアンダーラインが示される。 引数 (argument) 関数、ルーチン、またはコマンドに渡される値。 ビュー (view) データベースの内容を示す動的に制御されたピクチャーで、これを使用し て、ユーザーがどの情報を見たいか、操作したいかを判別することができ る。ビューは、指定された SELECT 文に基づいて仮想表を表す。 用語集 17 表 (table) 長方形のデータの配列で、各行が単一のエンティティーを記述し、各列に は、各記述カテゴリーごとの値が含まれている。たとえば、表には、顧客 の名前やアドレスを含めることができる。それぞれの行は、異なる顧客に 対応し、列は名前とアドレス項目に対応している。表は「関係」とも呼ば れる。 表示フィールド (display field) データを画面上のどこに表示するかを示すために、スクリーン・フォーム で使用される。表示フィールドは、通常、表の列と関連付けられている。 表示ラベル (display label) 照会での列または式の一時的な名前。 表領域 (tblspace) IBM Informix OnLine において、表に割り当てられたエクステントの論理コ レクション。ブール型 (Boolean) 論理値 TRUE (1)、FALSE (0)、または UNKNOWN (NULL 値が関係している場合 ) を取ることができる変数または 式。 ファイル (file) システム上に一緒に格納した関連情報のコレクション。たとえば、レター またはレポート内の語、コンピューター・プログラム、またはデータのリ スト。 ファイル・サー バー (file server) ディスクのセットを管理し、ストレージ・サービスをネットワーク上のコ ンピューターに提供するネットワーク・ノード。 ファイルのク ローズ (close a file) ファイルとプログラムの間の関連を解放すること。 ファイル名の拡 張子 (filename extension) ピリオドの後にあるファイル名の一部。たとえば、DB-Access は拡張子 .sql をコマンド・ファイルに追加します。 フォーム仕様 (form specification) フォームの外観と実行方法を記述する指示が入っているシステム・ファイ ル。フォーム仕様は、前もってコンパイルしておかないと使用できない。 フォールト・ト レランス ( 耐故 障性 ) (fault tolerance) 「高可用性 (high availability)」を参照。 18 IBM Informix SQL リファレンス・ガイド 複合インデック ス (composite index) 表の複数の列について構築されるインデックス。複合インデックスによっ て要求される整列は、最初の命名列では変化が最も少なく、最後の命名列 では変化が最も多い。 複合結合 (composite join) 各表の複数列間の関係に基づく、2 つの表の結合。 副照会 (subquery) 他の SQL 文の一部として埋め込まれている照会。たとえば、INSERT 文に、 VALUES 節を含めるのではなく、SELECT 文が挿入済み値を提供する副照 会を含めることができる。また、UPDATE 文に、SELECT 文が更新値を提 供する副照会を含めることもできる。あるいは、SELECT 文に、2 番目の SELECT 文が最初の SELECT 文の WHERE 節の修飾条件を提供する副照会 を含めることもできる。(CREATE VIEW 文または UNIONS を参照している 場合を除き、副照会は、常に小括弧で区切られる。) 複数サイト・ デッドロック (multisite deadlock) 複数の IBM Informix STAR システムにまたがって分散照会を行ったために 各プロセスで発生したデッドロック。 増進可能なロッ ク (promotable lock) 共有ロックから排他ロックへ変更できるロック。「更新ロック (update lock)」 を参照。 プッシュ (push) 値をメモリー内のスタックに配置すること。「スタック (stack)」および 「ポップ (pop)」を参照。 フッター (footer) 「ページ・トレーラー (page trailer)」を参照。 物理ログ (physical log) 最後のチェックポイント以降に変更されたすべてのページの前イメージが 入っている、IBM Informix OnLine のディスク領域を割り当てたもの。 浮動小数点数 (floatingpoint number) 精度が固定され ( 合計桁数 )、小数点以下桁数 ( 小数点の右側の桁数 ) が未 定義である数字。割り当て値を表すために、小数点は「浮動」である。 フラグ (flag) コマンド行オプションの 1 つで、UNIX では、通常、マイナス記号 (-) で示 される。たとえば、DB-Access では、-e フラグが画面への入力をエコーイ ングする。 用語集 19 プリプロセッ サー (preprocessor) 高水準プログラムを取り入れ、C や Micro Focus COBOL/2 などの、標準の 言語コンパイラーがコンパイルできるコードを作成するプログラム。 ブレークポイン ト (breakpoint) デバッガーによって指定された名前付きオブジェクト。プログラマーはこ のオブジェクトを文、プログラム・ブロック、変数、または論理条件と関 連付けることができる。ブレークポイントに達すると、プログラム実行が 一時停止するので、プログラマーは、プログラム変数の現行値や実行ス タックを調べたり、オプションで、その時点でデバッガー・コマンドを実 行したりできる。ブレークポイントが有効になるようにしておかなければ ならない。「デバッガー (debugger)」を参照。 プログラム・ブ ロック (program block) 特定のタスクを実行する文の名前付きコレクション。プログラム・コード の単位。4GL では、MAIN、FUNCTION、REPORT、または GLOBALS セク ションを指す。プログラム・ブロックは、「関数 (function)」、「プロシー ジャー (procedure)」、 「ディビジョン (division)」 、または「ルーチン (routine)」とも呼ばれる ( ただしこれらの用語は、言語によって、微妙な、 しかし明確な意味の違いがある )。 プログラム制御 (program control) コンピューターが取るアクションで、ユーザーが取るアクションと対比さ れる。 プロシージャー (procedure) プロシージャー 文 (procedural statements) 「プログラム・ブロック (program block)」を参照。 各種のアクション ( たとえば、条件が満たされた場合のループや分岐など ) を指定するプログラム言語文。「宣言文 (declarative statement)」を参照。 プロセス (process) 「データベース・サーバー・プロセス (database server process)」を参照。 プロセス排他設 定 (process isolation) 複数のユーザーが共通データ、特に、読み取り専用 SQL 要求のロック・ス トラテジーに関連するデータにアクセスしようとするときに、それらの ユーザー間でのプロセス独立性のレベル。各種の排他レベルが、主として、 共有ロックを取得し保持する ( または取得し保持できる ) 時間の長さによっ て区別されている。IBM Informix SE は、変更が不可能な 排他なし ( 「DIRTY READ」と呼ばれる ) というレベルを設定している。IBM Informix OnLine の場合、プログラマーは 4 つの排他レベルから選択することができ る。「DIRTY READ」、 「COMMITTED READ」 、「CURSOR STABILITY」、お よび「REPEATABLE READ」を参照。 20 IBM Informix SQL リファレンス・ガイド プロトコル (protocol) コンピューター間の通信を管理するルールのセット。これらのルールは、 フォーマット、タイミング、順序付け、およびエラー制御を管理する。 文 (statement) 単一のアクションを記述したプログラム・コードの行または行のセット ( たとえば、SELECT 文または UPDATE 文 )。 分散オプション (distributed option) 複数データベースのデータにアクセスできること。これらのデータベース は同一ハードウェア上にあっても、コンピューター・ネットワーク上に あってもよい。( IBM Informix OnLine は複数データベース照会を実行する ことができる。IBM Informix STAR は複数の OnLine データベース・サー バー上のデータベースを照会することができる。) 文識別子 (statement identifier) PREPARE 文に定義されたデータ構造体を表す埋め込み変数名または SQL 文識別子。これは、IBM Informix 4GL および IBM Informix 埋め込み言語製 品によって SQL 文管理に使用される。 文ブロック (statement block) プログラムのセクションを指す用語。通常、“begin” や “end” 特殊記号で開 始され、終了している。文ブロックは、プログラム変数の最小単位の参照 範囲である。 ページ (page) IBM Informix OnLine によって使用されるディスクとメモリー・ストレージ の基本単位。このサイズはポート用に固定されており、ユーザーがそれを 調整することはできない。 ページ・トレー ラー (page trailer) レポートの各ページの最下部に出力される項目 ( たとえば、ページ番号 )。 ページ・トレーラーは「フッター (footer)」とも呼ばれる。「柱」はレポー トの各ページの最下部に現れる。 ページ・ヘッ ダー (page header) レポートの各ページの最上部に出力される項目 ( たとえば、タイトルや日 付 )。 「欄外見出し」はレポートの各ページの最上部に現れる。 並列性 (concurrency) 2 つ以上のプロセスが同一のデータベースを同時にアクセスできること。 ヘッダー (header) 別名 (alias) 「ページ・ヘッダー (page header)」を参照。 照会における表の一時的な代替名。通常、複雑な副照会で使用され、セル フ結合には必須である。フォーム仕様ファイルまたは任意の SQL 照会で は、別名 は、より複雑な表名 ( たとえば、owner.table name) の代わりに使用 される単一語の代替名を指す。 用語集 21 ヘルプ・メッ セージ (help message) 対話型プログラムのユーザーを援助するために、自動的に、またはユー ザーの要求に応じて表示されるオンライン・テキスト。これらのメッセー ジはヘルプ・ファイルに格納される。 変数 (variable) メモリー内の格納場所を示す識別子で、プログラムの実行中に変更できる 値を持つプログラム・オブジェクトの値を格納している。 ホーム・サー バー (home server) IBM Informix STAR システムのネットワークを介した分散照会で現行データ ベースがアクセスする最初のデータベース・サーバー。 ホーム・ページ (home page) データ行の先頭バイトが入っているページ。データ行がそのオリジナルの 格納域をはみ出しても、ホーム・ページは変更されない。ホーム・ページ には、データ行の新規格納場所を指す正方向ポインターが含まれている。 「残余ページ (remainder page)」を参照。 ポインター (pointer) 当該データまたは変数のメモリー内のアドレスを指定する数字。 ホスト変数 (host variable) 文で参照される C または COBOL プログラム変数。ホスト変数は、その前 に付いたドル記号 ($) またはコロン (:) によって識別される。 ポップ (pop) メモリー内のスタックから値を削除すること。 「スタック (stack)」および 「プッシュ (push)」を参照。 マクロ (macro) 指示のセットに与えられた名前で、この名前が参照されるたびにコン ピューターが実行される。 ミラーリング (mirroring) 同一データを 2 つのチャンクに同時に格納すること。1 つのチャンクが失敗 しても、データは引き続き、ミラーリングされたペアのもう一方のチャン クで使用することができる。このオプションは、IBM Informix OnLine で提 供される。 メッセージ・ロ グ (message log) IBM Informix OnLine が、重要なイベント、たとえば、チェックポイント、ログ・ファイルの埋 め込み、復旧データ、エラーなどを記録するために保持している UNIX ファイル。 メニュー (menu) コンピューターに実行させるコマンドを選択するための画面表示。 22 IBM Informix SQL リファレンス・ガイド モジュール (module) モジュール変数 (module variable) 単一のシステム・ファイルに常駐するプログラムの一部。各ファイルは 1 つのモジュールを表す。複数のプログラムをまとめて単一のモジュールに 常駐させることもできるし、それらをいくつかのモジュールに収容して、 それぞれに特定の関数または目的を実行させることもできます。 同一モジュール内の任意のプログラム・ブロックから参照できるが、他の モジュールからは参照できない値を持つ変数。 「変数 (variable)」および 「参照範囲 (scope of reference)」を参照。 モノクロ (monochrome) 1 つの色しか表示できないモニターを示す用語。 ユーザー・イン ターフェース (user interface) ユーザーが入力した情報に基づいて、入力をプロンプトで要求し、出力を 表示することにより、ユーザーと通信するプログラムの一部。代表的な ユーザー・インターフェースには、メニュー、プロンプト、スクリーン・ フォーム、およびオンライン・ヘルプ・メッセージがある。 予約語 (reserved word) 言語やプログラムの他のコンテキストで使用すると、必ず警告またはエ ラー・メッセージが出る文またはコマンドの中の単語。 ライブラリー (library) プリコンパイルされた関数またはルーチンのコレクションで、特定の種類 のアプリケーションに共通なタスクを実行するためのもの。ユーザーの製 品には、ユーザーのプログラムから呼び出すことができるライブラリー関 数またはルーチンがインクルードされている場合がある。 ラッチ (latch) ユーザー・プロセスが共有メモリーの項目を修正しようとするときに、 IBM Informix OnLine がそれを調整するために使用する。 リテラル (literal) 文字定数。たとえば、PICTURE 属性のフォーマット・ストリングで は、A、#、および X 以外のすべての文字がリテラルである。なぜならば、 それらの文字は、フォーマット・ストリングに現れたとおりに表示される からである。 リレーショナ ル・データベー ス (relational database) データを格納するために表構造体を使用するデータベース。表間の関係は、 ユーザーがデータベースにアクセスするときに論理的に指定され、データ 構造体そのものには作成されない ( 他の一部のデータベース・システムと は異なる )。 リンク (link) 別個にコンパイルされたプログラム・モジュールを 1 つの実行可能プログ ラムに結合するプロセス。 ルーチン (routine) 「プログラム・ブロック (program block)」を参照。 用語集 23 ルート DB 領域 (root dbspace) IBM Informix OnLine システムの初期 DB 領域。すべてのデータに加え、 ルート DB 領域にはすべてのシステム管理表も含まれている。 例外 (exception) データベース・サーバーによって戻されたエラー、またはストアード・プ ロシージャー文によって開始された状態を指す。 レコード (record) 「行 (row)」を参照。 列 (column) 表のすべての行に存在する特定タイプの情報を含むデータ要素。列も、画 面またはウィンドウ内の位置を参照できる。 レポート・ライ ター (report writer) ユーザーがレポート作成言語を使用してレポートの体裁を記述するプログ ラム ( たとえば、ACE)。次に、レポート・ライターはこのレポート仕様を 実行可能レポートにコンパイルすることができる。 レポート仕様 (report specification) レポートの記述が含まれているファイルまたはプログラム・ セグメント。レポートは、レポート作成言語で記述される。 連結 (concatenate) 2 番目のストリングを最初のストリングの末尾に追加したときに作成され る文字ストリングを形成すること。 連結演算子 (concatenation operator) 2 つのストリングを結合したことを示すために式で使用される 2 つのパイプ 記号 (||) からなる記号表記。 ロールバック (roll back) データベースに対するアクションまたは一連のアクションを逆転させるこ と。データベースは、文が実行される前の状態に戻される。 「トランザク ション (transaction)」を参照。 ロールフォワー ド (roll forward) データベースを最新の状態にすること。このプロセスは、通常、システ ム・クラッシュまたはその他の障害が発生した後にデータベースが復旧し た ときに行われる。IBM Informix SE では、データベースのアーカイブ・コ ピーがディスクに復元され、データベースが障害発生直前のポイントに ロールフォワードされる。IBM Informix OnLine では、データベースのアー カイブ・コピーがディスクに復元され、論理ログ・レコードが障害発生直 前のポイントにロールフォワードされる。 ロウ・デバイス (raw device) キャラクター・スペシャル・デバイスとして定義されていて、マウントさ れない UNIX ディスク・パーティション。 ログイン (login) 自分自身をコンピューターに識別させること。 24 IBM Informix SQL リファレンス・ガイド ロック (locking) 各並行プロセス間で対話の矛盾が発生しないようにするために、オブジェ クト ( データベース、表、ページ、または行 ) へのアクセスを一時的に制限 すること。ロックは、排他モード ( 読み取りアクセスと書き込みアクセス の両方を 1 人のユーザーに制限する )、または共有モード ( 他のユーザーに も読み取り専用アクセスを許可する ) のいずれかである。また、共有モー ドで開始されるが、行が実際に変更されると、排他モードにアップグレー ドされる更新ロックもある。 ロック・モード (lock mode) すでにロックされたオブジェクトに対するロックを要求するユー ザーが、(1) ロックを待機しないでエラーを受け取るか、(2) オブジェクト が解放されるまで待ってロックを受け取るか、または (3) 特定の時間待機し た後でエラーを受け取るかを設定するオプション (IBM Informix OnLine で のみ提供されるオプション )。IBM Informix OnLine では、ロック・モード は、プログラマーが選択する標準のロック単位 ( ページまたは行のいずれ か ) を指すこともある。 ロック範囲 (locking granularity) ロックされるオブジェクトのサイズ。このサイズは、データベース、表、 ページ、または行にすることができる。 論理ログ (logical log) ログがアクティブ状態になっていたときにデータベースに対して行ったす べての変更のレコードを保持するディスク領域の割り当て。論理ログは、 トランザクションのロールバック、システム障害からの復旧、およびアー カイブからのデータベースの復元を行うために使用される。論理ログは、 「トランザクション・ログ (transaction log)」とも呼ばれる。 ワイルドカード (wildcard) ゼロまたはそれ以上の文字の任意のシーケンスまたは任意の単一文字を表 す特殊記号。たとえば、SQL では、アスタリスク (*)、疑問符 (?)、大括弧 ([ ])、パーセント記号 (%)、およびアンダースコアー (_) をワイルドカード 文字として使用することができる。(UNIX では、アスタリスク、疑問符、 および大括弧もワイルドカードである。) 割り込み (interrupt) 現行プロセスを一時的または永続的に停止できる、ユーザーまたは他のプ ロセスからのシグナル。「シグナル (signal)」を参照。 幻行 (phantom row) トランザクションの実行中に、最初、変更または挿入されたが、後でロー ルバックされた表の行。排他レベルが DIRTY READ であれば、別のプロセ スが幻行を見ることができる。その他の排他レベルでは、変更されたがコ ミットされない行を見ることはできない。 従表 (subservient table) 「外部結合 (outer join)」を参照。 用語集 25 ANSI American National Standards Institute ( 米国規格協会 ) の頭字語。ANSI は、 SQL 言語のための標準を含め、コンピューター業界のための標準を設定す る。 ANSI 標準準拠 の (ANSIcompliant) 特定の ANSI パフォーマンス標準に準拠するデータベースを指す用語。 Informix データベースは、ANSI 標準準拠としても、非 ANSI 標準準拠とし ても作成できる。ANSI 標準準拠データベースは、非 ANSI 標準準拠データ ベースでは課されない特定の ANSI 要件を課す。たとえば、暗黙的なトラ ンザクション、必須の所有者名の指定、非バッファー付きログ機能 (IBM Informix OnLine を使用する場合 ) など。 ASCII American Standards Committee for Information Interchange ( 情報交換用米国標 準コード ) の頭字語。多くの場合、コンピューターや通信で使用される印 刷可能文字や非印刷可能文字の順序セットを記述するために使用される。 B+ ツリー (B+ tree) レコード抽出の効率を高めるためにインデックスを編成するメソッドの 1 つ。 BLOB (blobs) Binary Large Objects ( バイナリー・ラージ・オブジェクト ) の頭字語。 BLOB は、実質的には最大サイズを持たないデータ・オブジェクトである ( 理論的には、231 バイトの大きさを持つ )。 BLOB 記述子 (blob descriptor) BLOB データをインクルードする行の BLOB 列位置に格納されている 56 バ イトのポインター。記述子は、BLOB データが格納されている DB 領域ま たは BLOB 領域 BLOB ページの最初のセグメントを指している。 BLOB ページ (blobpage) IBM Informix OnLine の BLOB 領域におけるディスク割り当ての単位。シス テム管理者が BLOB ページのサイズを決定する。このサイズは、BLOB 領 域ごとに異なる。 BLOB 領域 (blobspace) IBM Informix OnLine の TEXT および BYTE データを格納するために使用さ れるチャンクの論理コレクション。 capability termcap ファイルまたは terminfo ディレクトリーで使用されるコードで、画 面のサイズや画面をクリアするかどうかなどの端末機能を指定する。 COMMIT WORK トランザクションの開始以降の、データベースに対するすべての変更を受 け入れて、トランザクションを終了すること。 26 IBM Informix SQL リファレンス・ガイド COMMITTED READ ( 確定読込み ) IBM Informix OnLine で使用できるプロセス排他設定のレベルの 1 つで、 ユーザーは、照会要求を出した時点でコミットされている行のみを表示す ることができる。つまり、ユーザーは、現在コミットされていないトラン ザクションの一部として変更された行は表示できない。これは、ANSI 標準 準拠でないデータベースに対する、IBM Informix OnLine 下におけるデフォ ルトの排他レベルである。 「プロセス排他設定 (process isolation)」を参照。 コンパイル (compile) 指示 ( 高水準言語の ) が入っているファイルを、対応 するマシン・レベル指示が入っているファイルに変換すること。 CURSOR STABILITY ( カーソル安定性 ) IBM Informix OnLine で使用できるプロセス排他設定のレベルの 1 つで、 データベース・サーバーは、FETCH 文を使用して取り出した行に対して共 用ロックを取得しないと、その行を表示できない。データベース・サー バーは、FETCH 文を使用して新規行を取り出すための要求を受け取るま で、ロックを掛けたままにしている。 「プロセス排他設定 (process isolation)」 を参照。 DB モニター (DB-Monitor) システム管理者が IBM Informix OnLine データベース・サーバーをモニター および変更するために使用できる一連の画面を提供するインターフェース。 DB 領域 (dbspace) IBM Informix OnLine のディスク領域を表すチャンクの論理コレクション。DB 領域が UNIX ファイル・システムのディレクトリーと対応していることもある。 たとえば、特定の DB 領域に表を作成することができる。 DBA Database Administrator ( データベース管理者 ) の頭字語。 DBA アクセス権 付き (DBAprivileged) 実際に DBA アクセス権を持つユーザーによって使用されなくても、DBA 全般に関連するアクセス権を持つことを指す用語。 DIRTY READ( 単 純読込み ) プロセス排他設定の 1 つで、ロックを扱わず、既存のすべての行 ( 現在非 コミット・トランザクションの中から変更できる行でも ) を表示できるよ うにする。DIRTY READ は、最も低い排他レベル ( まったく排他がない ) である。つまり、IBM Informix SE が通常作動するレベルであり、IBM Informix OnLine のもとでのオプションのレベルである。「プロセス排他設定 (process isolation)」を参照。 DOS エンジン (DOS engine) SQL 文の実行を処理する DOS 環境用の IBM Informix データベース製品の部 分。「データベース・サーバー (database server)」も参照。 用語集 27 Esc キー (escape key) ほとんどの UNIX および DOS システムで、あるモードを終了し、別のモー ドを開始するために使用されるキー ( 通常、ESC とマークされる )。多くの 端末では、このキーは、PERFORM および IBM Informix 4GL スクリーン・ フォームに対するデフォルトの ACCEPT キーである ( 照会でテキスト入力 を終了したときに、追加、更新、または削除アクションを示すために使用 される )。 infocmp UNIX プログラムの 1 つ。これを使用して、terminfo ディレクトリーのファ イルを表示またはデコンパイルでき、また、コンパイル済みの terminfo 項 目と termcap ファイル内の項目を比較することもできる。 ISAM Indexed Sequential Access Method ( 索引順次アクセス方法 ) の頭字語。アクセ ス方法は、より大きな情報のセット ( 表 ) から情報の断片 ( 行 ) を抽出する 方法である。索引順次アクセス方法を使用すれば、情報を特定の順序で検 出したり、特定の情報の断片をインデックスで迅速に見つけ出したりでき る。 NULL 値 (null value) 「不明」または「該当せず」を表す値 (NULL はゼロまたはブランクの値と 同じではない )。 PREPARE 文で処 理された文 (prepared statement) 実行時に作成された文字ストリングをデータベースの要求に変換する SQL 文。この機能を使用すれば、プログラムを修正して再コンパイルすること なく、プログラムの実行中に要求を作成することができる。 REPEATABLE READ ( 反復読込 み) IBM Informix OnLine で使用できるプロセス排他設定レベルの 1 つで、トラ ンザクションの実行時に読み取られたすべてのデータが他のプロセスに よって変更されないようにする。REPEATABLE READ のトランザクション は「直列化可能トランザクション (serializable transactions)」とも呼ばれる。 REPEATABLE READ は、IBM Informix OnLine の場合、ANSI 標準準拠デー タベースに対してはデフォルトの排他レベルである。 「プロセス排他設定 (process isolation)」を参照。 SPL Stored Procedure Language ( ストアード・プロシージャー言語 ) の頭字語。 SQL Structured Query Language ( 構造化照会言語 ) の頭字語。IBM によって開発さ れ、ANSI によって標準化されたデータベース照会言語。IBM Informix リ レーショナル・データベース管理製品は、ANSI 標準 SQL に基づいて作成 される。 28 IBM Informix SQL リファレンス・ガイド SQLCA SQL CommunicationsArea (SQL 通信域 ) の頭字語。これは、最後に実行され た SQL 文に関する情報を格納するデータ構造体である。データベース・ サーバーによって SQLCA に戻された結果コードは、IBM Informix 4GL およ び IBM Informix 埋め込み言語製品によってエラー処理に使用される。 sqlda SQL DescriptorArea (SQL 記述子領域 ) の頭字語。これは、動的 SQL 文に よって使用された値に関する記述情報を保持するデータ記述子の配列が 入っている構造体である。これは ESQL/C によって使用することができる。 「記述子 (descriptor)」を参照。 sqlexecd クライアントからの要求を受け取り、データにアクセスするデータベー ス・サーバー・プロセスを作成する IBM Informix NET プロセス。 TCP/IP Transmission Control Protocol/Internet Protocol。DOS、UNIX、およびその他 の環境で使用されているポピュラーなネットワーク。 termcap 共通端末の名前と機能が入っている ASCII ファイル。 terminfo 端末機能のコンパイル済みファイルが入っている階層ディレクトリー構造 体。 tic terminfo ソース・ファイルまたは、infocmp を使用してデコンパイルされた terminfo ファイルをコンパイルする UNIX プログラム。「infocmp」を参照。 TLI Transport Level Interface。ネットワーク・プロトコルから独立したアプリ ケーション・プログラムが使用するように設計されたインターフェース。 用語集 29 30 IBM Informix SQL リファレンス・ガイド 索引 索引 記号 .dbs 拡張子 7-51, 7-103 .lok 拡張子 7-317 || 連続演算子 7-377 A ABSOLUTE キーワード FETCH で使用 7-158 FETCH での構文 7-155 ACCESS FOR キーワード、 INFO 文 7-190 ADD CONSTRAINT キ ーワ ー ド、ALTER TABLE での構文 720 ALL キーワード 構文 GRANT 7-182 REVOKE 7-254 SELECT 7-265 UNION 演算子 7-263 式 7-387 使用 GRANT で 7-183 REVOKE 7-255 SELECT 7-266 UNION 演算子 7-293 式 7-398 条件副照会 7-362 副照会の開始 7-281 ALLOCATE DESCRIPTOR 文 構文 7-13 連結演算子 7-377 ALTER INDEX 文 クラスター・インデックス の削除 7-19 クラスター・インデックス の作成 7-17 構文 7-17 ALTER TABLE 文 ADD CONSTRAINT 節 7-33 ADD 節 7-22 CHECK 節 7-28 DEFAULT 節 7-23 DROP CONSTRAINT 節 735 DROP 節 7-29 LOCK MODE 節 7-36 MODIFY NEXT SIZE 節 735 PAGE キーワード 7-36 REFERENCES 節 7-27 ROW キーワード 7-36 アクセス権 7-178 一意性制約のルール 7-33 主キー制約のルール 7-34 次のサイズの変更 7-35 表の再クラスター化 7-18 表ロックモードの変更 7-36 列制約の削除 7-35 列制約の追加 7-32 列データ型の変更 7-30 列の削除 7-29 列の追加 7-22 Alter アクセス権 7-183 ALTER キーワード GRANT で使用 7-183 構文 GRANT 7-178 REVOKE 7-254 使用 REVOKE 7-255 AND キーワード 使用 BETWEEN キーワード CREATE VIEW での 7100 GRANT 7-186 表示ラベル 7-269 表の別名 7-276 ASC キーワード 構文 CREATE INDEX で の 7-55 SELECT 7-288 7-277 条件セグメント 7-363 条件 セグ メン トの 構文 7- 使用 CREATE INDEX で の 7-57 350 AND 論理演算子 7-363 ANSI 標準準拠 -ansi フラグ 4-7, 7-70, 7-77, 799 行の更新 7-333 表の命名 7-248 レベル -24 ANSI 標準準拠データベース BEGIN WORK を持つ 7-38 FOR UPDATE が不要 7-112 IBM Informix SE で の使 用 7-54 インデックス命名 7-365, 7417, 7-439 作成、START DATABASE 7-323 説明 7-52 表アクセス権 7-77 プロシージャー命名 7-429 ANY キーワード WHENEVER 7-345 条件副照会での使用 7-362 副照会の開始 7-281 WHENEVER 7-343 AS キーワード SELECT 7-265 構文 CREATE VIEW での 798 GRANT 7-178 LOAD 文の要件 7-205 UNLOAD 文に関する考慮 事項 7-327 構文 7-370 ス ト ア ー ド・プ ロ シ ー ジャー 8-43, 8-47 説明 3-5 使用 ASCII 照合順序 7-435 AVG 関数 式での使用 7-399 式の構文 7-387 B BEGIN WORK 文 構文 7-37 トラ ンザ クシ ョン 内で の ロック 7-37 BETWEEN キーワード 構文、条件セグメント 7-351 使用 SELECT 7-277 条件セグメント 7-354 Binary Large Object (BLOB) 影響、検査時の排他 7-314 Bourne シェル、環境変数の設定 方法 4-4 BUFFERED LOG キーワード CREATE DATABASE での 構文 7-50 CREATE DATABASE での 使用 7-53 BUFFERED キー ワー ド、SET LOG の構文 7-319 BYTE データ型 BYTE 列の選択 3-6 2 IBM Informix SQL リファレンス・ガイド C C シェル、環境変数の設定方法 4-4 CALL キーワード、WHENEVER 文 7-343, 7-348 CALL 文 値の割り当て 8-25 構文 8-37 実行、プロシージャー 8-11 CHAR データ型 INSERT 7-433 構文 7-370 説明 3-6 データ型の変更 3-22 デフォルト値として使用 724, 7-83 CHECK TABLE 文、構文と使用 法 7-39 CHECK キーワード ALTER TABLE での使用 728 CREATE TABLE での使用 7-90 CLOSE DATABASE 文 クローズの前提条件 7-45 構文 7-45 CLOSE 文 INSERT カーソルのクロー ズ 7-42 SELECT カーソルの終了 742 構文 7-41 トランザクションの終了に より影響を受ける カーソル 7-43 連結演算子 7-377 CLUSTER キーワード 構文 ALTER INDEX 内の 717 CREATE INDEX で の 7-55 使用 CREATE INDEX で の 7-56 使用法 ALTER INDEX での 718 COLUMNS FOR キ ーワ ード、 INFO 文 7-189 COMMIT WORK 文 構文 7-47 COMMITTED READ キ ーワ ー ド、SET ISOLATION における 構文 7-312 Connect アクセス権 7-180, 7-256 CONNECT キーワード GRANT 7-180 REVOKE 7-256 CONSTRAINT キーワード ALTER TABLE での 7-32 CREATE TABLE での 7-84 CONTINUE キ ーワ ード、 WHENEVER 文 7-343, 7-348 CONTINUE 文 構文 8-40 ループの終了 8-27 COUNT 関数 式での使用 7-398, 7-400 COUNT キー ワー ド、SET DESCRIPTOR での使用 7-300 COUNT フィールド 取得、 GET DESCRIPTOR で コン テン ツを 7172 使用、GET DESCRIPTOR 7174 設定、WHERE 節の値を 7- 298 CREATE AUDIT 文 アーカイブの必要 7-49 更新記録の開始 7-48 構文 7-48 CREATE DATABASE 文 ANSI 準拠 7-52 OnLine でのロギング 7-52 構文 7-50 使用 CREATE SCHEMA SE 7-69 IBM Informix SE 7-53 での使用 PREPARE 7-51 CREATE INDEX 文 暗黙的表ロック 7-56 構文 7-55 使用 ASC キー ワー ドを 使 用した 7-57 CLUSTER キーワード を使用した 756 CREATE SCHEMA を 使用した 7-69 DESC キーワード を使 用した 7-57 UNIQUE キー ワー ド を使用した 756 複合インデックス 7-57 CREATE PROCEDURE FROM 文 埋め込み言語 8-8 構文と使用法 7-68 CREATE PROCEDURE 文 CREATE PROCEDURE FROM 内 8-8 構文 7-59 使用 8-7 CREATE SCHEMA 文 CREATE シー ケン スを 使 用した 7-70 GRANT を使用した 7-70 構文 7-69 CREATE SYNONYM 文 ANSI 標準準拠の命名法 772 CREATE SCHEMA を使 用 した 7-69 構文 7-71 シノニムに対するアクセス 権 7-71 シノニムのチェーニング 774 ビューのシノニム 7-71 表のシノニム 7-71 CREATE TABLE 文 BLOB データ型を持つ 7-85 CHECK 節 7-90 CREATE SCHEMA を使 用 した 7-69 DEFAULT 節 7-82 IN DB 領域節 7-93 LOCK MODE 節 7-96 REFERENCES 節 7-87 一意性制約のルール 7-87 一時表の作成 7-91 エクステント・サイズの指 定 7-95 構文 7-76 参照制約のルール 7-87 主キー制約のルール 7-87 制約の定義 表レベルでの 7-85 列レベルでの 7-84 データベース表の格納 7-93 表列の指定 7-81 命名規則 7-77 列 NOT NULL の設定 7-25, 7-84 CREATE VIEW 文 CREATE SCHEMA を使 用 した 7-69 SELECT * 表記を使用した 7-99 WITH CHECK OPTION 7索引 3 101 アクセス権 7-99 仮想列 7-100 構文 7-98 列データ型 7-99 CURRENT OF キーワード 構文 DELETE 7-124 UPDATE 7-331 使用 DELETE 7-125 UPDATE 7-339 CURRENT 関数 構文 INSERT 7-197 式 7-380 条件セグメント 7-351 使用 ALTER TABLE での 723 CREATE TABLE で の 7-82 INSERT 7-199 WHERE 条件 7-384 式 7-383 入力、DAY 関 数の 7384 CURRENT キーワード FETCH で使用 7-158 FETCH での構文 7-155 CURSOR STABILITY キーワー ド、SET ISOLATION における 構文 7-312 ベース 7-103 SQLAWARN 後 7-103 現行データベースの指定 7102 構文 7-102 デー タベ ース 型の 決定 7102 排他モード 7-104 プログラム変数付き 7-103 DATE 値 DBDATE 環境変数の設定 4-8 DBDATE を使用したヨー ロッパ形式の指定 4-9 DATE 関数 式での使用 7-390 式の構文 7-387 DATE データ型 DATETIME への変換 3-24 DATE 値の表現 3-28 演算の範囲 3-24 構文 7-370 説明 3-7 DATETIME データ型 DATE お よび INTERVAL を使用した演算の 範囲 3-24 DATE への変換 3-24 DATETIME 値 およ び INTERVAL 値 を 持つ 3-27 DATETIME 値の表現 3-28 DBTIME 環境変数の使用 418 D DATA フィールド 設定、SET DESCRIPTOR に よる 7-303 説明 6-7, 6-16 DATABASE 文 4GL における LIKE 7-104 DBPATH の 外部 のデー タ EXTEND 関数 付き 3-26, 327 INSERT 7-433 INTERVAL 値 との 加算 ま たは減算 3-26 値の操作 3-26 引用 符付 きス トリ ング 7432 構文 3-8, 7-370, 7-422 4 IBM Informix SQL リファレンス・ガイド 式 7-385 式の範囲 3-25 精度とサイズ 3-8 フィールド修飾子 3-8, 7-373 文字ストリング値 3-10 DATETIME フィールド修飾子 セグメント 7-373 DATETIME フォ ーマ ット、 DBTIME 環境変数を使用した 418 DAY 関数 式の構文 7-387 使用 式 7-389 DAY キーワード 構文 DATETIME デ ータ 型 7-373 INTERVAL デ ータ 型 7-419 使用 DATETIME フ ィー ル ド修 飾子 7422 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7425 INTERVAL フ ィー ル ド修飾子とし て 3-14 DB 領域 CREATE DATABASE を使 用して選択 7-50 DBA アクセス権付きプロシー ジャー 8-16 DBA キーワード GRANT で使用 7-181 REVOKE 7-256 DBANSIWARN 環境変数 4-7, 770, 7-77, 7-99 DBDATE 環境変数 4-8 DBDELIMITER 環境変数 4-9, 7- の制限 7-290 PREPARE 文で処理された 文でのカーソル 7- 206 DBEDIT 環境変数 4-10 DBFORMAT 環境変数 4-10 DBLANG 環境変数 4-11 dbload ユーティリティー DBDELIMITER を使用した フィールド区切り 文字の指定 4-9 DBMENU 環境変数 4-12 DBMONEY 環境変数 4-12 DBNETTYPE 環境変数 4-13 DBPATH 環境変数 4-14, 7-103, 7- 119 カーソル型 7-111 カーソル特性 7-112 カーソルとトランザクショ ン 7-120 構文 7-108 指定された列の更新 7-117 定義と使用 HOLD カーソル 7-114 INSERT カー ソル 7112, 7-122 SELECT カー ソル 7- 369 DBPRINT 環境変数 4-15 DBREMOTECMD 環境変数 4-16 DBSERVERNAME 関数 サーバー名を戻す 7-382 使用 ALTER TABLE での 7- 112 UPDATE カ ーソ ル 7112, 7-115 順カーソル 7-113 スクロール・カーソル 23 CREATE TABLE で の 7-82 式 7-382 DBSRC 環境変数 4-16 DBTEMP 環境変数 4-17 DBTIME 環境変数 4-18 DEALLOCATE DESCRIPTOR 文 構文 7-106 連結演算子 7-377 DECIMAL データ型 構文 7-370 説明 3-11 データ型の変更 3-22 デフォルト値として使用 724, 7-82 浮動小数点 3-11 DECLARE 文 FOR UPDATE キ ーワー ド 7-112 INSERT カーソルと HOLD 7-123 ORDER BY による SELECT 7-113 連結演算子 7-377 DECLARE 文、SELECT 付き 7272 D E F E R R E D 、S E T CONSTRAINTS 文 7-294 DEFINE 文 構文 8-41 配置 8-42 Delete アクセス権 7-182 DELETE キーワード GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 DELETE 文 CURRENT OF 節 7-125 アクセス権 7-182 カーソル付き 7-115 構文 7-124 条件セグメント 7-350 トランザクション内 7-124 DELIMITER キーワード LOAD 7-206 UNLOAD 7-328 DESC キーワード 7-289 構文 CREATE INDEX で の 7-55 SELECT 7-288 使用 CREATE INDEX で の 7-57 SELECT 7-289 DESCRIBE 文 USING SQL DESCRIPTOR 節 7-130 値、SELECT によって戻さ れた 7-129 関係、GET DESCRIPTOR と の 7-175 構文 7-127 文型の記述 7-128 連結演算子 7-377 DIRTY READ キーワード、SET ISOLATION における構文 7-312 DISTINCT キーワード 構文 CREATE INDEX で の 7-55 SELECT 7-265 式 7-387 使用 CREATE INDEX で の 7-56 SELECT 7-266 無効、副照会 7-361 DOCUMENT キーワード ス ト ア ー ド・プ ロ シ ー ジャーでの使用 88 DROP AUDIT 文 7-133 DROP CONSTRAINT キー ワー ド ALTER TABLE での構文 720 索引 5 ALTER TABLE での使用 735 DROP DATABASE 文 7-134 DROP INDEX 文 構文 7-136 DROP SYNONYM 文 7-139 DROP TABLE 文 7-141 DROP VIEW 文 7-143 DROP キーワード ALTER TABLE での構文 720 ALTER TABLE での使用 729 EXECUTE ON キーワード 構文 GRANT 7-178 REVOKE 7-252 使用 GRANT 7-184 REVOKE 7-252 EXECUTE PROCEDURE 文 FOREACH 8-55 値の割り当て 8-25 使用 8-11 EXECUTE 文 USING DESCRIPTOR 節 7148 E ERROR キ ーワ ード、 WHENEVER 文 7-343, 7-346 ESCAPE キーワード 使用 LIKE キーワード 7-279, 7-359 MATCHES キーワード 7-279, 7-359 WHERE キーワード 7278 条件セグメント 7-357 条件 セグ メン トの 構文 7351 ESQL SQL 通信領域 5-3 エラー処理 5-3 EXCLUSIVE キーワード 構文 DATABASE 7-102 LOCK TABLE 7-207 使用 DATABASE 7-104 LOCK TABLE 7-208 EXECUTE IMMEDIATE 文 構文と使用法 7-149 制限付きの文型 7-150 連結演算子 7-377 USING SQL DESCRIPTOR 節 7-147 構文 7-144 パラメーター化、文の 7-146 連結演算子 7-377 EXISTS キーワード 条件副照会での使用 7-361 副照会の開始 7-280 EXIT 文 構文 8-49 ループの終了 8-27 EXTEND 関数 DATE、DATETIME、および INTERVAL 付 き 3-26, 3-27 式の構文 7-387 EXTENT SIZE キーワード 7-95 所 7-159 順カーソル 7-157 スクロール・カーソル 7-157 プログラム配列 7-160 連結演算子 7-377 ロック、更新の 7-161 FIRST キーワード FETCH で使用 7-157 FETCH での構文 7-155 FLOAT データ型 構文 7-370 説明 3-12 データ型の変更 3-22 デフォルト値として使用 724, 7-82 FLUSH 文 構文 7-164 連結演算子 7-377 FOR TABLE キ ーワ ード、 UPDATE STATISTICS 7-341 FOR UPDATE キーワード DECLARE の構文 7-108 UPDATE との関連 7-339 使用 DECLARE 7-112, 7-115, 7-119 列リスト 7-117 FOR キーワード CONTINUE 8-40 CREATE AUDIT での 7-48 CREATE SYNONYM で の 7-71 F FETCH 文 CLOSE による影響 7-42 INTO キーワード 7-271 SQLCA による結果の検査 7-163 関係、 GET DESCRIPTOR と の 7-172 構文 7-155 指定、値のメモリー格納場 6 IBM Informix SQL リファレンス・ガイド EXIT 8-49 FOR 文 インクリメントの使用 8-52 構文 8-51 式リストの使用 8-53 ス ト ア ー ド・プ ロ シ ー ジャーでのループ 8-26 複数範囲の指定 8-53 FOREACH キーワード CONTINUE 文 8-40 EXIT 8-49 FOREACH 文 7-216 構文 8-55 ス ト ア ー ド・プ ロ シ ー ジャーでのループ 8-26 FOREIGN KEY キーワード ALTER TABLE での 7-32 CREATE TABLE での 7-85 FRACTION キーワード 構文 DATETIME デ ータ 型 7-373 INTERVAL デ ータ 型 7-419 使用 DATETIME フ ィー ル ド修 飾子 7- 425 INTERVAL フ ィー ル ド修飾子とし て 3-14 FREE 文 カーソルへの影響 7-217 効果、BYTE と TEXT 変数 の 7-170 構文 7-167 連結演算子 7-377 FROM キーワード 構文 PUT 7-234 REVOKE 7-252 SELECT 7-263 使用 PUT 7-239 SELECT 7-274 7-419 使用 GET DESCRIPTOR 文 COUNT キーワード 7-174 構文 7-172 連結演算子 7-377 GOTO キ ーワ ード、 WHENEVER 文 7-343, 7-346 GRANT 文 CREATE SCHEMA を使 用 した 7-69 構文 7-178 作成、アクセス権連鎖 7-185 データベース・レベル・ア クセス権 7-180 デフォルトの表アクセス権 DATETIME フ ィー ル ド修 飾子 7422 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7425 INTERVAL フ ィー ル ド修飾子とし て 3-14 7-184 422 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7- INTERVAL デ ータ 型 G 引渡し、付与権の 7-185 ビュ ーで のア クセ ス権 7186 表レベル・アクセス権 7-182 変更、権限授与者 7-186 GROUP BY キーワード SELECT での構文 7-263 SELECT での使用 7-284 H HAVING キーワード SELECT での構文 7-263 SELECT での使用 7-286 HEX 関数、式での使用 7-393 HIGH キーワード 7-321 HOLD カーソル INSERT カーソルと HOLD 7-123 使用 7-114 Hold カーソル 定義 7-112 HOUR キーワード 構文 DATETIME デ ータ 型 7-373 I IBM Informix 4GL SQLCODE の使用 5-5 STATUS 変数 5-5 WHENEVER ERROR 文 7343 IDATA フィールド X/Open プログラム 7-175 説明 6-8, 6-17 IF 文 NULL 値 8-60 構文 8-59 構文と使用 8-59 if 文 分岐 8-26 ILENGTH フィールド X/Open プログラム 7-175 説明 6-8, 6-17 IMMEDIATE キーワード、SET CONSTRAINTS 文 7-294 IN キーワード 構文 CREATE AUDIT で の 7-48 CREATE DATABASE での 7-50 索引 7 CREATE TABLE で の 7-93 LOCK TABLE 7-207 使用 WHERE キーワード 7278 条件セグメント 7-355 条件副照会 7-360 Index アクセス権 7-183 INDEX キーワード GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 INDEXES FOR キ ーワ ード、 INFO 文 7-189 INDICATOR キ ーワ ード、 SELECT 7-270 INDICATOR フィールド 設定、SET DESCRIPTOR で の 7-304 説明 6-7, 6-16 INFO 文 アクセス権と状態の表示 7190 構文 7-188 表、列、およびインデック スの表示 7-189 Informix の 拡張 機能 検査、 DBANSIWARN を使用した指定 INSERT INTO キーワード INSERT 7-192 LOAD 7-206 INSERT カーソル HOLD 7-123 INSERT 7-194 PUT 7-238 SQLCA 内での CLOSE の結 果 7-42 オープン 7-212 クローズ 7-42 再オープン 7-213 使用 7-112 定義 7-111 Insert カーソル 書込 み、FLUSH でバ ッ ファー付き行を 7164 INSERT キーワード GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 Insert バッファー 挿入、カーソルで行を 7-194 INSERT バッファー PUT による行の格納 7-235 挿入された行のカウント 7166, 7-242 定数 値に よる 埋め 込み 7- 4-7 INFORMIXCOB 環境変数 4-20 INFORMIXCOBDIR 環境変数 420 INFORMIXCOBSTORE 環境 変 数 4-21 INFORMIXCOBTYPE 環境変数 4-21 INFORMIXDIR 環境変数 4-22 INFORMIXTERM 環境変数 4-23 Informix、ユーザーと関連する アクセス権 7-181 237 バッ ファ ーの トリ ガー 7240 INSERT 文 DECLARE 7-108 INSERT カーソルでの使用 7-122 SELECT 7-200 SERIAL 列 7-199 SERIAL 列への値の挿入 318 構文 7-192 8 IBM Informix SQL リファレンス・ガイド 充て ん、PUT で挿 入バ ッ ファーを 7-235 挿入 カー ソル によ る行 7194 ビューの行 7-193 挿入する値の指定 7-197 動的 SQL 7-200 トランザクションの影響 7195 INTEGER データ型 構文 7-370 説明 3-13 データ型の変更 3-22 デフォルト値として使用 724, 7-82 INTERVAL データ型 DATE お よび DATETIME を使用した演算の 範囲 3-24 DATETIME 値 との加 算ま たは減算 3-26 EXTEND 関数 付き 3-26, 327 INSERT 7-433 値の乗算または除算 3-30 引用 符付 きス トリ ング 7432 加算または減算 3-29 構文 7-370, 7-425 式 7-385 式の範囲 3-25 説明 3-13 フィールド区切り文字 3-15 フィールド修飾子、構文 7419 INTERVAL フィールド修飾子 セグメント 7-419 INTO TEMP キーワード SELECT での構文 7-263 使用 SELECT 7-290 UNION 演算子 7-292 INTO キーワード SELECT 7-270 構文 FETCH 7-155 SELECT 7-263 使用 FETCH 7-160 SELECT 7-270 IS NOT キーワード、条件セグメ ントの構文 7-351 IS NULL キーワード 7-278 IS キーワード WHERE キーワード 7-278 条件セグメント 7-356 ITYPE フィールド X/Open プログラム 7-175 設定、SET DESCRIPTOR に よる 7-304 説明 6-8, 6-17 使用 SELECT 7-278 条件セグメント 7-357 条件 セグ メン トの 構文 7351 ワイルドカード文字 7-279 LOAD 文 DBDELIMITER を使用した フィールド区切り 文字の指定 4-9 DELIMITER 節 7-206 INSERT INTO 節 7-206 LOAD FROM フ ァイ ル 7203 VARCHAR、TEXT、または BYTE データ型の ロード 7-205 構文 7-202 データの入力フォーマット 7-204 L LAST キーワード FETCH で使用 7-157 FETCH での構文 7-155 LENGTH 関数 式 7-267 式での使用 7-393 式の構文 7-387 LENGTH フィールド DATETIME およ び INTERVAL タ イ プ 7-304 DECIMAL および MONEY 型 7-304 設定、SET DESCRIPTOR に よる 7-303 説明 6-7, 6-16 LET 文 値の割り当て 8-25 構文 8-63 実行、プロシージャーの 811 LIKE キーワード ロードする表の指定 7-206 LOCK MODE キーワード 構文 ALTER TABLE での 7- M MATCHES キーワード 構文、条件セグメント 7-351 使用 SELECT 7-278 条件セグメント 7-357 ワイルドカード文字 7-279 MAX 関数 式での使用 7-399 式の構文 7-387 MDY 関数 式の構文 7-387 MIN 関数 式での使用 7-399 式の構文 7-387 MINUTE キーワード 構文 DATETIME デ ータ 型 7-373 使用 DATETIME フ ィー ル ド修 飾子 7422 20 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7- CREATE TABLE で の 7-96 使用 ALTER TABLE での 736 CREATETABLE で の 7-96 LOCK TABLE 文 構文 7-207 トランザクション付きデー タベース 7-208 トランザクションなしデー タベース 7-209 LOG IN キーワード、CREATE DATABASE での構文 7-50 LOW キーワード 7-321 425 INTERVAL フ ィー ル ド修飾子とし て 3-14 MODE ANSI キーワード 構文 CREATE DATABASE での 7-50 START DATABASE 7323 使用 CREATE DATABASE での 7-53 START DATABASE 7324 索引 9 MODIFY NEXT SIZE キーワー ド ALTER TABLE での構文 720 ALTER TABLE での使用 735 MODIFY キーワード ALTER TABLE での構文 720 ALTER TABLE での使用 730 MONEY 値 DBMONEY 環 境変 数の 設 定 4-12 DBMONEY を使 用し た ヨーロッパ形式の 指定 4-13 MONEY データ型 構文 7-370 説明 3-17 データ型の変更 3-22 デフォルト値として使用 724, 7-82 MONTH 関数 式での使用 7-389 式の構文 7-387 MONTH キーワード 構文 DATETIME デ ータ 型 使用 N NAME フィールド 説明 6-7, 6-16 NEXT SIZE キーワード CREATE TABLE での使用 7-95 7-419 使用 DATETIME フ ィー ル ド修 飾子 7422 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7425 INTERVAL フ ィー ル ド修飾子とし LIKE、MATCHES キー ワード 7-278 条件セグメント 7-357 NOTFOUND キーワード、NOT FOUND キーワードと対比 7-346 NULL 値 IF 文 8-60 SELECT 内 でチ ェッ ク 7270 GRANT で使用 7-181 NEXT キーワード FETCH で使用 7-157 FETCH での構文 7-155 NOSORTINDEX 環境変数 4-24 NOT CLUSTER キーワード ALTER INDEX 内の構文 717 ALTER TABLE での使用 719 NOT FOUND キ ーワ ード、 WHENEVER 文 7-343, 7-346 NOT IN キーワード、条件副照 会 7-360 NOT NULL キーワード 構文 ALTER TABLE での 722 CREATE TABLE で の 7-373 INTERVAL デ ータ 型 7-351 て 3-14 7-81 使用 ALTER TABLE での 730 CREATE TABLE で の 7-84 IS キーワード 7-278 NOT WAIT キー ワー ド、SET LOCK MODE 7-316 NOT キーワード 構文 BETWEEN キーワード WHILE 文 8-83 主キーの制限 7-86 ス ト ア ー ド・プ ロ シ ー ジャーによる暗黙 的な戻し 8-74 デフォルト値としての指定 7-25 NULL キ ーワ ード、プ ロシ ー ジャー変数としてあいまい 7413 NULLABLE フィールド 説明 6-8, 6-17 O OF キーワード DECLARE での使用 7-117 DECLARE の構文 7-108 ON EXCEPTION 文 エラーのトラップ 8-32 構文 8-66 制御範囲 8-33 配置 8-68 ユーザー生成のエラー 8-34 ON キーワード 構文 CREATE INDEX で の 7-55 GRANT 7-178 REVOKE 7-252 7-277 IN キーワード 7-280 条件セグメント 7-350, 10 IBM Informix SQL リファレンス・ガイド 使用 CREATE INDEX で の 7-56 GRANT 7-184 OPEN 文 ? パラメーターの値の置換 7-214 7-96 PATH 環境変数 4-28 PERFORM キ ーワ ード、 WHENEVER 文 7-343 PIPE キーワード、OUTPUT 文 7- FOREACH の 使用 時期 7- 220 216 FREE 7-217 PRECISION フィールド GET DESCRIPTOR によ る INSERT カーソルのオープ ン 7-212 SELECT ま たは UPDATE カーソルのオープ ン 7-211 カー ソル の再 オー プン 7213 構文 7-210 作成、アクティブ・セツト を 7-211 連結演算子 7-377 OR キーワード 条件 セグ メン トの 構文 7350 使用、条件セグメントで 7363 ORDER BY キーワード INSERT での制限 7-200 SELECT での構文 7-263 降順 7-289 使用 SELECT 7-288 UNION 演算子 7-292 昇順 7-289 番号による列の選択 7-290 OUTER キー ワー ド、FROM キーワード SELECT 7-274 OUTPUT 文、構文と使用 7-219 P PAGE キーワード ALTER TABLE での使用 736 CREATE TABLE での使用 7-176 設定、SET DESCRIPTOR に よる 7-304 説明 6-8, 6-17 PREPARE 文 FREE によるリソースの解 放 7-169 SELECT での制限 7-224 構文 7-221 実行 7-144 パフォーマンス効率の向上 7-233 パラメーター化、SQL 識別 子 7-228 複数文テキスト 7-226, 7-231 プレースホルダーとしての 疑問符 (?) 7-222 文識別子の使用 7-222 文のパラメーター化 7-227 有効な文テキスト 7-224 連結演算子 7-377 PREPARE 文で処理された文 DESCRIBE に よる 戻り 値 の記述 7-128 PREPARE 文で処理された オブジェクトの制 限 7-222 有効な文テキスト 7-224 実行 7-144 PREVIOUS キーワード FETCH で使用 7-157 FETCH での構文 7-155 PRIMARY KEY キーワード ALTER TABLE での使用 732 ALTER TABLE 文での 7-25 CREATE TABLE での 7-84, 7-85 PRIOR キーワード FETCH で使用 7-157 FETCH での構文 7-155 PRIVILEGES FOR キーワード、 INFO 文 7-190 PRIVILEGES キーワード GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 PUBLIC キーワード 構文 GRANT 7-178 REVOKE 7-252 使用 GRANT 7-181 REVOKE 7-254 PUT 文 FLUSH 7-235 行値のソース 7-237 使用、トランザクション内 7-235 連結演算子 7-377 R RAISE EXCEPTION 文 構文 8-72 ループの終了 8-27 RECOVER TABLE 文 アーカイブ、データベース を更新記録付きで 7-243 構文 7-243 操作、更新記録ファイル 7244 REFERENCES FOR キ ーワ ー ド、INFO 文 7-190 References アクセス権 索引 11 INFO 文での表示 7-190 定義 7-183 REFERENCES キーワード ALTER TABLE での 7-27 CREATE TABLE での 7-87, 7-89 GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 RELATIVE キーワード FETCH で使用 7-158 FETCH での構文 7-155 RENAME COLUMN 文 構文 7-246 制限 7-246 RENAME TABLE 文 ANSI 標準準拠データベー スの命名 7-248 構文 7-248 REPAIR TABLE 文、構文および 使用 7-250 REPEATABLE READ キーワー ド、SET ISOLATION における 構文 7-312 Resource アクセス権 7-181 RESOURCE キーワード GRANT で使用 7-181 REVOKE で使用 7-256 RETURN 文 NULL 値の戻り 8-74 構文 8-74 不十分な値の戻り 8-74 ループの終了 8-27 REVOKE 文 アクセス権必須 7-253 構文 7-252 データベース・レベル・ア クセス権 7-256 表レベル・アクセス権 7-254 列指定アクセス権 7-256 ROLLBACK WORK 文 425 FOREACH に よる 制限 7260 WHENEVER との使用 7-38, 7-46 構文 7-259 使用、WHENEVER 7-260 ROLLFORWARD DATABASE 文 構文 7-261 排他ロック機能 7-261 ROUND 関数、式での使用 7-394 ROW キーワード ALTER TABLE での使用 736 CREATE TABLE での使用 7-96 S SCALE フィールド GET DESCRIPTOR によ る 7-176 設定、SET DESCRIPTOR に よる 7-304 説明 6-7, 6-16 SCROLL キーワード DECLARE での使用 7-113 DECLARE の構文 7-108 SECOND キーワード 構文 DATETIME デ ータ 型 7-373 INTERVAL デ ータ 型 7-419 使用 DATETIME フ ィー ル ド修 飾子 7422 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7- 12 IBM Informix SQL リファレンス・ガイド INTERVAL フ ィー ル ド修飾子とし て 3-14 Select アクセス権 定義 7-183 SELECT カーソル オープン 7-211 再オープン 7-213 終了 7-42 使用 7-112 定義 7-111 SELECT キーワード GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 プロシージャー変数として あいまい 7-413 SELECT 文 DECLARE 7-108 DESCRIBE に よる 戻り 値 の記述 7-127 FOREACH 8-55 FROM 節 7-274 GROUP BY 節 7-284 HAVING 節 7-286 INSERT 7-200 INTO TEMP 節 7-290 INTO キーワードによる 7159 INTO 節 I4GL、ESQL 7-270 LET 8-64 ORDER BY 節 7-288 SELECT 節 7-265 UNION 演算子 7-292 WHERE 節での表の結合 7282 値の割り当て 8-25 カーソルと DECLARE の関 連付け 7-112 検索した行の ASCII ファイ ルへの書き込み 7325 構文 7-263 式の使用 7-266 集計関数 7-397 条件セグメント 7-350 ス ト ア ー ド・プ ロ シ ー ジャーへの引数と して 8-38 制限、INTO 節による 7-224 選択番号 7-285, 7-290 副照会、WHERE キーワー ドによる 7-277 リモート照会 7-264 列番号 7-285, 7-290 SERIAL データ型 ALTER TABLE での 7-22 INSERT 7-199 値の挿入 3-18 値のリセット 3-18 構文 7-370 ス ト ア ー ド・プ ロ シ ー ジャー 8-42 説明 3-17 SET CONSTRAINTS 文、構文お よび使用 7-294 SET DEBUG FILE TO 文、構文 および使用 7-296 SET DEBUG FILE 文 TRACE 8-79 SET DESCRIPTOR 文 VALUE オプション 7-301 構文 7-298 SET EXPLAIN 文 MERGE JOIN 情報 7-308 SORT SCAN 情報 7-308 オプティマイザー・アクセ ス・パス 7-307 構文 7-306 出力の解釈 7-306 出力例 7-308 SET ISOLATION 文 構文 7-312 デフ ォル トの デー タベ ー ス・レベル 7-312 排他の影響 7-314 排他レベルの定義 7-313 SET LOCK MODE 文 カーネル・ロック 7-317 構文 7-316 待ち時間の設定 7-317 SET LOG 文 構文 7-319 バッファー付き 7-319 SET OPTIMIZATION 文、構文お よび使用 7-321 SET キーワード UPDATE での構文 7-331 UPDATE での使用 7-334 SHARE キー ワー ド、LOCK TABLE での構文 7-207 SITENAME 関数 構文 INSERT 7-197 式 7-380 サーバー名を戻す 7-382 使用 ALTER TABLE での 723 CREATE TABLE で の 7-82 INSERT 7-199 式 7-382 SMALLFLOAT データ型 構文 7-370 説明 3-18 データ型の変更 3-22 SMALLINT データ型 構文 7-370 説明 3-19 データ型の変更 3-22 デフォルト値として使用 724, 7-82 SOME キーワード 条件副照会での使用 7-362 副照会の開始 7-281 SPL SQL との関連 8-5 流れ制御文 8-25 文構文 8-36 SPL による Resource アクセス権 8-17 SQL 文タイプ 7-9 SQL 通信領域 (SQLCA) CLOSE 後の結果 7-42 DATABASE の結果 7-102 DBANSIWARN の設定の効 果 4-7 FETCH 後の結果 7-163 PUT 後の結果 7-241 SELECT 後の結果 7-273 結果、DESCRIBE 後の 7-128 結果、FLUSH 後の 7-165 結果、OPEN 後の 7-212 説明 5-3 SQLCA.SQLAWARN (4GL) 5-7 sqlca.sqlcode ESQL/C の 5-8 SQLCA.SQLCODE (4GL) 5-5 sqlca.sqlerrd ESQL/C の 5-9 SQLCA.SQLERRD (4GL) 5-6 sqlca.sqlwarn ESQL/C の 5-10 SQLCODE OF SQLCA (ESQL/COBOL) 5-12 sqlda 構造体 ESQL/C でのシステム記述 子領域 6-5 ESQL/C 内でのポインター の使用 6-9 ESQL/COBOL での シス テ ム記述子領域 6-13 sqlda 内のフィールド 6-11 sqlda.h ヘッダー・ファイル 6-10 sqlvar_struct 内のフィール ド 6-11 構文 DESCRIBE 7-127 EXECUTE 7-144 索引 13 FETCH 7-155 OPEN 7-211 PUT 7-235 使用 DESCRIBE 7-129 FETCH 7-161 OPEN 7-216 PUT 7-239 sqlda.h ヘッダー・ファイル sqlda 内のフィールド 6-11 sqlvar_struct 内のフィール ド 6-11 表示 6-10 SQLERRD OF SQLCA (ESQL/COBOL) 5-12 SQLERROR キ ーワ ード、 WHENEVER 文 7-343 SQLEXEC 環境変数 4-25 SQLRM 環境変数 4-26 SQLRMDIR 環境変数 4-27 SQLWARN の SQLWARN (ESQL/COBOL) 5-14 SQLWARNING キ ーワ ード、 WHENEVER 文 7-345 START DATABASE 文 構文および使用法 7-323 STATUS FOR キーワード、 INFO 文 7-191 STATUS 変数 (4GL) 5-5 STOP キーワード、WHENEVER 文 7-343 STOP キーワード、WHENEVER 文の 7-348 stores5 データベース call_type 表の列 1-10 catalog 表の列 1-9 cust_calls 表の列 1-10 customer 表の列 1-5 IBM Informix OnLine で の 作成 -7 IBM Informix SE での作成 8 items 表の列 1-6 manufact 表の列 1-11 orders 表の列 1-6 state 表の列 1-11 stock 表の列 1-8 概要 -6 コピー -7 主キーと外部キーの関係 113 ‐ 1-21 説明 1-3 データ値 1-21 表の構造 1-4 マップ 1-11 stores5 デ ータ ベー ス内 の call_type 表の列 1-10 stores5 デ ータ ベー ス内 の cust_calls 表の列 1-10 stores5 デ ータ ベー ス内 の customer 表の列 1-5 stores5 データベース内の items 表の列 1-6 stores5 デ ータ ベー ス内 の manufact 表の列 1-11 stores5 データベース内の orders 表の列 1-6 stores5 データベース内の stock 表の列 1-8 SUM 関数 式での使用 7-400 式の構文 7-387 SYSTEM 文 構文 8-77 T TABLE キ ーワ ード、UPDATE STATISTICS での構文 7-341 TABLES キーワード、INFO 文 7-189 TBCONFIG 環境変数 4-27 tbconfig ファイル、TBCONFIG を使用した指定 4-28 TEMP TABLE LOG キーワード、 CREATE TABLE での構文 7-76 TEMP キーワード 14 IBM Informix SQL リファレンス・ガイド SELECT での構文 7-263 SELECT での使用 7-290 TERM 環境変数 4-29 TERMCAP 環境変数 4-30 termcap ファイル INFORMIXTERM を使用し た選択 4-24, 4-25 およ び TERMCAP 環境 変 数 4-30 TERMINFO 環境変数 4-30 terminfo ディレクトリー INFORMIXTERM を使用し た選択 4-24 および TERMINFO 環境変 数 4-30 TEXT データ型 LOAD 文の要件 7-205 構文 7-370 ス ト ア ー ド・プ ロ シ ー ジャー 8-43, 8-47 制御文字付き 3-19 説明 3-19 列の選択 3-20 Time 関数 式の構文 7-387 TO CLUSTER キーワード ALTER INDEX 内の 7-18 TO キーワード GRANT 7-178 式 7-387 TODAY 関数 構文 INSERT 7-197 式 7-380 条件セグメント 7-351 使用 ALTER TABLE での 723 CREATE TABLE で の 7-82 INSERT 7-199 定数式 7-383 TRACE 文 構文 8-79 ス ト ア ー ド・プ ロ シ ー ジャーのデバッグ 8-14 TRUNC 関数、式での使用 7-395 TYPE フィールド SET DESCRIPTOR での 設 定 7-301 X/Open プログラム 7-175 設定、X/Open プログラム 7303 説明 6-7, 6-16 変更、BYTE または TEXT からの 7-305 フィールド区切り 文字の指定 4-9 DELIMITER 節 7-328 UNLOAD TO フ ァイ ル 7326 VARCHAR、TEXT、または BYTE 列 のア ン ロード 7-327 構文 7-325 UNLOCK TABLE 文、構文と使 用 7-329 UPDATE STATISTICS 文 検索ストラテジーの最適化 7-341 U UNION 演算子 SELECT での構文 7-263 SELECT での使用 7-292 使用上の制限 7-292 UNIQUE キーワード 構文 CREATE INDEX で の 7-55 CREATE TABLE で の 7-84 SELECT 7-265 使用 ALTER TABLE での 732 CREATE INDEX で の 7-56 CREATE TABLE で の 7-85 式 7-397 SELECT 7-266 無効、副照会 7-361 UNITS キーワード 式での使用 7-386 式の構文 7-380 UNLOAD TO ファイル 7-326 UNLOAD 文 DBDELIMITER を使用した 構文 7-341 実行時期 7-342 Update アクセス権 定義 7-183 ビュー 7-332 UPDATE カーソル UPDATE での使用 7-339 オープン 7-211 使用 7-115 制限付きの文 7-116 定義 7-111 ロックに関する考慮事項 7- 構文 7-331 式の使用 7-336 条件セグメント 7-350 トランザクション 7-332 ビューによる更新 7-332 ロックに関する考慮事項 7333 USER 関数 構文 INSERT 7-197 式 7-380 条件セグメント 7-351 使用 ALTER TABLE での 723 CREATE TABLE で の 7-82 INSERT 7-199 式 7-381 標準準拠による影響 7-382 USING DESCRIPTOR キーワー ド DESCRIBE か らの 情報 7129 構文 EXECUTE 7-144 FETCH 7-155 OPEN 7-210 PUT 7-234 116 UPDATE キーワード GRANT で使用 7-183 構文 GRANT 7-182 REVOKE 7-254 使用 REVOKE 7-255 UPDATE 文 FETCH 7-161 SET キーワード 7-334 UPDATE カーソル 7-115 WHERE CURRENT OF キーワード 7-339 WHERE キーワード 7-338 カーソルによる更新 7-339 更新する列の制限 7-117 更新のロールバック 7-333 使用 FETCH 7-161 OPEN 7-216 PUT 7-148, 7-239, 7-240 USING SQL DESCRIPTOR キー ワード DESCRIBE 7-130 EXECUTE 7-147 USING キーワード 7-146 構文 EXECUTE 7-146 OPEN 7-210 使用 EXECUTE 7-146 OPEN 7-214 索引 15 構文 V VALUE キーワード FETCH との関係 7-176 SET DESCRIPTOR での 使 用 7-301 VALUE フィールド GET DESCRIPTOR での 使 用 7-175 NULL 値が取り出された後 7-177 VALUES キーワード INSERT の構文 7-192 使用 INSERT 7-197 PUT による効果 7-238 VARCHAR データ型 LOAD 文の要件 7-205 UNLOAD 文に関する考慮 事項 7-327 構文 7-370 説明 3-21 デフォルト値として使用 724, 7-83 W WAIT キーワード、SET LOCK MODE 文 7-316 WARNING キ ーワ ード、 WHENEVER 文 7-343, 7-346 WEEKDAY 関数 式の構文 7-387 WHENEVER 文、構文および使 用法 7-343 WHERE CURRENT OF キ ー ワード 構文 DELETE 7-124 UPDATE 7-331 使用 UPDATE 7-339 WHERE キーワード DELETE 7-124 SELECT 7-263 UPDATE 7-331 使用 ALL キーワード 7-281 ANY キーワード 7-281 BETWEEN キーワード 7-277 DELETE 7-125 IN キーワード 7-278 IS キーワード 7-278 LIKE キーワード 7-278 MATCHES キーワード DECLARE の構文 7-108 WITH LISTING IN キーワード ス ト ア ー ド・プ ロ シ ー ジャーでの警告 810 WITH LOG IN キーワード、構文 START DATABASE 7-323 WITH MAX キーワード COUNT フィールドとの関 係 7-299 WITH NO LOG キーワード 構文 CREATE TABLE で の 7-76 SELECT 7-290 7-278 SOME キ ーワ ード 7- 使用 281 UPDATE 7-338 関係演算子 7-277 副照会での 7-277 設定、項目の記述 7-298 表の結合 7-282 WHILE キーワード CONTINUE 文 8-40 EXIT 8-49 WHILE 文 NULL 式 8-83 構文 8-83 ス ト ア ー ド・プ ロ シ ー ジャーでのループ 8-26 WITH APPEND キ ーワ ード、 SET DEBUG FILE TO 文 7-296 WITH CHECK キーワード CREATE VIEW での構文 798 CREATE VIEW での使用 7101 WITH GRANT キーワード GRANT での使用 7-185 GRANT の構文 7-178 WITH HOLD キーワード DECLARE での 使用 7-114, 16 IBM Informix SQL リファレンス・ガイド 7-123 CREATE TABLE で の 7-92 SELECT 7-292 WITH RESUME キ ーワ ード、 RETURN 8-75 WITH キー ワー ド、CREATE DATABASE での構文 7-50 WITHOUT HEADINGS キ ー ワード、OUTPUT 文 7-219 X X/Open 準拠レベル -24 Y YEAR 関数 式での使用 7-389 式の構文 7-387 YEAR キーワード 構文 DATETIME デ ータ 型 7-373 INTERVAL デ ータ 型 7-419 使用 DATETIME フ ィー ル ド修 飾子 7422 DATETIME フ ィー ル ド修飾子とし て 3-8 INTERVAL フ ィー ル ド修 飾子 7425 INTERVAL フ ィー ル ド修飾子とし て 3-14 あ アイコン、説明 -14 アクセス権 Alter 7-183 Connect 7-180 CREATE TABLE を使用す る表のデフォルト 7-77 DBA 7-181 DBA アクセス権付きプロ シージャー 8-18 Delete 7-183 Index 7-183 INFO 文での表示 7-190 Insert 7-183 Resource 7-181 Update 7-183 アクセス権の競合時 7-179 システム・カタログでエン コー ドさ れた 230, 2-34 シノニムに対する 7-71 所有者アクセス権付きプロ シージャー 8-17 ス ト ア ー ド・プ ロ シ ー ジャーのデフォル ト 8-17 必要 インデックスの削除 7- 136 データの修正 7-183 ビューの作成 7-186 ビューに対する 7-99 アクティブ・セット FETCH によるデータの検 索 7-155 OPEN による構成 7-211 アスタリスク (*) SELECT での使用 7-265 算術演算子 7-376 アットマーク (@)、データベー ス名 7-367 アンダースコアー (_)、条件セグ メントのワイルドカード 7-358 い 意見、資料・製品についての -24 一意性制約 削除 7-35 実行 7-79 使用のルール 7-33, 7-86, 7-87 データ型変換 7-31 要件 7-25 列の変更 7-31 一意性制約または主キー制約 データ型変換 7-32 一時表 制約の作成 7-92 一時ファイル、DBTEMP を使用 したディレクトリーの指定 4-17 入れ子にした整列、SELECT 7289 印刷、DBPRINT を使用した印 刷プログラムの指定 4-15 インストール・ディレクトリー、 INFORMIXDIR を使用した指定 4-22 インデックス DROP INDEX によ る削 除 7-136 一時表 7-291 情報の表示 7-189 制約との共有 7-26, 7-79 命名規則 7-365, 7-417, 7-439 インデックス名セグメント 構文 7-365, 7-429 使用 7-438 引用符付きストリング 構文 INSERT 7-197 式 7-387 条件セグメント 7-351 式 7-380 使用 INSERT 7-433 LIKE、MATCHES キー ワード 7-278 式 7-381 ワイルドカード 7-432 引用符付きストリング・セグメ ント DATETIME、ストリングと し て の INTERVAL 値 7432 構文 7-431 条件にける LIKE 7-432 え エディター、DBEDIT を使用し た指定 4-10 エラー検査 ON EXCEPTION での エ ラー状態 8-67 sqlca 構造体 (ESQL/C) 5-7 SQLCA データ構造体のサ マリー表 5-4 SQLCA レコード (4GL) 5-5 SQLCA レ コー ド (ESQL/COBOL) 510 SYSTEM 8-77 エラーのシミュレート 8-34 索引 17 ス ト ア ー ド・プ ロ シ ー ジャー 8-32 ス ト ア ー ド・プ ロ シ ー ジャーのエラー後 の続行 8-70 例外処理 8-32 円記号 (¥) エ ス ケ ー プ 文 字、 MATCHES 7-358 エス ケー プ文 字、LIKE 7358 オープン 7-211 型の定義 7-111 終了 7-41 順 7-113 スクロール 7-113 宣言 7-108 特性 7-112 トランザクションでの使用 表の命名のための 7-77 疑問符 (?) EXECUTE によるプレース ホルダーへの値の 提供 7-146 PUT における変数の指名 7-239 USING キーワードとの置 換 7-214 位置指定子、PREPARE 内 の 7-222 条件 のワ イル ドカ ード 7- 7-120 トランザクションの終了に よる影響 7-43 カーソル安定性排他レベル 7314 お お客様の環境のデフォルト解釈 4-3 オプティマイザー SET OPTIMIZATION 文 7321 親子関係 7-27, 7-87 オンライン ファイル -23 ヘルプ -24 か カーソリー・プロシージャー 856 カーソル DELETE 7-124 FETCH による値の検索 7155 INTO キーワード SELECT 7-271 OPEN による起動 7-210 PREPARE 文で処理された 文 7-111 PREPARE 文で処理された 文との関連付け 7119 ROLLBACK WORK による クローズ 7-260 358 カーソル操作文 7-10 外部キー 7-27, 7-87 拡張機能検査、DBANSIWARN を使用した指定 4-7 カラー、INFORMIXTERM の設 定 4-23 環境変数 -12 Bourne シェル 4-4 C シェルでの設定方法 4-4 製品別のリスト 4-5 定義 4-3 デフォルト解釈 4-3 環境変数の設定 4-4 関係演算子 WHERE キー ワー ド SELECT 7-277 条件セグメント 7-351 セグメント 7-434 関係演算子セグメント 7-434 関数 ス ト ア ー ド・プ ロ シ ー ジャー内 8-28 関数式、SELECT 7-267 き キャレット (^) ワイルドカード 7-358 行 FETCH による検索 7-158 FETCH による複数行照会 7-156 エンジン応答、ロック行に 対する 7-316 カーソルによる挿入 7-194 行 ID 定義 7-158 削除 7-124 バッファーに入れられた行 の FLUSH による 書き込み 7-164 ビューによる更新 7-332 ビューへの挿入 7-193 ファントム 7-313 行 ID 7-409 業界標準、準拠 -24 協調属性、INFORMIXTERM の 設定 4-23 共有メモリー・パラメーター、 TBCONFIG を使用したファイ ルの指定 4-27 く 規則 活字 -12 構文 -13 コードの例 -18 18 IBM Informix SQL リファレンス・ガイド 区切り文字 DATETIME 値の場合 3-9 INTERVAL 値の場合 3-15 7-133 LOAD 入力ファイル 7-206 UNLOAD による指定 7-328 クラスター・インデックス ALTER INDEX を使用した RECOVER TABLE によ る 適用 7-243 開始、CREATE AUDIT 7-48 クラスター・インデックス なし 7-57 操作、更新記録ファイル 7- 7-17 CREATE INDEX を使 用し て作成 7-56 更新記録付き 7-57 繰返し読込み排他設定レベル 更新 中の エミ ュレ ート 7162 244 構文ダイアグラム エレメント -16 規則 -13 コミット読み込み排他レベル 7313 け 警告 ス ト ア ー ド・プ ロ シ ー ジャー 8-10 計算式 GROUP BY の制限 7-284 計算済み式 記述 7-387 形式 DBDATE を使 用し た DATE 値の指定 48 結合 2 表結合 7-282 外部結合 7-283 条件セグメント 7-282 セルフ結合 7-283 複数表結合 7-283 幻行 7-313 権限 SYSTEM 8-78 現行のデータベース DATABASE で指定 7-102 こ 更新可能ビュー 7-101 更新記録 DROP AUDIT によ る削 除 コロン (:) DATETIME 内 の区切 り文 字として 3-9 INTERVAL 内 の区 切り 文 字として 3-15 コンパイラー COBOL 用の環境変数の設 定 4-20, 4-21 COBOL 用の記憶モードの 設定 4-21 さ 再 帰、ス ト ア ー ド・プ ロ シ ー ジャー 8-29 最適化 更新、システム・カタログ 表を 7-341 サーバー 7-321 照会 7-306 ネットワーク全体にまたが る 7-322 最適化、高レベルまたは低レベ ルの指定 7-321 算術演算子、式 7-376 参照制約 削除 7-35 実行 7-79 使用のルール 7-87 定義 7-27, 7-87 データ型制限 7-89 列の変更 7-31 し 式 UPDATE 7-335 整列 7-290 式セグメント SPL 式 8-24 計算済み式 7-387 結合式 7-402 構文 7-376 式型 7-376 集計式 7-397 定数式 7-380 列式 7-378 時刻関数 GROUP BY の制限 7-284 SELECT での使用 7-267 システム記述子領域 ESQL/C での 6-5 ESQL/COBOL での 6-13 TYPE および ITYPE フィー ルドの値 6-8, 6-17 定義済みのフィールド 6-7, 6-16 サイズ変更 7-300 修正、コンテンツの 7-298 システム名、データベース名 7368 システム・カタログ sysblobs 2-10 syschecks 2-11 syscolauth 2-11, 7-254 syscoldepend 2-12 syscolumns 2-13 sysconstraints 2-16 sysdefaults 2-17 sysdepend 2-18 sysindexes 2-18 sysopclstr 2-22 sysprocauth 2-24 索引 19 sysprocbody 2-25, 8-11 sysprocedures 2-26 sysprocplan 2-27 sysreferences 2-28 syssynonyms 2-28 syssyntable 2-29 SYSTABAUTH 7-186 systabauth 2-30, 7-254 systables 2-31 sysusers 2-34 sysviews 2-34 アクセス 2-8 更新 2-9 更新、最適化のためのデー タを 7-341 制約のための sysindexes 項 目 7-79 説明 2-3 データベース項目 7-51 統計の更新 2-9 表のマップ 2-35 実効確認 7-294 実行時プログラム DBANSIWARN の設定 4-7 INFORMIXCOBDIR の設定 4-20 シノニム ANSI 標準準拠の命名法 772 CREATE SYNONYM を 使 用した作成 7-71 削除 7-139 チェーニング 7-74 別名との差 7-71 集計関数 4GL および ESQL 7-401 EXISTS 副照会 7-361 GROUP BY の制限 7-284 SELECT 7-268 SPL 式 8-23 式 7-267, 7-387 要約 7-400 修飾子、フィールド DATETIME 7-373 DATETIME の場合 3-8 INTERVAL の場合 3-14 DATETIME 7-422 INTERVAL 7-419, 7-425 主キー制約 削除 7-35 参照側 7-27 実行 7-79 使用のルール 7-34, 7-87 要件 7-26, 7-86 列の定義 7-86 列の変更 7-31 順カーソル FETCH 7-157 使用 7-113 定義 7-112 準拠 業界標準 -24 照会 他のオペレーティング・シ ステム・ファイル への結果の送信 7- 結合条件 7-282 検索 のワ イル ドカ ード 7358 構文 7-350 説明 7-350 比較条件 7-351 ブール式 7-351 小数点 (.) DATETIME 内 の区切 り文 字として 3-9 INTERVAL 内 の区 切り 文 字として 3-15 状態、INFO 文での表示 7-191 省略記号 (...)、条件セグメント のワイルドカード 7-358 除算記号 (/)、算術演算子 7-376 所有者 ALTER TABLE での 7-21 CREATE SYNONYM で の 7-72 CREATE VIEW でのビュー 7-445 RENAME COLUMN 7-246 RENAME TABLE 7-248 インデックス名セグメント 7-365, 7-417, 7-429, 219 他のプログラムへの結果の 送信 7-220 他のプログラムへの結果の パイピング 7-220 照会での値の重複 7-266 条件セグメント ALL、ANY、SOME 副照会 7-362 7-439 ビュー名セグメント 7-444 表名セグメント 7-403, 7-441 所有者アクセス権付きストアー ド・プロシージャー 8-16 BETWEEN キ ーワ ード 7354 ESCAPE キーワード 7-359 EXISTS キーワード 7-361 IN キーワード 7-355 IS キーワード 7-356 LIKE キーワード 7-357 MATCHES キ ーワ ード 7357 NOT キーワード 7-357 SELECT での副照会 7-360 関係演算子 7-353 関数の使用 7-351 20 IBM Informix SQL リファレンス・ガイド す スクロール・カーソル FETCH 7-157 使用 7-113 定義 7-112 保留、トランザクション 7315 ストアード・プロシージャー BYTE および TEXT データ 型 8-43, 8-47 ALTER TABLE を使用した 追加 7-32, 7-78 DROP INDEX 7-136 一意性制約のルール 7-33 作成に必要なアクセス権 7- DBA アクセス権付き 8-16 DBACCESS からの作成 8-7 SELECT からの受け取り 7270 SQL 関数との名前の混用 34 8-23 TRACE 文の出力ファイル の命名 7-296 埋め込み言語からの作成 8- 実行 7-79 制約を持つ列の変更 7-30 設定、チェック・モード 7- 8 エラーのシミュレート 8-72 カーソル 8-55 概要 8-5 コメント 8-8 再帰 8-29 実行 8-11 使用 8-6 所有者アクセス権付き 8-16 定義 8-6 デバッグ 8-14, 8-79 ドキュメント化 8-8 取消し、アクセス権の 7-253 内容の表示 8-11 複数行の処理 8-75 ヘッダー 8-29, 8-42 変更 8-16 変数 8-19 マニュアルの表示 8-11 戻り値 8-29 ストアード・プロシージャー・ アクセス権の付与 7-184 スペース ( ) DATETIME 内 の区切り 文 字として 3-9 INTERVAL 内 の区 切り 文 字として 3-15 スラッシュ (/)、 算術演算子 7-376 294 定義 7-77 表レベルでの指定 7-85 許される列の数 7-78, 7-85 要件 7-25 列レベルでの指定 7-84 セルフ結合 説明 7-283 そ 相関副照会 定義 7-360 ソート SELECT 7-288 結合照会 7-292 た 単純代入 8-63 単純読み込み排他レベル 7-313 単精度浮動小数点数の格納 3-12 端末処理 および TERM 環境変数 4-29 およ び TERMCAP 環境 変 数 4-30 および TERMINFO 環境変 数 4-30 せ 制約 ALTER TABLE を使用した 削除 7-29, 7-35, 7-78 ち チェック制約 CREATE TABLE を使用し た作成 7-90 定義 7-90 表レベルでの指定 7-90 列レベルでの指定 7-90 遅延チェック 7-294 て 定数式 GROUP BY の制限 7-284 PUT での挿入 7-237 SELECT 7-267 構文 7-380 データ型 ALTER TABLE を使用した 変更 7-31 BYTE 3-5 CHAR 3-6 CHARACTER 3-7 CREATE VIEW を使用した 指定 7-99 DATE 3-7 DATETIME 3-8 DEC 3-11 DECIMAL 3-11 DOUBLE PRECISION 3-12 FLOAT 3-12 INSERT に関する考慮事項 7-198, 7-433 INT 3-12 INTEGER 3-13 INTERVAL 3-13 MONEY 3-17 NUMERIC 3-17 REAL 3-17 SERIAL 3-17 SMALLFLOAT 3-18 SMALLINT 3-19 SPL 変数 8-21 TEXT 3-19 VARCHAR 3-21 構文 7-370 索引 21 サマリー表 3-4 参照制約の要件 7-28, 7-89 浮動小数点 3-12 変換 3-22 データ型セグメント 7-370 データ型の変換 3-22 データ整合性文 7-11 データ操作文 7-10 データ定義文 7-10 データベース ANSI 準拠の作成 7-323 CLOSE DATABASE を使用 したクローズ 7-45 CREATE DATABASE を使 用した作成 7-50 stores5 -6 削除 7-134 照会の最適化 7-342 データ型 3-4 デフ ォル ト排 他レ ベル 7312 データベース・レベル・アクセ ス権 7-180, 7-256 付与 7-180 付与権限の引き渡し 7-185 データベース・ロック 7-104 データ、LOAD 文によるデータ の挿入 7-202 データ・アクセス文 7-11 テキスト・エディター、DBEDIT を使用した指定 4-10 デッドロックの検出 7-317 デフォルト値 ALTER TABLE を使用した 指定 7-24 指定 ALTER TABLE 7-24 CREATE TABLE を 使 用した 7-82 デモンストレーション・データ ベース インストール・スクリプト -6 排他モードでのオープン 7104 181 データベース名セグメント 引用符、スラッシュの使用 7-369 構文 7-367 データベース、DBPATH の 外部 7-369 変数による命名 7-369 命名規則 7-367 リモート・データベース 7368 データベース、stores5 説明 1-3 261 ロールバック 7-259 ログ 7-323 トランザクションおよび CREATE DATABASE 7-54 トランザクション・ログ ログのリネーム 7-324 ネットワーク環境変数 DBNETTYPE 4-13 DBPATH 4-14 SQLRM 4-26 SQLRMDIR 4-27 2-35 命名規則 7-368 リモート 7-368 デー タベ ース 管理 者 (DBA) 7- 315 トランザクションの回復 7- ね 概要 -6 コピー -7 表 1-5 ‐ 1-11 表の構造 1-4 マップ 1-11 復元 7-261 変数による命名 7-369 マップ stores5 1-11 システム・カタログ表 動的管理文 7-11 ドキュメント・ノート -23 トランザクション BEGIN WORK を使用した 開始 7-37 COMMIT WORK を使用し たコミット 7-47 カーソルの使用 7-120 ス ク ロ ー ル・カ ー ソ ル と データの一貫性 7- と 問合せ最適化情報文 7-11 動的 SQL システム記述子領域の使用 ESQL/C での 6-5 ESQL/COBOL で の 613 メモリーの割り当て ESQL/C での 6-4 ESQL/C で の sqlda ポ インターの使 用 6-9 ESQL/COBOL で の 6- 22 IBM Informix SQL リファレンス・ガイド 13 は パーセント (%) 記号、条件セグ メントのワイルドカード 7-358 排他レベル カーソル安定性 7-314 外部表 7-314, 7-317 繰り 返し 可能 読み 込み 7314 コミット読み込み 7-313 単純読み込み 7-313 定義 7-313 バイナリー・ラージ・オブジェ クト (BLOB) LOAD 文 7-205 UNLOAD 文 7-327 ハイフン (-) DATETIME 内 の区切り 文 字として 3-9 INTERVAL 内 の区 切り 文 字として 3-15 配列、FETCH による行の移動 7160 パス名 DBPATH を 使用 した指 定 4-14 DBSRC を使用した指定 417 PATH を使用した指定 4-28 SQLEXEC に組み込む 4-25 破損した表のチェック 7-39 バッファー付きロギング 7-50 パフォーマンス ス ト ア ー ド・プ ロ シ ー ジャーによる改善 8-6 パラメーター CALL 文 8-38 SPL での BYTE また は TEXT 8-48 ス ト ア ー ド・プ ロ シ ー ジャーへの 8-29 ひ 更新 7-332 削除 7-143 シノニムの作成 7-71 ビュー名セグメント 7-444 ビュー、更新可能 7-101 表 ANSI 準拠命名 7-441 CHECK TABLE 文を使用し たチェック 7-39 LOAD 文 によ るデ ータ の ロード 7-202 SELECT での別名 7-274 stores5 デ ータ ベー スの 構 造 1-4 一時の使用 7-92 エンジン応答、ロック表に 対する 7-316 更新記録の復元 7-243 最適化、照会の 7-342 削除 7-139 制約 7-35 表 7-141 作成 一時表 7-91 シノニム 7-71 表 7-76 システム・カタログ表 2-10 ‐ 2-34 修復、REPAIR TABLE 文に よる 7-250 条件セグメントでの結合 7282 比較条件 構文と使用 7-351 日付データ型 関数 7-387 ビュー GRANT によるアクセス権 7-186 SELECT * 表記を使用した 7-99 UNION 演算子の制限 7-292 アクセス権 7-99 仮想列 7-100 制約の追加 7-32 命名規則 7-77, 7-404, 7-441 リネーム 7-248 列のデータ型の変更 3-22 ロギング 7-92 ロック ALTER INDEX を使用 した 7-18 LOCK TABLE 7-207 モードの変更 7-36 ロックの解除 7-329 標識変数 EXECUTE 7-146 SELECT 7-270 式 7-401 表示ラベル SELECT での構文 7-265 UNION 演算子 7-292 表名セグメント 7-440 表レベル・アクセス権 GRANT でのデフォルト 7184 定義と使用 7-183 取り消し 7-254 付与 7-182 付与権限の引き渡し 7-185 列固有のアクセス権 7-256 ふ ファイル OUTPUT 文に よる 出力 の 送信 7-219 拡張子 .lok 7-317 .dbs 7-51, 7-103 フィールド修飾子 DATETIME 7-373 DATETIME の場合 3-8 INTERVAL の場合 3-14 INTERVAL 7-425, 7-419 ブール式 条件セグメント 7-350 フォーマット DBMONEY を使 用し た MONEY 値のため の指定 4-12 複合インデックス CREATE INDEX を使 用し て作成 7-55 定義 7-57 列の制限 7-57 複合代入 8-63 複合列リスト、複数列制限 7-33, 7-34 索引 23 副照会 ALL/ANY/SOME キーワー ドに よる 開始 7281 DISTINCT キーワード 7-266 EXISTS キーワードによる 開始 7-280 IN キーワードによる開始 へ め 並行性 SET ISOLATION による定 義 7-312 カーソル安定性排他 7-314 繰り返し可能読み込み排他 命名規則 インデックス 7-365, 7-417, 7- 7-314 7-280 UNION 演算子の制限 7-292 条件セグメント 7-360 複数行照会 FETCH による管理 7-156 戻り値の宛先 7-159 副問合せ 相関 7-360 定義 7-277 プラス記号 (+)、算術演算子 7376 プロシージャー名 関数名との矛盾 7-429 命名規則 7-429 文識別子 カー ソル との 関連 付け 7- コミ ット 読み 込み 排他 7313 単純読み込み排他 7-313 ヘッダー プロシージャーの 8-29 別名 SELECT 内の表 7-275 変数 IF での不明値 8-60 SPL 8-19 SPL での GLOBAL および LOCAL 8-20 SPL での定義 8-41 SPL でのデフォルト値 8-45, 8-46 SPL 変数の範囲 8-42 キーワードと同じ名前 8-22 広域、SPL 8-44, 8-46 111 解放 7-223 構文 DECLARE 7-108 DESCRIBE 7-127 EXECUTE 7-144 FREE 7-168 PREPARE 7-221 使用 DECLARE 7-119 FREE 7-169 PREPARE 7-222 定義 7-222 文タイプ 7-9 文のパラメーター化 PREPARE 7-227 SQL 識別子 7-228 文変数名の定義 7-149 439 データベース 7-368 表 7-77, 7-404, 7-441 列 7-81, 7-246 メッセージ・ファイルのファイ ル -21 メ ッ セ ー ジ・フ ァ イ ル、 DBLANG を使用したサブディ レクトリーの指定 4-11 メニュー、DBMENU を使用し た指定 4-12 メモリー ESQL/C での割り当て 6-4 ESQL/COBOL での 割り 当 て 6-13 システム sqlda 構造体につ いての割り当て 713 メモリーの割り当て ALLOCATE DESCRIPTOR 文を使用した 7-13 ESQL/C での動的な 6-4 ESQL/COBOL での 動的 な 6-13 ほ メモリー、FREE による解放 7167 ボールド体 -12 も ま マイナス記号 (-)、算術演算子 7376 マシン・ノート -23 マニュアル、型 ドキュメント・ノート -23 マシン・ノート -23 リリース・ノート -23 24 IBM Informix SQL リファレンス・ガイド 文字ストリング DATE 値として 3-28 DATETIME 値 とし て 3-10, 3-28 INTERVAL 値として 3-16 文字の表記 -12 ゆ る ろ ユーザー Informix、関連するア クセス権 7-181 ループ RAISE 例 外の 使用 によ る 終了 8-35 SPL での作成および終了 8- ロギング CREATE TABLE を使用し た設定 7-92 IBM Informix OnLine での 7- 26 り リテラル DATE デフォルト値として使 用 7-24, 7-83 DATETIME ALTER TABLE での使 用 7-23 CREATE TABLE で の 使用 7-82 IN キーワード 7-278 INSERT での構文 7-197 構文 7-422 式 7-380, 7-385 条件セグメント 7-351 セグメント 7-421 INTERVAL INSERT での構文 7-197 構文 7-425 式 7-380, 7-385 条件セグメント 7-351 セグメント 7-424 デフォルト値として使 用 7-24, 7-83 構文 7-425 数 INSERT での構文 7-197 番号 IN キーワード 7-356 構文 7-427 式 7-380, 7-383 条件セグメント 7-351 セグメント 7-427 リリース・ノート、-23 リレー・モジュール SQLRM 環境変数 4-26 SQLRMDIR 環境変数 4-27 52 WHILE での不確定 8-83 制御された 8-51 IBM Informix SE での 7-53 START DATABASE での開 始 7-54 ログのリネーム 7-324 ログ・ファイル位置の検出 れ 7-54 ログ 列 ALTER TABLE を使用した 削除 7-29 ALTER TABLE を使用した 変更 7-30 CREATE TABLE を使用し た指定 7-81 stores5 データベース内の 15 ‐ 1-11 外部キーとしての定義 7-87 仮想 7-100 主キーとしての定義 7-86 情報の表示 7-189 制約の設定 7-78 制約の定義時に許される数 7-78 挿入 7-193 チェック制約の指定 7-90 データ型の変更 3-22 被参照側と参照側 7-27, 7-87 命名規則 7-81, 7-246 リネーム 7-246 列式 SELECT 7-267 構文 7-378 列レベル・アクセス権 7-184 連結演算子 (||) 7-377 連絡先情報 -24 開始、START DATABASE 7-323 バッファー付きとバッ ファーなし 7-319 変更、SET LOG でモードを 7-319 ロック COMMIT WORK による解 放 7-47 FETCH 7-161 ROLLBACK WORK による アンロック 7-259 SET ISOLATION 7-312 SET LOCK MODE 7-316 UNLOCK TABLE 7-329 UPDATE カー ソル の影 響 7-116 上書き、行レベル 7-208 間 挿入 7-195 期間 更新 7-116 削除 7-124 更新 7-333 スクロール・カーソル 7-315 トランザクション内での 737 待ち時間 7-316 ロックのタイプ 行ロック 7-96 索引 25 ページ・ロック 7-96 論理演算子 条件セグメント 7-363 わ ワイルドカード文字、LIKE ま たは MATCHES 7-432 26 IBM Informix SQL リファレンス・ガイド Printed in Japan GB88-8617-00