IBM Informix ユーザ定義ルーチンおよびデータ タイプ 開発者ガイド (日本語版) (PDF:1.9MB)
by user
Comments
Transcript
IBM Informix ユーザ定義ルーチンおよびデータ タイプ 開発者ガイド (日本語版) (PDF:1.9MB)
IBM Informix ユーザ定義ルーチンおよびデータ タイプ開発者ガイド バージョン 9.4 GB88-8639-00 (英文原典:G251-1252-00) IBM Informix ユーザ定義ルーチンおよびデータ タイプ開発者ガイド バージョン 9.4 GB88-8639-00 (英文原典:G251-1252-00) ご注意 本書および本書で紹介する製品をご使用になる前に、187 ページの『特記事項』に記載されている情報をお読みください。 本マニュアルに関するご意見やご感想は、次の URL からお送りください。今後の参考にさせていただきます。 http://www.ibm.com/jp/manuals/main/mail.html なお、日本 IBM 発行のマニュアルはインターネット経由でもご購入いただけます。詳しくは http://www.ibm.com/jp/manuals/ の「ご注文について」をご覧ください。 (URL は、変更になる場合があります) お客様の環境によっては、資料中の円記号がバックスラッシュと表示されたり、バックスラッシュが円記号と表示さ れたりする場合があります。 原 典: G251–1252–00 IBM Informix User-Defined Routines and Data Types Developer’s Guide Version 9.4 発 行: 日本アイ・ビー・エム株式会社 担 当: ナショナル・ランゲージ・サポート 第1刷 2003.6 この文書では、平成明朝体™W3、平成明朝体™W9、平成角ゴシック体™W3、平成角ゴシック体™W5、および平成角 ゴシック体™W7を使用しています。この(書体*)は、(財) 日本規格協会と使用契約を締結し使用しているものです。フ ォントとして無断複製することは禁止されています。 注* 平成明朝体™W3、平成明朝体™W9、平成角ゴシック体™W3、 平成角ゴシック体™W5、平成角ゴシック体™W7 © Copyright International Business Machines Corporation 1996, 2003. All rights reserved. © Copyright IBM Japan 2003 目次 序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 本書について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 対象ユーザ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi ソフトウェア条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii ロケールに関する前提事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii デモンストレーション データベース . . . . . . . . . . . . . . . . . . . . . . . . . . xii 新機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii 拡張性の向上 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii マニュアルの規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii 文字の表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii その他の表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv コメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv 機能、製品、およびプラットフォーム . . . . . . . . . . . . . . . . . . . . . . . . xiv コード例の表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv 関連マニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 参考文献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii 業界標準への準拠. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviii 第 1 章 データベース サーバの拡張 . . . . . . . . . . . . . . . . . . . . . . . . 1 ユーザ定義ルーチンの作成. 組込み型の拡張 . . . . 演算子の拡張 . . . . . 不透明 (OPAQUE) 型の作成 演算子クラスの拡張 . . . ルーチンの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 2 3 3 第 2 章 ユーザ定義ルーチンの使用. . . . . . . . . . . . . . . . . . . . . . . . . 5 ユーザ定義ルーチン . . . . . . . . SPL ルーチン . . . . . . . . . 外部言語ルーチン. . . . . . . . ユーザ定義ルーチンに関する情報 . . ユーザ定義ルーチンで実行可能なタスク . データ型サポートの拡張 . . . . . ユーザ定義型のサポート . . . . . 型変換関数 . . . . . . . . . エンド ユーザ ルーチン . . . . 集計関数 . . . . . . . . . 演算子関数 . . . . . . . . 演算子クラス関数 . . . . . . 最適化関数 . . . . . . . . 不透明 (OPAQUE) 型サポート関数 アクセス方式のための関数 . . . エンド ユーザ ルーチンの作成 . . . 複数の SQL 文のカプセル化. . . トリガ アクションの作成. . . . 表へのアクセス制限 (SPL のみ) . 反復関数の作成 . . . . . . . ユーザ定義ルーチンの呼出し . . . 明示的な呼出し . . . . . . . 暗黙的な呼出し . . . . . . . © Copyright IBM Corp. 1996, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 . 6 . 6 . 7 . 7 . 7 . 8 . 8 . 9 . 10 . 10 . 11 . 13 . 13 . 13 . 14 . 14 . 15 . 16 . 16 . 16 . 16 . 16 iii 第 3 章 ユーザ定義ルーチンの実行 . . . . . . . . . . . . . . . . . . . . . . . . 17 SQL 文での UDR の呼出し . . . . . . . . . . . . . . . . . EXECUTE 文を使用した UDR の呼出し. . . . . . . . . . . . 関数の呼出し . . . . . . . . . . . . . . . . . . . . 関数引数での SELECT 文の使用 . . . . . . . . . . . . . プロシジャの呼出し . . . . . . . . . . . . . . . . . 式でのユーザ定義関数の呼出し . . . . . . . . . . . . . . . 演算子にバインドされている関数の呼出し . . . . . . . . . . . SPL ルーチンでの UDR の呼出し . . . . . . . . . . . . . . . ユーザ定義ルーチンの実行 . . . . . . . . . . . . . . . . . SQL 文の構文解析 . . . . . . . . . . . . . . . . . . . SQL 文の最適化 . . . . . . . . . . . . . . . . . . . . ルーチンの実行 . . . . . . . . . . . . . . . . . . . . SPL ルーチンの実行 . . . . . . . . . . . . . . . . . 外部言語ルーチンの実行 . . . . . . . . . . . . . . . . ルーチン分析の理解 . . . . . . . . . . . . . . . . . . . ルーチン シグネチャ . . . . . . . . . . . . . . . . . . ANSI 標準準拠および ANSI 標準非準拠のルーチン シグネチャの使用 DBA タスクを実行するためのルーチン シグネチャの使用 . . . . . ルーチンのオーバーロード . . . . . . . . . . . . . . . . オーバーロード ルーチンの作成 . . . . . . . . . . . . . 固有のルーチン名の割り当て . . . . . . . . . . . . . . 呼出し時のオーバーロード ルーチンの指定. . . . . . . . . . 組込み SQL 関数のオーバーロード . . . . . . . . . . . . ルーチン分析プロセス . . . . . . . . . . . . . . . . . . ルーチン シグネチャ . . . . . . . . . . . . . . . . . ルーチンの候補リスト . . . . . . . . . . . . . . . . . 型の優先順位リスト . . . . . . . . . . . . . . . . . 組込み型の優先順位リスト . . . . . . . . . . . . . . . ユーザ定義型でのルーチン分析 . . . . . . . . . . . . . . . 型階層におけるルーチン分析 . . . . . . . . . . . . . . ディスティンクト (DISTINCT) 型でのルーチン分析 . . . . . . . ソース型が組込み型であるルーチン分析 . . . . . . . . . . . コレクション (collection) 型でのルーチン分析 . . . . . . . . . オーバーロード ルーチンでの NULL 引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 18 18 18 19 19 19 19 20 20 20 20 21 23 24 24 24 25 25 25 26 27 27 27 28 28 29 31 31 32 33 34 34 第 4 章 ユーザ定義ルーチンの開発 . . . . . . . . . . . . . . . . . . . . . . . . 37 ルーチンの計画 . . . . . . . . . . . . . . ルーチンの命名 . . . . . . . . . . . . . ルーチン パラメータの定義 . . . . . . . . . 引数の数 . . . . . . . . . . . . . . ルーチン パラメータの宣言 . . . . . . . . 戻り値 . . . . . . . . . . . . . . . . バリアントまたは非バリアントの戻り値 . . . . OUT パラメータと文ローカル変数 (SLV) の使用 . 戻りパラメータの命名 . . . . . . . . . . . 反復関数の使用 . . . . . . . . . . . . . 反復関数の作成 . . . . . . . . . . . . 反復関数の登録 . . . . . . . . . . . . 反復関数の呼出し . . . . . . . . . . . SELECT 文の FROM 節での反復関数の使用 . . コーディング標準への準拠 . . . . . . . . . ルーチンの作成 . . . . . . . . . . . . . . ユーザ定義ルーチンの登録 . . . . . . . . . . ルーチンの特権の設定 . . . . . . . . . . . データベース レベル 特権 . . . . . . . . iv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 38 39 39 39 40 40 41 43 44 44 44 45 45 51 51 52 53 53 言語レベル 特権. . . . . . . . ルーチン レベル 特権 . . . . . . SPL ルーチンの作成 . . . . . . . 外部言語ルーチンの作成 . . . . . . C 言語で作成したルーチンの登録 . . Java で作成したルーチンの登録 . . 修飾子を使用した外部ルーチンの登録 パラメータと戻り値の登録 . . . . ユーザ定義ルーチンに関する情報の参照 . HDR での UDR の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 54 54 56 56 57 57 59 59 60 第 5 章 データ型の拡張. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 データ型システムについて . . . . . データ型について . . . . . . . . 組込み型 . . . . . . . . . . 拡張データ型 . . . . . . . . . 複合データ型 . . . . . . . . ユーザ定義型 . . . . . . . . IBM Informix DataBlade モジュール データ型システムの拡張 . . . . . . 演算 . . . . . . . . . . . . 型変換 (キャスト) . . . . . . . 演算子クラス . . . . . . . . . 演算子クラスの追加作成 . . . . 演算子クラスの拡張 . . . . . オプティマイザ情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 62 63 64 65 65 67 67 67 68 68 69 69 69 第 6 章 演算子および組込み関数の拡張 . . . . . . . . . . . . . . . . . . . . . . 71 演算子および演算子関数 . . . . . 算術演算子 . . . . . . . . テキスト演算子 . . . . . . . 関係演算子 . . . . . . . . 演算子関数のオーバロード . . . 組込み関数 . . . . . . . . . オーバロード可能な組込み関数 . . オーバロードできない組込み関数 . 組込み集計関数 . . . . . . 状態関数 . . . . . . . . 光ディスク記憶サブシステム関数 組込み関数のオーバロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 72 72 72 73 74 74 74 74 74 74 75 第 7 章 ユーザ定義の型変換 (キャスト) の作成 . . . . . . . . . . . . . . . . . . . 77 型変換について . . . . . . . 組込みキャスト . . . . . . ユーザ定義の型変換 . . . . 不透明 (opaque) 型 . . . . ディスティンクト (DISTINCT) 名前付き行 (ROW) 型 . . . ユーザが作成できない型変換 . ユーザ定義の型変換の作成 . . . ユーザ定義型変換の種類の選択 . 暗黙的キャスト . . . . . 明示的キャスト . . . . . 型変換メカニズムの選択 . . . 直接キャスト . . . . . . キャスト関数 . . . . . . . . . . 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 目次 . . . . . . . . . . . . . . 77 77 77 78 78 78 78 78 79 79 80 80 80 81 v キャスト関数の例 . 型変換の方向の定義 . 型変換の削除 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 . 82 . 84 第 8 章 ユーザ定義集計関数の作成 . . . . . . . . . . . . . . . . . . . . . . . . 85 既存の集計関数の拡張 . . . . . . . . . 組込み集計関数の演算子のオーバーロード . 集計関数の拡張 . . . . . . . . . . 組込み集計関数の拡張の例 . . . . . . ユーザ定義集計関数の作成 . . . . . . . サポート関数 . . . . . . . . . . . INIT 関数 . . . . . . . . . . . ITER 関数 . . . . . . . . . . . FINAL 関数 . . . . . . . . . . COMBINE 関数 . . . . . . . . . サポート関数の解決 . . . . . . . . サポート関数状態 . . . . . . . . . C または Java サポート関数の使用 . . . ユーザ定義集計関数の例 . . . . . . . ユーザ定義集計関数とユーザ定義型の使用 サポート関数の省略 . . . . . . . 集計関数の管理 . . . . . . . . . . . 集計関数の並列実行 . . . . . . . . ユーザ定義集計関数の特権 . . . . . . システム カタログの集計関数情報. . . . コマンド行からの集計関数情報 . . . . . 集計関数の廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 86 87 87 87 88 89 89 90 90 91 91 92 92 93 94 95 95 95 95 96 96 第 9 章 不透明 (OPAQUE) 型の作成 . . . . . . . . . . . . . . . . . . . . . . . 97 不透明 (OPAQUE) 型 . . . . . . . . . . . . . . . . 内部構造体 . . . . . . . . . . . . . . . . . . 固定長の不透明 (OPAQUE) 型 . . . . . . . . . . . 可変長の不透明 (OPAQUE) 型 . . . . . . . . . . . サポート関数 . . . . . . . . . . . . . . . . . . 演算子関数 . . . . . . . . . . . . . . . . . 組込み関数 . . . . . . . . . . . . . . . . . 集計関数 . . . . . . . . . . . . . . . . . . 統計情報収集ルーチン . . . . . . . . . . . . . エンド ユーザ ルーチン. . . . . . . . . . . . . 不透明 (OPAQUE) 型の利点 . . . . . . . . . . . . 不透明 (OPAQUE) 型の作成 . . . . . . . . . . . . . C の内部構造体の作成 . . . . . . . . . . . . . . データ型サイズ. . . . . . . . . . . . . . . . メモリの位置合せ . . . . . . . . . . . . . . . パラメータの引渡し . . . . . . . . . . . . . . UDT と Java 間のマッピングの作成. . . . . . . . . . サポート関数の作成と登録 . . . . . . . . . . . . . データベースへの不透明 (OPAQUE) 型の登録 . . . . . . 不透明 (OPAQUE) 型の登録 . . . . . . . . . . . 不透明 (OPAQUE) 型の型変換の作成 . . . . . . . . 非行内ストレージの使用. . . . . . . . . . . . . 不透明 (OPAQUE) 型への特権の付与 . . . . . . . . . SQL 呼出し関数の作成 . . . . . . . . . . . . . . 不透明 (OPAQUE) 型の算術演算子関数とテキスト演算子関数 不透明 (OPAQUE) 型の組込み関数 . . . . . . . . . 不透明 (OPAQUE) 型の集計関数 . . . . . . . . . . vi IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 . 98 . 98 . 98 . 99 . 99 . 100 . 100 . 100 . 100 . 101 . 101 . 101 . 102 . 103 . 103 . 104 . 104 . 104 . 104 . 105 . 106 . 106 . 107 . 108 . 108 . 108 不透明 (OPAQUE) 型の条件演算子 . . . . . 不透明 (OPAQUE) 型の関係演算子 . . . . . 不透明 (OPAQUE) 型の比較関数 . . . . . . アクセス方式のカスタマイズ . . . . . . . . . 汎用 B ツリーの使用. . . . . . . . . . . その他のアクセス方式の使用 . . . . . . . . スペーシャル (空間) データのインデックス作成. その他の型のデータのインデックス作成 . . . 不透明 (OPAQUE) 型に関するその他の操作 . . . . 不透明 (OPAQUE) 型へのアクセス . . . . . . 不透明 (OPAQUE) 型の廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 109 110 110 111 111 111 112 112 112 112 第 10 章 サポート関数の作成 . . . . . . . . . . . . . . . . . . . . . . . . . . 115 サポート関数の作成 . . . . . . . . . . . . . サポート関数の識別 . . . . . . . . . . . . 関数パラメータの選択 . . . . . . . . . . . サポート関数に対する特権の設定. . . . . . . . サポート関数の型 . . . . . . . . . . . . . . ラージ可変長文字 (LVARCHAR) 型 . . . . . . . SENDRECV 型 . . . . . . . . . . . . . . 外部表現の処理. . . . . . . . . . . . . . . input サポート関数 . . . . . . . . . . . . output サポート関数 . . . . . . . . . . . . 内部表現の処理. . . . . . . . . . . . . . . send および receive サポート関数 . . . . . . . SENDRECV 型 . . . . . . . . . . . . . receive サポート関数 . . . . . . . . . . . send サポート関数. . . . . . . . . . . . 一括コピーの実行 . . . . . . . . . . . . . . import および export サポート関数 . . . . . . . IMPEXP 型 . . . . . . . . . . . . . . import サポート関数 . . . . . . . . . . . export サポート関数 . . . . . . . . . . . importbinary および exportbinary サポート関数 . . . IMPEXPBIN 型 . . . . . . . . . . . . . importbinary サポート関数 . . . . . . . . . exportbinary サポート関数 . . . . . . . . . stream サポート関数 . . . . . . . . . . . . データの挿入と削除 . . . . . . . . . . . . . assign() 関数. . . . . . . . . . . . . . . destroy() 関数 . . . . . . . . . . . . . . update() 関数 . . . . . . . . . . . . . . deepcopy() 関数. . . . . . . . . . . . . . スマート ラージ オブジェクトの処理 . . . . . . . データの比較 . . . . . . . . . . . . . . . ロケールを区別するデータの処理 (GLS のみ) . . . . ロケールを区別する input および output サポート関数 ロケールを区別する receive および send サポート関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 116 117 118 118 119 119 119 120 122 123 124 124 124 125 126 127 127 128 128 128 129 129 130 130 130 131 132 132 133 134 135 135 136 137 第 11 章 演算子クラスの拡張 . . . . . . . . . . . . . . . . . . . . . . . . . . 139 演算子クラスの使用 . . . . . . . 2 次アクセス方式 . . . . . . . 汎用 B ツリー インデックス . . R ツリー インデックス . . . . 他のユーザ定義 2 次アクセス方式 演算子クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 目次 . . . . . . 139 139 140 140 140 141 vii 汎用 B ツリー演算子クラス . . . . R ツリー インデックス演算子クラス . 既存演算子クラスの拡張. . . . . . . . btree_ops 演算子クラスの拡張機能 . . . btree_ops を拡張する理由 . . . . . . 新しい型の単一値の生成. . . . . . ソート順の変更. . . . . . . . . 演算子クラスの作成 . . . . . . . . . 新規 B ツリーの演算子クラスの作成 . . 絶対値演算子クラスの作成 . . . . . . 他の 2 次アクセス方式の演算子クラス定義 演算子クラスの廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 143 143 143 145 145 145 147 148 149 150 151 第 12 章 ユーザ定義ルーチンの管理 . . . . . . . . . . . . . . . . . . . . . . . 153 ルーチンへの Execute 特権の割り当て . . . . . Execute 特権の付与および取り消し . . . . . UDR と関連付けされたオブジェクトに対する特権 DBA としての UDR の実行 . . . . . . . オブジェクトおよびネストされた UDR での DBA ユーザ定義ルーチンの修正 . . . . . . . . . C UDR の修正 . . . . . . . . . . . . 共有ライブラリからのルーチンの除去 . . . Java UDR の修正 . . . . . . . . . . . ユーザ定義ルーチンの変更 . . . . . . . . . ユーザ定義ルーチンの廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 特権の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 154 155 155 156 157 157 157 158 159 159 第 13 章 UDR パフォーマンスの向上 . . . . . . . . . . . . . . . . . . . . . . 161 ユーザ定義ルーチンの最適化 . . . . . . . . SPL ルーチンの最適化 . . . . . . . . . 最適化レベル . . . . . . . . . . . 自動最適化 . . . . . . . . . . . . SPL ルーチンの統計情報の更新 . . . . . . SQL 文の関数の最適化 . . . . . . . . . . 問合せ予定の計算 . . . . . . . . . . . コストと選択の水準の指定 . . . . . . . . 一定のコストおよび選択の水準の値 . . . . 動的なコストおよび選択の水準の値 . . . . コストの計算 . . . . . . . . . . . . 選択の水準とコストの例. . . . . . . . . UPDATE STATISTICS の拡張 . . . . . . . . UPDATE STATISTICS の使用 . . . . . . . UPDATE STATISTICS のサポート関数 . . . . stat 型 . . . . . . . . . . . . . . statcollect() 関数 . . . . . . . . . . statprint() 関数 . . . . . . . . . . . ユーザ定義統計関数の例. . . . . . . . 否定関数の使用. . . . . . . . . . . . . 仮想プロセッサ クラスの使用 . . . . . . . . 仮想プロセッサ クラスの選択 . . . . . . . CPU 仮想プロセッサ クラス . . . . . . ユーザ定義仮想プロセッサ クラス (C のみ) . JVM 仮想プロセッサ クラス (Java のみ) . . C で作成された UDR での仮想プロセッサの使用 仮想プロセッサの管理 . . . . . . . . . 仮想プロセッサの追加および削除. . . . . 仮想プロセッサ クラスの監視 . . . . . . viii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 162 162 163 164 165 165 166 166 166 167 167 168 168 168 169 169 170 170 170 171 172 172 173 173 173 174 174 174 並列 UDR . . . . . . . . . . . . . . . . . . UDR の並列実行 . . . . . . . . . . . . . . . 問合せ式での UDR の実行 . . . . . . . . . . . DataBlade API における UDR の FastPath 実行 (C のみ). ユーザ定義集計関数の暗黙的な UDR 実行 . . . . . 比較演算子の暗黙的な UDR 実行 . . . . . . . . Assign UDR の暗黙的な実行 . . . . . . . . . . ソートのための compare UDR の実行 . . . . . . . UDT 列のインデックスによる UDR の実行 . . . . . 並列 UDR の有効化 . . . . . . . . . . . . . . 修飾子 PARALLELIZABLE の指定 . . . . . . . . PDQ スレッド セーフ UDR の作成 . . . . . . . . PDQ の有効化および他の構成パラメータの検討 . . . . 並列 UDR を有効化するための段階的な手順 . . . . . 仮想プロセッサ数の設定. . . . . . . . . . . . . 並列 UDR の監視 . . . . . . . . . . . . . . . メモリに関する考慮事項. . . . . . . . . . . . . . C UDR のメモリ接続期間 . . . . . . . . . . . . スタック サイズに関する考慮事項 (Ext のみ) . . . . . ルーチンの仮想メモリ キャッシュ . . . . . . . . . システム カタログ表 sysprocedures . . . . . . . . UDR キャッシュ . . . . . . . . . . . . . . 入出力に関する考慮事項. . . . . . . . . . . . . . システム カタログ表の分離 . . . . . . . . . . . 入出力動作のバランシング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 175 176 178 178 178 179 179 179 179 180 180 180 181 181 182 183 183 183 184 185 185 185 186 186 特記事項. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 商標 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 索引 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 目次 ix x IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 序 本書について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi 対象ユーザ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi ソフトウェア条件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii ロケールに関する前提事項 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xii デモンストレーション データベース . . . . . . . . . . . . . . . . . . . . . . . . . . xii 新機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii 拡張性の向上 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii マニュアルの規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii 文字の表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii その他の表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv コメント . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiv 機能、製品、およびプラットフォーム . . . . . . . . . . . . . . . . . . . . . . . . xiv コード例の表記 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv 関連マニュアル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi 参考文献 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii 業界標準への準拠. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xviii 第 1 章 データベース サーバの拡張 ユーザ定義ルーチンの作成. . . . 組込み型の拡張 . . . . . . . 演算子の拡張 . . . . . . . . 不透明 (OPAQUE) 型の作成 . . . 演算子クラスの拡張 . . . . . . ルーチンの管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 序の内容 この序では、このマニュアルにある情報の概要を説明し、使用される表記規則を示 します。 本書について このマニュアルでは、新規の型を定義し、ユーザ定義ルーチン (UDR) を使用して IBM Informix Dynamic Server の機能を拡張する方法について説明します。また、型 に対する操作の拡張、新規キャストの作成、2 次アクセス メソッドのための演算子 クラスの拡張、不透明 (opaque) 型の作成、およびルーチンの作成と登録を行うため に実行する必要のあるタスクについて説明します。 対象ユーザ このマニュアルは、以下のユーザを対象としています。 v データベース アプリケーションのプログラマ v DataBlade モジュールの開発者 このマニュアルは、ユーザが以下の知識、または経験を持っていることを前提とし ています。 © Copyright IBM Corp. 1996, 2003 xi v コンピュータ、オペレーティング システム、およびオペレーティング システム が提供するユーティリティの、実際的な知識 v リレーショナル データベースの操作経験、またはデータベースの概念の理解 v コンピュータ プログラミングの経験 リレーショナル データベース、SQL、またはオペレーティング システムの経験が 少ない場合は、「IBM Informix: スタートアップ ガイド」の参考資料の一覧を参照 してください。 ソフトウェア条件 このマニュアルでは、データベース サーバとして、IBM Informix Dynamic Server バージョン 9.4 を使用していることを前提としています。 ロケールに関する前提事項 IBM Informix 製品は、多くの言語、地域特有の情報、およびコード セットをサポ ートしています。文化的差異に基づいた情報はすべて、広域言語サポート (GLS) ロ ケールと呼ばれる 1 つの環境にまとめられています。 このマニュアルは、U.S. 8859-1 English ロケールというデフォルトのロケールを使 用します。このデフォルトは、UNIX プラットフォームの場合は en_us.8859-1 (ISO 8859-1) で、Windows 環境の場合は en_us.1252 (Microsoft 1252) です。この ロケールは、日付、時刻、および通貨に関して、米国英語の表記規則をサポートし ています。また、ASCII コード セット、および é、è、ñ などの多くの 8 ビット文 字を含む、ISO 8859-1 あるいは Microsoft 1252 コード セットもサポートしていま す。 データまたは SQL 識別子でデフォルト以外の文字を使用する場合、またはデフォ ルト以外の文字データ照合規則に従う場合は、適切なデフォルト以外のロケールを 指定する必要があります。 デフォルト以外のロケールの指定、構文の詳細、および GLS ロケールに関するそ の他の情報については、「IBM Informix: GLS ユーザーズ ガイド」を参照してくだ さい。 デモンストレーション データベース IBM Informix データベース サーバ製品に付属する DB-Access ユーティリティに は、以下のデモンストレーション用のデータベースが含まれています。 v stores_demo データベースでは、架空のスポーツ用品卸し売り業者の例を使用 して、関係スキーマについて説明します。 IBM Informix のマニュアルには、 stores_demo データベースに基づく多くの例が含まれています。 v superstores_demo データベースでは、オブジェクト関係スキーマが示されてい ます。この superstores_demo データベースには、拡張データ型、型および表 の継承、およびユーザ定義ルーチンについての例が含まれています。 デモンストレーション データベースの作成および設定の詳細については、 「IBM Informix: DB-Access ユーザーズ ガイド」を参照してください。これらのデ ータベースの詳細、および内容の一覧については、「IBM Informix: SQL ガイド: 参 照」を参照してください。 xii IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド デモンストレーション データベースのインストールに使用するスクリプトは、 UNIX プラットフォームの場合は $INFORMIXDIR/bin ディレクトリに、Windows 環境の場合は %INFORMIXDIR%¥bin ディレクトリにあります。 新機能 次の表に、本書で取り上げている、IBM Informix Dynamic Server バージョン 9.4 の新機能に関する情報を示します。必要なページに移動するには、青色のハイパー リンクをクリックしてください。すべての新機能についての説明は、 「IBM Informix: スタートアップ ガイド」を参照してください。 拡張性の向上 バージョン 9.4 では、拡張性の領域で、以下の向上が図られています。 新機能 参照先 SELECT 文の FROM 節での反復関数の使用 44 ページの『反復関数の使用』 UDR の戻りパラメータの命名 43 ページの『戻りパラメータの命名』 複数の OUT パラメータおよび文ローカル変数 の使用 41 ページの『OUT パラメータと文ローカ ル変数 (SLV) の使用』 実行時の照合順序の設定 (多国語化) 135 ページの『ロケールを区別するデータ の処理 (GLS のみ)』 HDR による拡張型のサポート 51 ページの『ルーチンの作成』60 ページ の『HDR での UDR の使用』 マニュアルの規則 このセクションでは、このマニュアルで使用されている表記規則について説明しま す。これらの表記規則を覚えておくと、このマニュアル、およびほかのマニュアル の内容を理解するのに役立ちます。 以下の表記規則について説明します。 v 文字の表記 v その他の表記 v コマンド行の表記 v コード例の表記 文字の表記 このマニュアルでは、新規用語の紹介、画面表示の説明、コマンド構文の説明など で、以下の表記を使用しています。 規則 意味 KEYWORD プログラム言語の文中では、主要な要素 (キーワード) はすべて大文字の セリフ フォントで表示されます。 italics italics italics テキスト内では、新規用語と強調する語はイタリックで表示されます。構 文とコード例内では、指定する変数値はイタリックで表示されます。 序 xiii 規則 意味 boldface boldface プログラム エンティティ (クラス、イベント、表など) の名前、環境変 数、ファイルとパス名、およびインターフェイス エレメント (アイコ ン、メニュー項目、ボタンなど) は、太文字で表示されます。 monospace monospace 製品が表示する情報およびユーザが入力する情報は、モノスペース書体で 表示されます。 KEYSTROKE ユーザが押すキーは、サンセリフ フォントの大文字で表示されます。 → この記号はメニュー項目を示します。例えば、「「ツール」→ オプショ ン」と選択する」と記述されている場合は、「ツール」メニューから「オ プション」項目を選択することを意味します。 ヒント: コマンドの「入力」または「実行」を指示された場合は、入力後 Enter キ ーを押してください。コマンド以外の文字を「入力」したり、その他のキ ーを「押す」ように指示された場合は、Enter キーを押す必要はありませ ん。 その他の表記 このマニュアルの本文では、いくつかのマークアップが使用されています コメント コメントは、以下の例に示すように、3 種類の情報を示します。 警告: パラグラフに、重要な指示、注意、または情報が含まれていることを示し ます。 重要: パラグラフに、説明されている機能または操作に関する重要な情報が含ま れていることを示します。 ヒント: パラグラフに、説明されている機能に関する追加の詳細またはショート カットが記載されていることを示します。 機能、製品、およびプラットフォーム 機能、製品、およびプラットフォームに関するマークアップは、パラグラフに、機 能固有の情報、製品固有の情報、またはプラットフォーム固有の情報が含まれてい ることを示します。このマークアップの例を以下に示します。 xiv IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド Dynamic Server IBM Informix Dynamic Server に固有の情報であることを示します。 Dynamic Server の終り UNIX のみ UNIX プラットフォームに固有の情報であることを示します。 UNIX のみ の終り Windows のみ Windows 環境に固有の情報であることを示します。 Windows のみ の終り このマークアップは、セクション内の 1 つ以上のパラグラフに適用される場合があ ります。セクション全体が特定の製品またはプラットフォームに関係する場合は、 以下のように、見出しテキストの一部として示されます。 表ソート (Windows のみ) コード例の表記 このマニュアルでは、SQL コードの例が随所に使用されています。特に説明がない 限り、コードは、特定の IBM Informix アプリケーション開発ツール専用ではあり ません。 例に SQL 文のみがリストされている場合は、セミコロン (;) で区切られていませ ん。例えば、以下の例のようなコードがあります。 CONNECT TO stores_demo ... DELETE FROM customer WHERE customer_num = 121 ... COMMIT WORK DISCONNECT CURRENT 特定の製品でこの SQL コードを使用するには、その製品の構文ルールを使用する 必要があります。例えば、DB–Access を使用する場合は、複数の文をセミコロン (;) で区切る必要があります。 SQL API を使用する場合は、各文の始めに EXEC SQL を、文の終わりにセミコロン (;) (またはその他の適切な区切り記号) を使用する必 要があります。 ヒント: コード例における省略記号は、完全なアプリケーションではさらにコード が追加されることを示します。取り上げている概念の説明ではそのコード を示す必要がないため、この省略記号が使用されます。 序 xv 特定のアプリケーション開発ツールまたは SQL API で SQL 文を使用するための 詳細な説明については、ご使用の製品のマニュアルを参照してください。 関連マニュアル IBM Informix Dynamic Server のマニュアルは、次に示すようなさまざまな形式で提 供されています。 v オンライン マニュアル: オンライン マニュアルは、IBM Informix Online Documentation サイト (http://www-3.ibm.com/software/data/informix/pubs/library/) か ら入手できます。このサイトで、マニュアルの一部、あるいは全体を印刷するこ とができます。 v オンライン ヘルプ: この機能を使用すると、状況に応じたヘルプ、エラー メッ セージ リファレンス、言語構文、などを参照することができます。 v ドキュメント ノートおよびリリース ノート: ドキュメント ノート (マニュアル に関する追加事項や訂正事項を記載) とリリース ノートは、本製品がインストー ルされているディレクトリにあります。 これらのファイルには、アプリケーションおよびパフォーマンスの問題に関する 重要な情報が含まれているため、よく読んでおいてください。次の表に、これら のファイルについて示します。 UNIX のみ UNIX プラットフォームでは、以下のオンライン ファイルは $INFORMIXDIR/release/en_us/0333 ディレクトリにあります。 xvi オンライン ファイル 目的 ids_creating_udts__docnotes_9.40.html このマニュアルのご使用バージョ ンのドキュメント ノートのファイ ルです。マニュアルに記載されて いないトピック、またはマニュア ルが出版されてから変更されたト ピックについて説明しています。 ids_release_notes_9.40.html このリリース ノート ファイルで は、IBM Informix 製品の旧バージ ョンとの機能の違い、およびそれ らの違いが現在の製品に及ぼす影 響ついて説明しています。このフ ァイルには、既知の問題およびそ の対処方法も含まれています。 ids_machine_notes_9.40.txt このマシン ノート ファイルで は、ご使用のコンピュータで IBM Informix 製品を構成および使 用するために必要な特別な操作に ついて説明しています。 マシンノ ートには、製品と同じ名前が付い ています。 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド UNIX のみ の終り Windows のみ Informix フォルダには、以下の項目があります。このフォルダを表示するには、 タスクバーで、「スタート」→「プログラム」→「Informix」→「Documentation Notes or Release Notes」を選択してください。 プログラムグループの項目 内容 ドキュメント ノート この項目には、マニュアルに関する追加事項または訂正事項 が含まれています。また、マニュアルに記載されていない機 能、またはマニュアルが出版されてから変更された機能につ いても説明しています。 リリース ノート この項目では、IBM Informix 製品の旧バージョンとの機能 の違い、およびその違いが現在の製品に及ぼす影響について 説明しています。このファイルには、既知の問題およびその 対処方法も含まれています。 Windows のみ の終り マシン ノートは、Windows プラットフォームでは使用されていません。 v IBM Informix ソフトウェア製品には、エラー メッセージおよびエラーの訂正方 法をすべて含んだ ASCII ファイルが付属されています。これらのエラー メッセ ージについての詳細は、IBM Informix Online Documentation サイト (http://www-3.ibm.com/software/data/informix/pubs/library/) の「IBM Informix: Error Messages」を参照してください。 UNIX のみ UNIX でエラー メッセージを参照するには、finderr コマンドを使用すると、エ ラー メッセージをオンラインで表示することができます。 UNIX のみ の終り Windows のみ Windows でエラーメッセージおよび訂正方法を参照するには、Informix Error Message ユーティリティを使用します。このユーティリティを表示するには、 タスク バーから、「スタート」→「プログラム」→「Informix」と選択します。 Windows のみ の終り 参考文献 データベース サーバ、およびオペレーティング システム プラットフォームの概要 を説明する文献の一覧は、「IBM Informix: スタートアップ ガイド」を参照してく ださい。 序 xvii 業界標準への準拠 SQL の業界標準は、ANSI (American National Standards Institute : 米国規格協会) に よって確立されています。 IBM Informix SQL ベースの製品は、SQL-92 Entry Level (ANSI X3.135-1992 として公開されています) に完全準拠しています。この規 格は、ISO 9075:1992 と同一です。また、Informix データベース サーバの多くの機 能は、SQL-92 Intermediate Level と Full Level および X/Open SQL CAE (共通ア プリケーション環境) 標準に準拠しています。 xviii IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 1 章 データベース サーバの拡張 本章の内容 このマニュアルでは、ユーザ定義ルーチン (UDR) およびユーザ定義 (user-defined) 型 (UDT) を使用した IBM Informix Dynamic Server の拡張について説明します。 UDR を使用する場合、UDT は使用しません。逆に、UDT を使用する場合は UDR は使用しません。ただし、多くの場合、データ型を拡張するには、これらの拡張機 能をサポートするためのルーチンを記述する必要があります。 この章では、本書の章構成を要約して、目的に応じた参照箇所を示します。 ユーザ定義ルーチンの作成 データベース サーバを拡張するには、多くの場合、拡張機能をサポートする UDR を作成する必要があります。ルーチン とは、特定のタスクを実行するプログラム文 のコレクションです。UDR は、SQL 文において、データベース サーバまたは別の UDR により呼び出すことのできるユーザ定義のルーチンです。 このマニュアルの次の 3 つの章では、UDR の作成および使用に関する基本事項に ついて説明します。 v 5 ページの『第 2 章 ユーザ定義ルーチンの使用』 v 17 ページの『第 3 章 ユーザ定義ルーチンの実行』 v 37 ページの『第 4 章 ユーザ定義ルーチンの開発』 Informix データベース サーバは、次の言語での UDR をサポートします。 v ストアド プロシージャー言語 (SPL) v C プログラム言語 v Java プログラム言語 組込み型の拡張 組込み型とは、データベース サーバにより提供されている型のことです。データベ ース サーバには、組込み型の検索、保管、操作、およびソートを行うための関数が 提供されています。 組込み型は、次の方法で拡張することができます。 v 組込み型を基にした複合データ型を作成する v UDT (ディスティンクト (DISTINCT) 型および不透明 (OPAQUE) 型) を作成する v 組込み型と拡張データ型で可能な演算を拡張する 61 ページの『第 5 章 データ型の拡張』には、データベースが使用するデータ型シ ステムについての説明と、組込み型を基にした UDT の作成によるデータベース サ ーバの拡張方法が記載されています。また、「IBM Informix: データベース設計およ び実装 ガイド」にも、組込み型に基づく UDT が説明されています。 © Copyright IBM Corp. 1996, 2003 1 演算子の拡張 組込み型を拡張するか、または不透明 (OPAQUE) 型を作成して UDT を作成する場 合、そのデータ型が使用する演算を指定する必要があります。演算 とは、データベ ースが値に対して行う操作のことです。 データベースの組込み演算を拡張する特別なルーチンを作成することができます。 このマニュアルでは、次の特定の型の演算子について説明します。 v 算術演算子および関係演算子 データベース サーバには、演算子記号 (+、-、=、> など) と、cos() および abs() などの組込み関数が提供されています。これらの演算子を拡張データ型で も使用可能なように拡張することができます。 71 ページの『第 6 章 演算子および組込み関数の拡張』には、演算の拡張につい ての一般情報と、演算子記号および組込み関数の拡張方法が記載されています。 v 型変換 (キャスト) データベース サーバには、組込み型に対する型変換が提供されています。UDT を使用する場合、通常、型変換を指定する必要があります。 77 ページの『第 7 章 ユーザ定義の型変換 (キャスト) の作成』には、型変換の 作成方法が記載されています。また、「IBM Informix: データベース設計および実 装 ガイド」には、型変換の使用方法が説明されています。 v 集計関数 集計関数は、平均またはカウント数など、選択した列を特定の要素で集計した値 を示します。集計関数は、次の 2 通りの方法で拡張できます。 – 列内の各値の 2 乗の合計を計算する集計関数などの新しい集計関数を作成す る。 – AVG または COUNT などの既存の集計関数を拡張して、ユーザが定義したデ ータ型を組み込む。 ユーザ定義集計関数を作成する場合と、拡張データ型用に既存の集計関数を拡張 する場合では、異なる方法を使用する必要があります。これらの方法について は、 85 ページの『第 8 章 ユーザ定義集計関数の作成』を参照してください。 不透明 (OPAQUE) 型の作成 不透明 (OPAQUE) 型 は、データベースに定義する最小の (または基礎となる) デ ータ型です。データベース サーバには、不透明 (OPAQUE) 型を記述したルーチン を作成するまでは、不透明 (OPAQUE) 型に関して何も定義されていません。不透明 (OPAQUE) 型を作成する場合、次の点を検討する必要があります。 v 不透明 (OPAQUE) 型内の情報の構成 v データ型の保管および検索方法 v 不透明 (OPAQUE) 型に対する標準の演算の動作 – 2 つのデータを加算するとどうなるか。データの加算は可能か。 – どのような場合にデータ項目が他のデータ項目より大きくなるか。 – このデータを組込み型に関連付けできるか。 v このデータで可能な固有の操作 2 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド – このデータ型でピクチャを保管できるか。 – データ項目を別のデータ項目の内部に配置することができるか。 97 ページの『第 9 章 不透明 (OPAQUE) 型の作成』には、不透明 (OPAQUE) 型 を作成するための基本ステップが記載されています。115 ページの『第 10 章 サポ ート関数の作成』には、不透明 (OPAQUE) 型で使用するサポート関数が記載されて います。 主な作業は、不透明 (OPAQUE) 型およびこれをサポートするために必要なすべての ルーチンの作成です。理論的には、単に必要とされるルーチンをすべて作成すれば よいだけです。ただし、作成には IBM Informix DataBlade Developer's Kit (DBDK) を使用することをお勧めします。これは、DBDK により標準化が行われ、異なるバ ージョンのデータベース サーバ間での移行が容易になるためです。 DataBlade モジュール は、ユーザ定義データの管理または新機能の追加を行う、デ ータベース オブジェクトおよびサポート コードのグループです。DataBlade モジュ ールには、拡張データ型、ルーチン、型変換、集計関数、アクセス方式、SQL コー ド、クライアント コード、およびインストール プログラムを含むことができま す。各種の特別な不透明 (OPAQUE) 型をサポートする DataBlade モジュールが提 供されています。使用可能な DataBlade モジュールについては、販売担当者までお 問い合わせください。 演算子クラスの拡張 演算子クラスは、インデックスの作成に関連した機能のセットです。 139 ページの『第 11 章 演算子クラスの拡張』には、ユーザ定義の演算子クラスの 作成方法、および既存の演算子クラスの拡張方法が記載されています。 ルーチンの管理 153 ページの『第 12 章 ユーザ定義ルーチンの管理』には、次のトピックが記載さ れています。 v UDR への Execute 特権の割当て v UDR の再ロード v UDR の変更 v UDR の削除 161 ページの『第 13 章 UDR パフォーマンスの向上』には、UDR のパフォーマン スの最適化方法が記載されています。 第 1 章 データベース サーバの拡張 3 4 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 2 章 ユーザ定義ルーチンの使用 ユーザ定義ルーチン . . . . . . . . . . SPL ルーチン . . . . . . . . . . . 外部言語ルーチン. . . . . . . . . . ユーザ定義ルーチンに関する情報 . . . . ユーザ定義ルーチンで実行可能なタスク . . . データ型サポートの拡張 . . . . . . . ユーザ定義型のサポート . . . . . . . 型変換関数 . . . . . . . . . . . 組込み型間の型変換 . . . . . . . 他のデータ型間の型変換 . . . . . エンド ユーザ ルーチン . . . . . . 集計関数 . . . . . . . . . . . 演算子関数 . . . . . . . . . . 組込み型に対する演算子 . . . . . ユーザ定義型に対する演算子 . . . 演算子クラス関数 . . . . . . . . 組込み型に対する演算子クラス関数 . ユーザ定義型に対する演算子クラス . 最適化関数 . . . . . . . . . . 不透明 (OPAQUE) 型サポート関数 . . アクセス方式のための関数 . . . . . エンド ユーザ ルーチンの作成 . . . . . 複数の SQL 文のカプセル化. . . . . プログラムの単純化 . . . . . . 変更の単純化 . . . . . . . . . SPL を使用したパフォーマンスの向上 トリガ アクションの作成. . . . . . 表へのアクセス制限 (SPL のみ) . . . 反復関数の作成 . . . . . . . . . ユーザ定義ルーチンの呼出し . . . . . 明示的な呼出し . . . . . . . . . 暗黙的な呼出し . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 . 6 . 6 . 7 . 7 . 7 . 8 . 8 . 8 . 8 . 9 . 10 . 10 . 11 . 11 . 11 . 12 . 12 . 13 . 13 . 13 . 14 . 14 . 14 . 14 . 15 . 15 . 16 . 16 . 16 . 16 . 16 本章の内容 この章では、ユーザ定義ルーチン (UDR) を説明し、次のトピックを扱います。 v ユーザ定義ルーチン v ユーザ定義ルーチンで実行可能なタスク ユーザ定義ルーチン UDR には、次のように値を戻すものと戻さないものがあります。 v ユーザ定義関数 は、1 つまたは複数の値を戻します。そのため、SQL 式で使用 することができます。 この UDR は、CREATE FUNCTION 文を使用してシステム カタログ表に登録し ます。 © Copyright IBM Corp. 1996, 2003 5 v ユーザ定義プロシジャ は、値を戻さないルーチンです。プロシジャは値を戻さな いため、SQL 式では使用できません。 この UDR は、CREATE PROCEDURE 文を使用して、システム カタログ表に登 録します。 SPL ルーチン ストアド プロシジャ言語 (SPL) は、データベース サーバの一部となるものです。 このマニュアルの多くの例は、SPL で記述されています。これは、使用が簡単であ り、データベース サーバ以外のサポートを必要としないためです。 SPL は、SQL を拡張してフロー制御が可能なようにします。SPL ルーチン とは、 SPL および SQL で記述された UDR のことです。SPL ルーチンの本体には、SQL 文およびループと分岐用のフロー制御文が含まれています。SPL 文の構文について は、「IBM Informix: SQL ガイド: 構文」を参照してください。SPL 文の使用方法 については、「IBM Informix: SQL ガイド: チュートリアル」を参照してください。 データベース サーバは、SPL ルーチンを構文解析して最適化し、これを実行可能形 式でシステム カタログ表に格納します。可能な場合は、SQL を多用しているタス クで SPL ルーチンを使用してください。 詳しくは、54 ページの『SPL ルーチンの作成』を参照してください。 外部言語ルーチン 外部言語ルーチン とは、外部言語で記述された UDR のことです。外部言語ルーチ ンの本体には、フロー制御やループなどの操作用の文、およびデータベース サーバ にアクセスするための特殊な Informix ライブラリ呼出しが含まれています。したが って、適切なコンパイル ツールを使用して、外部言語ルーチンを構文解析し、実行 可能形式にコンパイルする必要があります。 データベース サーバでは、C および Java 言語で記述された UDR をサポートしま す。 v C 言語で記述されたルーチン C 言語でルーチンを記述するには、C コンパイラが必要です。C 言語での UDR の記述方法については、「IBM Informix: DataBlade API Programmer’s Guide」お よび「IBM Informix: DataBlade API Function Reference」を参照してください。 v Java 言語で記述されたルーチン Java 言語でルーチンを記述するには、IBM Informix Dynamic Server with J/Foundation が必要です。Java ルーチンのコンパイルには、Java 開発キット (JDK) も必要です。 Java で UDR を記述する方法については、「IBM Informix: J/Foundation Developer’s Guide」を参照してください。 重要: 外部言語での UDR の作成には、DBDK を使用することをお勧めします。こ れは、DBDK により標準化が行われ、異なるバージョンのデータベース サー バ間での移行が容易になるためです。 6 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ユーザ定義ルーチンに関する情報 データベース サーバは、UDR に関する情報を、次のシステム カタログ表に格納し ます。 v sysprocedures システム カタログ表は、UDR に関する情報 (名前、所有者、ユ ーザ定義関数であるかユーザ定義プロシジャであるかなど) を含みます。 v sysprocbody システム カタログ表は、SPL ルーチンの実際のコードを含みま す。 v sysprocauth システム カタログ表は、データベース サーバのどのユーザが特定 の UDR を実行できるかという情報を含みます。 CREATE FUNCTION 文および CREATE PROCEDURE 文では、外部ルーチンを構 成する実際のコードは作成しません。その代わり、外部ルーチンに関する情報 (実 行可能ファイルの名前を含む) を sysprocedures システム カタログ表に格納しま す。したがって、SPL ルーチンとは異なり、外部ルーチンの本体のコードは、デー タベースのシステム カタログ内には存在しません。 データベース サーバは、UDR 用にサポートする外部言語に関する情報を、次のシ ステム カタログ表に格納します。 v sysroutinelangs システム カタログ表は、外部言語に関する情報を含みます。 v syslangauth システム カタログ表は、データベース サーバのどのユーザが特定 の外部言語を使用できるかという情報を含みます。 詳しくは、56 ページの『外部言語ルーチンの作成』を参照してください。 ユーザ定義ルーチンで実行可能なタスク UDR を作成して、次のタスクを実行することができます。 v 組込み型または UDT のサポートの拡張 v エンド ユーザへの新機能 (エンド ユーザ ルーチン) の提供 次のセクションに、UDR で実行することのできるタスクを要約します。 UDR の作 成方法については、 37 ページの『第 4 章 ユーザ定義ルーチンの開発』 を参照し てください。 データ型サポートの拡張 Dynamic Server では、次のタイプの UDR をサポートします。 UDR タスク キャスト関数 コスト関数 エンド ユーザ ルーチン 反復関数 否定素子関数 不透明 (OPAQUE) 型サポート関 数 演算子関数 演算子クラス関数 SPL ルーチン C ルーチン Java ルーチン 参照 箇所 あり なし あり なし あり なし あり あり あり あり あり あり あり なし あり あり あり あり 第 第 14 第 第 第 あり なし あり あり あり なし 第 6 章 第 11 章 7 章 13 章 ページ 4 章 13 章 9 章 第 2 章 ユーザ定義ルーチンの使用 7 UDR タスク SPL ルーチン C ルーチン Java ルーチン 参照 箇所 並列処理可能な UDR 統計関数 選択水準関数 ユーザ定義集計関数 なし なし なし あり あり あり あり あり あり あり なし あり (いくつかの 制限あり) 第 第 第 第 13 章 13 章 13 章 8 章 ヒント: SPL で反復を実行する場合は、WITH RESUME キーワードを使用してくだ さい。 これらのタイプのいずれかの関数のサポートを拡張するために、該当する関数のユ ーザ独自のバージョンを記述して、データベースに登録することができます。 ユーザ定義型のサポート UDT を作成する場合は、次のルーチンも作成してください。 v データベース サーバがデータ型を操作するため暗黙的に呼び出すサポート関数 v データ型を変換するため、データベース サーバが暗黙的に呼び出す、またはユー ザが SQL 文に明示的に指定することのできるキャスト関数 v 新規データ型を管理するため、インデックス メソッド (B ツリー、R ツリーな ど) を拡張する演算子クラス関数 (オプション) v 他のサポート関数またはエンド ユーザが呼び出すことのできる追加ルーチン (オ プション) 型変換関数 型変換 は、2 つのデータ型の間の変換を実行します。データベース サーバにおい て、ユーザは、型変換を実行するための独自の関数を記述できます。次のセクショ ンに、組込みデータ型および UDT のキャスト関数を拡張する方法を要約します。 型変換の拡張方法についての詳細は、 77 ページの『第 7 章 ユーザ定義の型変換 (キャスト) の作成』を参照してください。 ヒント: DataBlade モジュールでデータ型を定義する場合、このデータ型とデータベ ースの他のデータ型とのキャスト関数も提供する場合があります。特定の DataBlade モジュールが提供する関数の詳細については、その DataBlade モジュールのユーザ ガイドを参照してください。 組込み型間の型変換: データベース サーバには、特定の組込み型の間の自動変換 を行う組込みキャスト が用意されています。これら組込みキャストの詳細について は、「IBM Informix: SQL ガイド: 参照」を参照してください。 元々組込みキャストが存在しない 2 つの組込み型間で変換を行うためのユーザ定義 キャストを作成することはできません。新しいキャスト関数を作成できる場合につ いては、78 ページの『ユーザ定義の型変換の作成』を参照してください。 他のデータ型間の型変換: 不透明 (OPAQUE) 型、ディスティンクト (DISTINCT) 型、行 (ROW) 型、および組込みデータ型を含む、ほとんどのデータ型の間で変換 8 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド を行うユーザ定義キャスト を作成することができます。キャスト関数は、SPL また は外部言語で作成することができます。例えば、次のいずれの UDT についても型 変換を定義できます。 v 不透明 (OPAQUE) 型 UDT をデータベースの他のデータ型に変換する型変換を作成することができま す。不透明 (OPAQUE) 型の作成者は、不透明 (OPAQUE) 型の内部表現と外部表 現との間のキャスト関数として機能する関数も作成する必要があります。詳しく は、 97 ページの『第 9 章 不透明 (OPAQUE) 型の作成』を参照してください。 v ディスティンクト (DISTINCT) 型 データベース サーバは、ディスティンクト (DISTINCT) 型を直接そのソース型 と比較することはできません。ただし、ディスティンクト (DISTINCT) 型からソ ース型への明示的キャスト (またはその逆) を自動的に登録します。ディスティン クト (DISTINCT) 型は、そのソース型の型変換および関数を継承しますが、ディ スティンクト (DISTINCT) 型で定義された型変換と関数は、そのソース型では使 用できません。 v 名前付き行 (ROW) 型 名前付き行 (ROW) 型を別のデータ型に変換する型変換を作成することができま す。名前付き行 (ROW) 型と名前なし行 (ROW) 型の間での型変換については、 「IBM Informix: SQL ガイド: チュートリアル」を参照してください。 拡張データ型での型変換の作成および登録方法については、 77 ページの『第 7 章 ユーザ定義の型変換 (キャスト) の作成』を参照してください。 エンド ユーザ ルーチン エンド ユーザ ルーチン は、SQL ユーザが SQL 文に組み込むことのできる SQL 呼出し関数です。これらのルーチンは、アプリケーション ユーザが必要とする特殊 な機能を提供します。エンド ユーザ ルーチンは、「XYZ 社のすべての商品価格を 5 パーセント増しにする」などの単純なものから、より複雑な内容まで指定できま す。 このセクションでは、次の型を操作するエンド ユーザ ルーチンの拡張方法につい て要約します。 v 組込み型 データベース サーバには、エンド ユーザが SQL 文で組込み型に対して使用で きる多くの関数が提供されています。これらの関数は、ユーザが定義する SQL 呼出し関数と区別するため、組込み関数 と呼ばれます。 サポートする組込み型に対して定義されている既存の組込み関数は、拡張するこ とはできません。ただし、次の拡張は可能です。 – 独自のエンド ユーザ ルーチンを定義して、新規または類似した機能を提供す る。 – 組込み関数と同じ名前を持ち、異なる組込み型を操作する UDR を定義する。 組込み関数の詳細については、 71 ページの『第 6 章 演算子および組込み関数の 拡張』を参照してください。 v 拡張データ型 第 2 章 ユーザ定義ルーチンの使用 9 データベースに登録されている任意の型に対してエンド ユーザ ルーチンを作成 できます。 エンド ユーザ ルーチンの詳細については、14 ページの『エンド ユーザ ルーチン の作成』を参照してください。 集計関数 集計関数 は、問合せで選択されたすべての行に関する値を取得し、その行に関する 情報を戻す SQL 呼出し関数です。データベース サーバは、ユーザが記述する集計 関数 (ユーザ定義集計関数) をサポートします。ユーザ定義集計関数は、SPL また は外部言語で作成することができます。 組込み型および UDT に対する集計関数を次のように拡張できます。 v データベース サーバには、組込み型を演算する COUNT、SUM、または AVG などの組込み集計関数が提供されています。 組込み集計関数と同じ名前を持ち、組込み型を処理するユーザ定義集計関数を作 成することはできません。ただし、組込み型を演算する新しい集計関数を定義す ることはできます。 v UDT を作成する場合、ユーザ定義集計関数を作成して、この型を処理する集計関 数を作成することができます。データベース サーバでは、2 通りの方法で集計関 数を拡張できます。 – 組込み集計関数を拡張して、型を処理する。 組込み集計関数のサポート関数をオーバーロードします。 – 新しい集計関数を定義する。 既存のいずれの集計関数とも名前が異なるユーザ定義集計関数を作成します。 次に、新しい集計関数をデータベースに登録します。 ヒント: DataBlade モジュールで型を定義する場合、この型についてユーザ定義集計 関数も作成する場合があります。特定の DataBlade モジュールが作成する 関数の詳細については、その DataBlade モジュールのユーザ ガイドを参照 してください。 集計関数の詳細については、 85 ページの『第 8 章 ユーザ定義集計関数の作成』を 参照してください。集計関数は、サポート関数を使用して集計結果を計算します。 サポート関数については、 115 ページの『第 10 章 サポート関数の作成』を参照し てください。 演算子関数 演算子関数 は、対応する演算子記号 (「’=’」または「’+’」など) が定義されている SQL 呼出し関数です。これらの演算子記号は、SQL 文の式内で使用されます。 演算子バインド は、演算子記号 が SQL 文で使用された場合に演算子関数 が暗黙 的に呼び出されることです。データベース サーバは、暗黙的に組込み演算子関数の 名前を組込み演算子にマップしています。例えば、次のいずれの方法でも 2 つの値 を比較して等しくすることができます。 10 比較方法 使用される演算子 演算子関数 equal(value1, value2) IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 演算子記号 value1 = value2 次のセクションに、組込み型および UDT に対する演算子の拡張方法を要約しま す。演算子の拡張方法の詳細については、 71 ページの『第 6 章 演算子および組込 み関数の拡張』を参照してください。 組込み型に対する演算子: データベース サーバには、ほとんどの組込み型を処理 する演算子関数が提供されています。演算子関数の全リストについては、 71 ページ の『第 6 章 演算子および組込み関数の拡張』を参照してください。組込み型を処 理する演算子関数を拡張することはできません。 ユーザ定義型に対する演算子: UDT を処理するよう既存の演算子を拡張すること ができます。適切な演算子関数を定義すると、SQL 文では、演算子バインドにより 関数名とその演算子記号の両方を UDT に対して使用することができます。演算子 関数は、SPL または外部言語で作成することができます。 例えば、スコットランド人名を表す型 Scottish を作成し、その型を米国英語の照 合順序と異なる順に順序付けするとします。名前 McDonald と MacDonald を電話番 号リストに並べて表示したい場合、文字列用のデフォルトの関係演算子 (= など) で は、この整列は行われません。 Mc と Mac を同じ文字として扱うために、2 つのスコットランド人名の値を比較す る compare() 関数を作成して、Mc と Mac を同じに扱うことができます。ルーチ ン オーバロード は、複数の関数で同じ名前を使用し、異なる型を処理する機能で す。データベース サーバは、compare (Scottish,Scottish) 関数を使用して、2 つの スコットランド人名の値を比較します。詳しくは、25 ページの『ルーチンのオーバ ーロード』を参照してください。 ヒント: 関係演算子 (= など) は、組込み 2 次アクセス方式 (汎用 B ツリー) の演 算子クラス関数です。したがって、UDT を処理するように関係演算子を再 定義する場合、その型を B ツリー インデックスでも使用できるようにす る必要があります。詳しくは、次のセクションの『演算子クラス関数』を 参照してください。 演算子クラス関数 演算子クラス は、データベース サーバにおいて、問合せ最適化とインデックス作 成のために 2 次アクセス方式 に関連付けられている演算子のセットです。2 次ア クセス方式 (インデックス アクセス方式 とも呼ばれる) は、B ツリー、R ツリー などのインデックス構造、または DataBlade モジュールで作成するインデックス構 造を作成、アクセス、および処理する一連のデータベース サーバ関数です。 問合せオプティマイザは、演算子クラスを使用して、インデックスを問合せ計画の コスト分析でインデックスを考慮するかどうかを判別します。問合せオプティマイ ザは、次の条件が真の場合に、指定の問合せでインデックスの使用を考慮に入れる ことができます。 v インデックスが、問合せの特定の列に対して存在する。 v 存在するインデックスにおいて、問合せ内の列への処理が、そのインデックスに 関連している演算子クラスのいずれかの演算子と一致する。 第 2 章 ユーザ定義ルーチンの使用 11 UDR での問合せの最適化方法の詳細については、162 ページの『ユーザ定義ルーチ ンの最適化』を参照してください。演算子クラスの拡張方法の詳細については、143 ページの『既存演算子クラスの拡張』を参照してください。 ヒント: DataBlade モジュールで 2 次アクセス方式を作成する場合、ストラテジ関 数およびサポート関数にも演算子クラスを提供する場合があります。特定 の DataBlade モジュールが提供する関数の詳細については、その DataBlade モジュールのユーザ ガイドを参照してください。 組込み型に対する演算子クラス関数: データベース サーバには、組込み 2 次アク セス方式 (汎用 B ツリー) 用のデフォルト演算子クラスが提供されています。これ らの演算子クラス関数は、組込み型を処理します。次のことを行う場合、組込み型 を処理する新しい演算子クラス関数を作成することができます。 v 汎用 B ツリー用のデフォルト演算子クラスを拡張し、これらの演算子がサポート する整列スキーマを再定義する。 compare() 関数は、B ツリー インデックスの整列スキーマを実装します。スト ラテジ関数 (greaterthan()、lessthan() など) を使用することにより、問合せオ プティマイザでは SQL 文を最適化するためにインデックスを使用できます。 これらの関数は、ルーチン オーバロードにより、デフォルトの演算子クラスの関 数と同じ名前を持つことができます。詳しくは、25 ページの『ルーチンのオーバ ーロード』を参照してください。 v 新しい演算子クラスを定義して、組込み型を処理する完全に新しい演算子セット を作成する。 2 次アクセス方式と関連した既存の演算子クラス関数とは異なる名前を持つ演算 子クラス関数を作成します。次に、これらの新しい演算子を含む新規演算子クラ スを登録します。問合せオプティマイザは、インデックスがこの新しい演算子ク ラスを使用し、SQL 文にこの演算子クラスのいずれかの演算子が含まれる場合、 この型のインデックスを選択できます。 ユーザ定義型に対する演算子クラス: 不透明 (OPAQUE) 型を作成する場合、演算 子クラス関数を作成して、次のことを行うことができます。 v 既存の 2 次アクセス方式のデフォルト演算子クラスを拡張し、これらの演算子が サポートするインデックス機能スキーマを処理する。 既存の演算子クラスのものと同じ名前の演算子クラス関数を作成します。これら の関数は、不透明 (OPAQUE) 型にそのインデックス機能スキーマを実装して、 既存の演算子クラスを拡張します。問合せオプティマイザは、インデックスがこ の演算子クラスを使用し、SQL 文にこの演算子クラスのいずれかの演算子が含ま れる場合、この型のインデックスを選択できます。 これらの関数は、ルーチン オーバロードにより、デフォルトの演算子クラスの関 数と同じ名前を持つことができます。ルーチン オーバロードの詳細については、 25 ページの『ルーチンのオーバーロード』を参照してください。 v 新しい演算子クラスを定義して、不透明 (OPAQUE) 型を処理する完全に新しい 演算子セットを作成する。 アクセス方式で必要になるサポート関数およびストラテジ関数を作成します。こ れらの関数は、問合せオプティマイザにより 2 次アクセス方式と関連していると 認識される新しい演算子を定義します。サポート関数とストラテジ関数の要件 12 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド は、アクセス方式ごとに異なります。新しい演算子クラスを定義する前に、その アクセス方式のマニュアルを参照してください。 最適化関数 最適化関数 により、問合せオプティマイザは、特定の SQL 文に最適な問合せ計画 を決定できます。これらの最適化関数には、次のものがあります。 最適化関数 説明 否定素子関数 ブール (Boolean) 型 UDR に関連する NOT 条件で 使用する関数を指定します。 コスト関数 特定の UDR を実行するためのコスト要因を指定し ます。 選択水準関数 ブール (Boolean) 型 UDR が true を戻すと予期さ れる行の割合を指定します。 並列 UDR 並列実行可能なため、並列問合せで実行可能な UDR。 統計関数 UDT の分散統計を作成します。 データベース サーバには、組込み型用の最適化関数が提供されています。データベ ースに登録されている任意の UDT について最適化関数を作成できます。最適化関 数により、組込み型の既存の最適化を拡張することはできません。 最適化関数の詳細については、 161 ページの『第 13 章 UDR パフォーマンスの向 上』を参照してください。 不透明 (OPAQUE) 型サポート関数 新しい不透明 (OPAQUE) 型を定義する場合、データベース サーバがその型を処理 できるようサポート関数を提供する必要があります。データベース サーバには、い くつかの必須サポート関数と、オプションのサポート関数があります。次のリスト は、不透明 (OPAQUE) 型をサポートするために定義する標準的な関数を示します。 v テキスト入力および出力ルーチン v バイナリ送信および受信ルーチン v テキスト インポートおよびエクスポート ルーチン v バイナリ インポートおよびエクスポート ルーチン 不透明 (OPAQUE) 型のサポート関数の詳細については、 115 ページの『第 10 章 サポート関数の作成』を参照してください。 アクセス方式のための関数 アクセス方式 は、データベース サーバが表またはインデックスへのアクセスおよ び処理に使用する関数のセットです。次の 2 つのタイプのアクセス方式がありま す。 v 表の作成および操作を行う 1 次アクセス方式 1 次アクセス方式は、データベース サーバで表を使用するためのすべての操作 (CREATE、DROP、INSERT、DELETE、UPDATE、および SCAN など) を実行す るルーチンのセットです。データベース サーバには、組込み 1 次アクセス方式 が提供されています。 第 2 章 ユーザ定義ルーチンの使用 13 v インデックスの作成および操作を行う 2 次アクセス方式 2 次アクセス方式は、データベース サーバでインデックスを使用するためのすべ ての操作 (CREATE、DROP、INSERT、DELETE、UPDATE、および SCAN など) を実行するルーチンのセットです。データベース サーバには、B ツリーおよび R ツリー 2 次アクセス方式が提供されています。R ツリー インデックスの詳細 については、「IBM Informix: R-Tree Index User’s Guide」を参照してください。 DataBlade モジュールでは、他の 1 次および 2 次アクセス方式を提供できます。詳 しくは、「IBM Informix: Virtual-Table Interface Programmer’s Guide」および 「IBM Informix: Virtual-Index Interface Programmer’s Guide」を参照してください。 エンド ユーザ ルーチンの作成 エンド ユーザ ルーチンを作成して、次のタスクを行うことができます。 v 複数の SQL 文のカプセル化 v 複数のアプリケーションに対するトリガ アクションの作成 v データの読み取り、変更、またはオブジェクトの作成を行うユーザの制限 v 反復関数の作成 ルーチンにより、次のような新しいテクノロジーを含むタスクを行うこともできま す。 v ラージ オブジェクトの操作 v イメージ、Web パブリッシング、およびスペーシャル (空間) などの新しいデー タ ドメインの管理 複数の SQL 文のカプセル化 ルーチンを作成して、プログラムの作成を簡単にしたり、SQL を多用しているタス クのパフォーマンスを向上させることができます。 プログラムの単純化: UDR は、複数の SQL 文を必要とする実行回数の多いタス クを統合することができます。SPL および外部言語のどちらでも、SQL が単独で行 うことができる操作を拡張するプログラム制御文を使用できます。UDR のデータベ ース値をテストし、ルーチンが検出した値について適切なアクションを実行するこ とができます。 複数の文を単一のルーチンにカプセル化し、これをデータベース サーバが名前で呼 び出すことができるようにすると、プログラムの複雑さを軽減できます。同じコー ドを使用する異なるプログラムで同じルーチンを実行できるため、各プログラムに 同じコードを組み込む必要はありません。コードは 1 箇所にのみ格納され、重複コ ードは除去されます。 変更の単純化: UDR は、特にクライアント/サーバ環境で役立ちます。アプリケー ション コードに変更を加えた場合、これをすべてのクライアント コンピュータに 配布する必要があります。UDR はデータベース サーバに存在するため、データベ ース サーバ側でのみ変更するだけで済みます。 データベース コードをクライアント アプリケーションに集約する代わりに、UDR のルーチンを作成して、このコードをデータベース サーバに移動できます。このよ 14 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド うに分離することにより、アプリケーションでは、ユーザ インターフェイスの対話 操作に集中できます。これは、複数タイプのユーザ インターフェイスを必要とする 場合に、特に重要です。 SPL を使用したパフォーマンスの向上: SPL ルーチンには、固有のデータベース 言語が含まれています。この言語に対して、データベース サーバが、ルーチンの作 成時に (実行時ではなく) 可能な限り構文解析および最適化を行うため、タスクによ っては SPL ルーチンによるパフォーマンスの向上が可能です。また、SPL ルーチ ンを使用すると、クライアント アプリケーションとデータベース サーバ間のデー タ転送量を減らすこともできます。 SPL ルーチンに関するパフォーマンスの考慮事項については、 161 ページの『第 13 章 UDR パフォーマンスの向上』を参照してください。 トリガ アクションの作成 SQL トリガ は、特定のイベントの発生時にアクションを自動的に実行するデータ ベース メカニズムです。アクションをトリガできるイベントには、特定の表に対す る INSERT、DELETE、または UPDATE 文があります。トリガされたイベントが処 理を行う表は、トリガ表 と呼ばれます。 SQL トリガは、使用権限を持つすべてのユーザが使用できます。トリガ イベント が発生すると、データベース サーバはトリガ アクションを実行します。アクショ ンは、1 つ以上の INSERT、DELETE、UPDATE、EXECUTE PROCEDURE、または EXECUTE FUNCTION 文の任意の組み合わせとすることができます。 トリガはデータベースに存在し、必要な特権を持つユーザは誰でもこれを使用でき るため、トリガを使用することにより、複数のアプリケーションが使用可能な SQL 文のセットを作成できます。これにより、複数のプログラムが同じデータベース処 理を実行する場合にコードの重複を避けることができます。データベースからトリ ガを呼び出すことにより、DBA は、アプリケーション ツールやプログラムでデー タを同じように処理させることができます。 トリガを使用して、次のアクションを行うことができます (リストにない他のアク ションも可能です)。 v データベースの動作の監査記録の作成 例えば、監査表の裏付けデータを更新することにより、注文表に対する更新を追 跡できます。 v ビジネス ルールの実装 例えば、注文が顧客のクレジット制限を超えた場合に、これを示すメッセージを 表示することができます。 v 表またはデータベース内で使用できない追加データを派生させる 例えば、items 表の quantity 列に更新が行われる場合、total_price 列への対応す る調整を計算できます。 トリガの詳細については、「IBM Informix: SQL ガイド: チュートリアル」を参照し てください。 第 2 章 ユーザ定義ルーチンの使用 15 表へのアクセス制限 (SPL のみ) SPL ルーチンには、表へのアクセス制限機能があります。例えば、データベース管 理者がユーザに挿入権限を許可した場合、そのユーザは ESQL/C、DB–Access、また はアプリケーション プログラムを使用して行を挿入できます。この状況では、管理 者がビジネス ルールを適用する場合に問題が発生することがあります。 SPL ルーチンを使用することによりセキュリティを追加し、ビジネス ルールを適用 することができます。例えば、行を削除する前にアーカイブするというビジネス ル ールを設定するとします。SPL ルーチンを作成すると、アーカイブと削除という両 方のタスクを実行し、ユーザが表に直接にアクセスできないようにすることができ ます。 管理者は、挿入特権を与えることなく、ユーザに挿入を行うルーチンを実行させる ことができます。 反復関数の作成 反復関数 は、項目のアクティブ セットを戻します。関数の各反復ごとに、アクテ ィブ セットの 1 項目が戻ります。反復関数を実行するには、関数をデータベース カーソルに関連付ける必要があります。 データベース サーバには、組込み反復関数は提供されていません。ただし、反復関 数を作成して、ITERATOR ルーチン修飾子で登録することができます。詳しくは、 44 ページの『反復関数の使用』を参照してください。 ユーザ定義ルーチンの呼出し UDR は、明示的または暗黙的に呼び出すことができます。詳しくは、 17 ページの 『第 3 章 ユーザ定義ルーチンの実行』を参照してください。 明示的な呼出し EXECUTE PROCEDURE 文および EXECUTE FUNCTION 文を使用して、次のもの から UDR を実行することができます。 v UDR v DB-Access v クライアント アプリケーション (ESQL/C アプリケーションなど) また、SELECT 節または WHERE 節の SQL 式でユーザ定義関数を使用できます。 プロシジャは値を戻さないため、SQL 式では使用できません。 暗黙的な呼出し データベース サーバは、次の場合 UDR を暗黙的に呼び出すことができます。 16 UDR の暗黙的な呼出し 呼び出される UDR 組込み演算子バインド 演算子関数 暗黙的キャスト 暗黙的キャスト関数 不透明 (OPAQUE) 型の処理 不透明 (OPAQUE) 型サポート関数および統計関数 問合せの処理 最適化関数および演算子クラス関数 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 3 章 ユーザ定義ルーチンの実行 SQL 文での UDR の呼出し . . . . . . . . . . . . . . . . . EXECUTE 文を使用した UDR の呼出し. . . . . . . . . . . . 関数の呼出し . . . . . . . . . . . . . . . . . . . . 関数引数での SELECT 文の使用 . . . . . . . . . . . . . プロシジャの呼出し . . . . . . . . . . . . . . . . . 式でのユーザ定義関数の呼出し . . . . . . . . . . . . . . . 演算子にバインドされている関数の呼出し . . . . . . . . . . . SPL ルーチンでの UDR の呼出し . . . . . . . . . . . . . . . ユーザ定義ルーチンの実行 . . . . . . . . . . . . . . . . . SQL 文の構文解析 . . . . . . . . . . . . . . . . . . . SQL 文の最適化 . . . . . . . . . . . . . . . . . . . . ルーチンの実行 . . . . . . . . . . . . . . . . . . . . SPL ルーチンの実行 . . . . . . . . . . . . . . . . . 外部言語ルーチンの実行 . . . . . . . . . . . . . . . . 実行可能コードのメモリへのロード . . . . . . . . . . . ルーチン シーケンスの作成 . . . . . . . . . . . . . . ルーチンの実行の管理 . . . . . . . . . . . . . . . . ルーチン分析の理解 . . . . . . . . . . . . . . . . . . . ルーチン シグネチャ . . . . . . . . . . . . . . . . . . ANSI 標準準拠および ANSI 標準非準拠のルーチン シグネチャの使用 DBA タスクを実行するためのルーチン シグネチャの使用 . . . . . ルーチンのオーバーロード . . . . . . . . . . . . . . . . オーバーロード ルーチンの作成 . . . . . . . . . . . . . 固有のルーチン名の割り当て . . . . . . . . . . . . . . 呼出し時のオーバーロード ルーチンの指定. . . . . . . . . . 組込み SQL 関数のオーバーロード . . . . . . . . . . . . ルーチン分析プロセス . . . . . . . . . . . . . . . . . . ルーチン シグネチャ . . . . . . . . . . . . . . . . . ルーチンの候補リスト . . . . . . . . . . . . . . . . . 型の優先順位リスト . . . . . . . . . . . . . . . . . 組込み型の優先順位リスト . . . . . . . . . . . . . . . ユーザ定義型でのルーチン分析 . . . . . . . . . . . . . . . 型階層におけるルーチン分析 . . . . . . . . . . . . . . ディスティンクト (DISTINCT) 型でのルーチン分析 . . . . . . . 2 つの異なるディスティンクト (DISTINCT) 型でのルーチン分析 . 異なるディスティンクト (DISTINCT) 型に対する代替の SELECT 文 ソース型が組込み型であるルーチン分析 . . . . . . . . . . . コレクション (collection) 型でのルーチン分析 . . . . . . . . . オーバーロード ルーチンでの NULL 引数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 23 23 24 24 24 25 25 25 26 27 27 27 28 28 29 31 31 32 32 33 33 34 34 本章の内容 本章では、以下のトピックについて説明します。 v SQL 文での UDR の呼出し v SPL ルーチンでの UDR の呼出し v ユーザ定義ルーチンの実行 v ルーチン分析の理解 © Copyright IBM Corp. 1996, 2003 17 SQL 文での UDR の呼出し UDR は、次の方法で SQL 文内から呼び出すことができます。 v EXECUTE FUNCTION 文または EXECUTE PROCEDURE 文を使用して、直接 UDR を呼び出す。 v 式内でユーザ定義関数を呼び出す。 EXECUTE 文を使用した UDR の呼出し EXECUTE FUNCTION 文および EXECUTE PROCEDURE 文の構文についての詳細 は、「IBM Informix: SQL ガイド: 構文」を参照してください。UDR の作成方法に ついての詳細は、 37 ページの『第 4 章 ユーザ定義ルーチンの開発』を参照してく ださい。 関数の呼出し 結果として戻される値は 整数 (INTEGER) 型の変数とします。次の例は、N の階乗 (n!) を戻す、C 言語で作成された nFact() というユーザ定義関数を登録し、呼び出 す方法を示しています。 CREATE FUNCTION nFact(arg1 n) RETURNING INTEGER; SPECIFIC nFactorial WITH (HANDLESNULLS, NOT VARIANT) EXTERNAL NAME ’/usr/lib/udtype2.so(nFactorial)’ LANGUAGE C; EXECUTE FUNCTION nFact (arg1); 関数引数での SELECT 文の使用 もう 1 つの例として、次の型階層と関数を作成するとします。 CREATE ROW TYPE emp_t (name VARCHAR(30), emp_num INT, salary DECIMAL(10,2)); CREATE ROW TYPE trainee_t (mentor VARCHAR(30)) UNDER emp_t; CREATE TABLE trainee OF TYPE trainee_t; INSERT INTO trainee VALUES (’sam’, 1234, 44.90, ’joe’); CREATE FUNCTION func1 (arg1 trainee_t) RETURNING row; DEFINE newrow trainee_t; LET newrow = ROW( ’sam’, 1234, 44.90, ’juliette’); RETURN newrow; END FUNCTION; 次の EXECUTE FUNCTION 文は、行 (ROW) 型を戻す問合せを引数とする、 func1() 関数を呼び出します。 EXECUTE FUNCTION func1 ((SELECT * from trainee where emp_num = 1234)) ... 重要: EXECUTE FUNCTION 文で呼び出すユーザ定義関数の引数に問合せを使用す る場合は、その問合せをさらに括弧で囲んでください。 プロシジャの呼出し 次の EXECUTE PROCEDURE 文は、log_compare() 関数を呼び出します。 EXECUTE PROCEDURE log_compare (arg1, arg2) 18 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 式でのユーザ定義関数の呼出し ユーザ定義関数は、SELECT 文の選択リスト、または INSERT 文、SELECT 文、 UPDATE 文、または DELETE 文の WHERE 節の式で呼び出すことができます。 例えば、18 ページの『関数の呼出し』で示した階乗を求める関数を使用して、次の SELECT 文を記述することができます。 SELECT * FROM tab_1 WHERE nFact(col1) > col3 演算子にバインドされている関数の呼出し 特定の演算子にバインドされている関数は、明示的に呼び出ししなくても自動的に 呼び出されます。type1 型の 2 つの引数を受け取り、ブール (Boolean) 型を戻す equal() という関数があるものとします。 type1 型の 2 つの列 col_1 と col_2 の比較に等値演算子 (=) を使用すると、equal() 関数が自動的に呼び出されます。 例えば、次の問合せでは、WHERE 節を評価するのに適した equal() 関数が暗黙的 に呼び出されます。 SELECT * FROM tab_1 WHERE col_1 = col_2 上記の問合せは、次のように指定されたものとして評価されます。 SELECT * FROM tab_1 WHERE equal (col_1, col_2) SPL ルーチンでの UDR の呼出し CALL 文は、SPL プログラム内から UDR を呼び出す場合にのみ使用します。 CALL 文を使用して、ユーザ定義関数およびユーザ定義プロシジャの両方を呼び出 すことができます。 v CALL 文を使用してユーザ定義関数を呼び出す場合は、RETURNING 節とその関 数が戻す値の名前を指定する必要があります。 次の文は equal() 関数を呼び出します。 CALL equal (arg1, arg2) RETURNING result CALL 文は、OUT パラメータを含むユーザ定義関数の呼出しには使用できませ ん。 v プロシジャは値を戻さないため、CALL 文を使用してユーザ定義プロシジャを呼 び出す場合には、RETURNING 節は指定しません。 次の CALL 文は、log_compare() プロシジャを呼び出します。 CALL log_compare (arg1, arg2) ユーザ定義ルーチンの実行 UDR を呼び出した後、データベース サーバはその UDR を実行する必要がありま す。これらの SQL 文の 1 つで UDR を実行するには、データベース サーバは次 のステップを実行する必要があります。 1. 問合せパーサーを呼び出す 2. 問合せオプティマイザを呼び出す 3. UDR を実行する 第 3 章 ユーザ定義ルーチンの実行 19 SQL 文の構文解析 問合せパーサーは、SQL 文をその構文パーツに分割します。SQL 文に UDR が含 まれている場合は、問合せパーサーはその文に対して次のステップを実行します。 v ルーチン呼出しを構文解析し、ルーチンのシグネチャを取得する。 v UDR 呼出しに対して必要なルーチン分析を行い、実行する UDR を決定する。 ルーチン分析については、23 ページの『ルーチン分析の理解』を参照してくださ い。 SQL 文の最適化 問合せパーサーが SQL 文をその構文パーツに分割すると、問合せオプティマイザ は、SQL 文の実行を効率的に編成する問合せ計画 を作成することができます。問 合せオプティマイザは問合せ計画を策定して、問合せを処理するのに必要なデータ 行を取り出すことができます。 詳しくは、162 ページの『ユーザ定義ルーチンの最適化』を参照してください。 ルーチンの実行 SPL ルーチンの場合、ルーチン マネージャが、データベース サーバがコンパイル し、sysprocbody システム カタログ表に格納した SPL 疑似コードを実行しま す。 外部言語で作成されたルーチンの場合、ルーチン マネージャ が適切な言語で UDR を実行します。ルーチン マネージャは、UDR の実行を管理するデータベース サー バの特定のパーツです。 SPL ルーチンの実行 実行可能コードが外部ファイルに存在している C あるいは Java のルーチンとは異 なり、SPL ルーチンの実行可能コードは、直接データベースの sysprocbody シス テム カタログ表に格納されます。SPL ルーチンを作成すると、データベース サー バはその SPL ルーチンを構文解析し、それをコンパイルし、そして実行可能コード を sysprocbody システム カタログ表に格納します。文で SPL ルーチンを呼び出 すと、データベース サーバは、内部に格納されているコンパイル済みのコードから SPL ルーチンを実行します。 EXECUTE FUNCTION 文、EXECUTE PROCEDURE 文、または CALL 文を使用し て SPL ルーチンを実行すると、データベース サーバは次のタスクを実行します。 v 疑似コード、実行計画、および依存性リストをシステム カタログから抽出し、そ れらをバイナリ形式に変換する。 v EXECUTE FUNCTION、EXECUTE PROCEDURE 文、または CALL 文によって 渡された引数を構文解析し、評価する。 v 実行する SQL 文がないか、依存性リストをチェックする。 再最適化が必要であることを示している項目が依存性リストにあれば、この時点 で最適化が行われます。SQL 文の実行に必要な項目が欠落している場合 (例え ば、列または表が削除されている場合)、この時点でエラーが発生します。 v 疑似コードの命令を実行する。 20 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド RETURN 文に WITH RESUME 節がしていされている SPL ルーチンを実行する と、同一のルーチン シーケンス内の同一の SPL ルーチンが複数実行されます。た だし、SPL ルーチンは、そのルーチン シーケンスのユーザ状態にはアクセスできま せん。 外部言語ルーチンの実行 ルーチン マネージャは、次のステップを実行して、外部言語ルーチンの実行を処理 します。 v 外部言語の実行可能コードをロードする v ルーチン シーケンスを作成する v UDR の実際の実行を管理する 実行可能コードのメモリへのロード: 外部言語で作成された UDR を実行するに は、実行可能コードがデータベース サーバのメモリに存在している必要がありま す。ルーチン マネージャは、UDR の最初の呼出し時に、その UDR を含むファイ ルをメモリにロードします。データベース サーバは、sysprocedures システム カ タログ表の externalname 列からそのファイルを見付け出します。 C 言語サポート UDR が存在する、動的にロードされたライブラリを表示するには、onstat コマン ド行ユーティリティで -g dll オプションを指定します。 onstat コマンドについて は、「IBM Informix: 管理者の参照」を参照してください。 C 言語サポート の終り エンタープライズ レプリケーション (ER) および高可用性データ レプリケーショ ン (HDR) に含まれるデータベース サーバなど、UDR を実行する必要のあるすべ てのデータベース サーバに、共有ライブラリおよび .jar ファイルをインストール する必要があります。共有オブジェクト ファイルおよび .jar ファイルは、同じ絶 対パス名の場所にインストールする必要があります。 ルーチン マネージャがメモリに外部言語ルーチンをロードし終われば、このファイ ルは、明示的にアンロードされるか、またはデータベース サーバがシャットダウン されるまで、メモリ内に残っています。詳しくは、159 ページの『ユーザ定義ルー チンの廃棄』を参照してください。 ルーチン シーケンスの作成: ルーチン シーケンス には、SQL 文または SPL 文 のコンテキストでルーチンのインスタンスを実行するのに必要な動的情報が含まれ ています。ルーチン マネージャは、問合せパーサーから UDR に関する情報を受け 取ります。ルーチン マネージャはこの情報を使用して、関連付けられている UDR のルーチン シーケンスを作成します。SQL 文または SPL 文の UDR の各インスタ ンスは、それが暗黙的であれ明示的であれ、少なくとも 1 つの独立したルーチン シーケンスを作成します。場合によっては、ルーチン シーケンスは、次に示すよう に、UDR への単一呼出しで構成されることもあります。 EXECUTE PROCEDURE update_log(log_name) 第 3 章 ユーザ定義ルーチンの実行 21 ただし、多くの場合、UDR は複数行で呼び出すことができます。例えば、次の SELECT 文では、問合せで一致したごとに、running_avg() 関数が呼び出されてい ます。 SELECT name, running_avg(price) FROM stock_history WHERE running_avg(price) > 5.00 上記の問合せでは、WHERE 節により、データベース サーバが、2 つの関数 (running_avg() UDR、および暗黙的に組込みの greaterthan() 関数) を呼び出して います。データベース サーバは、SELECT 文の running_avg() のルーチン シー ケンスとは別に、処理する行ごとに running_avg() 関数を呼び出し、その関数自体 の個別のルーチン シーケンスでその関数を実行します。 フラグメント化された stock_history 表の場合、running_avg() が PARALLELIZABLE オプションを使用して作成されていれば、WHERE 節のルーチ ン インスタンスは複数のルーチン シーケンスを持つ可能性があります。例えば、 stock_history 表に 4 つのフラグメントがある場合は、データベース サーバは次 の 5 つのルーチン シーケンスを使用して、WHERE 節の running_avg() を実行し ます。 v 主スレッドに対して 1 つのルーチン シーケンス v PDQ 副スレッドに対して、4 つのルーチン シーケンス (表内のフラグメントご とに 1 つ) ルーチン シーケンス内の UDR への個々の呼出しは、ルーチン呼出し と呼ばれま す。 ルーチン マネージャは、ルーチン状態領域 を作成して、ルーチン シーケンスが必 要とする UDR 情報を保持します。データベース サーバはこの情報を問合せパーサ ーから取得し、それをルーチン マネージャに渡します。ルーチン状態領域は、UDR に関する以下の情報を保持します。 v 引数情報: – UDR に渡される引数の数 – 各引数の型 v 戻り値情報 (ユーザ定義関数のみ): – UDR から渡される戻り値の数 – 各戻り値の型 重要: ルーチン状態領域のこの引数情報には、引数の実際の値は含まれていませ ん。引数情報には、引数の型に関する情報のみが含まれています。 ルーチン状態領域には、後で同一のルーチン シーケンス内のルーチンの呼び出しで 使用できるよう、プライベートなユーザ状態情報 も含まれています。 UDR は、こ の情報を使用して、後続の呼出しを最適化します。ユーザ状態情報は、ルーチン状 態領域に格納されます。 C 言語サポート C 言語の UDR の場合は、ルーチン マネージャは MI_FPARAM 構造体を作成し て、ルーチンの引数および戻り値に関する情報を保持します。ルーチンの引数およ 22 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド び戻り値に関する情報を保持するためにルーチン マネージャが作成する MI_FPARAM 構造体には、ユーザ状態情報へのポインタも含めることができます。 詳しくは、「IBM Informix: DataBlade API Programmer’s Guide」の UDR の実行方 法に関する章を参照してください。 C 言語サポート の終り Java 言語サポート Java の UDR の場合は、MI_FPARAM が C 言語の UDR に提供している情報のほ とんどを UDREnv インターフェイスが提供しています。このインターフェイス は、戻り値の SQL の型を戻すためのパブリック メソッド、反復関数で使用するた めのパブリック メソッド、およびユーザ状態ポインタのためのパブリック メソッ ドを備えています。このインターフェイスは、ログおよびトレースのための機能も 備えています。詳しくは、「IBM Informix: J/Foundation Developer’s Guide」を参照 してください。 Java 言語サポート の終り ルーチンの実行の管理: ルーチン シーケンスの作成後、ルーチン マネージャは、 次のようにして UDR を実行することができます。 1. ルーチンが使用できるよう、引数をスタックにプッシュする。 2. ルーチンを呼び出す。 3. UDR の結果を戻す処理を行う。 同一のルーチン シーケンス内で同一の UDR を呼び出すと、すべて同一のルーチン 状態領域にアクセスします。 ルーチン分析の理解 ルーチンのシグネチャが一意であれば、異なる UDR に同一の名前を割り当てるこ とができます。 UDR を一意に識別するには、ルーチン名だけでなくルーチンのシ グネチャ も使用します。多くのバージョンを持つルーチンは、オーバーロード ル ーチン と呼ばれます。オーバーロード ルーチンを呼び出した場合、データベース サーバは実行すべきルーチンを一意に識別する必要があります。実行すべき UDR を識別するというこのプロセスのことを、ルーチン分析 と言います。 このセクションでは、ルーチン分析に関する以下の情報について説明します。 v ルーチンのシグネチャとは v オーバーロード ルーチンとは v オーバーロード ルーチンの作成方法 v ルーチン分析プロセスとは 以下を行うには、ルーチン分析プロセスを理解しておく必要があります。 v 期待しているデータ結果を UDR から取得する。 v 間違った UDR を実行した場合に、意図しない副次作用を回避する。 v どのような場合にオーバーロード ルーチンを作成する必要があるのかを理解す る。 第 3 章 ユーザ定義ルーチンの実行 23 ルーチン シグネチャ ルーチンのシグネチャ は、ルーチンを一意に識別します。問合せパーサーは、UDR の呼出し時にルーチンのシグネチャを使用します。ルーチンのシグネチャには、以 下の情報が含まれています。 v ルーチンのタイプ (プロシジャまたは関数) v ルーチン名 v パラメータの数 v パラメータの型 v パラメータの順序 米国規格協会 (ANSI) v 所有者名 米国規格協会 (ANSI) の終り 重要: ルーチンのシグネチャには、戻り型は含まれません。したがって、シグネチ ャが同じで戻り型が異なる 2 つのユーザ定義関数を作成することはできませ ん。 ANSI 標準準拠および ANSI 標準非準拠のルーチン シグネチャの使 用 ANSI 標準に非準拠 のデータベースでは、ルーチンは、その所有者に関係なく、デ ータベース全体内で一意である必要があります。ルーチン名を所有者名で明示的に 修飾すると、シグネチャにはルーチン名の一部として所有者名が組み込まれます。 米国規格協会 (ANSI) ANSI 標準準拠データベースでは、ルーチンのシグネチャは、ユーザのネーム スペ ース内で一意である必要があります。ルーチン名は常に所有者で始まり、次の形式 をしています。 owner.routine_name 米国規格協会 (ANSI) の終り CREATE FUNCTION 文または CREATE PROCEDURE 文を使用してルーチンのシ グネチャをデータベースに登録すると、データベース サーバはそのルーチンのシグ ネチャを sysprocedures システム カタログ表に格納します。詳しくは、52 ペー ジの『ユーザ定義ルーチンの登録』を参照してください。 DBA タスクを実行するためのルーチン シグネチャの使用 SQL 文を使用して、ルーチンに対して DBA タスク (DROP、GRANT、REVOKE、 および UPDATE STATISTICS) を実行するときに、データベース サーバは、ルー チンのシグネチャを使用します。シグネチャは、その DBA タスクで実行するルー チンを識別します。例えば、図 1 に示した DROP 文は、ルーチンのシグネチャを 使用しています。 24 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 図 1. ルーチンのシグネチャの例 ルーチンのオーバーロード ルーチンのオーバーロード とは、複数のルーチンに 1 つの名前を割り当て、それ らのルーチンが操作可能な型の異なるパラメータを指定できる機能のことを言いま す。このデータベース サーバはルーチン オーバロードをサポートしているため、 同一の名前で複数の UDR を登録することができます。 オーバーロード ルーチンの作成 このデータベース サーバは、ポリモーフィズム (同一の名前を持つ複数のエンティ ティを持ち、特定の使用に最も関係するエンティティを 1 つ選択できる機能) をサ ポートしているため、ルーチン オーバロードをサポートすることができます。 以下のような場合、名前が同一で、パラメータ リストが異なる複数のルーチンを持 つことができます。 v 新しい UDT を処理するために、equal() などの組込み関数と同じ名前を持つル ーチンを作成する場合。 v 副型が上位型のデータ表現および関数を継承する型階層 を作成する場合。 v 内部格納表現が既存の型と同じで、名前が異なる型であるディスティンクト (DISTINCT) 型 を作成する場合。ディスティンクト (DISTINCT) 型をソース型と 比較する場合には、必ず型変換が必要です。ディスティンクト (DISTINCT) 型は そのソース型から UDR を継承します。 例えば、次の各ユーザ定義関数を作成し、異なる型の面積を計算することができま す (各型は異なる幾何学形状を表します)。 CREATE FUNCTION area(arg1 circle) RETURNING DECIMAL... CREATE FUNCTION area(arg1 rectangle) RETURNING DECIMAL.... CREATE FUNCTION area(arg1 polygon) RETURNING DECIMAL.... これら 3 つの CREATE FUNCTION 文は、area() というオーバーロード ルーチン を作成しています。各 CREATE FUNCTION 文は、特定の引数型ごとに area() 関 数を登録しています。ルーチンをオーバーロードすると、評価する型ごとにカスタ マイズされた area() ルーチンを得ることができます。 ルーチン オーバロードの利点は、異なる引数に対して同じタスクを実行するルーチ ンに、異なる名前を考え出す必要がないことです。ルーチンがオーバーロードされ ていると、データベース サーバは、ルーチンの呼出し時に、そのルーチンの引数に 基づいて実行すべきルーチンを選択することができます。 固有のルーチン名の割り当て ルーチン オーバロードのため、データベース サーバは、ルーチンをその名前だけ では一意に識別できない可能性があります。オーバーロードされた UDR を登録す 第 3 章 ユーザ定義ルーチンの実行 25 る場合は、ルーチンの特定のシグネチャに固有名 を割り当てることができます。こ の固有名は、ルーチンの特定のオーバーロード バージョンを指す省略識別子として 機能します。 固有名は、最大 128 文字で、データベース内で一意です。同一のデータベース内の 2 つのルーチンは、それらの所有者が異なっていても、同じ固有名にすることはで きません。特定の型を持つオーバーロード ルーチンに一意の名前を割り当てるに は、そのルーチンの作成時に SPECIFIC キーワードを使用します。CREATE PROCEDURE 文または CREATE FUNCTION 文で、ルーチン名と固有名を指定し ます。 以下の SQL 文では、完全なルーチン シグネチャの代わりに、固有名を使用できま す。 v ALTER FUNCTION、ALTER PROCEDURE、ALTER ROUTINE v DROP FUNCTION、DROP PROCEDURE、DROP ROUTINE v GRANT v REVOKE v UPDATE STATISTICS 例えば、次の文によって作成される UDR に固有名 eq_udtype1 を割り当てるとし ます。 CREATE FUNCTION equal (arg1 udtype1, arg2 udtype1) RETURNING BOOLEAN SPECIFIC eq_udtype1 EXTERNAL NAME ’/usr/lib/udtype1/lib/libbtype1.so(udtype1_equal)’ LANGUAGE C このようにすると、UDR をルーチンのシグネチャまたは固有名で参照できます。次 の 2 つの GRANT 文は等価です。 GRANT EXECUTE ON equal(udtype1, udtype1) to mary GRANT EXECUTE ON SPECIFIC eq_udtype1 to mary 呼出し時のオーバーロード ルーチンの指定 オーバーロード ルーチンを呼び出す場合は、そのルーチンに引数リストを指定する 必要があります。データベース サーバは引数のないルーチンを一意に識別できない ため、ルーチン名のみでオーバーロード ルーチンを呼び出すと、ルーチン分析プロ セスは失敗します。 例えば、次の SQL 文は、新しい型 udtype1 に対してオーバーロードされた equal() 関数を呼び出す方法を示しています。 CREATE TABLE atest (col1 udtype1, col2 udtype1, ...) ... SELECT * FROM employee WHERE equal(col1, col2) equal() 関数は、等号 (=) にバインドされている演算子関数であるため、次のよう に演算子記号の両側に引数を指定して equal() 関数を呼び出すこともできます。 SELECT * FROM employee WHERE col1 = col2 26 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ストアド プロシジャ言語サポート SPL では、次のように equal() 関数を呼び出します。 EXECUTE FUNCTION equal(col1, col2) INTO result CALL equal(col1, col2) RETURNING result LET result = equal(col1, col2) ストアド プロシジャ言語サポート の終り オーバーロードされた演算子関数についての詳細は、 71 ページの『第 6 章 演算子 および組込み関数の拡張』を参照してください。 組込み SQL 関数のオーバーロード このデータベース サーバは、いくつかの基本的な数学演算を行う組込みの SQL 関 数を備えています。これらの組込み SQL 関数のほとんどは、オーバーロードする ことができます。例えば、複素数を表す UDT に対して sin() 関数を作成すること ができます。オーバーロード可能な組込みの SQL 関数の完全なリストについて は、74 ページの『組込み関数』を参照してください。 ルーチン分析プロセス ルーチン分析 は、ルーチンの呼出し時にデータベース サーバが使用するプロセス です。別のルーチンが UDR を呼び出した場合には、データベース サーバはルーチ ン分析も呼し出します。ルーチンがオーバロードされている場合、問合せパーサー は、UDR のルーチン シグネチャに基づいて、システム カタログ表から UDR を分 析します。パーサは、実行すべき UDR を決定するのに必要なすべてのルーチン分 析を実行します。 ルーチン シグネチャ ユーザまたは別のルーチンがルーチンを呼び出すと、データベース サーバは、その ルーチン名と引数に一致するルーチン シグニチャを探します。完全に一致するルー チンがない場合は、データベース サーバは次のようにして代替ルーチンを探しま す。 1. 複数の引数がルーチンに渡されると、データベース サーバは、次のようにし て、呼び出されたルーチンに完全に一致するシグネチャを持つルーチンを sysprocedures システム カタログ表で探します。 a. データベース サーバは、一番左の引数と同じ型を持つルーチンの候補がない か調べます。 詳しくは、28 ページの『ルーチンの候補リスト』を参照してください。 b. 最初の引数に対して完全に一致するルーチンが存在していない場合は、デー タベース サーバは、型の優先順位を使用してルーチンの候補リストを検索し ます。 詳しくは、28 ページの『型の優先順位リスト』を参照してください。 2. データベース サーバは左から右に引数の突き合わせを続行します。データベー スに、一致するシグネチャを持つルーチンが含まれている場合には、データベー ス サーバはこのルーチンを実行します。 第 3 章 ユーザ定義ルーチンの実行 27 重要: ルーチンの引数の 1 つが NULL の場合、複数のルーチンがルーチン シグネ チャに一致する可能性があります。このような状態が発生した場合は、デー タベース サーバはエラーを生成します。詳しくは、34 ページの『オーバー ロード ルーチンでの NULL 引数』を参照してください。 ルーチンの候補リスト データベース サーバは、次の特性を持つルーチンの候補のリストを sysprocedures システム カタログ表から見付けます。 v 同一のルーチン名 v 同一のルーチンのタイプ (関数またはプロシジャ) v 同一の引数の数 v 現行セッションのルーチンに対する Execute 特権 米国規格協会 (ANSI) v 現行ユーザ、またはユーザ informix に属している 米国規格協会 (ANSI) の終り ルーチン呼出しで指定されている引数と同じ型を持つ UDR が候補リストに含まれ ていない場合には、データベース サーバは、その引数をルーチンの候補のパラメー タの型に暗黙的に変換できるキャスト ルーチンが存在していないか調べます。 例えば、次の 2 つの型変換と 2 つのルーチンを作成するとします。 CREATE CREATE CREATE CREATE IMPLICIT IMPLICIT FUNCTION FUNCTION CAST (type1 AS type2) CAST (type2 AS type1) g(type1, type1) ... g(type2, type2) ... 次の文で関数 g を呼び出すとします。 EXECUTE FUNCTION g(a_type1, a_type2) データベース サーバは両方の関数を候補と見なします。最も左の引数が最初に評価 されるため、ルーチン分析プロセスは関数 g(type1, type1) を選択します。データ ベース サーバは、 2 番目の型変換 cast(type2 AS type1) を実行して、2 番目の 関数の引数を変換してから、関数 g(type1, type1) を実行します。 型変換についての詳細は、 77 ページの『第 7 章 ユーザ定義の型変換 (キャスト) の作成』を参照してください。 ヒント: データベースがデータを型変換し、ルーチンを分析する順序は、ルーチン をオーバーロードする際にユーザが決定する項目の 1 つであると考えてく ださい。 型の優先順位リスト 候補リストのどのルーチンが引数の型として適切であるのかを決定するために、デ ータベースサーバは、その引数の型の優先順位リストを作成します。ルーチン分析 プロセスが優先順位リストを作成します。これは突き合わせる型を部分的に順序付 けたリストです。ルーチン分析プロセスは、次のようにして (優先度の高いものか ら低いものへ) 優先順位リストを作成します。 28 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 1. データベース サーバは、ルーチンに渡された引数と一致する型を持つルーチン がないか調べます。 2. ルーチンに渡された引数が、型階層の下位型である名前付き行 (ROW) 型 の場 合は、データベース サーバは、実行するルーチンを得るために、型階層ツリー を調べます。 詳しくは、31 ページの『ユーザ定義型でのルーチン分析』を参照してくださ い。 3. ルーチンに渡された引数がディスティンクト (DISTINCT) 型 の場合は、データ ベース サーバは、実行するルーチンを得るために、ソース型を調べます。 ソース型自体もディスティンクト (DISTINCT) 型である場合は、データベース サーバはそのディスティンクト (DISTINCT) 型のソース型を調べます。詳しく は、32 ページの『ディスティンクト (DISTINCT) 型でのルーチン分析』を参照 してください。 4. ルーチンに渡された引数が組込み型 の場合は、データベース サーバは、渡され た引数に対応した組込み型の優先順位リスト内の型が候補リストにないか調べま す。 詳しくは、29 ページの『組込み型の優先順位リスト』を参照してください。 この組込み型の優先順位リストに一致するものがあれば、データベース サーバ は暗黙のキャスト関数を探します。 5. データベース サーバは、ステップ 1 ∼ 4 で型が追加された順に、優先順位リ ストにその型の暗黙の型変換を追加 します。 6. ルーチンに渡された引数がコレクション (collection) 型 の場合は、コレクション の汎用型を、渡された引数の優先順位リストに追加します。 7. データベース サーバは、この時点で現在優先順位リストにある型 (組込みの型 を除く) とそれ以外の型の間に暗黙のキャストがある型を追加します。 該当するルーチンが存在していない場合には、データベース サーバは次のエラー メッセージを戻します。 -674: ルーチン (routine-name) が見付かりません。 ルーチン分析プロセスが該当するルーチンを複数見付けた場合には、データベース サーバは次のエラー メッセージを戻します。 -9700: Routine routine-name cannot be resolved. 組込み型の優先順位リスト ルーチンの呼出しで、ルーチンの候補リストに含まれていない型が含まれている場 合は、データベース サーバは、その型の優先順位リストに含まれているパラメータ を持つルーチン候補を見付けようとします。表 1 は、ルーチン呼出しでの引数が候 補リストのパラメータに一致しない場合の、組込み型の優先順位をリストしたもの です。 第 3 章 ユーザ定義ルーチンの実行 29 表 1. 組込み型の優先順位 型 優先順位リスト CHAR VARCHAR NCHAR NVARCHAR SMALLINT INT INT8 SERIAL 8 バイトシリアル (SERIAL8) 型 DECIMAL SMALLFLOAT FLOAT MONEY DATE DATETIME INTERVAL BYTE TEXT VARCHAR、LVARCHAR なし NVARCHAR なし INT、INT8、DECIMAL、SMALLFLOAT、FLOAT INT8、DECIMAL、SMALLFLOAT、FLOAT、SMALLINT DECIMAL、SMALLFLOAT、FLOAT、INT、SMALLINT INT、INT8、DECIMAL、SMALLFLOAT、FLOAT、SMALLINT INT8、DECIMAL、SMALLFLOAT、FLOAT、INT、SMALLINT SMALLFLOAT、FLOAT、INT8、INT、SMALLINT FLOAT、DECIMAL、INT8、INT、SMALLINT SMALLFLOAT、DECIMAL、INT8、INT、SMALLINT DECIMAL、SMALLFLOAT、FLOAT、INT8、INT、SMALLINT なし なし なし なし なし 次の例は、オーバーロードされた test 関数と、その test 関数を呼び出す問合せを 示しています。この問合せは、10 進数 (DECIMAL) 型の引数を指定した関数 test(2.0) を呼び出しています。 10 進数 (DECIMAL) 型の引数に対応する test 関 数は存在していないため、ルーチン分析プロセスは、表 1 の優先順位リストに示さ れている各型に対応する test 関数が存在していないか調べます。 CREATE FUNCTION test(arg1 INT) RETURNING INT... CREATE FUNCTION test(arg1 MONEY) RETURNING MONEY.... CREATE TABLE mytab (a real, ... SELECT * FROM mytab WHERE a=test(2.0); 図 2 は、データベース サーバが、オーバーロード関数 test() を探し出す順序を示 しています。データベース サーバは、整数 (INTEGER) 型の引数を 1 つ取る、適 格な test() 関数を探します。 図 2. ルーチン分析時の型の優先順位の例 30 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ユーザ定義型でのルーチン分析 以下のセクションでは、ルーチンのシグネチャ内の 1 つまたは複数の引数が UDT の場合のルーチン分析について説明します。 型階層におけるルーチン分析 型階層 とは、副型が上位の名前付き行 (ROW) 型 (上位型) から、構造 (データ フ ィールド) と動作 (ルーチン、演算子、規則) を継承し、追加フィールドとルーチン をつけ加えることのできる、名前付き行 (ROW) 型の間に定義している関係を言い ます。副型は、属性と動作を上位型から「継承する」、といいます。 型階層の作成方法については、「IBM Informix: データベース設計および実装 ガイ ド」の型階層および表階層についての説明を参照してください。 UDR が名前付き行 (ROW) 型をそのパラメータ リストに持っている場合、データ ベース サーバは、型階層内のどの型を UDR に渡すのかを分析する必要がありま す。引数リスト内の型が、ルーチン シグネチャの同じ位置にあるパラメータの型に 一致しない場合は、データベース サーバは、同じ位置にある、その引数から最も近 い上位型であるパラメータを持つルーチンを探します。 次の型階層を作成し、ルートの上位型 emp と副型 trainee に、オーバーロード関 数 bonus() を作成するとします。 CREATE ROW TYPE emp (name VARCHAR(30), age INT, salary DECIMAL(10,2)); CREATE ROW TYPE trainee UNDER emp ... CREATE ROW TYPE student_emp (gpa FLOAT) UNDER trainee; CREATE FUNCTION bonus (emp,INT) RETURNS DECIMAL(10,2) ... CREATE FUNCTION bonus(trainee,FLOAT) RETURNS DECIMAL(10,2). 次に、以下の文で bonus() 関数を呼び出します。 EXECUTE FUNCTION bonus(student_emp, INT); UDR パラメータの型が名前付き行 (ROW) 型の場合、その型を分析するために、デ ータベース サーバは次のステップを実行します。 1. データベース サーバは、次のようにして、最も左にある引数を最初に処理しま す。 a. データベース サーバは student_emp という行 (row) 型のパラメータを持 つ bonus という名前のルーチン候補を探します。 このパラメータを持つルーチン候補は存在していないため、データベース サ ーバは、28 ページの『型の優先順位リスト』に説明されているように、その 次の優先順位の型を探します。 b. student_emp は trainee の副型であるため、データベース サーバは、 1 番目のパラメータが trainee 型であるルーチン候補を探します。 2 番目の関数 bonus(trainee,float) の 1 番目のパラメータが、ルーチン呼 出しの最初の引数に一致します。したがって、このバージョンの bonus() が 優先順位リストに加えられます。 2. 次に、データベース サーバは 2 番目の引数を処理します。 第 3 章 ユーザ定義ルーチンの実行 31 a. データベース サーバは、2 番目のパラメータが整数 (INTEGER) 型であるル ーチン候補を探します。 ステップ 1b で一致したルーチン候補の 2 番目のパラメータは 実数 (FLOAT) 型です。したがって、データベース サーバは、28 ページの『型の 優先順位リスト』の説明に従って、次の優先順位の型を探します。 b. 2 番目のパラメータは整数 (INTEGER) 型の組込み型であるため、データベ ース サーバは 30 ページの表 1 に示している優先順位リストを検索します。 データベース サーバは、2 番目のパラメータが整数 (INTEGER) 型に対応す る優先順位リスト内の型のいずれかに一致するルーチンがないか、候補リス トを検索します。 c. 整数 (INTEGER) 型から実数 (FLOAT) 型への組込みキャストが存在している ため、データベース サーバは、bonus() 関数を実行する前に、整数 (INTEGER) 型の引数を実数 (FLOAT) 型に型変換します。 3. 引数を左から右へ処理するという規則により、データベース サーバは 2 番目の 関数 bonus(trainee,float) を実行します。 ディスティンクト (DISTINCT) 型でのルーチン分析 ディスティンクト (DISTINCT) 型は、既存の型と内部格納表現が同じですが、名前 が異なるために、ソース型と比較する場合は、必ず型変換を行う必要があります。 ディスティンクト (DISTINCT) 型は、そのソース型から関数を継承します。詳しく は、66 ページの『ディスティンクト (DISTINCT) 型』を参照してください。 UDR がそのパラメータ リストにディスティンクト (DISTINCT) 型を持っている場 合は、データベース サーバは、次のようにしてルーチンのシグネチャを分析しま す。 v ルーチンのシグネチャに、ルーチン呼出しと同じ位置にディスティンクト (DISTINCT) 型に一致するパラメータが含まれている場合、ルーチン分析プロセ スは、実行すべきルーチンとしてそのルーチンを選択します。 v 引数リスト内のディスティンクト (DISTINCT) 型が、ルーチン シグネチャの同 じ位置にあるパラメータの型に一致しない場合は、データベース サーバは、その 引数の位置にある以下のいずれかの型を受け入れる UDR を探します。 – ユーザが、ルーチン呼出しで指定している引数の型からの暗黙の型変換先とし て定義している型 型変換についての詳細は、2-16 ページの『型変換を使用したルーチン分析』を 参照してください。 – ディスティンクト (DISTINCT) 型のソース型 以下のセクションでは、ソース型の制限について説明し、これらのソース型でのル ーチン分析の手順を示します。 2 つの異なるディスティンクト (DISTINCT) 型でのルーチン分析: 候補リストに は、呼び出したルーチンの引数のソース型をパラメータとするルーチンを含めるこ とができます。ソース型自体がディスティンクト (DISTINCT) 型である場合は、デ ータベース サーバはそのディスティンクト (DISTINCT) 型のソース型を調べます。 ただし、ソース型がその型の優先順位リストに含まれていない場合には、ルーチン 分析プロセスはその候補を除去します。 32 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 例えば、次のディスティンクト (DISTINCT) 型と表を作成するとします。 CREATE DISTINCT TYPE pounds AS INT; CREATE DISTINCT TYPE stones AS INT; CREATE TABLE test(p pounds, s stones); 図 3 は、SQL ユーザが実行する問合せのサンプルを示したものです。 SELECT * FROM test WHERE p=s; 図 3. ディスティンクト (DISTINCT) 型の呼出しサンプル 2 つの引数のソース型は同じですが、p と s はディスティンクト (DISTINCT) 型 が異なるため、この問合せは失敗します。equal() 関数は、これら 2 つの異なる型 を比較できません。 異なるディスティンクト (DISTINCT) 型に対する代替の SELECT 文: 引数を明示 的に型変換すると、データベース サーバは、組込みの equals 関数を選択します。 以下のように SELECT 文を修正すると、データベース サーバは equals(int,int) 関 数を呼び出し、比較は成功します。 SELECT * FROM test WHERE p::INT = s::INT; 図 3 に示している SELECT 文を SQL ユーザが使用できるようにするために、以 下の追加関数を作成し、その関数を登録することもできます。 v 2 つのディスティンクト (DISTINCT) 型を処理するための、オーバーロード関数 equals(pounds,stones) CREATE FUNCTION equals(pounds, stones) ... オーバーロードされた equals() 関数を作成する利点は、SQL ユーザは、これら が明示的な型変換を必要とする新規の型であることを認識する必要がないという ことです。 v pounds 型から stones 型へ、および stones 型から INT 型への暗黙的キャス ト関数 CREATE IMPLICIT CAST (pounds AS stones); CREATE IMPLICIT CAST (stones AS INT); ソース型が組込み型であるルーチン分析 ソース型が組込み型である場合、ディスティンクト (DISTINCT) 型は、組込み型に 提供されている組込み型変換は継承しませんが、ソース型に対して定義されている ユーザ定義キャストは継承します。例えば、次のディスティンクト (DISTINCT) 型 と表を作成するとします。 CREATE DISTINCT TYPE inches AS FLOAT; CREATE TABLE test(col1 inches); INSERT INTO test VALUES (2.5::FLOAT::inches); SQL ユーザが、次の問合せのサンプルを実行するとします。 SELECT 4.8 + col1 FROM test; 第 3 章 ユーザ定義ルーチンの実行 33 col1 引数のソース型には、実数 (FLOAT) 型から 10 進数 (DECIMAL) 型 (4.8 は 10 進数 (DECIMAL) 型です) への変換を行うための組込みキャスト関数があります が、ディスティンクト (DISTINCT) 型 inches は組込みキャストを継承しないた め、この問合せは失敗します。 この SQL 問合せでは、明示的キャストを使用する必要があります。次の問合せは 成功します。 SELECT 4.8 + col1::INT from test; SELECT 4.8::FLOAT::inches + col1 FROM test; コレクション (collection) 型でのルーチン分析 コレクション (collection) 型 は、SET、MULTISET、あるいは LIST に格納されて いるのと同じ型の要素のグループをインスタンスとする複合型です。コレクション 内の要素は、不透明 (opaque) 型、ディスティンクト (DISTINCT) 型、組込み型、コ レクション (collection) 型、あるいは行 (row) 型にすることができます。 オーバーロード ルーチンでの NULL 引数 UDR を呼び出し、次の 2 つの条件がどちらも当てはまる場合、データベース サー バはエラー メッセージを戻す可能性があります。 v UDR の引数リストに NULL 値が含まれている。 v 呼び出された UDR がオーバーロード ルーチンである。 次のユーザ定義関数を作成するとします。 CREATE FUNCTION func1(arg1 INT, arg2 INT) RETURNS BOOLEAN... CREATE FUNCTION func1(arg1 MONEY, arg2 INT) RETURNS BOOLEAN... CREATE FUNCTION func1(arg1 REAL, arg2 INT) RETURNS BOOLEAN... 次の文により、表 new_tab を作成します。 CREATE TABLE new_tab (col_int INT); 次の問合せでは、データベース サーバは、式のに指定されている関数の引数に一致 する func1() 関数を 1 つだけ見付けることができるため、この問合せは成功しま す。 SELECT * FROM new_tab WHERE func1(col_int, NULL) = "t"; NULL 値は 2 番目の引数に対してワイルドカードとして働き、定義されている func1() それぞれの 2 番目のパラメータに一致します。最も左に、整数 (INT) 型 のパラメータを持つ func1() 関数だけが、呼び出す関数として該当します。 該当するルーチンが複数存在している場合は、データベース サーバはエラーを戻し ます。次の問合せでは、データベース サーバは、どの func1() 関数を呼び出せば よいか決定できないため、この問合せは失敗します。最初の引数の NULL 値は、各 関数の最初のパラメータに一致し、3 つの func1() 関数はすべて、2 番目の引数と して整数 (INTEGER) 型を想定しています。 SELECT * FROM new_tab WHERE func1(NULL, col_int) = "t"; 34 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド あいまいな呼出しを避けるために、NULL 値を引数として使用する場合は、注意が 必要です。 第 3 章 ユーザ定義ルーチンの実行 35 36 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 4 章 ユーザ定義ルーチンの開発 ルーチンの計画 . . . . . . . . . . . . . . ルーチンの命名 . . . . . . . . . . . . . ルーチン パラメータの定義 . . . . . . . . . 引数の数 . . . . . . . . . . . . . . ルーチン パラメータの宣言 . . . . . . . . 戻り値 . . . . . . . . . . . . . . . . バリアントまたは非バリアントの戻り値 . . . . OUT パラメータと文ローカル変数 (SLV) の使用 . SLV の使用 . . . . . . . . . . . . 戻り値のない SPL プロシジャ . . . . . . 戻りパラメータの命名 . . . . . . . . . . . 反復関数の使用 . . . . . . . . . . . . . 反復関数の作成 . . . . . . . . . . . . 反復関数の登録 . . . . . . . . . . . . 反復関数の呼出し . . . . . . . . . . . SELECT 文の FROM 節での反復関数の使用 . . 構文と使用方法 . . . . . . . . . . . メモリ割当て . . . . . . . . . . . . 並列問合せの実行 . . . . . . . . . . 制約事項 . . . . . . . . . . . . . SPL の反復関数の例 . . . . . . . . . C 反復関数の例 . . . . . . . . . . . Java の反復関数の例 . . . . . . . . . コーディング標準への準拠 . . . . . . . . . ルーチンの作成 . . . . . . . . . . . . . . ユーザ定義ルーチンの登録 . . . . . . . . . . ルーチンの特権の設定 . . . . . . . . . . . データベース レベル 特権 . . . . . . . . 言語レベル 特権. . . . . . . . . . . . ルーチン レベル 特権 . . . . . . . . . . SPL ルーチンの作成 . . . . . . . . . . . 外部言語ルーチンの作成 . . . . . . . . . . C 言語で作成したルーチンの登録 . . . . . . Java で作成したルーチンの登録 . . . . . . 修飾子を使用した外部ルーチンの登録 . . . . C 言語の UDR の修飾子 . . . . . . . . Java の UDR の修飾子 . . . . . . . . パラメータと戻り値の登録 . . . . . . . . ユーザ定義ルーチンに関する情報の参照 . . . . . HDR での UDR の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 38 39 39 39 40 40 41 42 42 43 44 44 44 45 45 45 46 46 46 47 47 49 51 51 52 53 53 54 54 54 56 56 57 57 57 58 59 59 60 本章の内容 この章では、UDR の設計と作成について説明します。以下のトピックを扱います。 v ルーチンの計画 v ルーチンの作成 v ユーザ定義ルーチンの登録 © Copyright IBM Corp. 1996, 2003 37 ルーチンの計画 UDR を作成する場合は、以下の点を検討してください。 v ルーチンの命名 v ルーチン パラメータの定義 v 戻り値の定義 (ユーザ定義関数のみ) v コーディング標準への準拠 ルーチン名とルーチン パラメータにより、ルーチンのルーチン シグネチャが構成 されます。ルーチン シグネチャはデータベース内で UDR を一意に識別します。詳 しくは、24 ページの『ルーチン シグネチャ』を参照してください。 ルーチンの命名と設計に関しては、以下の質問を考慮してください。 v モーダルなルーチンがあるか。つまり、ルーチンの動作が、引数のうちのいずれ かに依存するか。 v それぞれの型とルーチンが実行することを、2 文で記述できるか。 v 4 つ以上の引数を取るルーチンがあるか。 v ポリモーフィズムを効果的に使用したか。 UDR の最大サイズは、作成した言語、および使用するプラットフォームによって異 なります。C で作成した UDR の場合は、非常に大きな共有オブジェクトを作成す ることができます。この制限は、コンパイラとマシンのアーキテクチャによって異 なります。 Java で作成した UDR の制限サイズは、同様に大きく、作成可能な .jar ファイルのサイズによって異なります。SPL の場合は、SQL 文の最大サイズで ある 64 KB に制限されています。 ルーチンの命名 ルーチンには適切な名前を指定してください。ルーチン名は覚えやすく、ルーチン が実行することを簡潔に説明するものにしてください。データベース サーバは、複 数のルーチンが同一の名前を持てるようにするポリモーフィズム をサポートしま す。1 つの名前を複数のルーチンに割り当てることのできる機能は、ルーチン オー バロードと呼ばれます。ルーチン オーバロードの詳細については、25 ページの 『ルーチンのオーバーロード』を参照してください。 ルーチン オーバロードは、いくつかの高水準言語のプログラミングの慣例には反し ています。例えば、C 言語のプログラマーの場合、以下のような名前を付けた、大 きい方の引数を戻す関数を作成します。 bigger_int(integer, integer) bigger_real(real, real) SQL の場合、上記のルーチンは、以下のように定義する方がよいものになります。 bigger(integer, integer) bigger(real, real) 2 番目例の命名方式では、ユーザは、ルーチンを呼び出すときに引数の型を無視す ることができます。ユーザは、ルーチンが実行内容のみを覚えればよく、引数の型 に基づいてどのルーチンを呼び出すかを、データベース サーバに選択させるように できます。この機能を使用すると、UDR を使用しやすくなります。 38 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ルーチン パラメータの定義 UDR を呼び出す際、そのルーチンに、オプションの引数 値を渡すことができま す。各引数値は、ルーチンのパラメータ に対応しています。 引数の数 UDR での引数の数を制限し、これらの引数によりルーチンがモーダル にならない ようにする必要があります。モーダル ルーチンは、特殊な引数を一種のフラグとし て使用し、いつくかの動作のうちどれを行うかを決定します。例えば、以下の文 は、スペーシャル (空間) 値の包含を計算するルーチン呼出しを示しています。 Containment(polygon, polygon, integer); このルーチンは、最初の多角形が 2 番目の多角形を含んでいるのか、または 2 番 目の多角形が最初の多角形を含んでいるのかを判別します。呼び出し側は、どちら の値を計算するかを識別するための整数の引数 (例えば、1 または 0) を指定しま す。これはモーダル動作です。つまり、ルーチンのモードが、3 番目の値によって 変更されます。 次の例のルーチン名では、どのような計算が実行されるかが明確に示されていま す。 Contains(polygon, polygon) ContainedBy(polygon, polygon) 2 番目の例のように、常に、非モーダルのルーチンを作成してください。 ルーチン パラメータの宣言 ルーチンを宣言するときには、パラメータ リスト にルーチン パラメータを定義し ます。パラメータ リストには、ルーチンが処理する値の名前とデータ型を、各パラ メータで指定します。ルーチン パラメータはオプションです。入力パラメータのな い UDR を作成することができます。 ルーチンを呼び出す場合、引数値は、パラメータのデータ型と互換性のあるデータ 型を持っている必要があります。データ型が同じではない場合、データベース サー バによりその相違の分析が試行されます。詳しくは、27 ページの『ルーチン分析プ ロセス』を参照してください。 UDR を宣言する方法は、ルーチンを作成した言語によって異なります。 ストアド プロシジャ言語サポート SPL ルーチンのパラメータは、組込み型か、ユーザ定義型かのいずれかの SQL デ ータ型で宣言する必要があります。詳しくは、20 ページの『SPL ルーチンの実行』 を参照してください。 ストアド プロシジャ言語サポート の終り 第 4 章 ユーザ定義ルーチンの開発 39 C および JAVA 言語サポート C または Java で作成したルーチンの場合、その言語の構文を使用してルーチンを 宣言します。ルーチン パラメータは、ルーチンが処理する引数のデータ型を示しま す。 外部言語がサポートするデータ型を使用して、ルーチン パラメータを宣言します。 ただし、CREATE FUNCTION または CREATE PROCEDURE を使用してルーチン を登録する場合は、パラメータには SQL 型を使用します。(詳しくは、59 ページの 『パラメータと戻り値の登録』を参照してください。) したがって、これらの外部 データ型が、ルーチン登録で指定する SQL 型と互換性を持つようにする必要があ ります。 C および JAVA 言語サポート の終り C 言語サポート C 言語の UDR の場合は、DataBlade API が、SQL 型に使用するための特別なデー タ型を提供します。これらの特殊なデータ型のほとんどの場合、参照による引渡し のメカニズムを使用する必要があります。ただし、値による引渡しのメカニズムを 使用できるデータ型もいくかあります。詳しくは、「IBM Informix: DataBlade API Programmer’s Guide」および「IBM Informix: DataBlade API Function Reference」の DataBlade API データ型に関する章を参照してください。 C 言語サポート の終り Java 言語サポート すべての Java UDR は、データベースにインストールされている JAR ファイル内 にクラスが存在する、外部 Java 静的メソッドにマップされます。SQL と Java と の間のデータ型マッピングは、JDBC 仕様に従って行われます。詳しくは、 「IBM Informix: J/Foundation Developer’s Guide」およびお手持ちの Java 資料を参 照してください。 Java 言語サポート の終り 戻り値 UDR の一般的使用法では、呼び出し側 SQL 文に値が戻されます。値を戻す UDR は、ユーザ定義関数 と呼ばれます。 ユーザ定義関数の戻り値のデータ型を指定する方法については、 52 ページの『ユ ーザ定義ルーチンの登録』を参照してください。 バリアントまたは非バリアントの戻り値 デフォルトでは、ユーザ定義関数はバリアント関数です。バリアント関数 は、以下 のような特性を持っています。 v 同じ引数で呼び出されても、異なる結果を戻す。 例えば、現在の日付または時刻に基づいて戻り値が計算される関数は、バリアン ト関数です。 40 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v 以下のようなバリアント副次作用がある。 – 一部のデータベース表、変数の状態、または外部ファイルを変更する。 – 外部ファイル、またはデータベース内の表または行の検出に失敗すると、エラ ーを戻す。 VARIANT キーワードを使用してバリアント関数を明示的に指定することができま す。ただし、関数はデフォルトでバリアントに設定されているため、このキーワー ドは必要ありません。 非バリアント関数 は、同じ引数を受け取ると、必ず同じ値を戻します。また、上記 の副次作用はありません。したがって、非バリアント関数は外部ファイルにアクセ スしたり、 SQL 文を含むことはできません。これは、SQL 文が静的データのみを SELECT し、常に同じ結果を戻す場合でも同じです。非バリアント関数は、 NOT VARIANT キーワードを使用して指定します。 非バリアント関数にのみ関数インデックス を作成することができます。関数インデ ックスが戻す結果には、スマート ラージ オブジェクトを含むことはできません。 関数インデックスは、列の値に対してではなく、指定した関数が戻した値に対して インデックスを付加します。関数インデックスが戻す値には、スマート ラージ オ ブジェクトを含むことはできません。 データベース サーバは、渡された引数がすべて定数の場合は、問合せのコンパイル 時に非バリアント関数を実行することができます。この場合、その結果は、問合せ ツリー内の UDR 式と置き換わります。データベース サーバによるこの操作は、定 数除去 と呼ばれます。データベース サーバは、定数除去時には SQL 文を実行す ることはできません。したがって、非バリアント関数は、非バリアント SQL であ ってもそれを実行することはできません。 関数インデックスの作成については、「IBM Informix: SQL ガイド: 構文」の 『CREATE INDEX』文を参照してください。 OUT パラメータと文ローカル変数 (SLV) の使用 値を呼び出した関数から呼び出し側に渡す場合は、OUT パラメータを使用します。 SPL、C、または Java の呼び出された関数は、このパラメータに値を設定し、パラ メータを介して新規の値を戻します。UDR の引数は、一部またはすべてを OUT パ ラメータにすることができます。OUT パラメータを使用して、呼び出された関数へ 値を渡すことはできません。この場合、OUT パラメータは NULL として UDR に渡 されます。 OUT パラメータを使用して UDR を作成する構文は、以下のとおりです。 CREATE FUNCTION udr ([IN/OUT] arg0 datatype0, ..., [IN/OUT] argN datatypeN) RETURNING returntype; ... END FUNCTION; デフォルトでは、OUT キーワードを指定して、OUT パラメータとして定義しない 限り、パラメータは IN パラメータと見なされます。 例えば、以下の CREATE FUNCTION 文では、 1 つの IN パラメータ x と、 2 つの OUT パラメータ y および z が指定されています。 第 4 章 ユーザ定義ルーチンの開発 41 CREATE FUNCTION my_func(x INT, OUT y INT, OUT z INT) RETURNING INT EXTERNAL NAME ’/usr/lib/local_site.so’ LANGUAGE C 文ローカル変数 (SLV) は、 SELECT 文の WHERE 節で使用される OUT パラメ ータです。詳しくは、42 ページの『SLV の使用』を参照してください。 重要: データ操作言語 (DML) SQL 文では、SLV を使用する場合以外は、 OUT パ ラメータを持つ UDR を実行することはできません。SELECT、UPDATE、 INSERT、および DELETE の各文は DML 文です。 重要: JDBC を使用する場合以外は、EXECUTE FUNCTION 文を使用して、OUT パラメータが指定されているユーザ定義関数を呼び出すことはできません。 重要: OUT パラメータが指定されているリモート UDR を実行することはできませ ん。 SLV の使用: SLV は、ユーザ定義関数の OUT パラメータを SQL 文のその他の 部分へ伝えます。 SLV は SQL 文に対してローカルです。つまり、 SQL 文が実行 されている間のみ 有効です。この変数は、OUT パラメータ値にアクセスするため の一時的な名前を提供します。一部またはすべてのユーザ定義関数の引数を SLV にすることができます。 ユーザ定義関数を呼び出す SQL 文においては、SLV_name # SLV_type (ここで、 SLV_name は SLV 変数の名前、SLV_type はそのデータ型) という構文で SLV を宣 言します。以下のとおりです。 SELECT SLV_name1, SLV_nameN FROM table WHERE udr (param1, SLV_name1 # SLV_type1, ... SLV_nameN # SLV_typeN, paramN); 例えば、以下の SELECT 文では、WHERE 節で INTEGER 型の SLV、x と z を宣 言してから、射影リストで両方の SLV にアクセスしています。 SELECT x, z WHERE my_func(x # INT, y, z # INT) < 100 AND (x = 3) AND (z = 5) SLV の構文と使用の詳細については、「IBM Informix: SQL ガイド: 構文」の 『式』セクション内の関数式の説明を参照してください。 戻り値のない SPL プロシジャ: 戻り値のない SPL プロシジャは、 JDBC CallableStatement でのみアクセス可能です。戻り値のない SPL プロシジャに は、OUT パラメータを使用することができます。このようなプロシジャを作成する 構文は、以下のとおりです。 CREATE PROCEDURE spl_udr ([IN/OUT] arg0 datatype0, ..., [IN/OUT] argN datatypeN); ... END PROCEDURE; 例えば、以下の SQL 文では、 2 つの OUT パラメータと 1 つの IN パラメータ を持つ SPL プロシジャを作成しています。 42 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド CREATE PROCEDURE myspl (OUT arg1 int, arg2 int, OUT arg3 int); LET arg1 = arg2; LET arg3 = arg2 * 2; END PROCEDURE; 値を戻さない SPL プロシジャは、SELECT 文の WHERE 節では使用できないた め、SLV を生成することはできません。 戻りパラメータの命名 SPL UDR の各戻りパラメータごとに名前を定義することができます。 CREATE PROCEDURE 文または CREATE FUNCTION 文の RETURNS 節または RETURNING 節で名前を指定します。 CREATE PROCEDURE 文または CREATE FUNCTION 文の構文は、以下のとおり です。 RETURNS/RETURNING data_type AS return_param_name [{, data_type AS return_param_name}] return_param_name パラメータは、戻りパラメータの名前を定義し、表列名の場合と 同じルールに従います。戻りパラメータのすべて が名前を持つか、どれも 名前を 持たないかのいずれかにする必要があります。関数またはプロシジャの戻りパラメ ータの名前は、一意なものにする必要があります。プロシジャ本体内では、戻りパ ラメータ名を参照することはできません。以下の例に示すように、関数またはプロ シジャ自体の中では、戻りパラメータ名と変数名の間には関連はありません。 CREATE PROCEDURE NamedRetProc() RETURNING int AS p_customer_num, char(20) AS p_fname, char(20) AS p_lname; DEFINE v_id int; DEFINE v_fname char(15); DEFINE v_lname char(15); FOREACH curA FOR SELECT customer_num, fname, lmname INTO v_id, v_fname, v_lname FROM customer RETURN v_id,v_fname, v_lname WITH RESUME; END FOREACH; ENDPROCEDURE; 以下に示すように、NamedRetProc() プロシジャは、戻り値の上に戻りパラメータ 名を表示してデータを戻します。戻りパラメータを命名しなかった場合は、式 の名 前が表示されます。 p_customer_num p_fname p_lname 101 Ludwig Pauli 102 Carole Sadler 戻りパラメータの命名のための構文をサポートしていない 9.4 以前のバージョンの IBM Informix Dynamic Server にデータベースをエクスポートする場合は、戻りパラ メータは命名しないでください。戻りパラメータに名前を持つストアド プロシジャ を含むデータベースをエクスポートすると、スキーマ作成スクリプトにもこれらの 名前が含まれるようになります。 9.4 以前のバージョンの IBM Informix Dynamic Server を使用してデータベースをインポートすると、エラーが戻されます。作業を 継続し、戻りパラメータに名前を付けずにストアド プロシジャをインポートする場 合は、スキーマ作成スクリプトを手動で編集してインポート可能にすることができ ます。 第 4 章 ユーザ定義ルーチンの開発 43 ヒント: SELECT 文の射影リストでストアド プロシジャを呼び出す場合は、戻りパ ラメータ名は表示されません。代わりに、出力ストリングの「式」が表示 されます。戻りパラメータ名を表示する場合は、 SELECT some_func(a,b) AS name1,... のように AS キーワードを使用してください。 反復関数の使用 デフォルトでは、ユーザ定義関数は 1 つの値を戻します。つまり、戻り値を計算 し、それを呼び出し側 SQL 文へ一度だけ戻します。呼び出し側 SQL 文に一度だけ 結果を戻すユーザ定義関数は、非カーソル関数 と呼ばれます。これは、この関数で データベース カーソルを実行する必要がない ためです。非カーソル関数を呼び出 す方法については、18 ページの『SQL 文での UDR の呼出し』を参照してくださ い。 ただし、呼び出し側 SQL 文に複数回値を戻すユーザ定義関数を作成することがで きます。そのようなユーザ定義関数は、反復関数 と呼ばれます。反復関数は、実行 時にカーソルと関連付ける必要があるため、カーソル関数 と呼ばれます。カーソル は、カーソル関数が繰り返し SQL 文に戻した値を保持します。したがって、呼出 し側プログラムは、カーソルへアクセスし、一度に 1 つずつ各戻り値を取得するこ とができます。カーソルの内容は、アクティブ セット と呼ばれています。反復関 数は、呼び出し側 SQL 文に値を戻すごとに、1 つの項目をアクティブ セットに追 加します。 重要: 反復関数で OUT パラメータを使用することはできません。 反復関数の作成 SPL、C、または Java で反復関数を作成することができます。反復タスクの管理で は、各言語は、次のように異なる文、関数、およびメソッドを使用します。 v SPL 反復関数は、RETURN WITH RESUME 文で FOREACH キーワードを使用 して連結します。 v C 言語反復関数は、mi_fp_setisdone() および mi_fp_request() などの DataBlade API 関数を使用してアクティブ セットの各戻り項目を処理します。 MI_FPARAM は、mi_fp_setisdone() および mi_fp_request() がアクセスする 反復状態を保持します。 v Java 反復関数は、必要なメソッドと定数をすべて提供する UDREnv インターフ ェイスを使用します。 反復関数の登録 デフォルトでは、外部言語で作成された関数は、反復関数ではありません。C また は Java で作成された反復関数を定義するには、ITERATOR ルーチン修飾子を使用 してその関数を登録する必要があります。以下の CREATE FUNCTION 文のサンプ ルは、TopK() を C の反復関数として登録する方法を示しています。 CREATE FUNCTION TopK(INTEGER, INTEGER) RETURNS INTEGER WITH (ITERATOR, NOT VARIANT) EXTERNAL NAME ’/usr/lib/extend/misc/topkterms.so(topk_integers)’ LANGUAGE C 44 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ヒント: SPL 反復関数は、ITERATOR 修飾子を使用して登録する必要はありませ ん。 反復関数の呼出し 以下のいずれかの方法を使用して、反復関数を呼び出すことができます。 v EXECUTE FUNCTION 文で直接呼び出す。 – DB–Access から – 外部ルーチンの準備済みカーソル内で – 外部ルーチン内で – SPL FOREACH ループ内で v INSERT 文の一部として EXECUTE FUNCTION 文を使用して呼び出す。 – DB–Access から – ESQL/C または外部ルーチンの準備済みカーソル内で – DataBlade API データベース サーバ ルーチン内で – SPL FOREACH ループ内で v SELECT 文の FROM 節内で呼び出す。 表の代わりに、反復関数の結果セットが、問合せがデータを選択するソースにな ります。反復関数の戻り値は、仮想テーブルにマップされます。 FROM 節での 反復関数の使用については、次で詳しく説明します。 9.4 以前のリリースの既存の反復 UDR は、SELECT 文の FROM 節で使用する ことができます。 SELECT 文の FROM 節での反復関数の使用 SELECT 文のソースとして、表以外に反復関数を指定することができます。つま り、表インターフェイスを使用して、反復 UDR の戻り結果セットを問い合わせる ことができます。したがって、多くの方法で、反復関数の結果セットを操作するこ とができます。例えば、WHERE 節を使用して結果セットをフィルタに掛ける、 UDR 結果セットをその他の表走査に結合する、GROUP BY、集約、ORDER BY の 操作を実行する、などの方法です。 構文と使用方法: FROM 節で反復関数を使用するための構文は以下のとおりです。 FROM TABLE (FUNCTION iterator_func_name ([argument_list])) [[AS] virtual_table_name] [(virtual_column_list)] virtual_table_name パラメータでは、修飾せずに (所有者名またはデータベース名を 入れない)、反復関数の結果セットを保持する仮想テーブルの名前を指定します。 重要: 仮想テーブルは、この SELECT 問合せのコンテキスト内でのみ参照すること ができます。SELECT 文が完了すると、仮想テーブルは存在しなくなりま す。 virtual_column_list パラメータは、仮想テーブルの修飾されていない列名をコンマで 区切ったリストです。列数は、反復関数により戻される値の数と一致する必要があ ります (SPL 関数は複数の値を戻すことができます)。 SELECT 文のその他の部分 (例えば、射影リストの WHERE 節または HAVING 節) で仮想テーブル列を参照する場合は、FROM 節で仮想テーブル名および仮想列 第 4 章 ユーザ定義ルーチンの開発 45 名を指定する必要があります。 SELECT 節の射影リストでワイルドカード文字を使 用する場合は、FROM 節で仮想テーブル名または仮想列名を指定する必要はありま せん。 SELECT * FROM ... 例えば、以下の文は、fibseries() という関数から結果セットを取得します。この結 果セットは、vtab という仮想テーブルに保持されます。 SELECT col FROM TABLE (FUNCTION fibseries(10)) vtab(col); FROM 節で反復関数を指定する SELECT 文が、予期しない結果を戻す場合は、反 復関数を別個に実行して、その関数が予期した通りに動作するかどうかを確認して ください。例えば、以下のようなコマンドを使用して、DB-Access で関数を実行し ます。 execute function iterator_udr(args) 反復 UDR から取得した、仮想テーブルの SQL Explain 出力セクションには、 ITERATOR UDR SCAN のマークが付けられます。 反復 UDR を終了する際、C 言語の UDR では mi_fp_setisdone()、 JAVA 言語 の UDR では UDREnv.setSetIterationIsDone(true) を呼び出すようにしてくださ い。サーバは、このフラグを内部的に検査して、反復 UDR の呼出しをいつ停止す るかを判別します。 メモリ割当て: C で作成した反復関数の場合、サーバが設定する戻り値のデフォル トのメモリ持続期間は十分なものである必要があります。 すべての反復関数が実行されている期間 (通常は PER_COMMAND 期間) に MI_FPARAM データ構造体を割り当てる必要があります。 並列問合せの実行: IBM Informix Dynamic Server 並列データベース問合せ (PDQ) 機能を使用して問合せを並列で実行する場合に、FROM 節の反復 UDR が並列可能 ではない ときは、SELECT 問合せでは、問合せ並列処理は実行されません。しか し、FROM 節の反復 UDR が並列可能であり、問合せ並列処理を使用不可にする要 因が他にない場合は、問合せは並列に実行することができます。PDQ を有効にする と、機能表は、単一の非フラグメント表として処理されます。 以下の例では、GROUP BY 操作および集約操作は、複数の PDQ スレッドによって 実行され、fibseries() 関数は、副スレッドによって実行されます。 SELECT col1,col2, COUNT(*) FROM TABLE (FUNCTION fibseries(10)) tab1(col1),tab2 GROUP BY col1,col2; 問合せを並列で実行する方法については、「IBM Informix: Dynamic Server パフォー マンス ガイド」を参照してください。 制約事項: FROM 節での反復関数の使用には、以下の制約事項が適用されます。 v 反復関数は、FROM 節のその他の列を参照することはできない。例えば、次の問 合せは、fibseries 反復関数で列 t.x が引数として指定されているため、無効で す。 SELECT t.x, vtab.col FROM t, TABLE (FUNCTION fibseries(t.x)) vtab(col); 46 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ただし、反復関数は、次のように外部問合せにおいて使用する場合は、その他の 列を参照することができます。 SELECT t.x FROM t WHERE t.y IN (SELECT col FROM TABLE (FUNCTION fibseries(t.y)) vtab(col)); v 反復関数は、OUT パラメータおよび文ローカル変数を指定することはできない。 v INSERT 文、UPDATE 文、または DELETE 文で反復関数をターゲットとして使 用することはできない。 v FROM 節で使用する UDR は、反復関数である必要がある。 SPL の反復関数の例: FROM 節で使用する反復関数を SPL で作成するには、以 下の例に示すように、作成する関数で RETURN WITH RESUME 構成体を使用する 必要があります。 SPL で作成した UDR は複数の値を戻すことができるため、FROM 節の仮想列リス トには複数の列名を指定することができます。 SELECT 問合せのターゲット リス トで、これらの任意の仮想列名を参照することができます。 create function find_top_earners() returning integer,decimal,lvarchar define ret_empid integer; define ret_salary decimal; define ret_empname lvarchar; foreach select emp_id,salary into ret_empid,ret_salary from salary if (ret_salary > 100000.00) select emp_name into ret_empname from employee where emp_id = ret_empid; return ret_empid,ret_salary,ret_empname with resume; end if; end foreach; end function; 以下の問合せでは、上記の反復 UDR find_top_earners() を使用して、従業員名で ソートされた先頭の給与取得者を検索します。 select vemp_name,vemp_id,vemp_sal from table (function find_top_accounts()) vtab1(vemp_name,vemp_id,vemp_sal) order by vemp_name; C 反復関数の例: C 言語で反復関数を作成するには、mi_fp_request()、 mi_fp_setfuncstate()、mi_fp_setisdone() などの DataBlade API 関数を MI_FPARAM データ構造体で使用します。 C 言語で作成した UDR は、1 つの値しか戻すことができません。したがって、 FROM 節の仮想列リストには 1 つの列しか入れることができません。ただし、C 言語の UDR は、複数の戻り値を 1 つのユニットとしてキャプチャする行 (ROW) 型を戻すことができます。 以下の例では、C 言語で反復関数を作成し、それを FROM 節で使用する方法を示 しています。関連する DataBlade API と反復の状態は強調表示されています。 関数 fibseries() は反復関数であり、引数として関数に渡された値を上限とするフィ ボナッチ数列を戻します。 第 4 章 ユーザ定義ルーチンの開発 47 create function fibseries(int x) returns int with (handlesnulls,iterator, parallelizable) external name "$USERFUNCDIR/fib.so" language c; /* A Function to return a set of integer. This function takes stop val as a parameter and returns a fibonaucci series up to stop val. * Three states of fparam : * * SET_INIT: Allocate the the function state structure defined. This State Structure is allocated in PER_COMMAND duration to hold the memory till the end of the command. Make the fparam structure point to the State Structure. Set the first two numbers of the series i.e 0 and 1; And set the stop val field of State Structure to the stop val passed to the function. * SET_RETONE: Computes the next number in the series. Compares it with the stop val to check if the exit criteria is met. num1 = num2;num2 = next number in the series. * SET_END: Frees the user Allocated Func State structure. */ #include <milib.h> typedef struct fibState1 { mi_integer fib_prec1; mi_integer fib_prec2; mi_integer fib_ncomputed; mi_integer fib_endval; }fibState; mi_integer fibseries(endval,fparam) mi_integer endval; MI_FPARAM *fparam; { fibState *fibstate; mi_integer next; switch(mi_fp_request(fparam)) { case SET_INIT : fibstate = (fibState *) mi_dalloc (sizeof(fibState),PER_COMMAND); mi_fp_setfuncstate(fparam,(void *)fibstate); if (mi_fp_argisnull(fparam,0) || endval < 0) { mi_fp_setreturnisnull(fparam,0,1); break; } if (endval < 1) { fibstate->fib_prec1 = 0; fibstate->fib_prec2 = 1; fibstate->fib_ncomputed = 1; fibstate->fib_endval = endval; } else { fibstate->fib_prec1 = 0; fibstate->fib_prec2 = 1; fibstate->fib_ncomputed = 0; fibstate->fib_endval = endval; } break; case SET_RETONE : fibstate = mi_fp_funcstate(fparam); if (fibstate->fib_ncomputed < 2) { return((fibstate->fib_ncomputed++ == 0) ? 0 : 1); } next = fibstate->fib_prec1 + fibstate->fib_prec2; if (next > fibstate->fib_endval) { mi_fp_setisdone(fparam,1); return 0; 48 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド } if (next == 0) { fibstate->fib_prec1 fibstate->fib_prec1 } else { fibstate->fib_prec1 fibstate->fib_prec2 = 0; = 1; = fibstate->fib_prec2; = next; } return (next); case SET_END : fibstate = mi_fp_funcstate(fparam); mi_free(fibstate); break; } } この関数は、次のように SELECT 問合せの FROM 節で使用することができます。 select vcol1 from table (function fibseries(100)) vtab1(vcol1); Java の反復関数の例: UDREnv インターフェイスにより、必要なすべてのメソッ ドと定数を提供しています。Java で作成した UDR は、1 つの値しか戻すことがで きません。したがって、FROM 節の仮想列リストには 1 つの列しか入れることが できません。 以下の例では、Java で反復関数を作成し、それを FROM 節で使用する方法を示し ています。関連する DataBlade API と反復の状態は強調表示されています。 反復 UDR の jenv_iter() は整数パラメータを受け取り、CHAR(40) 列の行を戻し ます。渡されるパラメータによって、関数が戻す行数が決まります。 public interface UDREnv { ... // for maintaining state across UDR invocations void setUDRState(Object state); Object getUDRState(); // for set/iterator processing public static final int UDR_SET_INIT = 1; public static final int UDR_SET_RETONE = 2; public static final int UDR_SET_END = 3; int getSetIterationState(); void setSetIterationIsDone(boolean value); ... } import java.lang.*; import java.sql.*; import com.informix.udr.*; import informix.jvp.*; public class Env { public int count; // // test UDR meta // public static String envTest1(int i, String xchar, String xvchar, String xlvarchar) throws SQLException { UDREnv env = UDRManager.getUDREnv(); String res = env.getName() + "#" + env.getReturnTypeName() + "#"; String param[] = env.getParamTypeName(); for (int j = 0; j < param.length; ++ j) 第 4 章 ユーザ定義ルーチンの開発 49 res += param[j] + "#"; res += i + xchar + xvchar + xlvarchar; return res; } public static String envTest2(int i, String s[]) throws SQLException { UDREnv env = UDRManager.getUDREnv(); UDRLog log = env.getLog(); String res = env.getName() + "#" + env.getReturnTypeName() + "#"; String param[] = env.getParamTypeName(); for (int j = 0; j < param.length; ++ j) res += param[j] + "#"; res += i; log.log(res); s[0] = res; return res; } // //test env state, iterator, log, traceable, and properties // public static String envIter(int num) throws SQLException { UDREnv env = UDRManager.getUDREnv(); UDRLog log = env.getLog(); UDRTraceable tr = env.getTraceable(); JVPProperties pr = env.getProperties(); int iter = env.getSetIterationState(); Env state = (Env)env.getUDRState(); if (iter == UDREnv.UDR_SET_INIT) { state = new Env(); state.count = num; env.setUDRState(state); log.log("SET INIT" + state.count + " " + state.toString()); tr.tracePrint("UDR.ENVITER", 0, "SET INIT"); env.setSetIterationIsDone(false); pr.setProperty("ENVITERPROP", "AFTER INIT"); return "INIT"; } else if (iter == UDREnv.UDR_SET_END) { log.log("SET DONE"); tr.tracePrint("UDR.ENVITER", 0, "SET DONE"); env.setSetIterationIsDone(true); return "DONE"; } else if (iter == UDREnv.UDR_SET_RETONE) { log.log("SET RETONE" + state.count + " " + state.toString()); tr.tracePrint("UDR.ENVITER", 0, "SET RETONE"); String prv = pr.getProperty("ENVITERPROP"); if (state.count <= 0) env.setSetIterationIsDone(true); else env.setSetIterationIsDone(false); -- state.count; pr.setProperty("ENVITERPROP", "AFTER RETONE" + (state.count + 1)); return new String("ELEMENT " + (state.count + 1) ); //+ prv); } 50 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド else throw new SQLException("Bad iter code"); } } 以下の文では、Java で反復 UDR の jenv_iter() を作成しています。 create function jenv_iter(int) returning char(40) with (class = "jvp", iterator) external name `Env.envIter(int)’ language java; コーディング標準への準拠 UDR の開発では、SQL/PSM 標準を使用することができます。また、DataBlade モ ジュールの開発では、www.ibm.com/software/data/developer/informix の IBM Informix Developer Zone にある標準コレクションを使用することもできます。最も重要なル ールはデータ型とルーチンを命名するルールです。 DataBlade モジュールはこれら のネーム スペースを共用します。したがって、複数の DataBlade モジュールを単一 のデータベースに登録する場合は、問題が発生しないように、命名に関するガイド ラインに従う必要があります。 ヒント: DataBlade の開発を管理するには、DBDK バージョン 4.0 以降を使用する ことをお勧めします。BladeManager が Data Blade のアップグレードを正 しく処理できるようにするために、DBDK が生成する SQL 登録スクリプ トを使用することが特に重要です。 また、64 ビット クリーン インプリメンテーション、安全な関数呼び出し方法、ス レッド セーフ開発、およびプラットフォーム移植性のための標準仕様が重要です。 これらの標準仕様に準拠することにより、UDR モジュールをプラットフォーム間で 移植可能なものにすることができます。 UDR をコーディングする場合は、以下の質問を検討してください。 v すべての命名標準に従っているか。 v 設計が 64 ビット クリーンで、プラットフォーム間で移植可能なものになってい るか。 v 設計がスレッド セーフなものになっているか。 ルーチンの作成 外部ルーチンのソースは、別個のテキスト ファイルにあります。 C 言語の UDR については、「IBM Informix: DataBlade API Programmer’s Guide」および 「IBM Informix: DataBlade API Function Reference」を参照してください。Java の UDR については、「IBM Informix: J/Foundation Developer’s Guide」を参照してく ださい。 ヒント: UDR の作成を容易にするために、DBDK を使用することをお勧めしま す。DBDK により標準化が行われ、データベース サーバの異なるバージョ ン間の移行が容易になります。 第 4 章 ユーザ定義ルーチンの開発 51 外部言語ルーチンはデータベースの外部にあるため、UDR ソース コードはコンパ イルし、ルーチンを呼び出す際にデータベース サーバがアクセス可能な場所に保管 する必要があります。 UDR ソース コードを準備するには、以下のようにします。 v C 言語 UDR をコンパイルし、実行可能バージョンを共有オブジェクト ファイ ルに保管する。 共有オブジェクト ファイルの作成方法については、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 v Java 言語 UDR をコンパイルし、実行可能バージョンを .jar ファイルに保管す る。 .jar ファイルを準備する方法については、お手持ちの Java マニュアルを参照し てください。 エンタープライズ レプリケーション (ER) および高可用性データ レプリケーショ ン (HDR) に関連するデータベース サーバを含め、UDR を実行する必要のあるす べてのデータベース サーバ上に、共有オブジェクト ファイルと .jar ファイルをイ ンストールする必要があります。共有オブジェクト ファイルと .jar ファイルは、 同一の絶対パス名の場所にインストールする必要があります。 ユーザ定義ルーチンの登録 データベース サーバは、データベースに UDR を登録するための以下の SQL 文を 認識します。 v CREATE FUNCTION 文は、値を戻す UDR を登録します。 v CREATE PROCEDURE 文は、値を戻さない UDR を登録します。 データベースが HDR ペアの副データベース サーバ上にある場合を除いて、 UDR は、それらを使用するすべてのデータベースに登録する必要があります。 ユーザ定義ルーチンの登録: 1. UDR を登録するための正しい特権を持っていることを確認する。 2. CREATE FUNCTION 文または CREATE PROCEDURE 文を使用して、以下のよ うに UDR を登録する。 v SPL ルーチンの場合、この文は、ルーチン コードをリストしてから、ルーチ ンのコンパイルと登録を行います。 v 外部言語ルーチンの場合、この文は、ルーチン コードの格納場所を指定し (EXTERNAL NAME 節を使用)、ルーチンを登録します。 次の例は、CREATE FUNCTION 文の構文を示しています。 CREATE FUNCTION func_name(parameter_list) RETURNS ret_type WITH (NOT VARIANT) EXTERNAL NAME ’pathname’ LANGUAGE C この SQL 文は、データベースに以下の情報を提供します。 v サポート関数の名前 func_name および所有者 v サポート関数にオプションで指定する固有名 (表示されない) 52 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v サポート関数の、パラメータのデータ型 parameter_list、および戻り値のデータ型 ret_type v サポート関数のソース コードの格納場所 pathname v サポート関数の言語 LANGUAGE C v 関数が、異なる引数を指定しても異なる値を戻さないことを示すルーチン修飾子 NOT VARIANT ESQL/C ESQL/C プログラムでは、直接 CREATE FUNCTION を使用することはできませ ん。 ESQL/C アプリケーション内から不透明 (OPAQUE) 型サポート関数を登録す るには、オペレーティング システム ファイル内に CREATE FUNCTION 文を記述 する必要があります。次に、CREATE FUNCTION FROM 文を使用して、このファ イルの格納場所を示します。CREATE FUNCTION FROM 文は、オペレーティング システム ファイルの内容をデータベース サーバに送り、これを実行します。 ESQL/C の終り ルーチンの特権の設定 ユーザは、データベースに UDR を登録する CREATE FUNCTION 文または CREATE PROCEDURE 文を発行するために、以下の特権を持っている必要があり ます。 v データベース レベル 特権 v 言語レベル 特権 UDR の登録後は、ルーチン レベル 特権を割り当てることができます。特権を割り 当てる方法については、「IBM Informix: SQL ガイド: 構文」の 『GRANT』文を参 照してください。 データベース レベル 特権 データベース レベル 特権により、UDR の登録または削除を行うデータベースの拡 張機能を制御します。以下のユーザは、データベースに新規ルーチンを登録する資 格があります。 v DBA 特権を持つすべてのユーザは、CREATE FUNCTION 文または CREATE PROCEDURE 文で DBA キーワードを使用しているかどうかに関わらずルーチン を登録することができる。 v 非 DBA ユーザは、ルーチンを登録するには Resource 特権が必要である。 ルーチンの作成者はルーチンに対する所有者特権を持ちます。DBA 特権を持って いないユーザは、CREATE FUNCTION 文または CREATE PROCEDURE 文で DBA キーワードを使用して、ルーチンを登録することはできません。 ヒント: DBA キーワードの説明については、155 ページの『DBA としての UDR の実行』を参照してください。 DBA は、ルーチンを作成するために必要な Resource 特権を非 DBA ユーザに付与 する必要があります。 DBA は Resource 特権を取り消すことができます。特権を 取り消されたユーザは、追加ルーチンを作成できなくなります。 第 4 章 ユーザ定義ルーチンの開発 53 DBA またはルーチン所有者は、DROP ROUTINE 文、DROP FUNCTION 文、また は DROP PROCEDURE 文を使用して、登録をキャンセルすることができます。 DBA またはルーチン所有者は、ALTER ROUTINE 文、ALTER FUNCTION 文、ま たは ALTER PROCEDURE 文を使用して、ルーチンに対する変更を登録することが できます。 言語レベル 特権 言語レベル Usage 特権により、特定の UDR 言語で UDR を作成する機能を制御し ます。この特権は、informix ユーザまたは WITH GRANT OPTION で DBA 特権 を与えられている別のユーザによって付与される必要があります。 UDR 言語には、Usage 特権について、以下の GRANT および REVOKE の要件が あります。 v DBA は、データベース サーバがサポートするすべての 言語に対して、Usage 特 権を付与したり、取り消したりできる。 v DBA が GRANT EXECUTE ON 文で WITH GRANT キーワードを適用した場合 は、別のユーザが Usage 特権を付与することができる。 以下の GRANT 文は、Java の UDR に対する Usage 特権を dorian という名前の ユーザに付与します。 GRANT USAGE ON LANGUAGE JAVA TO dorian データベース サーバのデフォルト設定は以下のとおりです。 v 外部言語に対する Usage 特権を PUBLIC に対して付与しない v SPL に対する Usage 特権を PUBLIC に対して付与する 詳しくは、「IBM Informix: データベース設計および実装 ガイド」の特権の説明、 および「IBM Informix: SQL ガイド: 構文」の『GRANT』文の説明を参照してくだ さい。 ルーチン レベル 特権 UDR を登録すると、そのルーチンに関する Execute 特権が自動的に与えられま す。Execute 特権を所有しているユーザは、UDR を呼び出すことができます。ルー チンを他のユーザが実行できるようにする方法については、153 ページの『ルーチ ンへの Execute 特権の割り当て』を参照してください。 SPL ルーチンの作成 SPL ルーチンの場合、CREATE FUNCTION 文または CREATE PROCEDURE 文 は、以下のタスクを実行します。 v すべての SQL 文の構文解析と最適化 (可能な場合) データベース サーバは、SQL 文を実行計画 に入れます。実行計画とは、データ ベース サーバが SQL 文を効率的に保管し、実行できるようにする構造体のこと です。 データベース サーバは、SPL ルーチン内の各 SQL 文を最適化し、実行計画内の 選択した問合せ計画を組み込みます。 SPL ルーチンの最適化の詳細について は、162 ページの『SPL ルーチンの最適化』を参照してください。 v 依存性リストを作成する 54 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 依存性リストには、実行時に SPL ルーチンを再最適化する必要があるかどうか を、データベース サーバが判断するために確認する複数の項目が含まれていま す。例えば、データベース サーバは、問合せに関連するすべての表、インデック ス、列が存在するかどうかを検査します。 v SPL 文を構文解析し、疑似コードに変換する 疑似コード は、インタープリタが高速に実行可能な疑似的なコードのことを指し ます。 v 疑似コード、実行計画、および依存性リストを ASCII フォーマットに変換する データベース サーバは、これらの ASCII フォーマットを文字 (CHAR) 型列とし てシステム カタログ表の sysprocbody および sysprocplan に保管します。 v ルーチン名のパラメータおよび修飾子などのプロシジャに関する情報を、 sysprocedures システム カタログ表に保管する v プロシジャの権限を sysprocauth システム カタログ表に保管する SPL ルーチンを最適化する方法については、 161 ページの『第 13 章 UDR パフォ ーマンスの向上』を参照してください。 システム カタログ表内の UDR 情報の要約については、59 ページの『ユーザ定義 ルーチンに関する情報の参照』を参照してください。 図 4 では、abs_eq() というユーザ定義関数を登録する CREATE FUNCTION 文の 一部を示しています。 図 4. SPL 関数の登録 SPL 関数を作成する場合、データベース サーバが関数を実行する方法を指定する、 オプションのルーチン修飾子を指定することができます。SPL プロシジャでは、ル ーチン修飾子は使用できません。関数修飾子をリストするには、CREATE FUNCTION 文の WITH 節を使用します。SPL 関数では、以下のルーチン修飾子が 使用可能です。 v INTERNAL v NEGATOR 第 4 章 ユーザ定義ルーチンの開発 55 v NOT VARIANT v VARIANT 図 4 では、NOT VARIANT 修飾子が abs_eq() SPL 関数に指定され、同じ引数を 渡された場合常に同じ値を戻すように作成されています。 CREATE FUNCTION 文と CREATE PROCEDURE 文、および SPL の構文の詳細 については、「IBM Informix: SQL ガイド: 構文」を参照してください。 SPL を使 用したルーチンの作成方法については、「IBM Informix: SQL ガイド: チュートリア ル」を参照してください。 外部言語ルーチンの作成 データベース サーバがサポートする外部言語を使用して、ルーチンを作成すること ができます。ルーチンの作成後、CREATE FUNCTION 文または CREATE PROCEDURE 文を使用してルーチンを登録します。 CREATE FUNCTION 文および CREATE PROCEDURE 文は、以下のように外部ル ーチンの格納場所を指定します。 v C 言語の UDR の場合、格納場所は、関数またはプロシジャを実装する C 関数 の名前によって修飾された、共有オブジェクト モジュールの絶対パス名で指定し ます。 v Java の UDR の場合、格納場所は .jar ファイルの名前で指定します。引数を含 めた、Java クラス名とそのクラス内のメソッド名がその後に続きます。 例えば、図 5 は、C で作成した abs_eq() というユーザ定義関数を登録する CREATE FUNCTION 文を示しています。これに対応する C 関数は、abs.bld とい う共有オブジェクト ファイルにあります。 図 5. 外部言語関数の登録 C 言語で作成したルーチンの登録 C 言語のルーチンを登録するには、ルーチンの本体を作成し、それをコンパイル し、共有オブジェクト ファイルを作成してから、CREATE FUNCTION 文または CREATE PROCEDURE 文を使用して関数を登録します。CREATE FUNCTION の RETURNING 節では、関数の戻り値のデータ型を指定します。 例えば、以下の CREATE FUNCTION 文は、データ型 udtype1 の 2 つの引数 arg1 および arg2 を受け取り、ブール (BOOLEAN) 型の値を 1 つ戻す equal() という C 言語の関数を登録します。 56 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド CREATE FUNCTION equal (arg1 udtype1, arg2 udtype1) RETURNING BOOLEAN EXTERNAL NAME ’/usr/lib/udtype1/lib/libbtype1.so(udtype1_equal)’ LANGUAGE C END FUNCTION; ヒント: 上記の例では、END FUNCTION キーワードはオプションです。C 言語の ユーザ定義ルーチンでは、RETURNS または RETURNING のいずれかを使 用することができます。 詳しくは、「IBM Informix: SQL ガイド: 構文」の 『CREATE FUNCTION』文およ び 『CREATE PROCEDURE』文を参照してください。共有オブジェクト ファイル の作成方法については、「IBM Informix: DataBlade API Programmer’s Guide」を参 照してください。 Java で作成したルーチンの登録 Java のルーチンを登録するには、ルーチンの本体を作成し、それをコンパイル し、.jar ファイルを作成し、install_jar() を使用して .jar ファイルを登録します。 次に、CREATE FUNCTION 文または CREATE PROCEDURE 文を使用して関数を 登録します。例えば、以下のようにします。 CREATE PROCEDURE showusers() WITH (class=’jvp’) EXTERNAL NAME ’thisjar:admin.showusers()’ LANGUAGE java; Java で作成した UDR は、デフォルトでは JVP 上で実行されます。したがって、 上記の例の CLASS ルーチン修飾子はオプションです。ただし、Informix では、 SQL 文を読みやすくするために、UDR の登録の際に CLASS ルーチン修飾子を指 定することが推奨されています。 詳しくは、「IBM Informix: SQL ガイド: 構文」の 『CREATE FUNCTION』文およ び 『CREATE PROCEDURE』文を参照してください。Java ルーチンの作成方法に ついては、「IBM Informix: J/Foundation Developer’s Guide」を参照してください。 修飾子を使用した外部ルーチンの登録 外部言語でルーチンを作成する場合は、データベース サーバに UDR の属性を知ら せる修飾子をオプションで指定することができます。ルーチン修飾子は、CREATE FUNCTION 文および CREATE PROCEDURE 文の WITH 節でリストします。 WITH キーワードに続けて、指定する修飾子を括弧で囲み、カンマで区切ります。 ルーチン修飾子の使用法の詳細については、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 C 言語の UDR の修飾子: 以下の表は、C 言語で作成したルーチンで使用可能な ルーチン修飾子を示しています。 第 4 章 ユーザ定義ルーチンの開発 57 使用可能化 ルーチン修飾子 CLASS COSTFUNC HANDLESNULLS INTERNAL ITERATOR NEGATOR NOT VARIANT PARALLELIZABLE PERCALL_COST SELCONST SELFUNC STACK VARIANT 説明 UDR を実行する仮想プロセッサのクラス を指定します この UDR のコスト関数名を指定します UDR が NULL 引数を処理できることを 指定します UDR が内部ルーチンであることを指定し ます。つまり、このルーチンが SQL 文ま たは SPL 文では使用できないことを指定 します UDR が反復関数であることを指定します UDR が否定素子関数であることを指定し ます 同じ引数を指定した UDR のすべての呼出 しが同じ値を戻すことを指定します ルーチンは並列で実行できます UDR の実行コストを指定します UDR の選択水準を指定します この UDR の選択水準関数の名前を指定し ます UDR のスタック サイズを指定します 同じ引数を指定した UDR のすべての呼出 しが、必ずしも同じ値を戻すとは限らない ことを指定します 外部 関数 はい 外部 プロシジャ はい はい はい はい はい はい はい はい はい いいえ いいえ はい いいえ はい はい はい はい はい はい いいえ いいえ はい はい はい いいえ 以下の例では、外部言語関数を作成する際に、WITH 節を使用していくつかの修飾 子を指定する方法示しています。 CREATE FUNCTION lessthan (arg1 basetype2, arg2 basetype2) RETURNING BOOLEAN WITH (HANDLESNULLS, NOT VARIANT) EXTERNAL NAME ’/usr/lib/basetype2/lib/libbtype2.so(basetype2_lessthan)’ LANGUAGE C この例では、HANDLESNULLS 修飾子は、basetype2_lessthan() 関数 (共有ライ ブラリ /usr/lib/basetype2/lib/libbtype2.so にある) が、SQL で NULL を認識で きるようコーディングされることを指示しています。HANDLESNULL を設定しな い場合は、ルーチンの引数に NULL があるときは、ルーチン マネージャは UDR を実行できません。この場合、単に NULL を戻します。 Java の UDR の修飾子: 以下の表は、Java 言語で作成したルーチンで使用可能な ルーチン修飾子を示しています。 ルーチン修飾子 UDR のタイプ CLASS JVP へアクセスする HANDLESNULLS SQL で NULL 値を引数として処理する UDR 58 ITERATOR 反復関数 NEGATOR 否定素子関数 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド NOT VARIANT 同じ引数を指定した UDR のすべての呼出しが同じ値を戻す PARALLELIZABLE 並列処理可能な UDR VARIANT 同じ引数を指定した UDR のすべての呼出しが、必ずしも同じ値を 戻すとは限らない パラメータと戻り値の登録 CREATE FUNCTION 文および CREATE PROCEDURE 文で、C 言語の UDR に任 意のパラメータと戻り値を指定します。これらの文は、パラメータと戻り値に SQL のデータ型を使用します。例えば、C 言語の UDR が以下のように C 言語で宣言 されていると仮定します。 mi_double_precision *func1(parm1, parm2) mi_integer parm1; mi_double_precision *parm2; 次の CREATE FUNCTION 文は、func1() ユーザ定義関数を登録します。 CREATE FUNCTION func1(INTEGER, FLOAT) RETURNS FLOAT パラメータまたは戻りの型に対して同等の SQL 型が存在しない外部言語ルーチン のデータ型を指定するには、不透明 (OPAQUE) SQL 型の POINTER を使用してく ださい。ルーチンが受け取ったり戻したりするデータ構造体がプライベートなデー タ型であり、ユーザに使用できない型の場合には、CREATE FUNCTION 文または CREATE PROCEDURE 文で、POINTER 型を使用します。 ユーザ定義ルーチンに関する情報の参照 以下の表は、データベース サーバが、sysprocedures システム カタログ表のどこ に CREATE FUNCTION 文と CREATE PROCEDURE 文の情報を保管するかを示し ています。 第 4 章 ユーザ定義ルーチンの開発 59 UDR 情報 CREATE 文の構文 sysprocedures の列 ルーチン タイプ: 関数ま たはプロシジャ 所有者名 (オプション) isproc 固有名 (オプション) ルーチン パラメータ FUNCTION キーワードまたは PROCEDURE キーワード ルーチン名の前に付けます (owner.routine_name)。デフォルト ではルーチンの作成者に設定され ます。 FUNCTION キーワードまたは PROCEDURE キーワードの後 SPECIFIC キーワード パラメータ リスト ルーチン修飾子 WITH 節 ルーチンの格納場所 (外 部の場合) ルーチン言語 EXTERNAL NAME specificname numargs、 paramstyle、 paramtypes variant、handlesnulls、 iterator、percallcost、 negator、selfunc、 internal、 class、stack、 parallelizable、costfunc、 selconst、 modifiers externalname LANGUAGE langid ルーチン名 owner procname データベース サーバは、各 UDR に一意な識別番号を割り当て、この番号を sysprocedures 表の procid 列に保管します。 SPL ルーチンの場合、データベース サーバは、ルーチン情報を sysprocbody と sysprocplan のシステム カタログ表にも保管します。 sysprocbody 表は、SPL ルーチンのテキストとコンパイル済みのバージョン (読解不可能) の両方を保管しま す。 sysprocplan 表は、実行計画のコンパイル済みのバージョン (読解不可能) を 保管します。 HDR での UDR の使用 高可用性データ レプリケーション (HDR) を使用する場合は、UDR の実行時に従 う必要のあるいくつかのルールがあります。 v HDR ペアの両方のサーバの同じ絶対パス名の場所に UDR オブジェクト ファイ ルをインストールする。 v HDR ペアの両方のサーバで、 UDR オブジェクト ファイルに同じ名前を付け る。 v 主サーバにのみ UDR を登録する。 v UDR を使用して、永続外部ファイルまたは永続メモリ オブジェクトを作成しな い。 60 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 5 章 データ型の拡張 データ型システムについて . . . . . データ型について . . . . . . . . 組込み型 . . . . . . . . . . 拡張データ型 . . . . . . . . . 複合データ型 . . . . . . . . ユーザ定義型 . . . . . . . . ディスティンクト (DISTINCT) 型 不透明 (opaque) 型 . . . . . IBM Informix DataBlade モジュール データ型システムの拡張 . . . . . . 演算 . . . . . . . . . . . . 型変換 (キャスト) . . . . . . . 演算子クラス . . . . . . . . . 演算子クラスの追加作成 . . . . 演算子クラスの拡張 . . . . . オプティマイザ情報 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 62 63 64 65 65 66 67 67 67 67 68 68 69 69 69 本章の内容 既存のデータ型を拡張することによって、またはユーザ定義型 (UDT) を作成するこ とによって、Dynamic Server を拡張することができます。この章では、データ型に ついての基本的な情報を参照します。取り上げるトピックは次のとおりです。 v データ型システムについて v データ型について v データ型システムの拡張 新しいデータ型を作成する場合、または既存のデータ型を拡張する場合は、 5 ペー ジの『第 2 章 ユーザ定義ルーチンの使用』で説明した UDR を使用します。 データ型システムについて このデータベース サーバで使用しているデータ型システムは、拡張可能 なデータ 型システムです。つまり、データ型システムが柔軟なため、次のことが可能です。 v データ型システムに定義済みのサポートされているデータ型を使用する。 v ユーザ独自のデータ型を定義する。 v データ型システムを拡張し、データ型の新たな動作をサポートする。 データ型システムでは、データ型を相互的に処理します。データ型 は、変数または 列に格納できるデータの型を示すために、変数また列に割り当てる記述子です。デ ータベース サーバは、データ型を使用して以下の情報を判別します。 v データベース サーバが使用できるデータ型 データ型によって、データベース サーバがそのデータ型の値をディスクに格納す るときに使用できるレイアウトまたは内部構造 が判別されます。 © Copyright IBM Corp. 1996, 2003 61 v データベース サーバが指定したデータ型の値に適用できる操作 (乗算、文字列連 結、型変換 (キャスト)、集約など) 操作は特定のデータ型に対して定義される必要があります。データ型を特定して いない場合は、データベース サーバは操作の実行を許可しません。 v データベース サーバが指定したデータ型の列内の値に対して使用できるアクセス 方式 – 1 次アクセス方式 は、表内の特定のデータ型の保管と抽出を処理します。 1 次アクセス方式で特定のデータ型を処理しなければ、データベース サーバは その型の値にアクセスできません。 – 2 次アクセス方式 は、インデックス内の特定のデータ型の保管と抽出を処理 します。副アクセス方式で特定のデータ型を処理しなければ、そのデータ型の インデックスを作成することはできません。 v データベース サーバが異なる 2 つのデータ型の値の間でデータ変換を実行する ときに使用できる型変換 データベース サーバは、型変換を使用して、異なる 2 つのデータ型の値の間で データ変換を実行します。 データ型システムは、組込み型に対しては、上記の動作をどのように指定すればよ いかを把握しています。 UDT を作成する場合は、作成するデータ型についてこの 情報を指定する必要があります。 データ型について このセクションでは、データベース サーバがサポートするデータ型の概要を簡単に 説明します。 図 6 にデータ型の要約を示します。 図 6. データベース サーバがサポートするデータ型 62 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド データ型の詳細については、「IBM Informix: データベース設計および実装 ガイ ド」を参照してください。 組込み型 組込み型とは、データベース サーバに定義されている基本データ型です。基本デー タ型は最小単位です。つまり、それ以上小さい部分に分けることができません。組 込み型は、ほかのデータ型を作成する際の基礎になります。データベース サーバが 提供する組込み型をまとめて表 2 に示します。 表 2. 組込み型 データ型 説明 バイナリ ラージ オブジェクト (BLOB) 型 バイナリ形式のデータを、ランダム アクセスをサポート する形式でスマート ラージ オブジェクトに格納しま す。 ブール (BOOLEAN) 型 true と false を示すブール (Boolean) 型の値を格納しま す。 バイト (BYTE) 型 ランダム アクセスを行わないチャンクにバイナリ形式の データを格納します。 文字 (CHAR) 型 (n) 文字、数字、および記号を含む固定長の単一バイト文字 列またはマルチバイト文字列を格納します。照合はコー ドセットにより異なります。 文字 (CHARACTER) 型 (n) 文字 (CHAR) 型のシノニムです。 可変長文字 (CHARACTER VARYING) 型 (m,r) 可変長文字 (VARCHAR) 型の ANSI 標準準拠バージョ ンです。 CLOB 型 テキストを、ランダム アクセスをサポートする形式でス マート ラージ オブジェクトに格納します。 日付 (DATE) 型 カレンダ日付を格納します。 日時 (DATETIME) 型 カレンダ日付を時刻と組み合わせて格納します。 10 進数 (DEC) 型 10 進数 (DECIMAL) 型のシノニムです。 10 進数 (DECIMAL) 型 小数点以下桁数および精度が定義可能な数値を格納しま す。 実数 (DOUBLE PRECISION) 型 実数 (FLOAT) 型と同じように動作します。 実数 (FLOAT) 型 (n) C 言語の double 型に対応する倍精度浮動小数点の数値 を格納します (ほとんどのプラットフォームで使用)。 整数 (INT) 型 整数 (INTEGER) 型のシノニムです。 8 バイト整数 (int8) 型 8 バイトの整数値を格納します。これらの整数の範囲は -(263-1) から 263-1 です。 整数 (INTEGER) 型 -(231-1) から 231-1 までの整数を格納します。 時間隔 (INTERVAL) 型 時間のスパンを格納します。 ラージ可変長文字 (LVARCHAR) 型 文字、数字、および記号からなる可変長 (最大 32 KB) の単一バイト文字列またはマルチバイト文字列を格納し ます。不透明 (opaque) 型の外部格納形式でもあります。 照合はコード セットにより異なります。 金額 (MONEY) 型 (p,s) 通貨の金額を格納します。 第 5 章 データ型の拡張 63 表 2. 組込み型 (続き) データ型 説明 各国語文字 (NCHAR) 型 (n) 文字、数字、および記号を含む単一バイト文字列および マルチバイトの文字列を格納します。照合はロケールに より異なります。詳しくは、「IBM Informix: GLS ユー ザーズ ガイド」を参照してください。 10 進数 (NUMERIC) 型 (p,s) 10 進数 (DECIMAL) 型のシノニムです。 各国語可変長文字 (NVARCHAR) 型 (m,r) 文字、数字、および記号を含む可変長 (最大 255 バイ ト) の単一バイト文字列またはマルチバイト文字列を格 納します。照合はロケールにより異なります。詳しく は、「IBM Informix: GLS ユーザーズ ガイド」を参照し てください。 小桁実数 (REAL) 型 小桁実数 (SMALLFLOAT) 型のシノニムです。 シリアル (SERIAL) 型 連続する整数を格納します。値の範囲は整数 (INTEGER) 型と同じです。 8 バイト シリアル (SERIAL8) 型 値が大きな連続する整数を格納します。値の範囲は 8 バ イト整数 (int8) 型と同じです。 小桁実数 (SMALLFLOAT) 型 C 言語の float 型に対応する単精度浮動小数点の数値を 格納します (ほとんどのプラットフォームで使用)。 小桁整数 (SMALLINT) 型 -(215-1) から 215-1 までの整数を格納します。 テキスト (TEXT) 型 ランダム アクセスを行わないチャンクにテキスト形式の データを格納します。 可変長文字 (VARCHAR) 型 (m,r) 文字、数字、および記号からなる可変長 (最大 255 バイ ト) の単一バイト文字列またはマルチバイト文字列を格 納します。照合はコード セットにより異なります。 拡張データ型 拡張可能なデータ型システムでは、次のことができます。 v 拡張データ型 と呼ばれる新しいデータ型を定義して、データ型システムを拡張す る v 拡張データ型の動作を定義する – 拡張データ型でサポートする操作 – 拡張データ型をサポートし、2 次アクセス方式のための新しい機能を提供する 新しい演算子クラス – 拡張データ型とほかのデータ型の間のデータ変換を提供する新規の型変換 (キ ャスト) – オプティマイザ用の統計情報 を収集する関数 次の拡張データ型を定義できます。 v 複合データ型 – コレクション (collection) 型 – 行 (ROW) 型 v UDT – 不透明 (opaque) 型 64 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド – ディスティンクト (DISTINCT) 型 データベース サーバは、拡張データ型に関する情報を sysxtdtypes および sysxtdtypeauth のシステム カタログ表に格納します。これらの表については、 「IBM Informix: SQL ガイド: 参照」を参照してください。 複合データ型 複合データ型 は、ほかのデータ型を組み合わせて作成します。 SQL 文は、複合デ ータ型に含まれる個々のコンポーネントにアクセスできます。次のように 2 種類の 複合データ型があります。 v コレクション (collection) 型 は、同じデータ型の要素のグループであるインスタ ンスを持ちます。このインスタンスには、任意の組込み型または複合データ型を 使用することができます。 要素の位置順序付けの要件および要素間の一意性の要件によって、そのコレクシ ョン (collection) 型をセット (SET) 型、リスト (LIST) 型、またはマルチセット (MULTISET) 型のいずれにするかを決定します。 v 行 (ROW) 型 は、関連するデータ フィールド のグループであるインスタンスを 持ちます。このインスタンスは任意のデータ型にすることができ、レコードのテ ンプレートになります。 行 (row) 型への名前を割り当てることによって、その行 (row) 型が名前付き行 (ROW) 型か、名前なし行 (row) 型かが決定します。 データベース サーバがサポートする複合データ型をまとめて表 3 に示します。 表 3. データベース サーバの複合データ型 データ型 説明 リスト (LIST) 型 (e) 暗黙的に位置 (1 番目、2 番目など) が決められており、重複値 が許容される値のコレクションを格納します。すべての要素は e という同じ要素型を持ちます。 マルチセット (MULTISET) 暗黙的に位置が決定されておらず、重複値が許容される値のコ 型 (e) レクションを格納します。すべての要素は e という同じ要素型 を持ちます。 名前付き行 (row) 型 CREATE ROW TYPE 文を使用して作成された行 (row) 型。こ の行 (row) 型は、名前と継承 プロパティ定義されており、型付 き表 を構築するために使用できます。ある名前付き行 (row) 型 と別の名前付き行 (row) 型は、フィールド定義が同じである場 合でも、等しくなることはありません。 行 (ROW) 型 (名前なし行 SQL キーワードの ROW を使用して作成された行 (row) 型。 (ROW) 型) この行 (row) 型には名前も継承プロパティも定義されていませ ん。 2 つの名前なし行 (ROW) 型は、フィールドの数が同じで あり、対応するフィールドが同じデータ型を持つ場合には、フ ィールドの名前が異なっていても、等しいとみなされます。 セット (SET) 型 (e) 暗黙的に位置が決定されておらず、重複値が許容されない値の コレクションを格納します。すべての要素は e という同じ要素 型を持ちます。 ユーザ定義型 データベース サーバがサポートする UDT をまとめて表 4 に示します。 第 5 章 データ型の拡張 65 表 4. ユーザ定義のデータ型 データ型 説明 ディスティン クト (DISTINCT) 型 不透明 (opaque) 型 内部表記は基になるソース型と同じですが、型変換と関数はソース型のもの とは異なるものが定義されています。 ユーザが定義する基本データ型。基本データ型は最小単位です。つまり、そ れ以上小さい部分に分けることができず、ほかのデータ型を作成する際の基 礎になります。 米国規格協会 (ANSI) ANSI 標準準拠データベースでは、ユーザ定義データ型を使用して定義する列は、 owner.object の形式でなければなりません。 米国規格協会 (ANSI) の終り ディスティンクト (DISTINCT) 型: ディスティンクト (DISTINCT) 型は、既存の データ型と同じ内部構造を持ちます。ただし、名前が異なるため関数も異なり、そ の点がソース型との違いになります。ディスティンクト (DISTINCT) 型を定義する 場合は、以下の情報を指定します。 v ディスティンクト (DISTINCT) 型の内部構造 を定義するソース型 ソース型の関数は、データベース サーバがこの内部構造と相互処理する方法を決 定します。 v ディスティンクト (DISTINCT) 型に対して有効な操作 ディスティンクト (DISTINCT) 型を処理する演算子関数、組込み関数、またはエ ンド ユーザ ルーチンを定義します。演算子関数の作成については、 71 ページの 『第 6 章 演算子および組込み関数の拡張』を参照してください。 v 2 次アクセス方式の演算子クラス の拡張 (演算子クラスのストラテジ関数とサポ ート関数でディスティンクト (DISTINCT) 型を処理するようにする) サポート関数については、 115 ページの『第 10 章 サポート関数の作成』を参照 してください。 v ディスティンクト (DISTINCT) 型への、およびディスティンクト (DISTINCT) 型 からのデータ変換を提供するキャスト関数 データベース サーバは自動的に、ディスティンクト (DISTINCT) 型とそのソー ス型との間の明示的キャストを作成します。これら 2 つのデータ型は内部形式が 同じであるため、この型変換にキャスト関数は必要ありません。ディスティンク ト (DISTINCT) 型とデータベース内のほかのデータ型との間のデータ変換をサポ ートするキャスト関数や、ディスティンクト (DISTINCT) 型とそのソース型との 間の暗黙的な型変換をサポートするキャスト関数を作成できます。型変換の作成 については、 77 ページの『第 7 章 ユーザ定義の型変換 (キャスト) の作成』を 参照してください。 ディスティンクト (DISTINCT) 型の作成には CREATE DISTINCT TYPE 文を使用 します。ディスティンクト (DISTINCT) 型は、作成した後、ほかのデータ型が有効 な任意の場所で使用できます。詳しくは、「IBM Informix: SQL ガイド: 構文」のこ の文の説明を参照してください。 66 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 不透明 (opaque) 型: ほかのデータ型 (組込み、複合、およびディスティンクト) とは異なり、不透明 (opaque) 型の内部構造は、データベース サーバにはまだ定義 されていません。したがって、不透明 (opaque) 型を定義する場合は、以下の情報を 指定する必要があります。 v データの形式を指定する、不透明 (opaque) 型の内部構造 不透明 (opaque) 型のサポート関数 を定義して、この内部構造と相互処理する方 法をデータベース サーバに指示します。 v 不透明 (opaque) 型に対して有効な操作 不透明 (opaque) 型を処理する演算子関数、組込み関数、またはエンド ユーザ ル ーチンを定義します。 v 2 次アクセス方式の演算子クラス の拡張 (演算子クラスのストラテジ関数とサポ ート関数で不透明 (opaque) 型を処理するようにする) v 不透明 (opaque) 型への、および不透明 (opaque) 型からのデータ変換を提供する キャスト関数 不透明 (opaque) 型のサポート関数は、キャスト関数としても機能します。 不透明 (opaque) 型は CREATE OPAQUE TYPE 文を使用して登録します。この文 については、「IBM Informix: SQL ガイド: 構文」を参照してください。詳しくは、 97 ページの『第 9 章 不透明 (OPAQUE) 型の作成』、および 115 ページの『第 10 章 サポート関数の作成』を参照してください。 IBM Informix DataBlade モジュール ユーザが明示的に定義する拡張データ型に加えて、提供されている事前パッケージ された拡張データ型を使用できます。例えば、IBM Informix DataBlade モジュール には、球座標系システムをサポートするために必要なルーチンが含まれています。 IBM Informix DataBlade モジュールについて詳しくは、販売担当者に問い合わせる か、DataBlade モジュールのユーザ ガイドを参照してください。 データ型システムの拡張 既存の組込み型または拡張データ型に対して以下の追加動作を提供するルーチンを 作成することによって、データ型システムを拡張できます。 v データ型に対する追加演算を提供する演算子 を定義する。 v データ型に対する 2 次アクセス方式 (インデックス) のための新しい機能を提供 する演算子クラス を定義する。 v データ型間の変換を提供する型変換 を定義する。 v オプティマイザのための情報を提供する関数を定義する。 新しい各関数は、CREATE FUNCTION 文を使用してデータベースに登録する必要 があります。 演算 データ型は、そのデータ型の値に対して実行できる演算 をデータベース サーバに 指示します。データベース サーバには、データ型に対して次の種類の演算が用意さ れています。 v 演算子関数 (特定の演算子記号を実装する) 第 5 章 データ型の拡張 67 plus() および times() 関数は、それぞれ + および * 演算子の演算子関数の例で す。 v 組込み関数 (データベース サーバが提供する事前定義の関数であり、SQL 文で 使用できる) cos() および hex() 関数は、組込み関数の例です。 v 集計関数 (抽出行の 1 つの集合について単一値を戻す) SUM および AVG 関数は、集計関数の例です。 v エンド ユーザ ルーチン (いくつかの有用なアクションを実行するためにエンド ユーザが SQL 文で使用できる UDR) データベース サーバには、データベース サーバに用意されているデータ型を処理 する演算子関数、組込み関数、および集計関数が提供されています。これらの演算 およびその拡張方法については、 71 ページの『第 6 章 演算子および組込み関数の 拡張』を参照してください。 型変換 (キャスト) データベース サーバは、syscasts システム カタログ表で型変換を探し、データ型 値を異なる型に変換するために使用する関数を決定します。型変換 では、データ型 を別のデータ型に変換するために必要な操作が実行されます。 2 つのデータ型が異 なる内部形式を持つ場合、データベース サーバはキャスト関数 を呼び出して、あ るデータ型を別のデータ型に変換します。例えば、整数 (INTEGER) 型の値を 10 進数 (DECIMAL) 型の値に加算する場合、データベース サーバは整数 (INTEGER) 型を 10 進数 (DECIMAL) 型の値に変更する型変換を実行してから、加算を実行し ます。 データベース サーバには、組込み型間の型変換が提供されています。ユーザは、既 存のデータ型と、ユーザが作成した拡張データ型間のデータ変換を提供する追加の 型変換を作成することができます。 2 つのデータ型が異なる内部形式を持つ場合、 データ変換を実行するキャスト関数を定義する必要があります。型変換を使用する には、その前に CREATE FUNCTION 文でキャスト関数を登録し、CREATE CAST 文で型変換を作成する必要があります。型変換について詳しくは、 77 ページの『第 7 章 ユーザ定義の型変換 (キャスト) の作成』を参照してください。 演算子クラス 演算子クラスは、2 次アクセス方式を使用してインデックス付けすることができ る、1 つまたは複数のデータ型をデータベース サーバに指示します。演算子クラス は、アクセス方式の要件に従っている必要があります。 2 次アクセス方式では、イ ンデックスを作成し、アクセスします。演算子クラスは、演算子のグループを 2 次 アクセス方式に関連付けます。演算子クラスを拡張する場合は、問合せでフィルタ として使用でき、データベース サーバがインデックスを使用できる追加の関数を指 定します。 データベース サーバには、組込み 2 次アクセス方式である汎用 B ツリー用のデフ ォルトの演算子クラスが提供されています。このデフォルト演算子クラスでは、関 係演算子 (<、>、= など) を使用して汎用 B ツリー内の値を順序付けます。これら の関係演算子は組込み型に対して定義されています。 68 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 演算子クラスの追加作成 B ツリーのインデックス内の値を順序付けることができる追加シーケンスを提供す るには、汎用 B ツリー用の演算子クラスを追加作成します。 演算子クラスの拡張 デフォルトの演算子クラスは、組込み型にのみ提供されています。次のような場合 は、拡張データ型をサポートする演算子クラスを拡張できます。 v デフォルトの演算子クラスで汎用 B ツリーの拡張データ型の値を処理できるよう にする v 拡張データ型の値を汎用 B ツリーに格納するための新しいシーケンスを提供する v 拡張データ型を処理するように他の 2 次アクセス方式の演算子クラスを拡張する 演算子クラスを拡張または実装するには、インデックス付けする各拡張データ型を 処理するストラテジ関数とサポート関数 を定義する必要があります。詳しくは、 139 ページの『第 11 章 演算子クラスの拡張』を参照してください。 新しい各演算子クラスは、CREATE OPCLASS 文を使用してデータベースに登録す る必要があります。この文については、「IBM Informix: SQL ガイド: 構文」を参照 してください。 オプティマイザ情報 UPDATE STATISTICS 文は、組込み型に関する情報を収集します。オプティマイザ はこの情報を使用して、問合せに関連するコストを判別します。 不透明 (opaque) 型およびディスティンクト (DISTINCT) 型の UDT に関する統計 情報を収集するには、情報を収集する関数を作成する必要があります。これらの関 数について詳しくは、 161 ページの『第 13 章 UDR パフォーマンスの向上』を参 照してください。 第 5 章 データ型の拡張 69 70 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 6 章 演算子および組込み関数の拡張 演算子および演算子関数 . . . . . 算術演算子 . . . . . . . . テキスト演算子 . . . . . . . 関係演算子 . . . . . . . . 演算子関数のオーバロード . . . 組込み関数 . . . . . . . . . オーバロード可能な組込み関数 . . オーバロードできない組込み関数 . 組込み集計関数 . . . . . . 状態関数 . . . . . . . . 光ディスク記憶サブシステム関数 組込み関数のオーバロード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 72 72 72 73 74 74 74 74 74 74 75 本章の内容 本章では、UDT と共に使用できるようにユーザが拡張可能な演算子および組込み関 数について説明します。操作 とは、データベース サーバが 1 つまたは複数の値で 実行するタスクです。 データベース サーバは、SQL 文で操作を提供する以下の SQL 呼出し関数を提供し ます。 v 演算子シンボル (+、-、/、および * など) およびこれらシンボルに関連する演算 子関数 v cos() および abs() などの組込み関数 v SUM および AVG などの集計関数 これらの関数は、組込み型を処理します。UDT でこれらのいずれかの関数を使用す るために、名前が同一でそのパラメータ リスト内に UDT を適用する関数を新規に 作成できます。 ルーチン オーバロード という名前のプロパティによって、名前がデータベースに すでに定義済みで、パラメータ リストが異なるユーザ定義関数を作成することがで きます。同じ名前を持つすべての関数は同じ機能を持ちますが、異なる型を操作し ます。 ルーチン オーバロードおよびルーチン分析について詳しくは、23 ページの『ルー チン分析の理解』 を参照してください。集計関数について詳しくは、 85 ページの 『第 8 章 ユーザ定義集計関数の作成』 を参照してください。 © Copyright IBM Corp. 1996, 2003 71 演算子および演算子関数 演算子関数 は、特定の演算子シンボルを実装します。データベース サーバは、演 算子を実装する演算子関数 という名前の特殊 SQL 呼出し関数を提供します。演算 子関数は、1 つから 3 つの引数を処理し、値を戻します。SQL 文に演算子が含ま れている場合には、データベース サーバは自動的に関連する演算子関数を呼び出し ます。 演算子および演算子関数間の関連は、演算子バインド と呼ばれています。演算子関 数をオーバロードして、UDT に演算子を提供することができます。これによって、 SQL ユーザは、組込み型と UDT を使って演算子を使用できます。SQL 文に演算 子が含まれている場合には、データベース・サーバは関連する演算子関数を自動的 に呼び出します。 算術演算子 算術演算子は、通常、数値を操作します。次の表に、データベース サーバが提供す る算術演算子の演算子関数をリストします。 算術演算子 演算子関数 + (バイナリ) - (バイナリ) * + (単項) - (単項) / plus() minus() times() positive() negate() divide() こららの演算子をオーバロードして、ユーザ定義型で使用することができます。 plus() 関数および divide() 関数のオーバロードの例については、92 ページの『ユー ザ定義集計関数の例』 を参照してください。 テキスト演算子 テキスト演算子は、文字列を操作します。次の表に、データベース サーバが提供す るテキスト演算子をリストします。 テキスト演算子 演算子関数 LIKE like() MATCHES matches() || concat() LIKE 演算子および MATCHES 演算子の構文および使用法について詳しくは、 「IBM Informix: SQL ガイド: 構文」の『条件セグメント』を参照してください。 関係演算子 関係演算子は、数値および文字列値の式を操作します。次の表に、データベース サ ーバが提供する演算子関数をリストします。 72 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 関係演算子 演算子関数 = equal() <> および != notequal() > greaterthan() < lessthan() >= greaterthanorequal() <= lessthanorequal() すべての関係演算子関数は、ブール型を戻す必要があります。関係演算子について 詳しくは、「IBM Informix: SQL ガイド: 構文」の『関係演算子』セグメントを参照 してください。 エンド ユーザが、関係演算子で新規の型の値を使用するには、新規の型を処理でき る関係演算子関数を新たに作成する必要があります。これらの関数では、次のこと を行えます。 v その型に対する関係演算子の意味を決定する。 例えば、circle 不透明 (opaque) 型を作成し、circle を実装します。circle は、比 較する単一値を持たないスペーシャル (空間) オブジェクトです。ただし、この型 に、その領域の値を使用できる関係演算子を定義できます。ある circle の領域が もう 1 つの circle の領域よりも小さい場合には、その circle は、もう 1 つの circle よりも小さくなっています。 v 型を辞書式順序から、その他の順序に変更する。 例えば、Scottish 名を保持する ScottishName 型を作成して、米国英語 (U.S. English) の照合順序とは異なる方法で型を順序付けするとします。電話番号リス トに、名前 McDonald および MacDonald を一緒に表示させたいとします。文字列 Mc および Mac を等価にするこの型に対して、関係演算子を定義することができ ます。詳しくは、145 ページの『ソート順の変更』 を参照してください。 関係演算子を定義すると、次のような SQL 文を使用できます。 SELECT * FROM employee WHERE emp_name = ’McDonald’::ScottishName 関係演算子関数は、組込み 2 次アクセス方式である汎用 B ツリーのストラテジ関 数です。ストラテジ関数について詳しくは、141 ページの『演算子クラス』 を参照 してください。 演算子関数のオーバロード 演算子関数の新規バージョンを作成する場合には、以下のルールに従います。 v 演算子関数の名前は、算術関数、テキスト関数、または関係演算子関数の名前と 一致すること。名前には大文字と小文字の区別はありません。plus() 関数は、 Plus() 関数と同一です。 v 演算子関数は、適切な数のパラメータを処理すること。 v 演算子関数は、適切な型を戻すこと。 ヒント: compare() 関数は正確には演算子関数ではありませんが、関係演算子をオ ーバロードする場合、対応する compare() 関数を準備する必要がありま 第 6 章 演算子および組込み関数の拡張 73 す。これは、データベース サーバが、compare() を使用して、SELECT DISTINCT または ORDER BY 節を持つ問合せを処理するためです。 組込み関数 データベース サーバは、いくつかの基本的な算術演算子を提供する組込み関数 と いう名前の特別な SQL 呼出し関数を提供します。組込み関数について詳しくは、 「IBM Informix: SQL ガイド: 構文」の『式セグメント』を参照してください。 オーバロード可能な組込み関数 基本操作、および以下の関数を含む特定のテキスト関数および時刻関数を提供する 組込み関数をオーバロードできます。 abs() trunc() atan() extend() hex() mod() pow() root() round() sqrt() exp() log10() logn() cos()、sin() tan() acos()、asin() atan2() length() char_length() character_length() octet_length() atan2() decode() nvl() initcap() lower() lpad()、rpad() upper() オーバロードできない組込み関数 次のセクションは、オーバロードできない 組込み関数のリストです。 組込み集計関数 各集計関数は、組込み関数を使用して集計結果を生成します。組込み集計関数をオ ーバロードすることはできません。代わりに、必要なサポート関数をオーバロード します。集計関数および関連する演算子関数のリストは、86 ページの『組込み集計 関数の演算子のオーバーロード』 を参照してください。 状態関数 時刻、日付、データベース サーバ、およびユーザを記述する以下の関数は、オーバ ロードできません。 cardinality() day() month() user current date() datetime() dbinfo() dbservername mdy() sitename today trim() weekday() year() ヒント: 技術的には、CURRENT、DBSERVERNAME、SITENAME、TODAY、およ び USER は組込み関数ではなく、組込みマクロです。これらの名前でオー バロードしたルーチンは、登録できますが、SQL 文で使用することはでき ません。 光ディスク記憶サブシステム関数 次の表に、オーバロードできない 光ディスク記憶サブシステムに対する組込み関数 をリストします。 74 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド descr() volume() family() 組込み関数のオーバロード データベース サーバは、組込み型を処理する関数を提供します。ユーザの新しい型 で操作可能な新規組込み関数のバージョンを作成できます。新規組込み関数のバー ジョンを作成する場合には、以下のルールに従います。 v 関数は、74 ページの『オーバロード可能な組込み関数』 にリストされているオ ーバロード可能な関数であること。名前には大文字と小文字の区別はありませ ん。abs() 関数は、Abs() 関数と同一です。 v 関数は、適切な数のパラメータを処理し、これらのパラメータは、適切な型であ ること。 v 関数は、必要に応じて、適切な型を戻すこと。 第 6 章 演算子および組込み関数の拡張 75 76 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 7 章 ユーザ定義の型変換 (キャスト) の作成 型変換について . . . . . . . 組込みキャスト . . . . . . ユーザ定義の型変換 . . . . 不透明 (opaque) 型 . . . . ディスティンクト (DISTINCT) 名前付き行 (ROW) 型 . . . ユーザが作成できない型変換 . ユーザ定義の型変換の作成 . . . ユーザ定義型変換の種類の選択 . 暗黙的キャスト . . . . . 明示的キャスト . . . . . 型変換メカニズムの選択 . . . 直接キャスト . . . . . . キャスト関数 . . . . . . キャスト関数の例 . . . . 型変換の方向の定義 . . . . 型変換の削除 . . . . . . . . . . . . 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 77 77 78 78 78 78 78 79 79 80 80 80 81 81 82 84 本章の内容 型変換 とは、ある型の値をほかの型の値に変換するメカニズムです。データベース サーバでは、3 種類の型変換がサポートされています。 v 型変換について v ユーザ定義の型変換の作成 v 型変換の削除 この章では、UDT の型変換を作成する方法について説明します。 型変換について 型変換では、異なる型の値どうしを比較したり、ある型の値を別の型の値に置換し たりできます。例えば、整数に浮動小数点数を加算する場合、コンピュータで加算 を実行する前に、整数を浮動小数点値に変更 (型変換) する必要があります。 組込みキャスト 組込みキャスト は、2 つの組込み型間で自動変換を実行します。データベース サ ーバには、ほとんどの組込み型間の型変換が提供されています。 組込みキャストについて詳しくは、「IBM Informix: データベース設計および実装 ガイド」の型に関する章を参照してください。 ユーザ定義の型変換 ユーザ定義の型変換 は、ある UDT から別のデータ型 (組込みまたはユーザ定義) への変換を行うためにユーザが定義する型変換です。ユーザ定義の型変換を作成す © Copyright IBM Corp. 1996, 2003 77 ることで、不透明 (opaque) 型、ディスティンクト (DISTINCT) 型、行 (ROW) 型、 および組込み型を含む、ほとんどの型間で変換を行うことができます。 不透明 (opaque) 型 不透明 (opaque) 型を作成する場合、不透明 (opaque) 型の内部表記と外部表記の間 の変換を処理する型変換を定義します。不透明 (opaque) 型とデータベース内のほか の型との間の変換を処理する型変換を作成することもできます。 不透明 (opaque) 型の型変換を作成および登録する方法については、105 ページの 『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 ディスティンクト (DISTINCT) 型 ディスティンクト (DISTINCT) 型を作成すると、そのディスティンクト (DISTINCT) 型からソース データ型への明示的キャスト、およびソース データ型か らディスティンクト (DISTINCT) 型への明示的キャストが自動的にデータベース サ ーバに登録されます。新しいディスティンクト (DISTINCT) 型とデータベース内の ほかのデータ型との変換を処理するディスティンクト (DISTINCT) 型に対する型変 換を作成するか、または SQL 文中で明示的キャストを使用する必要があります。 ディスティンクト (DISTINCT) 型の型変換を作成および使用する方法と例について は、「IBM Informix: データベース設計および実装 ガイド」の型変換に関する章を 参照してください。 名前付き行 (ROW) 型 ほとんどの場合、型変換を作成することなく、名前付き行 (ROW) 型をほかの行 (row) 型の値に明示的に型変換することができます。ただし、名前付き行 (ROW) 型 とほかの型間の比較を可能にする型変換を作成することが必要な場合もあります。 名前付き行 (ROW) 型と名前なし行型間の型変換の方法については、 「IBM Informix: データベース設計および実装 ガイド」の型変換に関する章を参照 してください。 ユーザが作成できない型変換 型変換のソース型またはターゲット データ型として以下の型が含まれる場合、ユー ザ定義型変換は作成できません。 v コレクション (COLLECTION) 型: リスト (LIST) 型、マルチセット (MULTISET) 型、またはセット (SET) 型 v 名前なし行型 v スマート ラージ オブジェクト データ型: CLOB 型または BLOB 型 v シンプル ラージ オブジェクト データ型: テキスト (TEXT) 型またはバイト (BYTE) 型 ユーザ定義の型変換の作成 ユーザ定義の型変換は CREATE CAST 文を使用して作成します。この文で syscasts システム カタログ表に型変換を登録します。 CREATE CAST を使用し て型変換を登録したユーザが、型変換の所有者となります。 78 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド CREATE CAST 文の構文については、「IBM Informix: SQL ガイド: 構文」を参照 してください。型変換の使用方法の概要については、「IBM Informix: データベース 設計および実装 ガイド」を参照してください。 CREATE CAST 文は、型変換に関する以下の情報をデータベース サーバに提供し ます。 v 作成するユーザ定義型変換の種類 v データ変換を実行するためにデータベース サーバが使用する型変換メカニズム v 型変換の方向 CREATE CAST 文では、型変換の方向を決定するためにソース型とターゲット データ型を指定します。 2 つの型間の完全なデータ変換の場合、1 つの型変換を 変換の各方向に定義する必要があります。 ユーザ定義型変換の種類の選択 CREATE CAST 文を使用する場合は、データベース サーバでの型変換の処理方法 を指定します。データベース サーバでは、次の 2 種類のユーザ定義型変換がサポ ートされています。 v 暗黙的キャスト v 明示的キャスト データベース サーバが明示的キャストを呼び出して 2 つの型間の変換を実行す るのは、CAST AS キーワードまたは二重コロン (::) キャスト演算子を指定した 場合のみです。 暗黙的キャスト 暗黙的キャストは、異なる 2 つの型を使用している操作に対して、どのような自動 データ変換を行うかを制御します。組込み型間の型変換は、すべて暗黙的な変換で す。 データベース サーバでは、以下のタスクの実行時、自動的に暗黙的キャストが呼び 出されます。 v ある型の引数を、型が異なるパラメータを持つ UDR に渡す場合。 v 式を評価して、2 つの類似した型を操作する必要がある場合。 ある型からほかの型への変換によって、データが消失する場合があります。このよ うな変換のための暗黙的キャストを作成する場合は、注意が必要です。エンド ユー ザは、データベース サーバが暗黙的キャストをいつ呼び出すかを制御できません。 したがって、このような変換に伴うデータの消失を回避できません。 暗黙的キャストは、キャスト演算子を使用せずに、データベース サーバによって自 動的に呼び出されます。ただし、CAST AS キーワードまたは :: キャスト演算子を 使用して、暗黙的キャストを明示的に呼び出すこともできます。 暗黙的キャストを作成するには、CREATE CAST 文の IMPLICIT キーワードを指定 します。次に示す CREATE CAST 文では、パーセント (percent) 型から 10 進数 (DECIMAL) 型への暗黙的キャストが作成されます。 CREATE IMPLICIT CAST (percent AS DECIMAL) 第 7 章 ユーザ定義の型変換 (キャスト) の作成 79 明示的キャスト 明示的キャストでは、エンド ユーザが UDT (不透明 (opaque) 型、ディスティンク ト (DISTINCT) 型、行 (row) 型など) に対して指定できるデータ変換を制御しま す。データベース サーバは、次の構文構造のいずれかを検出した場合にのみ、明示 的キャストを呼び出します。 v CAST AS キーワード 例えば、次に示す式では、CAST AS キーワードを使用して、パーセント (percent) 型と整数 (INTEGER) 型の間の明示的キャストを呼び出しています。 WHERE col1 > (CAST percent AS INTEGER) v :: キャスト演算子 例えば、次に示す式では、キャスト演算子を使用して、パーセント (percent) 型 と整数 (INTEGER) 型の間の明示的キャストを呼び出しています。 WHERE col1 > (percent::INTEGER) あるデータ型からほかのデータ型への変換によって、データが消失する場合があり ます。このような変換を明示的キャストとして定義した場合、エンド ユーザは、こ のような変換に伴うデータの消失を許容できる場合を制御できます。 明示的キャストを作成するには、CREATE CAST 文の EXPLICIT キーワードを指 定します。このキーワードを省略すると、デフォルトでは明示的キャストが指定さ れます。次に示す両方の CREATE CAST 文では、パーセント (percent) 型から整 数 (INTEGER) 型への明示的キャストを作成しています。 CREATE EXPLICIT CAST (percent AS INTEGER) CREATE CAST (percent AS INTEGER) 型変換メカニズムの選択 CREATE CAST 文では、オプションで、型変換を実装するキャスト関数の名前を指 定できます。拡張データ型に対するデータ変換がデータベース サーバによって自動 的に実行されることはありません。 2 つの型の内部構造が異なる場合には、キャス ト関数を指定する必要があります。 データベース サーバは、次のいずれかのメカニズムを使用して型変換を実装できま す。 v 2 つの型が同じ内部構造を持つ場合は、直接キャストを実行する。 v データ変換を実行するキャスト関数を呼び出す。 直接キャスト 直接キャスト では、2 つのデータ型が同じ内部構造を持つことをデータベース サ ーバに指示します。この型変換では、データベース サーバは、データを操作するこ となくソース型からターゲット データ型に変換できます。そのため、CREATE CAST 文に WITH 節を指定する必要はありません。 例えば、整数 (INTEGER) 型の値と UDT である my_int の値を比較する必要があ り、my_int は整数 (INTEGER) 型と同じ内部構造を持っているとします。この変換 にキャスト関数は必要ありません。データベース サーバがこれら 2 つの型の値を 80 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 比較するために操作を実行する必要がないからです。次に示す CREATE CAST 文 では、整数 (INT) 型と my_int の値の間の変換を可能にする明示的キャストを作成 しています。 CREATE CAST (INT AS my_int) CREATE CAST (my_int AS INT) 最初の型変換では、整数 (INT) 型から my_int への有効な変換を定義します。2 番 目の型変換では、my_int から整数 (INT) 型への有効な変換を定義します。 組込みキャストには、キャスト関数は関連付けられていません。ディスティンクト (DISTINCT) 型とそのソース型は内部構造が同じなので、ディスティンクト (DISTINCT) 型をソース型に型変換するためにキャスト関数は必要ありません。デー タベース サーバは、ディスティンクト (DISTINCT) 型とそのソース型との間の明示 的キャストを自動的に作成します。 キャスト関数 異なる 2 つの型間のデータ変換を実装する、キャスト関数と呼ばれる特別な SQL 呼出し関数を作成することができます。 2 つの型が異なるストレージ構造を持つ場 合、ソース型のデータをターゲット データ型のデータに変換する方法を定義したキ ャスト関数を作成する必要があります。 キャスト関数を持つ型変換を作成するには: 1. キャスト関数を作成する。 キャスト関数は、ソース型を引数として受け取り、ターゲット データ型を戻し ます。 2. CREATE FUNCTION 文を使用してキャスト関数を登録する。 3. CREATE CAST 文を使用して型変換を登録する。 CREATE CAST 文の WITH 節を使用して、キャスト関数を指定します。キャス ト関数を呼び出すには、関数は現行のデータベース内になければなりません。た だし、型変換を登録する時点ではキャスト関数は存在している必要はありませ ん。 キャスト関数の例 例えば、int_type と float_type という 2 つの不透明 (opaque) 型の値を比較する とします。両方の型に外部形式のラージ可変長文字 (LVARCHAR) 型があり、この 型を型変換の中間の型として使用できます。 図 7 に示す CREATE FUNCTION 文 では、SPL 関数 int_to_float() を作成し、引数として登録します。 int_type の入 力値をラージ可変長文字 (LVARCHAR) 型に変換し、次に、ラージ可変長文字 (LVARCHAR) 型の結果を float_type に変換して、float_type を結果として戻しま す。 CREATE FUNCTION int_to_float(int_arg int_type) RETURNS float_type RETURN CAST(CAST(int_arg AS LVARCHAR) AS float_type); END FUNCTION; 図 7. int_type から float_type へのキャスト関数としての SPL 関数 第 7 章 ユーザ定義の型変換 (キャスト) の作成 81 int_to_float() 関数は、不透明 (opaque) 型 int_type および float_type のネストさ れたキャスト関数およびサポート関数を使用して、次のように戻り値を取得しま す。 1. int_to_float() 関数は、内部キャストによって、int_type 引数をラージ可変長文 字 (LVARCHAR) 型に変換する。 CAST(int_arg AS LVARCHAR) int_type 不透明 (opaque) 型の出力サポート関数は、この内部キャストのキャス ト関数として機能します。この出力サポート関数は、int_type 不透明 (opaque) 型の定義の一部として定義する必要があり、int_type の内部形式をその外部形 式であるラージ可変長文字 (LVARCHAR) 型に変換します。 2. int_to_float() 関数は、外部キャストによって、ラージ可変長文字 (LVARCHAR) 型の値を float_type に変換します。 CAST((LVARCHAR value from step 1) AS float_type) float_type 不透明 (opaque) 型の入力サポート関数は、この外部キャストのキャ スト関数として機能します。この入力サポート関数は、float_type 不透明 (opaque) 型の定義の一部として定義する必要があり、float_type の外部形式であ るラージ可変長文字 (LVARCHAR) 型を内部形式に変換します。 入力サポート関数および出力サポート関数については、136 ページの『ロケールを 区別する input および output サポート関数』を参照してください。 このキャスト関数を作成した後、CREATE CAST 文を使用して関数を型変換として 登録します。この関数は、CREATE CAST 文を使用して登録するまで、型変換とし て使用できません。 図 8 に示す CREATE CAST 文では、int_to_float() 関数をキ ャスト関数として使用する明示的キャストを作成しています。 CREATE EXPLICIT CAST (int_type AS float_type WITH int_to_float); 図 8. int_type から float_type への明示的キャスト 関数を明示的キャストとして登録した後は、エンド ユーザが CAST AS キーワー ドまたは :: キャスト演算子を使用して関数を呼び出し、int_type 値を float_type 値に変換できます。CREATE FUNCTION 文および CREATE CAST 文の構文につ いては、「IBM Informix: SQL ガイド: 構文」を参照してください。 型変換の方向の定義 型変換により、ソース型からターゲット データ型への変換方法をデータベース サ ーバに指示します。 CREATE CAST 文では、型変換のソース型とターゲット デー タ型の名前を指定します。ソース型は、変換する必要があるデータ型です。ターゲ ット データ型は、ソース型を変換した後のデータ型です。例えば、次に示す CREATE CAST 文では、ソース型が DECIMAL で、ターゲット データ型が percent という UDT である型変換を作成しています。 CREATE CAST (DECIMAL AS percent) ユーザ定義の型変換を登録する場合、ソース型とターゲット データ型の組合せがデ ータベース内で一意である必要があります。 82 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 2 つの型間のデータ変換を指定するには、変換の各方向について型変換を定義する 必要があります。例えば、図 8 の明示的キャストでは、データベース サーバは int_type 不透明 (opaque) 型から float_type 不透明 (opaque) 型への変換を実行で きます。したがって、エンド ユーザは INSERT 文で以下の型変換を実行して、 int_type 値の it_val を float_type 列の ft_col に変換できます。 INSERT INTO table1 (ft_col) VALUES (it_value::float_type) ただし、この型変換では、float_type から int_type への逆の変換は提供されませ ん。 int_type 列に float_type 値を挿入しようとすると、データベース サーバで エラーが生成されます。データベース サーバでこの変換を実行できるようにするに は、キャスト関数をもう 1 つ定義する必要があります。すなわち、float_type 引数 を取って int_type 値を戻す関数を定義します。図 9 は、float_to_int() SPL 関数 を定義する CREATE FUNCTION 文を示しています。 CREATE FUNCTION float_to_int(float_arg float_type) RETURNS int_type RETURN CAST(CAST(float_arg AS LVARCHAR) AS int_type); END FUNCTION; 図 9. float_type から int_type へのキャスト関数としての SPL 関数 また、float_to_int() 関数は、不透明 (opaque) 型 int_type および float_type のネ ストされたキャスト関数およびサポート関数を使用して、次のように戻り値を取得 します。 1. float_to_int() 関数は、内部キャストによって、float_type 値をラージ可変長文 字 (LVARCHAR) 型に変換します。 CAST(float_arg AS LVARCHAR) float_type 不透明 (opaque) 型の出力サポート関数は、この内部キャストのキャ スト関数として機能します。この出力サポート関数は、float_type 不透明 (opaque) 型の定義の一部として定義する必要があり、float_type の内部形式をそ の外部形式であるラージ可変長文字 (LVARCHAR) 型に変換します。 2. float_to_int() 関数は、外部キャストによって、ラージ可変長文字 (LVARCHAR) 型の値を int_type に変換します。 CAST(LVARCHAR value AS int_type) int_type 不透明 (opaque) 型の入力サポート関数は、この外部キャストのキャス ト関数として機能します。この入力サポート関数は、int_type 不透明 (opaque) 型の定義の一部として定義する必要があり、int_type の外部形式であるラージ 可変長文字 (LVARCHAR) 型を内部形式に変換します。 図 10 に示す CREATE CAST 文では、int_to_float() 関数をキャスト関数として使 用する明示的キャストを作成しています。 CREATE EXPLICIT CAST (float_type AS int_type WITH float_to_int); 図 10. float_type から int_type への明示的キャスト 第 7 章 ユーザ定義の型変換 (キャスト) の作成 83 エンド ユーザは、INSERT 文で以下の型変換を実行して、float_type 値の ft_val を int_type 列の it_col 用に変換できます。 INSERT INTO table1 (it_col) VALUES (ft_value::int_type) 82 ページの図 8 および 図 10 に示す明示的キャストを一緒に使用することで、 float_type と int_type の不透明 (opaque) 型間の変換が可能になります。データベ ース サーバで個々の明示的キャストに、一方向の変換を実行するキャスト関数が提 供されています。 型変換の削除 DROP CAST 文では、型変換の定義をデータベースから削除します。データベース サーバは syscasts システム カタログ表からクラス定義を削除します。データベー スから型変換の定義を削除するには、その型変換の所有者 (型変換を作成したユー ザ) であるか、または DBA である必要があります。 警告: ユーザ informix が所有する組込みキャストは削除しないでください。デー タベース サーバでは、組込み型間の自動変換に組込みキャストが使用されま す。データベースで不透明 (opaque) 型を引き続き使用する場合は、型変換と して機能する不透明 (opaque) 型のサポート関数を削除しないでください。 次に示す文では、mytype 型と 10 進数 (DECIMAL) 型の間の型変換を作成し、次 に削除します。 CREATE CAST (decimal AS mytype WITH dec_to_mytype); CREATE CAST (mytype AS decimal WITH mytype_to_decimal); ... ... DROP CAST (decimal AS mytype); DROP CAST (mytype AS decimal); 型変換を削除しても、その型変換に関連する関数には影響がありません。前述の文 は、dec_to_mytype または mytype_to_decimal 関数には影響しません。データ ベースから関数を削除するには、DROP FUNCTION 文を使用します。 DROP CAST および DROP FUNCTION の構文については、「IBM Informix: SQL ガイド: 構文」を参照してください。 84 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 8 章 ユーザ定義集計関数の作成 既存の集計関数の拡張 . . . . . . . . . 組込み集計関数の演算子のオーバーロード . 集計関数の拡張 . . . . . . . . . . 組込み集計関数の拡張の例 . . . . . . ユーザ定義集計関数の作成 . . . . . . . サポート関数 . . . . . . . . . . . INIT 関数 . . . . . . . . . . . INIT 関数の省略. . . . . . . . オプションの 2 番目の引数の使用. . ITER 関数 . . . . . . . . . . . FINAL 関数 . . . . . . . . . . COMBINE 関数 . . . . . . . . . サポート関数の解決 . . . . . . . . サポート関数状態 . . . . . . . . . C または Java サポート関数の使用 . . . ユーザ定義集計関数の例 . . . . . . . ユーザ定義集計関数とユーザ定義型の使用 サポート関数の省略 . . . . . . . SUMSQ と SSQ2 集計関数の相違 . . SSQ2 のサポート関数のオーバーロード 集計関数の管理 . . . . . . . . . . . 集計関数の並列実行 . . . . . . . . ユーザ定義集計関数の特権 . . . . . . システム カタログの集計関数情報. . . . コマンド行からの集計関数情報 . . . . . 集計関数の廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 86 87 87 87 88 89 89 89 89 90 90 91 91 92 92 93 94 94 94 95 95 95 95 96 96 本章の内容 この章では、データベース サーバにおいて集計関数の機能を拡張する方法について 説明します。集計関数 は、一連の問合せ行に対して 1 つの値を戻す関数です。デ ータベース サーバで集計関数を拡張する方法には次の 2 つがあります。 v 組込み集計関数の拡張 組込み集計関数 は、データベース サーバによって提供される集計関数であり、 COUNT、SUM、AVG などがあります。UDT と使用するために、組込み集計関 数を拡張することができます。 v ユーザ定義集計関数 ユーザ定義集計関数 は、データベース サーバで提供されていない集計関数を提 供するためにユーザが定義する集計関数です。 ユーザ定義集計関数 という用語は、広い意味で使用され、組込み集計関数の拡張を 意味する場合と、新規のユーザ定義集計関数を意味する場合があります。データベ ース サーバは、組込み集計関数とユーザ定義集計関数を含め、すべての集計関数を 管理します。集計関数システムの拡張を作成した後は、集計関数をどのように作成 したかに関わらず、すべての集計関数を同じように使用します。 © Copyright IBM Corp. 1996, 2003 85 2 つのタイプの拡張を提供する手法は異なります。この章では、集計関数を拡張す る 2 つの方法について別個に説明します。 SELECT 文で集計関数を使用する方法の詳細については、「IBM Informix: SQL ガ イド: チュートリアル」を参照してください。集計関数の構文の詳細については、 「IBM Informix: SQL ガイド: 構文」を参照してください。 既存の集計関数の拡張 データベース サーバでは、組込み型を操作する SUM および COUNT などの組込 み集計関数を提供します。組込み集計関数を拡張することができるため、UDT の操 作が可能になります。組込み集計関数を拡張するには、幾つかの二項演算子をオー バーロードする UDR を作成する必要があります。 組込み集計関数の演算子のオーバーロード 次の表は、それぞれの組込み集計関数ごとに、オーバーロードする必要がある演算 子を示します。例えば、UDT に SUM 集計関数のみが必要な場合は、plus() 演算 子のみをオーバーロードする必要があります。 集計関数 必須演算子 戻りの型 AVG plus(udt, udt), divide(udt, integer) divide() の戻りの型 COUNT -- (新規演算子は不要) 整数 (Integer) 型 COUNT DISTINCT equal(udt,udt) ブール (Boolean) 型 DISTINCT (または UNIQUE) compare(udt, udt) ブール (Boolean) 型 MAX greaterthanorequal(udt, udt) ブール (Boolean) 型 MIN lesthanorequal(udt, udt) ブール (Boolean) 型 RANGE lessthanorequal(udt, udt), greaterthanorequal(udt, udt), minus(udt, udt) minus() の戻りの型 SUM plus(udt, udt) plus() の戻りの型 STDEV times(udt, udt), divide(udt, integer), plus(udt, udt), minus(udt, udt), sqrt(udt) divide() の戻りの型 VARIANCE times(udt, udt), divide(udt, integer), plus(udt, udt), minus(udt, udt) divide() の戻りの型 データベース サーバは、インデックス付けおよび DISTINCT と UNIQUE 集計の ために compare() 関数を使用します。ただし、データベース サーバは equal() 関 数を呼び出して COUNT DISTINCT を処理します。compare() 関数は C または Java で作成する必要があります。 86 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 集計関数の拡張 UDT を組み込むように組込み集計関数を拡張する場合、集計関数自体がすでに存在 しているので、CREATE AGGREGATE 文は使用しません。 組込み集計関数を拡張するには: 1. 必須演算子をオーバーロードするためにサポート関数を開発します。 2. CREATE FUNCTION 文を使用して各関数を登録します。 詳しくは、52 ページの『ユーザ定義ルーチンの登録』を参照してください。 二項演算子をオーバーロードするサポート関数を登録した後、SQL 文で組込み集計 関数を使用することができます。 CREATE FUNCTION 文の構文の詳細については、「IBM Informix: SQL ガイド: 構 文」を参照してください。オーバーロードされた関数を作成する方法の詳細につい ては、25 ページの『ルーチンのオーバーロード』を参照してください。外部言語で 関数を作成する方法の詳細については、「IBM Informix: DataBlade API Programmer’s Guide」または「IBM Informix: J/Foundation Developer’s Guide」を参 照してください。 組込み集計関数の拡張の例 次の例では、SPL 関数を使用して、複素数を表す行 (row) 型 complex に対して plus() および divide() 演算子をオーバーロードします。演算子をオーバーロードし た後、complex とともに SUM、AVG、および COUNT 演算子を使用することが できます。 CREATE ROW TYPE complex(real FLOAT, imag FLOAT); CREATE FUNCTION plus (c1 complex, c2 complex) RETURNING complex; RETURN row(c1.real +c2.real, c1.imag +c2.imag)::complex; END FUNCTION; CREATE FUNCTION divide (c1 complex, count INT) RETURNING complex; RETURN row(c1.real/count, c1.imag/count)::complex; END FUNCTION; 拡張された集計関数は、次のように使用することができます。 CREATE INSERT INSERT ... SELECT SELECT SELECT TABLE c_test (a complex, b integer); INTO c_test VALUES (ROW(4,8)::complex,14); INTO c_test VALUES (ROW(7,9)::complex,3); SUM(a) FROM c_test; AVG(a) FROM c_test; COUNT(a) FROM c_test; ユーザ定義集計関数の作成 ユーザ定義集計関数は、データベース サーバがその集計関数をデータベース内のデ ータに適用できるようにするための情報を提供することにより、データベース サー バを拡張します。ユーザ定義集計関数を作成するには、集計を実行するサポート関 数を作成し、登録してから、CREATE Aggregate 文を使用して集計関数を実装しま す。 第 8 章 ユーザ定義集計関数の作成 87 CREATE Aggregate 文は、集計関数に関する次の情報をデータベース サーバに提供 します。 v 集計関数の名前 v 集計関数の所有者 v 集計関数をサポートする関数の名前 v 集計関数の修飾子 CREATE AGGREGATE 文の構文の詳細については、「IBM Informix: SQL ガイド: 構文」を参照してください。 次の型に対してユーザ定義集計関数を作成することはできません。 v コレクション (COLLECTION) 型: リスト (LIST) 型、マルチセット (MULTISET) 型、またはセット (SET) 型 v 名前なし行型 v スマート ラージ オブジェクト データ型: CLOB 型または BLOB 型 v シンプル ラージ オブジェクト データ型: テキスト (TEXT) 型またはバイト (BYTE) 型 サポート関数 CREATE AGGREGATE 文では、4 つのサポート関数に関する情報が必要です。次 の表は、これらのサポート関数をまとめたものです。集計関数を使用する各型に対 してサポート関数を提供する必要があります。 関数型 目的 INIT 集計関数を計算するために必要なデータ構造体を初 期化します。 ITER 単一の (行) 値と前の部分結果をマージします。 COMBINE ある部分結果と他の部分結果をマージし、集計関数 の並列実行を可能にします。 FINAL 部分結果を最終値に変換します。 クリーンアップ操作を実行し、リソースを解放する ことができます。 サポート関数は SPL、C、または Java で作成することができます。SPL について は、「IBM Informix: SQL ガイド: 構文」を参照してください。外部言語での関数作 成の詳細については、「IBM Informix: DataBlade API Programmer’s Guide」または 「IBM Informix: J/Foundation Developer’s Guide」を参照してください。 次の CREATE AGGREGATE 文は、init_func、iter_func、combine_func、および final_func という名前のサポート関数を使用して SUMSQ 集計関数を登録します。 サポート関数を作成していない場合でも、集計関数を登録できます。 CREATE AGGREGATE sumsq (INIT = init_func, ITER = iter_func, COMBINE = combine_func, FINAL = final_func); 88 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ユーザ定義集計関数を作成するとき、集計関数が操作する各型ごとにサポート関数 を提供するために、各サポート関数をオーバーロードする必要があります。つま り、反復関数が iter_func である新規集計関数 SUMSQ を作成する場合は、適用で きる各型ごとに iter_func 関数をオーバーロードする必要があります。集計関数名 は大文字と小文字を区別しません。集計関数を作成して使用する場合は、大文字ま たは小文字を使用することができます。 INIT 関数 INIT 関数は、集計関数の残りの計算に必要なデータ構造体を初期化します。例え ば、C 関数を作成する場合、INIT 関数は、中間結果を格納するためにラージ オブ ジェクトまたは一時ファイルをセットアップすることができます。 INIT 関数は、 状態 (state) 型である集計関数の初期結果を戻します。 INIT 関数は 1 つまたは 2 つの引数を取ります。最初の引数は、集計される列と同 じ型である必要があります。データベース サーバは、最初の引数の型を使用して、 オーバーロードされた INIT 関数を解決します。 C および JAVA 言語サポート INIT 関数の最初の引数はダミー引数であり、常に NULL 値となります。したがっ て、INIT 関数として機能するすべての関数は、HANDLESNULLS 修飾子を使用して 定義する必要があります。 C および JAVA 言語サポート の終り INIT 関数の省略: 状態 (state) 型が集計関数の最初の引数の型と同じである単純な 二項演算子に対しては、 INIT 関数を省略することができます。この場合、データ ベース サーバは初期結果値として NULL を使用します。 オプションの 2 番目の引数の使用: 集計計算をカスタマイズするための設定引数 として、INIT 関数のオプションの 2 番目の引数を使用することができます。例え ば、平均値の計算から N 最大値と N 最小値を除外する集計関数を作成することが できます。この場合、N の値は、集計式の 2 番目の引数となります。 設定の値は集計関数の計算の間中、同じにする必要があるため、設定表現式は group-by 列から指定する必要があります。 C 言語サポート 設定表現式は、単独のホスト変数参照にすることはできません。 C 言語サポート の終り ITER 関数 反復関数 ITER は、単一値と部分結果をマージし、部分結果を戻します。 ITER 関 数は、問合せで選択された各行からの情報を処理する主要なジョブを実行します。 例えば、AVG 集計関数では、ITER 関数は現行値を現行の合計に追加し、行カウン トを 1 つずつインクリメントします。 第 8 章 ユーザ定義集計関数の作成 89 ITER 関数は、すべてのユーザ定義集計関数に必要です。INIT 関数がユーザ定義集 計関数に定義されていない場合、ITER 関数は NULL を明示的に処理する必要があ ります。 ITER 関数は状態引数から集計計算の状態を取得します。 SPL ルーチンは、デフォルトでは NULL 引数を処理します。C および Java 関数 の場合は、ITER 関数で NULL 値を明示的に処理し、 HANDLESNULLS 修飾子を 使用して関数を登録する必要があります。 C 言語サポート FPARAM 構造体はサポート関数の間で共有されないため、 ITER 関数は、 FPARAM 構造体に追加の状態を保持しないようにする必要があります。ただし、 FPARAM 構造体を使用して、集計結果に影響しない情報をキャッシュすることがで きます。 C 言語サポート の終り FINAL 関数 FINAL 関数は、内部結果をユーザに戻される結果 (result) 型に変換します。例え ば、AVG 集計関数の場合、FINAL 関数は現行の合計を現行の行カウントで割った 結果を戻します。 FINAL 関数は、結果 (result) 型が状態 (state) 型と列 (column) 型と同じである単純 な二項演算子から派生する集計関数には必要ありません。FINAL 関数を定義しない 場合は、データベース サーバは最終状態を戻します。 C および JAVA 言語サポート FINAL 関数は、クリーンアップ処理を実行し、INIT 関数によって割り当てられた リソースを解放することができます。ただし、状態自体は解放されません。 C および JAVA 言語サポート の終り COMBINE 関数 COMBINE 関数は、ある部分結果と他の部分結果をマージし、更新された部分結果 を戻します。例えば、AVG 集計関数の場合、COMBINE 関数は 2 つの部分結果を 追加し、2 つの部分カウントを追加します。 集計関数が、結果 (result) 型が状態 (state) 型と列 (column) 型と同じである単純な 二項演算子から派生する場合は、COMBINE 関数は ITER 関数と同じにすることが できます。例えば、AVG 集計関数では、COMBINE 関数は現行の合計値と 1 つの 部分結果の行カウントを他の部分結果の同じ値に追加し、新規の値を戻します。 データベース サーバは、並列実行のために COMBINE 関数を使用します。問合せ に集計関数が含まれている場合、データベース サーバは、問合せに集計関数のみが 含まれている場合に並列実行を使用します。ただし、問合せが並列化されていない 場合でも、COMBINE 関数を使用することもできます。例えば、問合せに個別およ び非個別集計関数が含まれている場合、データベース サーバは個別な列値に基づい 90 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド て非個別な集計関数の計算を副集計関数に分解することができます。したがって、 各ユーザ定義集計関数に対して COMBINE 関数を提供する必要があります。 並列集計は、並列に計算されない集計関数と同じ結果になる必要があります。一連 の行の集計の結果が、それらの行の 2 つの区画を個別に集計し、その結果を連結し た場合の結果と同じになるように、COMBINE 関数を作成する必要があります。 C および JAVA 言語サポート COMBINE 関数は、クリーンアップ処理を実行し、INIT 関数によって割り当てられ たリソースを解放することができます。ただし、状態引数は解放してはなりませ ん。 C および JAVA 言語サポート の終り サポート関数の解決 SQL 文がユーザ定義集計関数を使用するとき、データベース サーバはサポート関 数を適切な UDR に解決します。 データベース サーバは、データベース所有者 名なしでサポート関数を解決しま す。したがって、ユーザ定義関数の解決ロジックは、現行ユーザ、引数型のスキー マ、Informix スキーマをそれぞれ個別に解決します。ルーチン解決の詳細について は、23 ページの『ルーチン分析の理解』を参照してください。 サポート関数状態 データベース サーバは次の手順に従ってサポート関数を検出します。 1. CREATE AGGREGATE 文に INIT 関数が含まれている場合、次の UDR を解決 します。 init_func(dt_agg, dt_setup) INIT 関数の戻りの型により、データベース サーバが他のサポート関数を解決す るために使用する状態 (state) 型 が決定されます。INIT 関数を省略すると、状 態型は集計関数の引数の型となります。 2. ITER 関数の場合、次の UDR を解決します。 iter_func (state_type, dt_agg) ITER 関数の戻りの型は状態 (state) 型となります。 3. COMBINE 関数の場合、次の UDR を解決します。 comb_func (state_type, state_type) COMBINE 関数の戻りの型は状態 (state) 型となります。 4. FINAL 関数を指定した場合は、次の UDR を解決します。 final_func (state_type) ユーザ定義集計関数の戻りの型は FINAL 関数の戻りの型となります。FINAL 関数を指定しない場合、戻り型は状態 (state) 型となります。 上の手順では次の変数を使用しています。 第 8 章 ユーザ定義集計関数の作成 91 変数 説明 comb_func COMBINE 関数の名前 dt_aggr 集計関数の最初の引数の型 dt_setup 集計関数の 2 番目の引数または設定引数の型 final_func FINAL 関数の名前 init_func INIT 関数の名前 iter_func ITER 関数の名前 state_type INIT 関数の戻りの型によって決定される状態 (state) 型 集計関数の状態は NULL とすることはできません。つまり、サポート関数は NULL 値を戻すことはできません。データベース サーバは、NULL 値と空の表の 集計結果とを区別することはできません。したがって、NULL 値によりランタイム エラーは生じませんが、COMBINE 関数と FINAL 関数では NULL 値は無視され ます。 C または Java サポート関数の使用 C または Java を使用してサポート関数のルーチンを作成する場合、NULL 値の処 理を検討する必要があります。HANDLESNULLS 修飾子がない限り、集計される列 に NULL 値がある列は、集計計算に寄与しません。反復関数 ITER が HANDLESNULLS を使用する場合は、NULL 値を処理できるようにすべてのサポー ト関数を宣言する必要があります。初期化関数 INIT は、常に NULL 値を処理でき る必要があります。 ユーザ定義集計関数は強固に型付けされています。つまり、データベース サーバ は、サポート関数からの状態 (state) 型情報を使用して、値が正しく型付けされるよ うにし、メモリを正しく管理できるようにします。汎用ユーザ定義型ポインタ を慎 重に使用することにより、新規状態 (state) 型の作成を避けることができます。 ユーザ定義集計関数を作成するには: 1. 集計関数をサポートする関数を作成します。 2. CREATE FUNCTION 文を使用してサポート関数を登録します。 3. CREATE AGGREGATE 文を使用して集計関数を登録します。 集計関数を登録した後、SQL 文で集計関数を使用することができます。 関数の登録の詳細については、52 ページの『ユーザ定義ルーチンの登録』を参照し てください。 CREATE FUNCTION 文と CREATE AGGREGATE 文の構文の詳細 については、「IBM Informix: SQL ガイド: 構文」を参照してください。 ユーザ定義集計関数の例 次の例では、SPL 関数を使用して、2 乗和を計算する新規集計関数 SUMSQ にサポ ート関数を提供します。サポート関数を登録し、集計関数を作成した後、実数 (float) 型にキャストされるデータ型を持つ列がある SUMSQ 集計関数を使用するこ とができます。 92 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド CREATE FUNCTION ssq_init (dummy float) RETURNING float; RETURN 0; END FUNCTION; CREATE FUNCTION ssq_iter (result float, value float) RETURNING float; RETURN result + value * value; END FUNCTION; CREATE FUNCTION ssq_combine(partial1 float, partial2 float) RETURNING float; RETURN partial1 + partial2; END FUNCTION; CREATE FUNCTION ssq_final(final float) RETURNING float; RETURN final; END FUNCTION; CREATE AGGREGATE sumsq WITH (INIT = ssq_init, ITER = ssq_iter, COMBINE = ssq_combine, FINAL = ssq_final); ここで、例えば、87 ページの『組込み集計関数の拡張の例』に示す表 c_test の INTEGER 列がある SUMSQ を使用することができます。 SELECT SUMSQ(b) FROM c_test; ユーザ定義集計関数とユーザ定義型の使用 複素数 (complex) 型は実数 (FLOAT) 型に型変換されないので、87 ページの『組 込み集計関数の拡張の例』に示す表 c_test の complex 列とともに SUMSQ を使 用することはできません。複素数 (complex) 型の SUMSQ を使用するには、 SUMSQ 集計関数のサポート関数をオーバーロードする必要があります。 CREATE FUNCTION ssq_init (dummy complex) RETURNING complex; RETURN ROW(0,0)::complex; END FUNCTION; CREATE FUNCTION ssq_iter (partial complex, c complex) RETURNING complex; RETURN ROW ( (partial.real + c.real*c.real - c.imag*c.imag), (partial.imag + 2*c.real*c.imag) )::complex; END FUNCTION; CREATE FUNCTION ssq_combine(p1 complex, p2 complex) RETURNING complex; RETURN ROW(p1.real + p2.real, p1.imag + p2.imag)::complex; END FUNCTION; CREATE FUNCTION ssq_final(final complex) RETURNING complex; RETURN final::complex; END FUNCTION; ユーザ定義集計関数に対するサポート関数をオーバーロードする場合、CREATE AGGREGATE 文に宣言されたものと同じ関数を作成する必要があります。この例で は、その要件は各サポート関数をオーバーロードすることです。 第 8 章 ユーザ定義集計関数の作成 93 サポート関数の省略 完全を期するため、前の例では、INIT、ITER、COMBINE、FINAL の 4 つすべて のサポート関数を示しました。SUMSQ は単純な集計関数であるため、この例では INIT 関数と FINAL 関数を省略することができます。 SSQ2 集計関数を作成するに は、次のコマンドを使用することができます。 CREATE FUNCTION ssq2_iter (result float, opr float) RETURNING float; IF result IS NULL THEN LET result = (opr*opr); ELSE LET result = result + opr*opr; END IF RETURN result; END FUNCTION; CREATE FUNCTION ssq2_combine(partial1 float, partial2 float) RETURNING float; RETURN partial1 + partial2; END FUNCTION; CREATE AGGREGATE ssq2 WITH (ITER = ssq2_iter, COMBINE = ssq2_combine); SUMSQ と SSQ2 集計関数の相違: SUMSQ の INIT 関数は、状態、つまり、結 果を明示的に初期化します。SSQ2 集計関数に INIT 関数が含まれていないため、 ITER 関数は、結果が NULL であるケースを明示的に処理する必要があります。 SSQ2 集計関数の動作は、SUMSQ 集計関数の動作とまったく同じわけではありませ ん。列を FLOAT に明示的に型変換しない限り、実数 (FLOAT) 型の列とのみ SSQ2 を使用することができます。次の例では、最初の SELECT 文は失敗します が、他の SELECT 文は成功します。 CREATE TABLE trial (t INT); INSERT INTO trial VALUES (2); INSERT INTO trial VALUES (3); SELECT ssq2(t) FROM trial; SELECT ssq2(t::float) FROM trial; SELECT sumsq(t) from trial; -- fails -- succeeds -- succeeds INIT 関数が SSQ2 の宣言から省略されているため、集計関数は集計関数引数の型を その状態 (state) 型として使用します。 ITER 関数は、実数 (FLOAT) 型を必要とし ます。したがって、INIT 関数を省略する場合、集計関数引数は実数 (FLOAT) 型と する必要があります。状態 (state) 型の詳細については、91 ページの『サポート関 数の解決』を参照してください。 SSQ2 のサポート関数のオーバーロード: オーバーロードされた関数は集計関数の 宣言の関数と同じにする必要があるため、ssq2_iter と ssq2_combine をオーバ ーロードし、SSQ2 集計関数を複素数 (complex) 型に拡張する必要があります。 CREATE FUNCTION ssq2_iter (partial complex, c complex) RETURNING complex; RETURN ROW ( (partial.real + c.real*c.real - c.imag*c.imag), (partial.imag + 2*c.real*c.imag) )::complex; END FUNCTION; CREATE FUNCTION ssq2_combine(p1 complex, p2 complex) 94 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド RETURNING complex; RETURN ROW(p1.real + p2.real, p1.imag + p2.imag)::complex; END FUNCTION; 集計関数の管理 データベース サーバは、ユーザ定義またはユーザにより拡張された集計関数および 関連する関数を管理するためのツールを提供します。 集計関数の並列実行 集計関数のみの問合せでは、データベース サーバは集計関数の計算を複数の部分に 分割し、各部分を並列して実行することができます。データベース サーバは COMBINE 関数を使用して、すべての部分の部分結果を 1 つの結果値に連結しま す。データベース サーバは、オプティマイザを使用して集計関数を並列化する時期 と方法を決定します。この処理はユーザに意識されることなく実行されます。 集計関数のみではない問合せでも、データベース サーバは複数の集計結果を並列し て計算することができます。このような場合、データベース サーバは各集計結果を 順番に計算します (COMBINE 関数を使用せずに)。 並列化および最適化の詳細については、「IBM Informix: Performance Guide」を参照 してください。 ユーザ定義集計関数の特権 特権は、ユーザ定義またはユーザにより拡張された集計関数に、直接は関連付けら れません。その代わりに、集計関数をサポートする関数に正しい特権を設定する必 要があります。 関数を作成するには、RESOURCE または DBA データベース レベル 特権を持つ 必要があります。 ANSI に準拠しないデータベースに関数を作成する場合は、すべ てのユーザがその関数を使用できます。 ANSI に準拠するデータベースに関数を作 成する場合は、その関数に明示的に Execute 特権を付与し、ユーザがその関数と関 連集計関数を使用できるようにする必要があります。 特権の詳細については、「IBM Informix: SQL ガイド: 構文」の『GRANT』文を参 照してください。 システム カタログの集計関数情報 CREATE AGGREGATE 文は、集計関数をシステム カタログ表 sysaggregates に 登録します。CREATE AGGREGATE を使用して集計関数を登録するユーザが、集 計関数の所有者となります。表 sysaggregates には、組込み集計関数に関する情 報は含まれません。 ユーザにより拡張された組込み集計関数とユーザ定義集計関数には、ユーザ定義関 数が必要です。システム カタログ表 sysprocauth、sysprocbody、 sysprocedures には、ユーザ定義集計関数と組込み集計関数の拡張をサポートする 関数を含め、作成した関数の情報が記録されます。 第 8 章 ユーザ定義集計関数の作成 95 システム カタログ表については、「IBM Informix: SQL ガイド: 参照」を参照して ください。 コマンド行からの集計関数情報 ユーティリティ onstat のオプション -g cac agg は、ユーザ定義集計関数に関す る情報を提供します。onstat については、「IBM Informix: 管理者の参照」を参照 してください。 集計関数の廃棄 DROP AGGREGATE 文は、データベースから集計関数の定義を削除します。データ ベースから定義を削除するには、集計関数の所有者またはデータベース管理者 (DBA) である必要があります。 所有者または DBA である場合、次の文は、データベースから集計関数 SUMSQ を 削除します。 DROP AGGREGATE SUMSQ; 集計関数を廃棄しても、集計関数と関連付けられている関数に影響はありません。 DROP FUNCTION 文を使用して、データベースから関数を削除します。 96 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 9 章 不透明 (OPAQUE) 型の作成 不透明 (OPAQUE) 型 . . . . . . . . . . . . . . . . 内部構造体 . . . . . . . . . . . . . . . . . . 固定長の不透明 (OPAQUE) 型 . . . . . . . . . . . 可変長の不透明 (OPAQUE) 型 . . . . . . . . . . . サポート関数 . . . . . . . . . . . . . . . . . . 演算子関数 . . . . . . . . . . . . . . . . . 組込み関数 . . . . . . . . . . . . . . . . . 集計関数 . . . . . . . . . . . . . . . . . . 統計情報収集ルーチン . . . . . . . . . . . . . エンド ユーザ ルーチン. . . . . . . . . . . . . 不透明 (OPAQUE) 型の利点 . . . . . . . . . . . . 不透明 (OPAQUE) 型の作成 . . . . . . . . . . . . . C の内部構造体の作成 . . . . . . . . . . . . . . データ型サイズ. . . . . . . . . . . . . . . . 固定長の不透明 (OPAQUE) 型. . . . . . . . . . 可変長の不透明 (OPAQUE) 型. . . . . . . . . . メモリの位置合せ . . . . . . . . . . . . . . . パラメータの引渡し . . . . . . . . . . . . . . UDT と Java 間のマッピングの作成. . . . . . . . . . サポート関数の作成と登録 . . . . . . . . . . . . . データベースへの不透明 (OPAQUE) 型の登録 . . . . . . 不透明 (OPAQUE) 型の登録 . . . . . . . . . . . 不透明 (OPAQUE) 型の型変換の作成 . . . . . . . . 非行内ストレージの使用. . . . . . . . . . . . . 不透明 (OPAQUE) 型への特権の付与 . . . . . . . . . SQL 呼出し関数の作成 . . . . . . . . . . . . . . 不透明 (OPAQUE) 型の算術演算子関数とテキスト演算子関数 不透明 (OPAQUE) 型の組込み関数 . . . . . . . . . 不透明 (OPAQUE) 型の集計関数 . . . . . . . . . . 不透明 (OPAQUE) 型の条件演算子 . . . . . . . . . 不透明 (OPAQUE) 型の関係演算子 . . . . . . . . . ハッシュ可能な型 . . . . . . . . . . . . . . ハッシュ不可能な型 . . . . . . . . . . . . . 不透明 (OPAQUE) 型の比較関数 . . . . . . . . . . アクセス方式のカスタマイズ . . . . . . . . . . . . . 汎用 B ツリーの使用. . . . . . . . . . . . . . . その他のアクセス方式の使用 . . . . . . . . . . . . スペーシャル (空間) データのインデックス作成. . . . . その他の型のデータのインデックス作成 . . . . . . . 不透明 (OPAQUE) 型に関するその他の操作 . . . . . . . . 不透明 (OPAQUE) 型へのアクセス . . . . . . . . . . 不透明 (OPAQUE) 型の廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 . 98 . 98 . 98 . 99 . 99 . 100 . 100 . 100 . 100 . 101 . 101 . 101 . 102 . 102 . 102 . 103 . 103 . 104 . 104 . 104 . 104 . 105 . 106 . 106 . 107 . 108 . 108 . 108 . 108 . 109 . 109 . 109 . 110 . 110 . 111 . 111 . 111 . 112 . 112 . 112 . 112 本章の内容 この章では以下の事項について説明します。 v 不透明 (OPAQUE) 型 v 不透明 (OPAQUE) 型の作成 v アクセス方式のカスタマイズ © Copyright IBM Corp. 1996, 2003 97 v 不透明 (OPAQUE) 型に関するその他の操作 不透明 (OPAQUE) 型 不透明 (OPAQUE) 型 は、データベースに対して定義する最小 (ATOMIC) 型です。 データベース サーバが型の内部表現に関する情報を保持しないため、不透明 (OPAQUE) 型という名前が付けられています。データベース サーバが内部形式に関 する情報を保持する組込み型と異なり、不透明 (OPAQUE) 型はカプセル化されてい ます。つまり、データベース サーバは、不透明 (OPAQUE) 型内のデータ形式につ いては情報を持ちません。 不透明 (OPAQUE) 型を定義する場合は、データベース サーバのデータ型システム を拡張します。新規の不透明 (OPAQUE) 型は、データベース サーバが提供するす べての組込み型と同様に使用することができます。データベース サーバに対して不 透明 (OPAQUE) 型を定義するには、外部言語 (C または Java) で以下の情報を提 供する必要があります。 v 不透明 (OPAQUE) 型の内部記憶域を定義するデータ構造体 v データベース サーバとこの内部構造体との対話を可能にするサポート関数 v 型の取り扱い方法を指定するオプションの修飾子 v 不透明 (OPAQUE) 型を操作するために、その他のサポート関数またはエンド ユ ーザにより呼び出すことのできるオプションの追加ルーチン 以下のセクションでは、不透明 (OPAQUE) 型の上記の各構成部分について説明しま す。 上記構成部分の作成方法については、101 ページの『不透明 (OPAQUE) 型の 作成』を参照してください。 内部構造体 不透明 (OPAQUE) 型を作成するには、最初に、データを内部表記で保管するデータ 構造体を提供する必要があります。このデータ構造体は、ディスクへのデータの保 管方法を示すものであるため、不透明 (OPAQUE) 型の内部構造体 と呼ばれます。 ユーザが作成するサポート関数がこの内部構造体を操作します。したがって、デー タベース サーバは、内部構造を認識しません。内部構造体は、外部言語を使用して データ構造体として作成します。 固定長の不透明 (OPAQUE) 型または可変長の不透明 (OPAQUE) 型のいずれかをサ ポートする内部構造体を定義することができます。 固定長の不透明 (OPAQUE) 型 固定長の不透明 (OPAQUE) 型 は、不透明 (OPAQUE) 型のすべての可能値につい て、そのサイズが等しい内部構造体を持っています。固定長の不透明 (OPAQUE) 型 は、数値などの、固定長フィールドで表現できるデータの場合に役立ちます。 不透明 (OPAQUE) 型をデータベースに登録するときに、サイズを指定します。詳し くは、102 ページの『データ型サイズ』を参照してください。 可変長の不透明 (OPAQUE) 型 可変長の不透明 (OPAQUE) 型 は、不透明 (OPAQUE) 型の値に合わせてサイズが 変わる内部構造体を持っています。可変長の不透明 (OPAQUE) 型は、イメージなど 98 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド の、複数表現データを保管する場合に役立ちます。例えば、イメージのサイズはピ クチャごとに異なります。特定のサイズまではデータを不透明 (OPAQUE) 型内に保 管し、イメージ サイズがそのサイズを超えた場合に、不透明 (OPAQUE) 型のスマ ート ラージ オブジェクトを使用することができます。 データベースに不透明 (OPAQUE) 型を登録する場合は、サイズが変化することを示 します。また、内部構造体の最大サイズを指定することができます。詳しくは、102 ページの『データ型サイズ』を参照してください。 複数表現のデータ型 は可変長の型であり、データ長が指定したしきい値より小さい 場合は、データを不透明 (OPAQUE) 型の内部構造体に直接保管します。データ長が しきい値より大きい場合、この型は、値をスマート ラージ オブジェクトに保管 し、次に、スマート ラージ オブジェクト ハンドルを不透明 (OPAQUE) 型に保管 します。 値を複数表現のデータ型に挿入する場合は、assign() サポート関数により、データ の保管場所が決定されます。データを削除する場合は、destroy() サポート関数によ り、データを内部構造体から削除するか、スマート ラージ オブジェクトから削除 するかが決定されます。update() 関数および deepcopy() 関数を使用すると、スマ ート ラージ オブジェクトを含む UDT を効率よく管理できます。これらの関数の 詳細については、134 ページの『スマート ラージ オブジェクトの処理』を参照し てください。複数表現のデータ型の使用法については、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 サポート関数 サポート関数は、データベース サーバが不透明 (OPAQUE) 型と対話するときに必 要な基本機能を提供します。ただし、不透明 (OPAQUE) 型に以下のような関数を提 供する場合は、追加の UDR を作成することをお勧めします。 v 演算子関数 v 組込み関数 v 集計関数 v 統計情報収集ルーチン v 選択水準関数 v エンド ユーザ ルーチン 演算子関数 演算子関数 は、plus() または equal() などのユーザ定義関数であり、対応する演 算子記号を持っています。演算子関数が不透明 (OPAQUE) 型を操作できるようにす るには、不透明 (OPAQUE) 型に対してルーチンをオーバーロードする必要がありま す。 データベース サーバが提供する演算子関数については、 72 ページの『演算子およ び演算子関数』を参照してください。ルーチンのオーバーロードについては、25 ペ ージの『ルーチンのオーバーロード』を参照してください。不透明 (OPAQUE) 型の 演算子関数をオーバーロードする方法については、 108 ページの『不透明 (OPAQUE) 型の算術演算子関数とテキスト演算子関数』を参照してください。 第 9 章 不透明 (OPAQUE) 型の作成 99 組込み関数 組込み関数 は cos() または length() などの事前定義関数であり、 SQL 式で使用 できるようにデータベース サーバによって提供されています。データベース サー バは、組込み型の組込み関数をサポートします。不透明 (OPAQUE) 型の場合は、不 透明 (OPAQUE) 型に対して関数をオーバーロードする必要があります。 これらの組込み関数については、74 ページの『組込み関数』を参照してください。 不透明 (OPAQUE) 型に対して組込み関数をオーバーロードする方法については、 108 ページの『不透明 (OPAQUE) 型の組込み関数』を参照してください。 集計関数 集計関数 は、SUM または AVG などの、一組の問合せ行についての 1 つの値を 戻します。不透明 (OPAQUE) 型で処理できるように、組込み集計関数を拡張するこ とができます。特別用途の新規の集計関数を作成することもできます。 組込み集計関数を拡張する方法については、 86 ページの『既存の集計関数の拡 張』を参照してください。新規の集計関数を作成する方法については、 87 ページ の『ユーザ定義集計関数の作成』を参照してください。集計関数の使用法について は、「IBM Informix: SQL ガイド: 構文」の『式セグメント』を参照してください。 統計情報収集ルーチン UPDATE STATISTICS 文は、オプティマイザが使用する統計情報を収集するため に、statcollect() 関数を呼び出します。 statcollect() 関数は、データベース サー バが情報を表示できるようにするために、情報をフォーマットします。 詳しくは、169 ページの『statcollect() 関数』を参照してください。 エンド ユーザ ルーチン データベース サーバを使用すると、エンド ユーザが式または SQL 文で使用でき る SQL 呼出し関数やプロシジャを定義することができます。これらのエンド ユー ザ ルーチンは、エンド ユーザが不透明 (OPAQUE) 型を処理するために必要な追加 機能を提供します。エンド ユーザ ルーチンの例には、以下のものがあります。 v 不透明 (OPAQUE) 型の特定の値を戻す関数 不透明 (OPAQUE) 型はカプセル化されているため、エンド ユーザ関数が、ユー ザが内部構造体のフィールドにアクセスできる唯一の方法です。 v キャスト関数 幾つかのサポート関数は、データベース サーバが使用する基本データ型間のキャ スト関数として機能します。データベースの不透明 (OPAQUE) 型とその他の型 (組込み型、不透明型、または複合型) 間の追加キャスト関数を作成することもで きます。 v 不透明 (OPAQUE) 型に対して共通操作を実行する関数またはプロシジャ 不透明 (OPAQUE) 型に対して操作またはタスクを頻繁に実行する場合は、この タスクを実行するエンド ユーザ ルーチンを作成することをお勧めします。 エンド ユーザ ルーチンの詳細については、 37 ページの『第 4 章 ユーザ定義ルー チンの開発』を参照してください。 100 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 不透明 (OPAQUE) 型の利点 不透明 (OPAQUE) 型と行 (ROW) 型のどちらを使用しても、データ型のメンバを定 義することができます。行 (ROW) 型ではなく不透明 (OPAQUE) 型を作成する利点 は、以下のとおりです。 v 不透明 (OPAQUE) 型はコンパクトに保管できる。 不透明 (OPAQUE) 型には、行 (ROW) 型で必要なシステム カタログにおけるオ ーバーヘッドがない。 v 不透明 (OPAQUE) 型は効率的である。 不透明 (OPAQUE) 型のサポート関数は、不透明 (OPAQUE) 型の内部構造体を直 接操作します。メンバからデータを抽出するときに、行 (ROW) 型のフィールド の場合に必要な特別な手順 (DataBlade API 呼出しまたは SQL ピリオド表記) を 実行する必要はありません。 不透明 (OPAQUE) 型の作成 不透明 (OPAQUE) 型を作成するには、以下の手順に従います。 1. 不透明 (OPAQUE) 型の内部構造体を作成します。 2. サポート関数を作成し、登録します。 3. CREATE OPAQUE TYPE 文を使用して、データベースに不透明 (OPAQUE) 型 を登録します。 4. GRANT 文を使用して、不透明 (OPAQUE) 型とそのサポート関数にアクセス権 を付与します。 5. 不透明 (OPAQUE) 型をサポートするために必要な SQL 呼出し関数を作成しま す。 6. 不透明 (OPAQUE) 型に必要な、カスタマイズした 2 次アクセス方式を提供しま す。 以下のセクションでは、上記の各手順について説明します。 C の内部構造体の作成 不透明 (OPAQUE) 型の内部構造体は C のデータ構造体です。内部構造体の場合、 プラットフォームによってサイズが変化する可能性のあるフィールドに対し、 DataBlade API が提供する C の typedef を使用します。 mi_integer および mi_float などの typedef を使用すると、不透明 (OPAQUE) 型の移植性が向上しま す。これらの型の詳細については、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 内部構造体を作成する場合は、この構造体のサイズが以下のものに与える影響を検 討してください。 v 新規不透明 (OPAQUE) 型の最終の構造体サイズ v 不透明 (OPAQUE) 型のメモリ内の位置合せ v 不透明 (OPAQUE) 型を UDR に引き渡す方法 CREATE OPAQUE TYPE 文を使用して、不透明 (OPAQUE) 型を作成する場合は、 以下の情報を提供します。 第 9 章 不透明 (OPAQUE) 型の作成 101 データ型サイズ データベースの領域を節約するために、内部構造体はできるだけコンパクトに配置 してください。データベース サーバは内部表記で値を保管するため、記入項目間に 埋込みのある内部構造体は不必要な領域を消費します。 CREATE OPAQUE TYPE 文の INTERNALLENGTH キーワードは、内部構造体の 最終サイズを提供します。このキーワードには、サイズを指定する次の 2 つの方法 があります。 v 内部構造体の実際のサイズをバイト単位で指定し、固定長の不透明 (OPAQUE) 型を定義する。 v VARIABLE キーワードを指定し、可変長の不透明 (OPAQUE) 型を定義する。 固定長の不透明 (OPAQUE) 型: INTERNALLENGTH の実際のサイズを指定する と、固定長の不透明 (OPAQUE) 型が作成されます。固定長の不透明 (OPAQUE) 型 のサイズは、 C 言語の sizeof() ディレクティブが内部構造体について戻す値と一 致する必要があります。固定長の不透明 (OPAQUE) 型の最大内部長は、 32760 バ イトです。 ほとんどのコンパイラでは、sizeof() ディレクティブは、構造体配列上のポインタ 照合が正常に処理されるように、最も近い 4 バイト サイズに切り上げます。ただ し、固定長の不透明 (OPAQUE) 型のサイズについては、切り上げる必要はありませ ん。その代わりに、ALIGNMENT 修飾子を使用して、不透明 (OPAQUE) 型の位置 合せを指定することができます。詳しくは、103 ページの『メモリの位置合せ』を 参照してください。 可変長の不透明 (OPAQUE) 型: INTERNALLENGTH 修飾子に VARIABLE キー ワードを指定すると、可変長の不透明 (OPAQUE) 型が作成されます。可変長の不透 明 (OPAQUE) 型のデフォルト最大サイズは 2 KB です。 可変長の不透明 (OPAQUE) 型に別の最大サイズを指定するには、 MAXLEN 修飾 子を指定してください。可変長の不透明 (OPAQUE) 型の最大内部長は 32740 バイ トです。MAXLEN 値を指定すると、データベース サーバは、不透明 (OPAQUE) 型のリソース割振りを最適化することができます。不透明 (OPAQUE) 型のデータ サイズが MAXLEN 値を超えると、データベース サーバはエラーを戻します。ま た、可変長の不透明 (OPAQUE) 型は、 32740 バイトの最大長内で 195 列に制限さ れています。 例えば、次の CREATE OPAQUE TYPE 文は、最大サイズが 4 KB の var_type と呼ばれる可変長の不透明 (OPAQUE) 型を定義します。 CREATE OPAQUE TYPE var_type (INTERNALLENGTH=VARIABLE, MAXLEN=4096); 可変長サイズにすることができるのは、内部構造体の最後のメンバのみです。 可変長の不透明 (OPAQUE) 型用の C データ構造体は、 mi_lvarchar データ構造 体に格納する必要があります。 mi_lvarchar については、「IBM Informix: DataBlade API Function Reference」を参照してください。 102 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド メモリの位置合せ データベース サーバは、型を UDR に渡す場合、指定したバイト境界上に不透明 (OPAQUE) 型をそろえます。位置合せに関する要件は、不透明 (OPAQUE) 型につ いての C の定義、および不透明 (OPAQUE) 型をコンパイルするシステム (ハード ウェアおよびコンパイラ) によって異なります。 CREATE OPAQUE TYPE 文の ALIGNMENT 修飾子を使用して、不透明 (OPAQUE) 型のメモリ位置合せの要件を指定することができます。次の表に、有効 な位置合せの値を要約します。 ALIGNMENT 値 意味 目的 1 単一バイト境界上に構造 体をそろえる。 1 バイトで始まる構造体 2 2 バイト境界上に構造体 をそろえる。 mi_unsigned_smallint などの、2 バイトで始 まる構造体 4 4 バイト境界上に構造体 をそろえる。 実数 (FLOAT) 型または mi_unsigned_integer などの、4 バイトで始 まる構造体 8 8 バイト境界上に構造体 をそろえる。 C の倍精度浮動小数点数 (DOUBLE) 型のメン バを含む構造体 シングルバイト文字 char で始まる構造体は、どの境界上にも位置合せが可能で す。型の配列は、型自体と同じ位置合せに関する制約事項に従う必要があります。 例えば、次の CREATE OPAQUE TYPE 文は、1 バイト境界上に位置合せされる必 要のある、18 バイトの LongLong と呼ばれる固定長の不透明 (OPAQUE) 型を指 定します。 CREATE OPAQUE TYPE LongLong (INTERNALLENGTH=18, ALIGNMENT=1); CREATE OPAQUE TYPE 文に ALIGNMENT 修飾子を入れない場合は、デフォル トの位置合せは 4 バイト境界です。 パラメータの引渡し データベース サーバは、次のいずれかの方法で、不透明 (OPAQUE) 型の値を UDR に渡すことができます。 v 値による引渡し は、不透明 (OPAQUE) 型の実際の値を UDR に渡します。 v 参照による引渡し は、不透明 (OPAQUE) 型の値へのポインタを UDR に渡しま す。 デフォルトでは、データベース サーバは、すべての不透明 (OPAQUE) 型を参照に よって引き渡します。データベース サーバが不透明 (OPAQUE) 型を値で引き渡す ようにするには、 CREATE OPAQUE TYPE 文で PASSEDBYVALUE 修飾子を指 定する必要があります。値で引渡しのできる不透明 (OPAQUE) 型は、サイズが 4 バイト以下のものです。ただし、 DataBlade API データ型の mi_real は、長さが 4 バイトしかありませんが、常に参照によって引き渡されます。 次の CREATE OPAQUE TYPE 文は、 two_bytes の不透明 (OPAQUE) 型を値に より引き渡すことを指定します。 第 9 章 不透明 (OPAQUE) 型の作成 103 CREATE OPAQUE TYPE two_bytes (INTERNALLENGTH=2, ALIGNMENT=2, PASSEDBYVALUE); UDT と Java 間のマッピングの作成 ルーチン マネージャでは、UDR にパラメータを渡し、そこから戻される結果を取 得できるようにするために、SQL データ値と Java オブジェクト間のマッピングが 必要です。 SQL と Java のデータ型間マッピングは、 JDBC 仕様に従って実行さ れます。組込み SQL データ型の場合は、ルーチン マネージャでは、既存の JDBC データ型に対するマッピングを使用することができます。 ユーザ定義 SQL データ型と Java オブジェクト間のマッピングの作成: 1. SQLData インターフェイスを実装するユーザ定義クラスを作成する。(詳しく は、JDBC 2.0 の仕様を参照してください。) 2. setUDTExtName 組込みプロシジャを使用して、このユーザ定義クラスとユーザ 定義 SQL データ型をバインドする。 サポート関数の作成と登録 不透明 (OPAQUE) 型では、入出力、演算子関数、コスト関数、選択水準関数、演算 子クラス関数、および統計情報関数に対して、型変換 (キャスト) を提供するサポー ト関数が必要です。これらの関数の詳細については、 115 ページの『第 10 章 サ ポート関数の作成』および 139 ページの『第 11 章 演算子クラスの拡張』を参照 してください。 データベースへの不透明 (OPAQUE) 型の登録 不透明 (OPAQUE) 型の内部構造体とサポート関数を作成した後、次の SQL 文を使 用してそれらをデータベースに登録してください。 v CREATE OPAQUE TYPE 文は、不透明 (OPAQUE) 型を型として登録します。 v CREATE FUNCTION 文は、サポート関数を登録します。 v CREATE CAST 文は、サポート関数をキャスト関数として登録します。 不透明 (OPAQUE) 型の登録 データベース内に不透明 (OPAQUE) 型を作成するには、データベースに対する Resource 特権を持っている必要があります。 CREATE OPAQUE TYPE 文は、デー タベースに不透明 (OPAQUE) 型を登録します。データベースに対して、次の情報を 提供します。 v 不透明 (OPAQUE) 型の名前と所有者 不透明 (OPAQUE) 型の名前は、SQL 文が使用する型の名前です。不透明 (OPAQUE) 型の内部構造体の名前である必要はありません。型を不透明 (OPAQUE) 型として識別するために、特別なプレフィックスを作成すると役立ち ます。不透明 (OPAQUE) 型の名前は、ネーム スペース内で一意である必要があ ります。 v 不透明 (OPAQUE) 型のサイズ INTERNALLENGTH 修飾子を使用して、このサイズ情報を指定します。この修飾 子は、型が固定長の不透明 (OPAQUE) 型であるか、可変長の不透明 (OPAQUE) 型であるかを指示します。詳しくは、101 ページの『C の内部構造体の作成』を 参照してください。 104 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v 異なる不透明 (OPAQUE) 型修飾子の値 CREATE OPAQUE TYPE 文は、不透明 (OPAQUE) 型について、MAXLEN、 PASSEDBYVALUE、CANNOTHASH、および ALIGNMENT の修飾子を指定する ことができます。この情報は、不透明 (OPAQUE) 型の内部構造体を作成すると きに決定します。詳しくは、101 ページの『C の内部構造体の作成』を参照して ください。 CREATE OPAQUE TYPE 文は、この情報を sysxtdtypes システム カタログ表に 保管します。 sysxtdtypes に新規の不透明 (OPAQUE) 型を保管する場合、 CREATE OPAQUE TYPE 文は、拡張識別子 と呼ばれる固有値を不透明 (OPAQUE) 型に割り当てます。システム カタログの中では、不透明 (OPAQUE) 型は、名前で なく拡張識別子によって識別されます。(sysxtdtypes システム カタログの列の詳 細については、「IBM Informix: SQL ガイド: 参照」のシステム カタログ表に関す る章を参照してください。) データベース内に新規の不透明 (OPAQUE) 型を登録するには、データベースに対す る Resource 特権を持っている必要があります。デフォルトでは、新規の不透明 (OPAQUE) 型は、所有者に割り当てられた Usage アクセス権を持っています。不透 明 (OPAQUE) 型のアクセス権を変更する方法については、 106 ページの『不透明 (OPAQUE) 型への特権の付与』を参照してください。 CREATE OPAQUE TYPE 文、CREATE FUNCTION 文、および CREATE FUNCTION FROM 文の構文の詳細については、「IBM Informix: SQL ガイド: 構 文」の説明を参照してください。 不透明 (OPAQUE) 型の型変換の作成 次の表の各サポート関数では、データベース サーバは、型変換を使用して不透明 (opaque) 型を特定の内部データ型に変換します。 サポート関数 output 元の型 ラージ可変長文字 (LVARCHAR) 型 不透明 (OPAQUE) 型 receive send import export importbinary exportbinary streamread streamwrite SENDRECV 型 不透明 (OPAQUE) IMPEXP 型 不透明 (OPAQUE) IMPEXPBIN 型 不透明 (OPAQUE) STREAM 型 不透明 (OPAQUE) input 型 型 型 型 型変換後の型 不透明 (OPAQUE) 型 型変換のタイプ 暗黙的 ラージ可変長文字 (LVARCHAR) 型 不透明 (OPAQUE) SENDRECV 型 不透明 (OPAQUE) IMPEXP 型 不透明 (OPAQUE) IMPEXPBIN 型 不透明 (OPAQUE) STREAM 型 明示的 型 型 型 型 暗黙的 明示的 暗黙的 明示的 暗黙的 明示的 暗黙的 明示的 データベース サーバが上記の型変換を実行できるようにするには、 CREATE CAST 文を使用して型変換を作成する必要があります。型変換を作成すると、デー タベース サーバは、ラージ可変長文字 (LVARCHAR) 型、SENDRECV 型、 IMPEXP 型、IMPEXPBIN 型、または STREAM 型との間で不透明 (OPAQUE) 型 を型変換する必要があるときに、適切なサポート関数を呼び出すことができます。 第 9 章 不透明 (OPAQUE) 型の作成 105 CREATE CAST 文は、キャスト関数に関する情報を syscasts システム カタログ 表に保管します。 CREATE CAST 文の詳細については、「IBM Informix: SQL ガイ ド: 構文」での説明を参照してください。型変換の説明については、 「IBM Informix: SQL ガイド: チュートリアル」を参照してください。 非行内ストレージの使用 不透明 (OPAQUE) 型は、次のタイプの非行内ストレージを使用することができま す。 v スマート ラージ オブジェクト (BLOB および CLOB) v ファイル v ローカル コンピュータに依存する非行内ストレージ タイプ このストレージ タイプの例として、磁気テープ ストレージ システムへの参照が あります。 v データベース サーバに依存しない非行内ストレージ タイプ このストレージ タイプの例として、コンピュータの位置を含むファイル参照があ ります。この場合、ユーザは、参照が保管されているデータベース サーバをバイ パスして、直接、指定されたコンピュータを参照します。 不透明 (OPAQUE) 型をサポートするルーチンは、以下のことを行う必要がありま す。 v ストレージ ハンドルにロケーション情報用のスペースを組み込む ロケーション情報にはデータベース サーバ名が含まれている必要があります。ま た、型が特定のデータベースに依存する場合は、データベース名も含まれている 必要があります。 v server-send サポート関数を組み込むために、ストレージ ハンドルとの間で、ロケ ーション情報の設定と取得を行うルーチンを提供する v アクセス ルーチンにリモート データに対するサポートを提供する 例えば、オープン ルーチンは、リモート データベース サーバへの参照を認識 し、リモート データベース サーバに適切にアクセスする必要があります。 不透明 (OPAQUE) 型への特権の付与 不透明 (OPAQUE) 型を作成して、データベースに登録した後、 GRANT 文を使用 して、この型に次の特権を定義します。 v 不透明 (OPAQUE) 型の使用に関する特権 v 不透明 (OPAQUE) 型のサポート関数に関する特権 CREATE OPAQUE TYPE 文は、不透明 (OPAQUE) 型の所有者および DBA に Usage 特権が付与された新規の不透明 (OPAQUE) 型を作成します。SQL 文で不透 明 (OPAQUE) 型を使用するには、Usage 特権を持っている必要があります。所有者 は、GRANT 文の USAGE ON TYPE 節を使用して、その他のユーザに Usage 特権 を付与することができます。 データベース サーバは、SQL 文に不透明 (OPAQUE) 型の名前 (CREATE TABLE における列 (column) 型または CREATE CAST におけるキャスト (cast) 型など) が 出現すると必ず Usage 特権を検査します。SQL 文が次のことを実行する場合、デ ータベース サーバは Usage 特権を検査しません。 106 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v 不透明 (OPAQUE) 型の列にアクセスする Select、Insert、Update、および Delete の表レベルの特権が列に対する特権を決定 します。 v 不透明 (OPAQUE) 型を引数として持つ UDR を呼び出す Execute ルーチン 特権が UDR への特権を決定します。 例えば、次の GRANT 文は、 circle 不透明 (OPAQUE) 型に関する Usage 特権を ユーザ dexter に割り当てます。 GRANT USAGE ON TYPE circle TO dexter sysxtdtypeauth システム カタログ表は、データ型レベルの特権を保管します。こ の表には、データベースで定義されている不透明 (OPAQUE) 型および ディスティ ンクト (DISTINCT) 型のそれぞれについての特権が含まれています。この表には、 付与された特権の各セットごとに 1 行が含まれています。 サポート関数の特権の設定については、 118 ページの『サポート関数に対する特権 の設定』を参照してください。 SQL 呼出し関数の作成 SQL 呼出し関数 は、エンド ユーザが SQL 文で明示的に呼び出すことのできるユ ーザ定義関数です。次の方法で SQL 呼出し関数を作成し、不透明 (OPAQUE) 型の 機能を拡張することができます。 v 算術演算関数または組込み関数をオーバーロードし、不透明 (OPAQUE) 型に関 する算術演算関数および組込み関数を提供する v 関係演算子関数をオーバーロードし、不透明 (OPAQUE) 型に関する比較演算を 提供する v 新規のエンド ユーザ ルーチンを作成し、不透明 (OPAQUE) 型の追加機能を提 供する v 新規のキャスト関数を作成し、不透明 (OPAQUE) 型との間での追加のデータ変 換を提供する データベース サーバが定義する SQL 関数は、組込み型を処理します。UDT がこ れらの関数を使用できるようにするには、UDT を処理する関数をオーバーロードし ます。ユーザ定義関数を作成する方法の詳細については、 37 ページの『第 4 章 ユーザ定義ルーチンの開発』を参照してください。関数のオーバーロードについて は、25 ページの『ルーチンのオーバーロード』を参照してください。 データベース サーバは、SQL 文の式内のデータを操作できるようにする、次のタ イプの SQL 呼出し関数をサポートします。 v 算術演算子関数およびテキスト演算子関数 v 組込み関数 v 集計関数 データベース サーバは、SQL 文の式内のデータを比較できるようにする、次のタ イプの関数もサポートします。 v 条件節内の SQL 演算子 v 関係演算子関数 第 9 章 不透明 (OPAQUE) 型の作成 107 不透明 (OPAQUE) 型の算術演算子関数とテキスト演算子関数 データベース サーバには、算術演算子 (72 ページの『算術演算子』を参照) とテキ スト演算子 (72 ページの『テキスト演算子』を参照) の演算子関数が用意されてい ます。データベース サーバが提供する演算子関数は、組込み型を処理します。演算 子関数をオーバーロードして、新規の不透明 (OPAQUE) 型に関する関連操作を提供 することができます。 演算子関数をオーバーロードする場合は、次の規則に従ってください。 1. 演算子関数の名前は、データベース サーバが提供する関数のいずれかの名前に 一致する必要がある。名前には大文字小文字の区別はありません。 plus() 関数 は Plus() 関数と同じです。 2. 演算子関数は、正しい数のパラメータを処理する必要がある。 3. 演算子関数は、該当する場合、正しい型を戻す必要がある。 不透明 (OPAQUE) 型の組込み関数 データベース サーバには、幾つかの基本的数学操作を実行できるようにする、組込 み関数 と呼ばれる特別な SQL 呼出し関数が提供されています。データベース サ ーバが提供する組込み関数は、組込み型を処理します。組込み関数をオーバーロー ドして、新規の不透明 (OPAQUE) 型に関する関連操作を実行することができます。 組込み関数をオーバーロードする場合は、次の規則に従ってください。 1. 組込み関数の名前は、74 ページの『オーバロード可能な組込み関数』にリスト された名前と一致する必要がある。ただし、名前には大文字小文字の区別はあり ません。 abs() 関数は Abs() 関数と同じです。 2. 組込み関数は、上書き可能な組込み関数である必要がある。 3. 組込み関数は正しい数のパラメータを処理し、これらのパラメータは正しい型を 持っている必要がある。 4. 組込み関数は、該当する場合、正しい型を戻す必要がある。 組込み関数の詳細については、「IBM Informix: SQL ガイド: 構文」を参照してくだ さい。 不透明 (OPAQUE) 型の集計関数 SUM および AVG などの組込み集計関数を拡張して、不透明 (OPAQUE) 型を操作 することができます。新規の集計関数を作成することもできます。85 ページの『第 8 章 ユーザ定義集計関数の作成』では、集計関数の拡張または作成の方法が説明さ れています。 不透明 (OPAQUE) 型の条件演算子 データベース サーバは、SQL 文の条件節において、不透明 (OPAQUE) 型に関する 次の関係演算子をサポートします。 v IS 演算子および IS NOT 演算子 v equal() 関数が定義されている場合は、IN 演算子 v compare() 関数が定義されている場合は、BETWEEN 演算子 ヒント: データベース サーバは、compare() 関数をデフォルトの B ツリー演算子 クラスのサポート関数としても使用します。詳しくは、143 ページの 『btree_ops 演算子クラスの拡張機能』を参照してください。 108 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 条件節の詳細については、「IBM Informix: SQL ガイド: 構文」の『条件セグメン ト』を参照してください。compare() 関数の詳細については、 110 ページの『不 透明 (OPAQUE) 型の比較関数』を参照してください。 不透明 (OPAQUE) 型の関係演算子 データベース サーバには、72 ページの『関係演算子』にリストされた関係演算子 の演算子関数が用意されています。データベース サーバが提供する関係演算子関数 は、組込み型を処理します。関係演算子関数をオーバーロードして、新規の不透明 (OPAQUE) 型に関する関連操作を提供することができます。 関係演算子関数をオーバーロードする場合は、次の規則に従ってください。 1. 関係演算子関数の名前は、72 ページの『関係演算子』にリストされた名前と一 致する必要がある。ただし、名前には大文字小文字の区別はありません。 equal() 関数は Equal() 関数と同じです。 2. 関係演算子関数は、両方とも不透明 (OPAQUE) 型の 2 つのパラメータを取る必 要がある。 3. 関係演算子関数はブール関数である必要がある。つまり、関係演算子関数は BOOLEAN 値を戻します。 不透明 (OPAQUE) 型の列を次のように処理できるようにするには、 equal() 関数 を定義して、この型を処理する必要があります。 v UNIQUE または PRIMARY KEY として制約する 制約の詳細については、「IBM Informix: SQL ガイド: 構文」の 『CREATE TABLE 文』を参照してください。 v 式において equal (=) 演算子を使用して比較する v 条件において IN 演算子と一緒に使用する ハッシュ可能な型: データベース サーバは、組込みビット ハッシュ関数を使用し て型のハッシュ値を生成します。つまり、組込みハッシュ関数は、ビット ハッシュ 可能な型にのみ使用できます。不透明 (OPAQUE) 型がビット ハッシュ可能ではな い 場合、データベース サーバは、等比較に組込みハッシュ関数を使用することは できません。したがって、型がビット ハッシュ可能でない場合は、次の場合にその 型を使用することはできません。 v SELECT 文の GROUP BY 節内で使用する v ハッシュ結合内で使用する v WHERE 節の IN 演算子と一緒に使用する v COUNT DISTINCT 集計関数において使用する ハッシュ不可能な型: データベース サーバの組込みハッシュ関数を使用するビッ ト ハッシュ不可能な不透明 (OPAQUE) 型の場合は、CREATE OPAQUE TYPE 文 で CANNOTHASH 修飾子を指定します。 ハッシュ可能な型は、A = B が成り立てば、hash(A) = hash(B) が成り立つという 特性を持っています。つまり、A と B は同一のビット表記になります。 複数の表現が可能な型はビット ハッシュ可能ではありません。このような型は、大 量のデータをスマート ラージ オブジェクトに保管し、ラージ オブジェクト ハン ドルをユーザ定義型に保管するからです。スマート ラージ オブジェクト ハンドル 第 9 章 不透明 (OPAQUE) 型の作成 109 のために、複数の表現が可能な型はハッシュ不可能になります。つまり、複数の表 現が可能な型の CREATE OPAQUE TYPE 文には、 CANNOTHASH 修飾子が含ま れている必要があります。 不透明 (OPAQUE) 型の比較関数 compare() 関数は、ターゲット データ型をソートする SQL 呼出し関数です。デー タベース サーバは、compare() 関数を使用して、SELECT 文の次の節とキーワー ドを実行します。 v ORDER BY 節 v UNIQUE および DISTINCT キーワード v UNION キーワード データベース サーバは、SQL 文の条件において、 BETWEEN 演算子を評価する場 合にも compare() 関数を使用します。条件節の詳細については、「IBM Informix: SQL ガイド: 構文」の条件セグメントを参照してください。 データベース サーバには、組込み型を処理する compare() 関数が用意されていま す。データベース サーバが不透明 (OPAQUE) 型をソートするには、この不透明 (OPAQUE) 型を処理する compare() 関数を定義する必要があります。 compare() 関数をオーバーロードする場合は、次の規則に従ってください。 1. 関数の名前は compare() とする必要がある。名前には大文字小文字の区別はあ りません。compare() 関数は、 Compare() 関数と同じです。 2. 関数は、比較の対象となる 2 つの型を引数として受け取る必要がある。 3. 関数は、次に示すような、比較結果を示す整数値を戻す必要がある。 v <0 は、最初の引数が 2 番目の引数より前にあることを示す。 v 0 は、2 つの引数が等しいことを示す。 v >0 は、最初の引数が 2 番目の引数の後にあることを示す。 compare() 関数は、B ツリー 2 次アクセス方式のデフォルト演算子クラスのサポ ート関数でもあります。詳しくは、140 ページの『汎用 B ツリー インデックス』 を参照してください。 アクセス方式のカスタマイズ データベース サーバには、汎用 B ツリー 2 次アクセス方式の完全なインプリメン テーション、および R ツリー 2 次アクセス方式の定義が用意されています。デフ ォルトでは、 CREATE INDEX 文は、列またはユーザ定義関数の汎用 B ツリー イ ンデックスを作成します。 不透明 (OPAQUE) 型を作成する場合は、新しい型をサポートする 2 次アクセス方 式が必ず存在している必要があります。2 次アクセス方式およびそれによる不透明 (OPAQUE) 型のサポートについて、次の点を確認してください。 v 汎用 B ツリーは不透明 (OPAQUE) 型をサポートしているか ? v 不透明 (OPAQUE) 型データがスペーシャル (空間) データの場合、R ツリー イ ンデックスを使用できるか ? 110 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v 不透明 (OPAQUE) 型データのインデックス作成をより適切に行うその他の 2 次 アクセス方式が存在するか ? 不透明 (OPAQUE) 型の列に関して、特定の 2 次アクセス方式のインデックスを作 成するには、データベース サーバは、2 次アクセス方式に関連した演算子クラスを 見付ける必要があります。この演算子クラスは、不透明 (OPAQUE) 型の操作 (スト ラテジ関数)、および 2 次アクセス方式が使用する関数 (サポート関数) を指定する 必要があります。 演算子クラスと演算子クラス関数の詳細については、 141 ページの『演算子クラ ス』を参照してください。 汎用 B ツリーの使用 汎用 B ツリー 2 次アクセス方式には btree_ops というデフォルトの演算子クラ スがあります。この演算子クラス関数は、組込み型のインデックス作成を行いま す。この演算子クラス関数は、組込み型についての次の機能を持っています。 v データを辞書式順序で順序付ける。 この順序が、使用する不透明 (OPAQUE) 型にとって論理的ではない場合、必要 な順序を提供する不透明 (OPAQUE) 型の演算子クラス関数を定義することがで きます。 v 特定の型の 2 つの単一の 1 次元値を比較できる。 不透明 (OPAQUE) 型が複数の値を保持するが、それに対して単一値を定義でき る場合は、これらの 1 次元値の 2 つの値を比較する不透明 (OPAQUE) 型の演 算子クラス関数を定義することができます。不透明 (OPAQUE) 型の 1 次元値を 定義できない場合は、 B ツリー インデックスを 2 次アクセス方式として使用す ることはできません。 不透明 (OPAQUE) 型の列およびユーザ定義関数のサポートを提供するために、新規 の不透明 (OPAQUE) 型を処理できるように、 btree_ops 演算子クラス関数を拡張 することができます。汎用 B ツリー 2 次アクセス方式は、新規の演算子クラス関 数を使用して、不透明 (OPAQUE) 型の値を B ツリー インデックスに保管しま す。 デフォルトの B ツリー演算子クラスを拡張する方法の詳細については、 143 ペー ジの『btree_ops 演算子クラスの拡張機能』を参照してください。 その他のアクセス方式の使用 汎用 B ツリー 2 次アクセス方式がデータを順序付ける方法は、 1 次元データの場 合に役立ちます。データ型が 1 次元ではないときは、場合により、その他のアクセ ス方式を使用する必要があります。 R ツリー アクセス方式については、「IBM Informix: R-Tree Index User’s Guide」 を参照してください。Data Blade モジュールが提供する 2 次アクセス方式の詳細に ついては、 DataBlade モジュールのユーザ ガイドを参照してください。 スペーシャル (空間) データのインデックス作成 R ツリー 2 次アクセス方式は、地図や図形などのスペーシャル データまたは多次 元データの場合に役立ちます。R ツリー インデックスを使用するには、 R ツリー 第 9 章 不透明 (OPAQUE) 型の作成 111 インデックスを実装する spatial DataBlade モジュール、 Geodetic DataBlade モジュ ール、またはサード パーティ製の DataBlade モジュールなどの、スペーシャル DataBlade モジュールをインストールする必要があります。詳しくは、カスタム ア クセス方式についてのユーザ マニュアルを参照してください。 その他の型のデータのインデックス作成 使用する不透明 (OPAQUE) 型には、汎用 B ツリーまたは R ツリーで最適にイン デックス作成できないデータが存在する場合があります。多くの場合、新規の不透 明 (OPAQUE) 型を定義する DataBlade モジュールにより、このような型のデータ について、独自の 2 次アクセス方式を提供できます。アクセス方式の作成について は、「IBM Informix: Virtual-Index Interface Programmer’s Guide」を参照してくださ い。 不透明 (OPAQUE) 型に関するその他の操作 このセクションでは、不透明 (OPAQUE) 型に対して実行できる次の操作について説 明します。 v クライアント アプリケーションから不透明 (OPAQUE) 型にアクセスする方法 v データベースから不透明 (OPAQUE) 型を削除する方法 不透明 (OPAQUE) 型へのアクセス 不透明 (OPAQUE) 型が作成された後、この型が登録されたデータベースに接続する と、次のクライアント プログラムはこの型を使用することができます。 v SQL 文、および ラージ可変長文字 (LVARCHAR) 型、固定バイナリ (FIXED BINARY) 型、可変長バイナリ (VAR BINARY) 型のホスト変数を使用する ESQL/C アプリケーション 詳しくは、「IBM Informix: ESQL/C Programmer’s Manual」の不透明 (OPAQUE) 型に関する章を参照してください。 v DataBlade API を使用する C ルーチン 詳しくは、「IBM Informix: DataBlade API Programmer’s Guide」を参照してくだ さい。 v SPL UDR 詳しくは、「IBM Informix: SQL ガイド: チュートリアル」の SPL に関する章を 参照してください。 v Java で作成されたクライアント アプリケーション データベースのその他のデータ型を使用するすべての方法で、不透明 (OPAQUE) 型 を使用することができます。 不透明 (OPAQUE) 型の廃棄 不透明 (OPAQUE) 型は、データベースにおいてそれに対する依存性が存在している 場合は、削除することはできません。したがって、データベースから不透明 (OPAQUE) 型を削除するには、次のように、型の登録プロセスの逆を実行します。 1. データベースにある、不透明 (OPAQUE) 型を型として持つすべての列の型を削 除または変更します。 112 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ALTER TABLE 文を使用して、データベース列の型を変更します。DROP TABLE 文を使用して、表全体を削除します。 2. USAGE ON TYPE 節を持った REVOKE 文は、不透明 (OPAQUE) 型に割り当 てられた 1 セットの特権を削除します。 この文は、不透明 (OPAQUE) 型の特権を定義する、sysxtdtypeauth システム カタログ表の行を削除します。この文を使用して、不透明 (OPAQUE) 型に割り 当てられた特権の各セットを削除してください。 3. EXECUTE ON FUNCTION 節または EXECUTE ON ROUTINE 節を持った REVOKE 文は、不透明 (OPAQUE) 型のサポート関数に割り当てられた特権を削 除します。 この文は、不透明 (OPAQUE) 型の特権を定義する、 sysprocauth システム カ タログ表の行を削除します。この文を使用して、サポート関数に割り当てられた 特権の各セットを削除してください。各サポート関数の特権を削除する必要があ ります。サポート関数に固有名を指定した場合は、 SPECIFIC キーワードを使用 して、固有名を識別してください。 4. DROP CAST 文は、不透明 (OPAQUE) 型のサポート関数についてのキャスト関 数を削除します。 この文は、サポート関数のキャスト関数を定義する、 syscasts システム カタ ログ表の行を削除します。この文を使用して、定義した各型変換を削除してくだ さい。詳しくは、 105 ページの『不透明 (OPAQUE) 型の型変換の作成』を参照 してください。 5. DROP FUNCTION 文または DROP ROUTINE 文は、現行のデータベースから不 透明 (OPAQUE) 型のサポート関数を削除します。 この文は、サポート関数を登録する、 sysprocedures システム カタログ表の 行を削除します。この文を使用して、登録した各サポート関数を削除してくださ い。 6. DROP TYPE 文は、現行のデータベースから不透明 (OPAQUE) 型を削除しま す。 この文は、不透明 (OPAQUE) 型を説明する、 sysxtdtypes システム カタログ 表の行を削除します。データベースから不透明 (OPAQUE) 型を削除した後は、 データベースのユーザは、その型にアクセスすることはできません。型を削除す るには、不透明 (OPAQUE) 型の所有者であるか、 DBA 特権を持っている必要 があります。 上記の SQL 文を使用するには、ユーザは、削除するオブジェクトの所有者である か、DBA 特権を持っている必要があります。REVOKE 文、 DROP FUNCTION 文、 DROP ROUTINE 文、DROP CAST 文、および DROP TYPE 文の構文の詳細 については、「IBM Informix: SQL ガイド: 構文」の説明を参照してください。 第 9 章 不透明 (OPAQUE) 型の作成 113 114 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 10 章 サポート関数の作成 サポート関数の作成 . . . . . . . . . . . . . サポート関数の識別 . . . . . . . . . . . . 関数パラメータの選択 . . . . . . . . . . . サポート関数に対する特権の設定. . . . . . . . サポート関数の型 . . . . . . . . . . . . . . ラージ可変長文字 (LVARCHAR) 型 . . . . . . . SENDRECV 型 . . . . . . . . . . . . . . 外部表現の処理. . . . . . . . . . . . . . . input サポート関数 . . . . . . . . . . . . output サポート関数 . . . . . . . . . . . . 内部表現の処理. . . . . . . . . . . . . . . send および receive サポート関数 . . . . . . . SENDRECV 型 . . . . . . . . . . . . . receive サポート関数 . . . . . . . . . . . send サポート関数. . . . . . . . . . . . 一括コピーの実行 . . . . . . . . . . . . . . import および export サポート関数 . . . . . . . IMPEXP 型 . . . . . . . . . . . . . . import サポート関数 . . . . . . . . . . . export サポート関数 . . . . . . . . . . . importbinary および exportbinary サポート関数 . . . IMPEXPBIN 型 . . . . . . . . . . . . . importbinary サポート関数 . . . . . . . . . exportbinary サポート関数 . . . . . . . . . stream サポート関数 . . . . . . . . . . . . データの挿入と削除 . . . . . . . . . . . . . assign() 関数. . . . . . . . . . . . . . . destroy() 関数 . . . . . . . . . . . . . . update() 関数 . . . . . . . . . . . . . . deepcopy() 関数. . . . . . . . . . . . . . スマート ラージ オブジェクトの処理 . . . . . . . データの比較 . . . . . . . . . . . . . . . ロケールを区別するデータの処理 (GLS のみ) . . . . ロケールを区別する input および output サポート関数 ロケールを区別する receive および send サポート関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 116 117 118 118 119 119 119 120 122 123 124 124 124 125 126 127 127 128 128 128 129 129 130 130 130 131 132 132 133 134 135 135 136 137 本章の内容 本章では、不透明 (opaque) 型および演算子クラスのサポート関数について説明しま す。 サポート関数の作成 不透明 (opaque) 型のサポート関数は、データベース サーバが自動的に呼び出す、 明確に定義された型固有の関数のセットです。一般に、SQL 文ではこれらの関数は 明示的には呼び出されません。 © Copyright IBM Corp. 1996, 2003 115 サポート関数の識別 次の表に、不透明 (OPAQUE) 型のサポート関数の概要を示します。 関数 目的 参照先 input 不透明 (OPAQUE) 型のデータを、外部テキスト表現から内 部表現に変換します。テキスト形式のデータを不透明 (OPAQUE) 型の列に挿入することができます。ラージ可変長 文字 (LVARCHAR) 型から不透明 (OPAQUE) 型への暗黙的 キャストを必要とします。 不透明 (OPAQUE) 型のデータを、内部表現から外部テキス ト表現に変換します。データを不透明 (OPAQUE) 型の列か ら外部テキスト形式で選択することができます。不透明 (opaque) 型からラージ可変長文字 (LVARCHAR) 型の不透明 (opaque) 型への明示的キャストを必要とします。 不透明 (OPAQUE) 型のデータを、クライアント コンピュー タの外部バイナリ表現から、データベース サーバ コンピュ ータの内部表現に変換します。バイナリ形式のデータを不透 明 (OPAQUE) 型の列に挿入することができます。 SENDRECV 型から不透明 (OPAQUE) 型への暗黙的キャス トを必要とします。 不透明 (OPAQUE) 型データを、データベース サーバ コン ピュータの内部表現からクライアント コンピュータの外部 バイナリ表現に変換します。不透明 (OPAQUE) 型の列から バイナリ形式のデータを選択できます。不透明 (opaque) 型 から SENDRECV 型への明示的キャストを必要とします。 不透明 (OPAQUE) 型の列のテキスト データを一括ロードす るために、不透明 (OPAQUE) 型のデータを処理します。 IMPEXP 型から不透明 (OPAQUE) 型への暗黙的キャストを 必要とします。 不透明 (OPAQUE) 型の列からテキスト データを一括アンロ ードするために、不透明 (OPAQUE) 型のデータを処理しま す。不透明 (OPAQUE) 型から IMPEXP 型への明示的キャ ストを必要とします。 不透明 (OPAQUE) 型の列のバイナリ形式のデータを一括ロ ードするために、不透明 (OPAQUE) 型のデータを処理しま す。IMPEXPBIN 型から不透明 (OPAQUE) 型への暗黙的キ ャストを必要とします。 不透明 (OPAQUE) 型の列からバイナリ形式のデータを一括 アンロードするために、不透明 (OPAQUE) 型データを処理 します。不透明 (OPAQUE) 型から IMPEXPBIN 型への明示 的キャストを必要とします。 不透明 (OPAQUE) 型のデータを、ストリーム表現からデー タベース サーバの内部表現に変換します。 不透明 (OPAQUE) 型のデータを、データベース サーバの内 部表現からストリーム表現に変換します。 データベース サーバが不透明 (OPAQUE) 型のデータをディ スクに保存する前に、必要な処理を実行します。INSERT 文、UPDATE 文、および LOAD 文に対して、不透明 (OPAQUE) 型データを格納することができます。 不透明 (OPAQUE) 型を含む行をデータベース サーバが削除 する前に、必要な処理を実行します。 120 ページ output receive send import export importbinary exportbinary streamread streamwrite assign destroy 116 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 122 ページ 124 ページ 125 ページ 128 ページ 128 ページ 129 ページ 130 ページ 131 ページ 132 ページ 関数 目的 参照先 lohandles 埋込みラージ オブジェクトのハンドルのリストを不透明 (OPAQUE) 型で戻します。 ORDER BY、UNIQUE、DISTINCT、および UNION 節、お よび BETWEEN 比較での不透明 (OPAQUE) 型をサポート しています。さらに、B ツリー インデックスに対する CREATE INDEX をサポートしています。 複数表現型を関数の戻り値としてサポートしています。 スマート ラージ オブジェクトに対するインプレース更新を サポートしています。 134 ページ compare deepcopy update 135 ページ 132 ページ 132 ページ ほとんどのサポート関数には、任意の名前を付けることができます。データベース サーバは、実行する必要のあるタスクによって、サポート関数を識別します。例え ば、クライアントがバイナリ値を INSERT にバインドしていると、データベース サーバは、UDT 値をその外部バイナリ形式 (SENDRECV) から不透明 (OPAQUE) 型に変換するキャスト関数を、syscasts システム カタログ表から探します。 compare()、assign()、destroy()、update()、および deepcopy() の各関数は、明 示的に命名する必要があります。ただし、名前は大文字と小文字を区別しません。 すなわち、関数 compare() は、Compare() と命名することもできます。 サポート関数には、その目的を記録しておくのに役立つ名前を付けることをお勧め します。例えば、不透明 (OPAQUE) 型が sphere という名前であれば、receive 関 数および send 関数を sphere_receive() および sphere_send() と命名します。 優れたパフォーマンスを得るために、可能な場合は必ず、サポート関数は NOT VARIANT として作成してください。バリアント関数および非バリアント関数につ いては、40 ページの『バリアントまたは非バリアントの戻り値』を参照してくださ い。 関数パラメータの選択 次の表に、サポート関数を登録する CREATE FUNCTION 文のパラメータ リスト および戻りの型に対する SQL の型の要約を示します。 サポート 関数 パラメータ 型 input 戻りの型 参照先 ラージ可変長文字 (LVARCHAR) 型 不透明 (opaque) 型 120 ページ output 不透明 (opaque) 型 ラージ可変長文字 (LVARCHAR) 型 122 ページ receive sendrecv 型 不透明 (opaque) 型 124 ページ send 不透明 (opaque) 型 sendrecv 型 124 ページ import impexp 不透明 (opaque) 型 127 ページ export 不透明 (opaque) 型 impexp 127 ページ importbinary impexPbin 型 不透明 (opaque) 型 128 ページ exportbinary 不透明 (opaque) 型 impexpbin 型 128 ページ assign 不透明 (opaque) 型 不透明 (opaque) 型 131 ページ 第 10 章 サポート関数の作成 117 サポート 関数 パラメータ 型 戻りの型 参照先 destroy 不透明 (opaque) 型 - 戻り値なし - 132 ページ update 不透明 (OPAQUE) 型、 不透明 (OPAQUE) 型 不透明 (opaque) 型 132 ページ deepcopy 不透明 (opaque) 型 lohandles 不透明 (opaque) 型 - ポインタのリスト - 134 ページ compare ユーザ定義型、 ユーザ定義型 - より小、より大、および等しい を示す整数値 - 135 ページ 133 ページ 上記の表で、不透明 (OPAQUE) 型 は、CREATE OPAQUE TYPE 文で指定する型 の名前です。詳しくは、104 ページの『不透明 (OPAQUE) 型の登録』を参照してく ださい。 CREATE FUNCTION 文により新規のサポート関数が sysprocedures に格納され ると、この文によりデータベース サーバがルーチン識別子 と呼ばれる一意の値を そのサポート関数に割り当てます。サポート関数は、システム カタログ全体にわた って、その名前ではなく、そのルーチン識別子で識別されます。 サポート関数に対する特権の設定 CREATE FUNCTION 文は、サポート関数の所有者および DBA に付与されている Execute 特権を持つ関数を登録します。そのような関数は、所有者特権付き関数 と 呼ばれます。 SQL 文でサポート関数を実行するには、ユーザに Execute 特権が必要になります。 通常、暗黙的な型変換であるサポート関数には、デフォルトの特権で十分です。そ れは、暗黙的キャストは一般に SQL 文内から呼び出してはいけないからです。明 示的キャストであるサポート関数には、Execute 特権が付与されている場合がありま すが、その場合はユーザはサポート関数を明示的に呼び出すことができます。所有 者は、GRANT 文の EXECUTE ON 節を使用して、Execute 特権を他のユーザに付 与します。 sysprocauth システム カタログ表は、ルーチン レベルの特権を格納しています。 この表には、UDR ごとに特権が格納されています。つまり、データベースで定義さ れているすべてのサポート関数に対する特権が格納されています。この表には、付 与されている特権のセットごとに 1 つの行が格納されています。 サポート関数の型 データベース サーバは、UDT および UDR で使用するための型を提供していま す。これらの型はデータベース サーバによって事前定義 されていますが、データ ベース サーバはそれらの型を拡張データ型として扱います。 sysxtdtypes システム カタログ表は、事前定義され、かつユーザ定義された拡張デ ータ型を記録しています。このセクションでは、特に UDT および UDR によって 使用される事前定義された型について説明します。 118 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ラージ可変長文字 (LVARCHAR) 型 データベース サーバはラージ可変長文字 (LVARCHAR) 型を使用して、データベー ス サーバとアプリケーションの間で、不透明 (OPAQUE) 型の外部テキスト表現を 転送します。不透明 (OPAQUE) 型の実際の内部バイナリ表現には、テキスト (TEXT) 型以外の型 (例えば、整数 (INTEGER) 型、あるいは倍精度浮動小数点 (DOUBLE) 型) が含まれている場合がありますが、外部テキスト形式のデータはラ ージ可変長文字 (LVARCHAR) 型です。 input および output サポート関数は、ラー ジ可変長文字 (LVARCHAR) 型および不透明 (OPAQUE) 型の間のキャスト関数と して機能します。 ヒント: 列 (column) 型としてラージ可変長文字 (LVARCHAR) 型を使用する場合 は、列のサイズは 2 KB に制限されます。ただし、ラージ可変長文字 (LVARCHAR) 型を使用して不透明 (OPAQUE) 型を転送する場合は、デー タ長は、使用しているオペレーティング・システムによってのみ制限され ます。 DataBlade API には、不透明 (OPAQUE) 型の外部表現を保持するための mi_lvarchar 型が用意されています。詳しくは、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 ESQL/C ESQL/C アプリケーションでは、ラージ可変長文字 (LVARCHAR) 型を使用して不 透明 (OPAQUE) 型の外部テキスト表現を転送します。データベース サーバは、ラ ージ可変長文字 (LVARCHAR) 型のホスト変数を含む SQL 文を受信すると、input および output サポート関数を暗黙的に呼び出します。 ESQL/C アプリケーションでは、可変長バイナリ (VARBINARY) 型を使用して、不 透明 (OPAQUE) 型の外部バイナリ表現を転送します。 ESQL/C の終り SENDRECV 型 不透明 (OPAQUE) 型を作成する場合には、クライアント コンピュータでのその内 部表現と、データベース サーバ コンピュータでのその内部表現との間で、不透明 (OPAQUE) 型を変換するサポート関数を提供する必要があります。これらの関数 は、入出力パラメータとして sendrecv 型を使用します。 外部表現の処理 すべての不透明 (OPAQUE) 型には、内部表現と外部表現があります。内部表現は、 不透明 (OPAQUE) 型に対して定義している内部構造体です。(詳しくは、98 ページ の『内部構造体』を参照してください。) 外部テキスト表現は、不透明 (OPAQUE) 型値の印刷可能バージョンである文字列です。不透明 (OPAQUE) 型は、外部バイナ リ表現を持つ場合もあります。 不透明 (OPAQUE) 型を定義する場合は、次のように、不透明 (OPAQUE) 型の内部 表現と外部表現の間で変換を行うサポート関数を提供する必要があります。 v input 関数は、外部テキスト表現を内部表現に変換します。 第 10 章 サポート関数の作成 119 v output 関数は、内部表現を外部テキスト表現に変換します。 これらのサポート関数の名前は、input および output にする必要はありませんが、 指定された変換を行う必要があります。これらの関数は、逆関数の関係にある必要 があります。つまり、input 関数は、output 関数が引数として受け取る値を生成する 必要があり、その逆も成り立っている必要があります。データベース サーバがこれ らのサポート関数を自動的に実行するためには、ラージ可変長文字 (LVARCHAR) 型から、input 関数を呼び出すユーザ定義型への暗黙的キャストを提供する必要があ ります。同様に、UDT から、output 関数を呼び出すラージ可変長文字 (LVARCHAR) 型への明示的キャストを提供する必要もあります。 データベース サーバでは、タスクを実行するための適切なサポート関数が見付から ない場合、エラーが発生します。例えば、アプリケーションが INSERT 文を使用し て外部テキスト形式の値を挿入しようとすると、データベース サーバはラージ可変 長文字 (LVARCHAR) 型からユーザ定義型への型変換を探します。その型変換が存 在していない場合は、データベースではエラーが発生します。 広域言語サポート 不透明 (OPAQUE) 型が、デフォルト以外のロケールで外部表現を受け取るために は、input および output 関数で IBM Informix GLS API を使用して、これらの関数 内から Informix ロケールにアクセスする必要があります。詳しくは、135 ページの 『ロケールを区別するデータの処理 (GLS のみ)』を参照してください。 広域言語サポート の終り input サポート関数 データベース サーバは、クライアント アプリケーションから不透明 (OPAQUE) 型 の外部表現を受け取ると、input 関数を呼び出します。例えば、クライアント アプ リケーションは、INSERT 文または UPDATE 文を発行した場合には、不透明 (OPAQUE) 型のテキスト表現をデータベース サーバに送信して、それを不透明 (OPAQUE) 型の列に格納することができます。データベース サーバは input 関数を 呼び出して、この外部表現を、データベース サーバがディスクに保管している内部 表現に変換します。 図 11 は、データベース サーバがどの時点で input サポート関数を実行するかを示 したものです。 120 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 図 11. input サポート関数の実行 不透明 (OPAQUE) 型が参照によって受け渡される場合は、input サポート関数は次 のタスクを実行する必要があります。 v 内部表現を保持するのに十分な領域を割り当てる。 C 言語サポート input サポート関数は、mi_alloc() DataBlade API 関数を使用して、内部構造体用 の領域を割り当てることができます。 C 言語サポート の終り v 入力文字列を構文解析する。 入力文字列から個々のメンバを取得し、それらを内部構造体の該当するフィール ドに格納する必要があります。 v 内部構造体へのポインタを戻します。 不透明 (OPAQUE) 型が値によって受け渡される場合は、input サポート関数は上と 同じ基本タスクを実行する必要がありますが、内部構造体へのポインタではなく、 内部構造体内の実際の値を戻す必要があります。値による受け渡しを使用できるの は、長さが 4 バイト未満の不透明 (OPAQUE) 型の場合だけです。 C 言語サポート input 関数は mi_lvarchar 値を引数として取り、不透明 (OPAQUE) 型の内部構造 体を戻します。次の関数シグネチャは、内部構造体が ll_longlong_t の固定長不透 明 (OPAQUE) 型の input サポート関数です。 ll_longlong_t * ll_longlong_input(mi_lvarchar *extrnl_format); ll_longlong_input() 関数は、ラージ可変長文字 (LVARCHAR) 型から ll_longlong_t 内部構造体へのキャスト関数です。この関数は、CREATE IMPLICIT CAST 文を使用して、暗黙的キャスト関数として登録されている必要があります。 キャスト関数についての詳細は、105 ページの『不透明 (OPAQUE) 型の型変換の作 成』を参照してください。 C 言語サポート の終り 第 10 章 サポート関数の作成 121 output サポート関数 データベース サーバは、クライアント アプリケーションに不透明 (OPAQUE) 型の 外部表現を送信する際に、output 関数を呼び出します。例えば、クライアント アプ リケーションが SELECT 文または FETCH 文を発行すると、このアプリケーショ ンは、データベース サーバから文字 (CHARACTER) 型のホスト変数で受け取った 不透明 (OPAQUE) 型のデータを格納することができます。データベース サーバ は、output 関数を呼び出して、ディスクに保管されている内部表現を文字 (CHARACTER) ホスト変数が要求する外部表現に変換します。 図 12 は、データベース サーバがどの時点で output サポート関数を実行するかを 示したものです。 図 12. output サポート関数の実行 不透明 (OPAQUE) 型が参照によって受け渡される場合は、output サポート関数は次 のタスクを実行する必要があります。 v 内部表現へのポインタを引数として受け取る。 v 外部表現を保持するのに十分な領域を割り当てる。 C 言語サポート output サポート関数は、mi_alloc() 関数を使用して、文字列に領域を割り当てる ことができます。メモリ管理および mi_alloc() 関数については、 「IBM Informix: DataBlade API Programmer’s Guide」および「IBM Informix: DataBlade API Function Reference」を参照してください。 C 言語サポート の終り v 内部構造体の個々のメンバから出力ストリングを作成する。 この関数は、内部構造体の該当するフィールドの値を使用して、外部表現を構成 する必要があります。 v 文字列へのポインタを戻す。 不透明 (OPAQUE) 型が値によって渡される場合は、output サポート関数は上と同じ 基本タスクを実行する必要がありますが、内部構造体内の実際の値を受け取る必要 があります。値による受け渡しを使用することができるのは、4 バイト以下の不透 122 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 明 (OPAQUE) 型の場合だけです。 C 言語サポート output 関数は不透明 (OPAQUE) 型の内部構造体を引数として受け取り、 mi_lvarchar 値を戻します。次の関数シグネチャは、ll_longlong_t を内部構造体 とする、不透明 (OPAQUE) 型の output サポート関数に対するものです。 mi_lvarchar * ll_longlong_output(ll_longlong_t *intrnl_format); ll_longlong_output() 関数は、ll_longlong_t 内部構造体からラージ可変長文字 (LVARCHAR) 型へのキャスト関数です。この関数は、CREATE EXPLICIT CAST 文を使用して、明示的キャスト関数として登録されている必要があります。キャス ト関数についての詳細は、105 ページの『不透明 (OPAQUE) 型の型変換の作成』を 参照してください。 C 言語サポート の終り 内部表現の処理 不透明 (OPAQUE) 型を使用するクライアント アプリケーションがデータベース サ ーバ以外のコンピュータで実行されている場合、関係しているコンピュータでは、 不透明 (OPAQUE) 型の内部構造体の表現方法が異なる場合があります。例えば、ク ライアント コンピュータは、データベース サーバ コンピュータとは異なるバイト 順を使用している可能性があります。 クライアント アプリケーションとデータベース サーバとの間でデータを変換す る、一般的に receive 関数および send 関数と呼ばれる、送信および受信サポート関 数 (トランスポート関数 と呼ばれることもあります) を提供する必要があります。 これらのサポート関数には任意の名前を選択することができます。これらの関数を 使用するキャスト関数によって、データベース サーバで必要なサポート関数を識別 します。 receive および send 関数は、次のようにして、不透明 (OPAQUE) 型の転送をサポ ートします。 v receive 関数は、着信データを、ローカル データベース サーバの内部表現に変換 します。 v send 関数は、ローカル データベース サーバの内部表現からクライアント アプ リケーションまたは外部データベースの該当する表現に、発信データを変換しま す。 send および receive 関数は、逆関数の関係にある必要があります。つまり、receive 関数は、send 関数が引数として受け取る値を生成する必要があり、send 関数は receive 関数が引数として受け取る値を生成する必要があります。 これらの関数は、クライアント アプリケーションまたは外部データベース サーバ が稼働される可能性のあるすべてのプラットフォームに対して、変換を処理する必 要があります。ローカル データベース サーバは、クライアント接続を受け入れる か、リモート データベース サーバに接続すると、クライアントまたはリモート デ 第 10 章 サポート関数の作成 123 ータベース サーバが使用する内部表現の記述を受け取ります。データベース サー バはこの記述を使用して、receive および send サポート関数で使用するデータ表現 を決定します。 IBM Informix DataBlade API は、不透明 (OPAQUE) 型の、異なる内部表現の間で の変換をサポートする関数を提供しています。send および receive 関数は、内部構 造体のメンバごとに DataBlade API ルーチンを呼び出し、宛先プラットフォームの 該当する表現にそれらを変換することができます。 広域言語サポート 不透明 (OPAQUE) 型が内部表現をデフォルト以外のロケールで受け入れるために は、receive および send 関数で IBM InformixGLS API を使用して、これらの関数 内から Informix ロケールにアクセスする必要があります。詳しくは、135 ページの 『ロケールを区別するデータの処理 (GLS のみ)』を参照してください。 広域言語サポート の終り send および receive サポート関数 データベース サーバは、send および receive サポート関数を使用して、クライアン ト アプリケーションとの間でデータの受渡しを行います。 SENDRECV 型 SENDRECV 型は、クライアント コンピュータとデータベース サーバ コンピュー タとの間で不透明 (OPAQUE) 型の外部バイナリ表現を転送する際に、その表現を保 持します。SENDRECV 型は、2 つの表現の間で変換が行われたときに発生するデー タ サイズの変化を見込んでいます。receive および send サポート関数は、 SENDRECV 型と不透明 (OPAQUE) 型の間のキャスト関数として機能します。 ESQL/C ESQL/C アプリケーションでは、SENDRECV 型は使用されません。その代わりに、 これらのアプリケーションでは、SQL 文で固定バイナリ (FIXED BINARY) 型のホ スト変数および可変バイナリ (VAR BINARY) 型のホスト変数を使用して、クライ アント コンピュータでの不透明 (OPAQUE) 型の内部表現を転送します。データベ ース サーバは、固定バイナリ (FIXED BINARY) 型のホスト変数または可変バイナ リ (VAR BINARY) 型のホスト変数を含む SQL 文を受け取ると、receive および send サポート関数を呼び出します。 ESQL/C の終り receive サポート関数 receive サポート関数は、不透明 (OPAQUE) 型を、クライアント コンピュータの外 部バイナリ表現から、データベース サーバ コンピュータの内部表現に変換し、 SENDRECV 型から不透明 (OPAQUE) 型への暗黙的キャストを行います。 データベース サーバは、クライアント アプリケーションから不透明 (OPAQUE) 型 の外部バイナリ表現を受信すると、receive 関数を呼び出します。例えば、クライア 124 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ント アプリケーションは、INSERT 文または UPDATE 文を発行する場合には、不 透明 (OPAQUE) 型の外部バイナリ表現をデータベース サーバに送信して、列に格 納することができます。 図 13 は、データベース サーバがどの時点で receive サポート関数を実行するかを 示したものです。 図 13. receive サポート関数の実行 データベース サーバは receive 関数を呼び出して、クライアント コンピュータの 外部バイナリ表現をデータベース サーバ コンピュータの内部表現に変換し、その 不透明 (OPAQUE) 型をディスクに保存します。 C 言語サポート receive 関数は、mi_sendrecv 構造体 (クライアント コンピュータの内部構造体を 保持しています) を引数として受け取り、不透明 (OPAQUE) 型 (データベース サ ーバ コンピュータの内部表現) 用の内部構造体を戻します。次の関数シグネチャ は、内部構造体が ll_longlong_t の不透明 (OPAQUE) 型の receive サポート関数 に対するものです。 ll_longlong_t * ll_longlong_receive(mi_sendrecv *client_intrnl_format); ll_longlong_receive() 関数は、SENDRECV 型から ll_longlong_t 内部構造体への キャスト関数です。この関数は、CREATE IMPLICIT CAST 文を使用して、暗黙的 キャスト関数として登録されている必要があります。キャスト関数についての詳細 は、105 ページの『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 C 言語サポート の終り send サポート関数 データベース サーバは、不透明 (OPAQUE) 型の外部バイナリ表現をクライアント アプリケーションに送信する際に、send 関数を呼び出します。例えば、クライアン ト アプリケーションは、SELECT 文または FETCH 文を発行する場合、不透明 (OPAQUE) 型の外部バイナリ表現に準拠するホスト変数でデータベース サーバから 受け取った、不透明 (OPAQUE) 型のデータを保存することができます。 第 10 章 サポート関数の作成 125 図 14 は、データベース サーバがどの時点で send サポート関数を実行するかを示 したものです。 図 14. send サポート関数の実行 データベース サーバは send 関数を呼び出して、ディスクに保存されている内部表 現をクライアント コンピュータが使用する外部バイナリ表現に変換します。 C 言語サポート send 関数は、データベース サーバ コンピュータの不透明 (OPAQUE) 型の内部構 造体を引数として受け取り、クライアント コンピュータで内部構造体を保持してい る mi_sendrecv 構造体を戻します。次の関数シグネチャは、内部構造体が ll_longlong_t の不透明 (OPAQUE) 型の send サポート関数に対するものです。 mi_sendrecv * ll_longlong_send(ll_longlong_t *srvr_intrnl_format); ll_longlong_send() 関数は、ll_longlong_t 内部構造体から SENDRECV 型へのキ ャスト関数です。この関数は、CREATE EXPLICIT CAST 文を使用して、明示的キ ャスト関数として登録されている必要があります。キャスト関数についての詳細 は、105 ページの『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 C 言語サポート の終り 一括コピーの実行 データベース サーバは、一括コピー操作によって、データベースにデータをコピー したり、データベースからコピーしたりできます。一括コピーでは、データベース サーバは、列値を 1 つ 1 つコピーするのではなく、大量の列値を 1 つのファイル で送信します。データが大量の場合、一括コピーは、値を 1 つ 1 つ移動するより もはるかに効率的です。 一括コピーは、以下の Informix ユーティリティで実行できます。 v DB–Access。LOAD および UNLOAD 文を使用して一括コピーします。 v dbimport および dbexport ユーティリティ。一括コピーを実行します。 v ハイパフォーマンス ローダ (HPL)。一括コピーを実行します。 v pload ユーティリティ。外部ファイルからデータベースをロードおよびアンロー ドします。 126 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド データベース サーバは、不透明 (OPAQUE) 型のバイナリ (内部) 表現または文字 (外部) 表現に対して一括コピーを実行できます。 import および export サポート関数 import および export サポート関数は、一括ロードおよび一括アンロードを行うため に、不透明 (OPAQUE) 型の外部テキスト表現を処理するのに必要なタスクを実行し ます。データベース サーバは、データベースとの間で外部テキスト形式でデータを コピーする際に、コピー ファイルとの間でコピーされた値ごとに、以下のサポート 関数を呼び出します。 v import 関数は、テキスト データを、外部テキスト表現から内部形式に変換してイ ンポートします。 v export 関数は、テキスト データを、内部形式から外部テキスト表現に変換してエ クスポートします。 これらのサポート関数の名前は、import および export にする必要はありませんが、 指定された変換を行う必要があります。これらの関数は、逆関数の関係にある必要 があります。つまり、import 関数は、export 関数が引数として受け取る値を生成す る必要があり、その逆も成り立っている必要があります。 import および export 関数は、値をコピーする前に、それらの値に対して特殊な操作 を行うことができます。一般的には、スマート ラージ オブジェクトを含む不透明 (OPAQUE) 型だけに、import および export 関数が定義されています。例えば、そ のような型に対する export 関数は、クライアント コンピュータにファイルを作成 し、データベースからこのファイルにスマート ラージ オブジェクト データを書き 込み、そのクライアント ファイルの名前をデータとして送信し、コピー ファイル に保存します。同様に、そのような型に対応した import 関数は、コピー ファイル からクライアントのファイル名を取り出し、そのクライアント ファイルをオープン し、コピー ファイルからデータベースにラージ オブジェクト データをロードしま す。このような設計の利点として、スマート ラージ オブジェクト データはコピー ファイルには現れないということを挙げることができます。したがって、コピー フ ァイルのサイズが急激に増大することはなく、コピー ファイルの読み取りが容易に なります。 小さな不透明 (OPAQUE) 型の場合は、通常は import および export サポート関数 を定義する必要はありません。import および export サポート関数を定義しなかった 場合は、データベース サーバがそれぞれ input および output 関数を使用して、一 括コピーを行います。 大きな不透明 (OPAQUE) 型の場合は、input および output 関数が生成するデータ は、大きくなりすぎてファイルに収まりきれなかったり、オブジェクト内のすべて のデータを表すことができなかったりすることがあります。この問題を解決するに は、import 関数 filetoclob() および filetoblob() と、export 関数 lotofile() を使用 します。 IMPEXP 型 SQL 文は、一括コピー用に不透明 (OPAQUE) 型の外部表現を保持するための、 IMPEXP と呼ばれる内部型をサポートしています。IMPEXP 型は、2 つの表現の間 第 10 章 サポート関数の作成 127 で変換が行われたときに発生するデータ サイズの変化を見込んでいます。import お よび export サポート関数は、IMPEXP 型と不透明 (OPAQUE) 型の間のキャスト関 数として機能します。 import サポート関数 import サポート関数は、ユーザ定義型の外部表現の一括コピー形式を保持する構造 体を引数として受け取り、ユーザ定義型に対応する内部構造体を戻します。 import 関数が読み取るファイルはすべて、データベース サーバ コンピュータに存 在している必要があります。import サポート関数を提供しない場合は、データベー ス サーバが input 関数を使用して、テキスト データをインポートします。 C 言語サポート 次の関数シグネチャは、内部構造体が ll_longlong_t の不透明 (OPAQUE) 型の import サポート関数に対するものです。 ll_longlong_t * ll_longlong_import(mi_impexp *extrnl_bcopy_format); ll_longlong_import() 関数は、IMPEXP 型から ll_longlong_t データ構造体へのキ ャスト関数です。この関数は、CREATE IMPLICIT CAST 文を使用して、暗黙的キ ャスト関数として登録されている必要があります。キャスト関数についての詳細 は、105 ページの『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 C 言語サポート の終り export サポート関数 export 関数は、不透明 (OPAQUE) 型の内部構造体と、不透明 (OPAQUE) 型の外部 表現の一括コピー形式を保持する構造体を引数として取ります。 export サポート関数を提供しない場合は、データベース サーバは output サポート 関数を使用して、テキスト データをエクスポートします。 C 言語サポート 次の関数シグネチャは、内部構造体が ll_longlong_t の不透明 (OPAQUE) 型の export サポート関数に対するものです。 mi_impexp * ll_longlong_export(ll_long_t *intrnl_bcopy_format); ll_longlong_export() 関数は、ll_longlong_t 内部構造体から IMPEXP 型へのキャ スト関数です。この関数は、CREATE EXPLICIT CAST 文を使用して、明示的キャ スト関数として登録されている必要があります。キャスト関数についての詳細は、 105 ページの『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 C 言語サポート の終り importbinary および exportbinary サポート関数 importbinary および exportbinary サポート関数は、次に示すように、一括コピーを 行うために、不透明 (OPAQUE) 型の外部バイナリ表現を処理するのに必要なタスク を実行します。 128 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v importbinary 関数は、バイナリ形式のデータを、あるバイナリ表現から内部表現 に変換してインポートします。 v exportbinary 関数は、バイナリ形式のデータを、内部表現からあるバイナリ表現に 変換してエクスポートします。 これらのサポート関数の名前は、importbinary および exportbinary にする必要はあ りませんが、指定された変換を行う必要があります。これらの関数は、逆関数の関 係にある必要があります。つまり、importbinary 関数は、exportbinary 関数が引数と して受け取る値を生成する必要があり、その逆も成り立っている必要があります。 IBM Informix DataBlade API は、不透明 (OPAQUE) 型の異なる内部表現の間での 変換をサポートする関数を提供しています。 同一の外部表現および内部表現を持つ不透明 (OPAQUE) 型の場合、import および importbinary サポート関数は、同じ関数にすることができます。同様に、export およ び exportbinary サポート関数は、同じ関数にすることができます。 IMPEXPBIN 型 SQL 文は、一括コピー用に不透明 (OPAQUE) 型の外部バイナリ表現を保持するた めの MPEXPBIN と呼ばれる内部型をサポートしています。IMPEXPBIN 型は、2 つの表現の間で変換が行われたときに発生するデータ サイズの変化を見込んでいま す。importbinary および exportbinary サポート関数は、IMPEXPBIN 型と不透明 (OPAQUE) 型の間のキャスト関数として機能します。 importbinary サポート関数 importbinary サポート関数は、不透明 (OPAQUE) 型の外部バイナリ形式の一括コピ ー形式を保持する構造体を引数として受け取り、不透明 (OPAQUE) 型の内部構造体 を戻します。 import 関数が読み取るファイルはすべて、データベース サーバ コンピュータに存 在している必要があります。importbinary サポート関数を提供しない場合は、データ ベース サーバが、不透明 (OPAQUE) 型のデータベース サーバ内部表現で、バイナ リ形式のデータをインポートします。 C 言語サポート 次の関数シグネチャは、内部構造体が ll_longlong_t の不透明 (OPAQUE) 型の importbinary サポート関数に対するものです。 ll_longlong_t * ll_longlong_importbin(mi_impexpbin *client_intrnl_bcopy_format); ll_longlong_importbin() 関数は、IMPEXPBIN 型から ll_longlong_t 内部構造体へ のキャスト関数です。この関数は、CREATE IMPLICIT CAST 文を使用して、暗黙 的キャスト関数として登録されている必要があります。詳しくは、105 ページの 『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 C 言語サポート の終り 第 10 章 サポート関数の作成 129 exportbinary サポート関数 exportbinary サポート関数は、不透明 (OPAQUE) 型の内部構造体を引数として受け 取り、不透明 (OPAQUE) 型の外部バイナリ表現の一括コピー形式を保持する構造体 を戻します。 exportbinary サポート関数を提供しない場合は、データベース サーバが、不透明 (OPAQUE) 型の外部バイナリ表現でバイナリ形式のデータをエクスポートします。 C 言語サポート 次の関数シグネチャは、内部構造体が ll_longlong_t の不透明 (OPAQUE) 型の exportbinary サポート関数に対するものです。 mi_impexpbin * ll_longlong_exportbin(ll_longlong_t *srvr_intrnl_bopy_format); ll_longlong_exportbin() 関数は、ll_longlong_t 内部構造体から IMPEXPBIN 型へ のキャスト関数です。この関数は、CREATE EXPLICIT CAST 文を使用して、明示 的キャスト関数として登録されている必要があります。詳しくは、105 ページの 『不透明 (OPAQUE) 型の型変換の作成』を参照してください。 C 言語サポート の終り stream サポート関数 streamread() および streamwrite() サポート関数を使用すると、データベース サ ーバは不透明 (OPAQUE) 型のデータをストリーム表現で処理することがでできま す。すなわち、単調化された順次形式で処理できます。DataBlade API は、データ ベース サーバと他のサイトまたは記憶媒体との間でのストリーム データの転送を 処理する一般的な関数を提供しています。「IBM Informix: DataBlade API Programmer’s Guide」では、一般的な stream 関数の使用方法の詳細について記載し ています。 重要: これらのサポート関数の名前は、streamread および streamwrite にする必 要があります。名前は、大文字と小文字を区別しません。 データの挿入と削除 不透明 (OPAQUE) 型の中には、それをディスクに保存したり、ディスクから削除す る前に特殊な処理を必要とするものがあります。以下のサポート関数は、この特殊 処理を実行します。 v assign() v destroy() v update() v deepcopy() 重要: これらのサポート関数の名前は、それぞれ assign、destroy、update、およ び deepcopy にする必要があります。名前は、大文字と小文字を区別しませ ん。 130 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド assign() および destroy() 関数は、スマート ラージ オブジェクトまたは複数表現 データを含む不透明 (OPAQUE) 型に必要です。データがスマート ラージ オブジェ クトに格納されている場合は、不透明 (OPAQUE) 型の内部構造体には、データの格 納場所を識別するための LO ハンドルが含まれていますが、データそれ自体は含ま れていません。assign()、update()、および deepcopy() サポート関数は、データ の格納方法および格納場所を決定し、destroy() サポート関数は、データをその格納 場所に関係なく削除する方法を決定します。 これらの関数は、mi_* メモリ割当て関数を使用します。この関数については、 「IBM Informix: DataBlade API Function Reference」で説明しています。複数表現の データ型についての詳細は、www.ibm.com/software/data/developer/informix の IBM Informix Developer Zone の DataBlade Developers Corner を参照してくださ い。 assign() 関数 assign() 関数には、不透明 (OPAQUE) 型を表に挿入する前に実行する、特殊な処 理が含まれています。データベース サーバは、不透明 (OPAQUE) 型の内部表現を ディスクに保存する直前に、assign() 関数を呼び出します。例えば、クライアント アプリケーションが INSERT 文、UPDATE 文、または LOAD 文を発行する場合に は、データベース サーバは、不透明 (OPAQUE) 型の内部表現を列に保存する前 に、assign() 関数を呼び出します。 図 15 は、データベース サーバがどの時点で assign() 関数を実行するかを示した ものです。 図 15. assign() サポート関数の実行 INSERT 文を使用して不透明 (OPAQUE) 型の値を挿入する場合は、assign() 関数 は不透明 (OPAQUE) 型を引数として受け取り、必要な追加処理をすべて実行し、デ ータベース サーバが表に格納するための最終の不透明 (OPAQUE) 型の値を戻しま す。 第 10 章 サポート関数の作成 131 destroy() 関数 destroy() 関数は、データベース サーバが、不透明 (OPAQUE) 型のデータを含む 行を削除する前に必要な処理をすべて実行します。データベース サーバは、不透明 (OPAQUE) 型の内部表現をディスクから削除する直前に、destroy() 関数を呼び出 します。例えば、クライアント アプリケーションが DELETE 文または DROP TABLE 文を発行すると、データベース サーバは、列から不透明 (OPAQUE) 型の 値を削除する前に、destroy() 関数を呼び出します。 図 16 は、データベース サーバがどの時点で destroy() 関数を実行するかを示した ものです。 図 16. destroy() サポート関数の実行 destroy() 関数は、不透明 (OPAQUE) 型を受け取ります。この関数は値を戻しませ ん。 update() 関数 update() 関数を使用すると、データベース サーバは不透明 (OPAQUE) 型の値のイ ンプレース更新を処理することができ、負荷の高いコンストラクタを持つ不透明 (OPAQUE) 型のパフォーマンスが向上します。例えば、不透明 (OPAQUE) 型にス マート ラージ オブジェクトが含まれている場合、update() 関数が有益な場合があ ります。 update() 関数が存在していない場合は、データベース サーバが assign() 関数を呼び出します。この関数は全く新規のスマート ラージ オブジェクトを作成 し、次に destroy() 関数を呼び出して、古いスマート ラージ オブジェクトを削除 します。更新によりラージ オブジェクトが数バイトしか変化しなければ、これが効 率的でないことは明らかです。 update() 関数は、不透明 (OPAQUE) 型のインプレース更新を提供しています。 assign() 関数および destroy() 関数と同様、update() 関数も、特定の UDT によ って定義された SQL 関数です。この関数は、同じ UDT 型の 2 つの引数を受け取 り、同じ UDT 型を戻します。最初の引数はユーザ定義型のオリジナルの値で、2 番目の引数は新規の UDT 値です。この関数は NULL を処理する必要があります。 次の文を発行すると、複数表現型の MyUDT に対して update() 関数が登録されま す。 CREATE FUNCTION Update (MyUDT, MyUDT) RETURNS MyUDT WITH (HANDLESNULLS, NOT VARIANT) EXTERNAL NAME’/usr/lib/extend/blades/MyUDT.so(MyUDT_update)’ LANGUAGE C; 132 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド update 関数は、更新によって複数表現データに対するしきい値を越えていないかど うかをチェックする必要があります。例えば、大量のデータが更新された結果、デ ータ量が少なくなった場合、update() ルーチンはスマート BLOB の参照カウント を減らし、更新された値を行内オブジェクトとして戻す必要があります。 deepcopy() 関数 複数表現の不透明 (OPAQUE) 型は、一般に、データベース サーバが assign() 関 数を呼び出すまで、スマート ラージ オブジェクトの作成を据え置きます。不透明 (OPAQUE) 型は、assign() が呼び出されるまで、個別に割り当てられているメモリ に大きな値を保管し、不透明 (OPAQUE) 型のデータ構造体内にそのメモリへのポイ ンタを保管します。 しかし、データベース サーバは、戻り値をコピーするときにはこの追加メモリにつ いては何も知らないので、値の一部しかコピーしません。つまり、データベース サ ーバはシャロー コピーを実行します。これは、きわめて長いメモリ接続期間を持つ 割当てのみが、いくつかの問合せコンテキストに対して十分に長い期間持続できる ということを意味します。 deepcopy() サポート関数は、データベース サーバが不透明 (OPAQUE) 型の値全 体をコピーするための方法を提供しており、これにより、不透明 (OPAQUE) 型は、 デフォルトのメモリ接続期間を使用するルーチンをサポートできるようになりま す。 あるいは、PER_STMT_EXEC などのより長いメモリ接続期間を使用することもでき ます。ただし、デフォルトのメモリ接続期間で十分な場合があるので、このストラ テジを採用すると、メモリの使用量が大幅に増加します。PER_STMT_EXEC につい ては、「IBM Informix: DataBlade API Programmer’s Guide」および「IBM Informix: DataBlade API Function Reference」を参照してください。 deepcopy() 関数は、デフォルトのメモリ接続期間から割り当てられたメモリを使 用して、入力された不透明 (OPAQUE) 型のコピーを作成し、そのコピーを戻す必要 があります。deepcopy() がデフォルトのメモリ接続期間からメモリを割り当てる ために使用できる関数には、mi_alloc、mi_zalloc、mi_new_var、および mi_var_copy があります。戻りの UDT に対しては、それらの関数から割り振られ たメモリを使用することが重要です。これは、データベース サーバは、 deepcopy() を呼び出す前に、問合せコンテキストに応じて適切なデフォルトのメ モリ接続期間を準備するからです。 入力 UDT に行外バッファへのポインタが含まれている場合、deepcopy() は、 mi_alloc から割り振られたメモリを使用してその行外データをコピーし、メモリの ポインタを使用して、コピーされた行外データへのポインタを、コピーされた UDT に格納することができます。 入力 UDT にスマート ラージ オブジェクトへの参照が含まれている場合、 deepcopy() はラージ オブジェクトのハンドルを戻り値にコピーする必要がありま すが、ラージ オブジェクトをコピーする必要はありません。 第 10 章 サポート関数の作成 133 スマート ラージ オブジェクトの処理 不透明 (OPAQUE) 型に埋込みスマート ラージ オブジェクトが含まれている場合 は、不透明 (OPAQUE) 型に lohandles() 関数を定義することができます。 lohandles() サポート関数は、不透明 (OPAQUE) 型のインスタンスを受け取り、そ の型に埋め込まれているスマート ラージ オブジェクトのポインタ構造体のリスト を戻します。例えば、lohandles() 関数を使用して、ある型の値が参照しているス マート ラージ オブジェクトに関する情報を提供することができます。 データベース サーバは、スマート ラージ オブジェクトへの参照を不透明 (OPAQUE) 型の値から検索する必要が生じると、lohandles() サポート関数を使用 します。データベース サーバは、自動的に lohandles() を呼び出すことはありま せん。この関数を実行するには、それを明示的に呼び出す必要があります。次のタ スクには、lohandles() を使用することができます。 v データベースのアーカイブ v スマート ラージ オブジェクトの参照カウントの取得 v oncheck ユーティリティの実行 lohandles() サポート関数は、スマート ラージ オブジェクトの参照カウントを自 動的に増やしたり、減らしたりしません。参照カウントは、以下に示されているよ うに、assign() および destroy() 関数で明示的に処理する必要があります。 v assign() 関数では、DataBlade API 関数の mi_lo_increfcount() を使用して参照 カウントを増分します。 v destroy() 関数では、DataBlade API 関数の mi_lo_decrefcount() を使用して参 照カウントを減分します。 1 つまたは複数のスマート ラージ オブジェクトを参照する不透明 (OPAQUE) 型を 定義する場合は、次のサポート関数の定義を考慮する必要があります。 v assign() v destroy() v update() v deepcopy() v import 関数 v export 関数 v importbinary 関数 v exportbinary 関数 assign() および destroy() サポート関数についての詳細は、130 ページの『データ の挿入と削除』を参照してください。import、export、importbinary、および exportbinary の各サポート関数については、126 ページの『一括コピーの実行』を参 照してください。 134 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド データの比較 compare() 関数は、ターゲット データの型をソートする SQL 呼出し関数です。デ ータベース サーバは、CREATE INDEX 文の compare() 関数を使用して、 SELECT 文の以下のコンポーネントを実行します。 v ORDER BY 節 v UNIQUE および DISTINCT キーワード v UNION キーワード v BETWEEN 演算子 SELECT 文の詳細については、「IBM Informix: SQL ガイド: 構文」を参照してく ださい。 データベース サーバで不透明 (OPAQUE) 型をソートできるようにするには、不透 明 (OPAQUE) 型を処理する compare() 関数を定義する必要があります。 compare() 関数は、以下の規則に従う必要があります。 1. 関数の名前は compare() にする必要がある。ただし、この名前は大文字と小文 字を区別しません。つまり、compare() 関数は Compare() 関数と同じもので す。 2. この関数は、比較の対象となる 2 つの型を引数として受け取る必要がある。 3. この関数は、比較結果を示す、次の整数値を戻す必要がある。 v <0 は、最初の引数が 2 番目の引数よりも小さい (<) ことを示す。 v 0 は、2 つの引数が等しい (=) ことを示す。 v >0 は、最初の引数が 2 番目の引数よりも大きい (>) ことを示す。 compare() 関数は、組込みの 2 次アクセス方式の B ツリーに対するサポート関数 です。組込みの 2 次アクセス方式についての詳細は、140 ページの『汎用 B ツリ ー インデックス』を参照してください。不透明 (OPAQUE) 型に対して 2 次アクセ ス方式をカスタマイズする方法についての詳細は、139 ページの『演算子クラスの 使用』を参照してください。 ロケールを区別するデータの処理 (GLS のみ) Informix データベースは、データベースごとに固定のロケールを持っています。こ のロケール (データベース ロケール) は、データベースの作成時に、そのデータベ ースに付加されます。どのデータベースであっても、すべての文字型 (CHAR、 NCHAR、VARCHAR、NVARCHAR、および TEXT) には、データベース ロケール がサポートしているコード セット内のデータが含まれています。 ただし、SQL 文の SET COLLATION を使用すると、実行時に使用する照合順序を 指定することができます。この照合順序は、データをデータベースに格納するため に使用されるロケールには依存せず、セッションの間維持されます。 mi_get_db_locale() 関数を使用すると、あるセッションでユーザが照合順序に対し て設定したロケールを判別することができます。そのユーザが照合順序を変更して いなければ、mi_get_db_locale() はデフォルトのデータベース ロケールを戻しま す。SET COLLATION 文については、「IBM Informix: SQL ガイド: 構文」を参照 第 10 章 サポート関数の作成 135 してください。 mi_get_db_locale() 関数については、「IBM Informix: DataBlade API Function Reference」を参照してください。 不透明 (OPAQUE) 型は、文字 (CHARACTER) 型のデータを保持できます。次のサ ポート関数により、クライアント アプリケーションとデータベース サーバとの間 で、不透明 (OPAQUE) 型を転送することができます。 v input および output サポート関数を使用すると、不透明 (OPAQUE) 型の外部表 現を転送することができます。 v receive および send サポート関数を使用すると、不透明 (OPAQUE) 型の内部表 現を転送することができます。 ただし、クライアント アプリケーションとデータベース サーバとの間でデータを 転送できるだけでは、ロケールを区別するデータをサポートするのには十分ではあ りません。これだけでは、接続の両側でデータが正しく操作されることが保証され ません。次のように、接続の両側でロケールを区別するデータが処理されることを 保証する必要があります。 v 接続のクライアント側では、クライアント アプリケーションは、不透明 (OPAQUE) 型の列に対してロケールを区別するデータを正しく処理する必要があ ります。 また、CLIENT_LOCALE 環境変数を正しく設定しておく必要もあります。 v 接続のデータベース サーバ側では、ロケールを区別するデータが適切なサポート 関数で処理されることを保証する必要があります。 さらに、DB_LOCALE および SERVER_LOCALE 環境変数を正しく設定してお く必要もあります。 CLIENT_LOCALE、DB_LOCALE、および SERVER_LOCALE の各環境変数につ いては、「IBM Informix: GLS ユーザーズ ガイド」を参照してください。 ロケールを区別するデータを処理するサポート関数の作成を支援するために、 IBM Informix GLS API が提供されています。GLS API は、スレッド セーフ ライ ブラリです。このライブラリには、GLS ロケールからロケール固有の情報をサポー ト関数により取得できるようにする C 関数が含まれています。そのような関数に は、以下のものがあります。 v 移植可能な方法でロケールを区別するデータを操作するための関数 v 単一バイトおよびマルチバイトの文字のアクセスを処理するための関数 v 日付 (DATE) 型、時刻 (TIME) 型、あるいは通貨 (MONETARY) 型データのエ ンド ユーザ形式など、その他のロケールを区別するデータを操作するための関数 GLS API の概要については、「IBM Informix: GLS ユーザーズ ガイド」を参照し てください。GLS API 関数については、「IBM Informix: GLS Programmer’s Manual」を参照してください。 ロケールを区別する input および output サポート関数 ラージ可変長文字 (LVARCHAR) 型 (および mi_lvarchar) は、クライアント ロケ ールまたはデータベース ロケールのコード セット内のデータを保持することがで きます。このデータには、単一バイト (ASCII および 非 ASCII) およびマルチバイ トの文字データが含まれます。不透明 (OPAQUE) 型のデータが外部表現でデータベ 136 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ース サーバとの間で転送される際に、ラージ可変長文字 (LVARCHAR) 型はその不 透明 (OPAQUE) 型のデータを保持します。したがって、不透明 (OPAQUE) 型の外 部表現は、単一バイトまたはマルチバイトのデータを保持することができます。 ただし、正しいロケールでラージ可変長文字 (LVARCHAR) 型データを解釈するた めに、input および output サポート関数を作成する必要があります。クライアント ロケールとデータベース ロケールで異なるコード セットがサポートされている場 合は、これらのサポート関数でコード セット変換を行う必要が生じる場合がありま す。コード セット変換についての詳細は、「IBM Informix: GLS ユーザーズ ガイ ド」を参照してください。 ロケールを区別する receive および send サポート関数 SENDRECV (および mi_sendrecv) 型は、不透明 (OPAQUE) 型の内部構造体を保 持します。この内部構造体には、次の型のロケールを区別するデータを含めること ができます。 v クライアント ロケールまたはデータベース ロケールのコード セットのデータを 保持できる文字 (CHAR) 型フィールド このデータには、単一バイト (ASCII および 非 ASCII) およびマルチバイトの文 字データが含まれます。 v ロケール固有のデータ表現を保持する通貨 (MONETARY) 型、日付 (DATE) 型、 または 時刻 (TIME) 型フィールド 不透明 (OPAQUE) 型はカプセル化されているので、クライアント アプリケーショ ンは、内部構造体のフィールドを解釈することができません。 SENDRECV 型は、不透明 (OPAQUE) 型のデータが、内部表現でデータベース サ ーバとの間で転送される際に、その不透明 (OPAQUE) 型のデータを保持します。 SENDRECV 構造体内のロケール固有のデータを解釈するために、receive および send サポート関数を作成する必要があります。 第 10 章 サポート関数の作成 137 138 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 11 章 演算子クラスの拡張 演算子クラスの使用 . . . . . . . . . 2 次アクセス方式 . . . . . . . . . 汎用 B ツリー インデックス . . . . R ツリー インデックス . . . . . . 他のユーザ定義 2 次アクセス方式 . . 演算子クラス . . . . . . . . . . 汎用 B ツリー演算子クラス . . . . B ツリー ストラテジ関数 . . . . B ツリー サポート関数 . . . . . R ツリー インデックス演算子クラス . 既存演算子クラスの拡張. . . . . . . . btree_ops 演算子クラスの拡張機能 . . . btree_ops を拡張する理由 . . . . . . 新しい型の単一値の生成. . . . . . ソート順の変更. . . . . . . . . 演算子クラスの作成 . . . . . . . . . 新規 B ツリーの演算子クラスの作成 . . 絶対値演算子クラスの作成 . . . . . . 他の 2 次アクセス方式の演算子クラス定義 演算子クラスの廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 139 140 140 140 141 141 142 142 143 143 143 145 145 145 147 148 149 150 151 本章の内容 本章では、演算子クラスの機能の拡張方法を説明します。演算子クラス は、2 次ア クセス方式に関連付けされた一連の関数です。データベース サーバは、以下の演算 子クラスを拡張する方法を 2 つ提供します。 v データベース サーバが提供する演算子クラスの拡張機能 異なる順序でデータを並べ替える場合、または UDT のインデックス サポートを 提供する場合には、演算子クラスを拡張する必要があります。 v ユーザ定義演算子クラス 既存の 2 次アクセス方式のいずれかを用いて容易に UDT の索引付けを行えない 場合には、演算子クラスを新たに作成する必要があります。 演算子クラスの使用 ほとんどの場合、インデックスを作成する際は、2 次アクセス方式で定義されてい るデフォルト演算子を使用できます。本セクションでは、2 次アクセス方式および 演算子クラスを概説します。 このトピックの詳細な説明は、「IBM Informix: Performance Guide」を参照してくだ さい。 2 次アクセス方式 通常インデックス と呼ばれる 2 次アクセス方式 は、インデックス構造の作成と取 り扱い、およびインデックス構造へのアクセスを行う一連のユーザ定義関数です。 © Copyright IBM Corp. 1996, 2003 139 これらの関数は、インデックス内のノードの走査、挿入、削除、または更新などの インデックス操作をカプセル化します。2 次アクセス方式は、列 (列インデックス) またはユーザ定義関数 (関数インデックス) に作成したインデックスのデータへのア クセス方式を記述します。通常、2 次アクセス方式により、型を抽出する際の処理 速度が向上します。 データベース サーバは、それぞれのデータベースのシステム カタログ表に、以下 の 2 次アクセス方式の定義を提供します。 v 汎用 B ツリー v R ツリー DataBlade モジュールを用いて、UDT で使用する 2 次アクセス方式を追加すること ができます。 DataBlade モジュールの 2 次アクセス方式について詳しくは、それぞ れの DataBlade モジュールのユーザ ガイドを参照してください。R ツリーについ て詳しくは、「IBM Informix: R-Tree Index User’s Guide」を参照してください。 汎用 B ツリー インデックス 従来のリレーショナル データベース システムでは、B ツリー アクセス方式は、組 込み型のみ処理します。したがって、比較できるのは、組込み型の 2 つのキーのみ です。B ツリー インデックスは、データの範囲を抽出する問合せで役立ちます。 UDT をサポートするために、データベース サーバは、B ツリーの拡張バージョン である汎用 B ツリー インデックス を提供します。 データベース サーバは、汎用 B ツリー インデックスを組み込み 2 次アクセス方 式として使用します。この 2 次アクセス方式は、btree という名前で、sysams シ ステム カタログ表に登録されます。CREATE INDEX 文を (USING 節なしで) 使用 してインデックスを作成する場合には、データベース サーバは汎用 B ツリー イン デックスを作成します。次の文は、customer 表の zipcode 列に B ツリー イン デックスを作成します。 CREATE INDEX zip_ix ON customer (zipcode) 詳しくは、「IBM Informix: SQL ガイド: 構文」の CREATE INDEX 文を参照して ください。 R ツリー インデックス データベース サーバは、マップおよびダイヤグラムなどのスペーシャル (空間) の データを含む列の R ツリー インデックス をサポートできます。R ツリー インデ ックスは、他のオブジェクト内にあるオブジェクト、または 1 つ以上のオブジェク トを含むオブジェクトを問合せが探す場合に一番役立ちます。 R ツリー インデックスを使用するには、Spatial DataBlade モジュール、Geodetic DataBlade モジュール、または R ツリー インデックスを実装する他のすべてのサ ード パーティ DataBlade モジュールなどのスペーシャル DataBlade モジュールを インストールします。 他のユーザ定義 2 次アクセス方式 DataBlade モジュールは、UDT を提供して、特定の型を処理することができます。 このモジュールは、モジュールが定義する新規の型に対する新規 2 次アクセス方式 (インデックス) も提供します。例えば、Excalibur Text DataBlade モジュールは、テ 140 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド キスト データを検索するためのインデックスを提供します。詳しくは、 「IBM Informix: Excalibur Text Search DataBlade Module User’s Guide」を参照して ください。各 DataBlade モジュールが提供する型および関数について詳しくは、 DataBlade モジュールのユーザ ガイドを参照してください。sysams システム カ タログ表は、ユーザのデータベース内に存在する 2 次アクセス方式を説明します。 sysams について詳しくは、「IBM Informix: SQL ガイド: 参照」を参照してくだ さい。 演算子クラス 演算子クラス は一連の関数で、これによって、2 次アクセス方式で、特定の型の値 の格納および検索ができるようになります。問合せオプティマイザは、演算子クラ スを使用して、インデックスが最小のコストで問合せを処理できるかどうかを判別 します。問合せオプティマイザについて詳しくは、「IBM Informix: Performance Guide」を参照してください。 演算子クラス関数は、以下のカテゴリに分類されます。 v ストラテジ関数 データベース サーバは、2 次アクセス方式のストラテジ関数 を使用すること で、問合せオプティマイザが、データ型の特定の操作に特定のインデックスを適 用できるかどうかを決定することを支援します。ストラテジ関数は、SQL 文のフ ィルタで使用できる演算子です。 v サポート関数 データベース サーバは、2 次アクセス方式のサポート関数 を使用して、インデ ックスの作成およびアクセスを行います。エンド ユーザは、これらの関数の呼出 しは直接行いません。問合せのフィルタの演算子がストラテジ関数の 1 つと一致 する場合には、2 次アクセス方式は、サポート関数を使用して、インデックスを 全検索して結果を取得します。 それぞれの 2 次アクセス方式には、そのメソッドに関連付けされたデフォルトの演 算子クラス があります。デフォルトで、CREATE INDEX 文は、デフォルト演算子 クラスをインデックスに関連付けします。 データベース サーバは、演算子クラスに関する情報を sysopclasses システム カ タログ表に格納します。 汎用 B ツリー演算子クラス 組込み 2 次アクセス方式である汎用 B ツリーには、sysopclasses システム カタ ログ表で定義された単一の演算子クラスがあります。これは、btree_ops という名 前の演算子クラスであり、btree 2 次アクセス方式に対するデフォルトの演算子ク ラスです。 データベース サーバは、btree_ops 演算子クラスを使用して、以下を指定します。 v 問合せでどのフィルタが B ツリー インデックスを使用できるかをオプティマイ ザに通知するためのストラテジ関数 v B ツリー インデックスを作成および検索するためのサポート関数 140 ページの『汎用 B ツリー インデックス』 の CREATE INDEX 文は、列が btree_ops 演算子クラスを使用する B ツリー インデックスの作成方法を示してい 第 11 章 演算子クラスの拡張 141 ます。この CREATE INDEX 文では、 btree_ops 演算子クラスを指定する必要が ありません。これは、btree_ops が btree アクセス方式に対するデフォルトの演算 子クラスになっているためです。 btree 2 次アクセス方式について詳しくは、140 ページの『汎用 B ツリー インデ ックス』 を参照してください。 B ツリー ストラテジ関数: btree_ops 演算子クラスでは、btree アクセス方式に 対する以下のストラテジ関数が定義されています。 v lessthan (<) v lessthanorequal (<=) v equal (=) v greaterthanorequal (>=) v greaterthan (>) これらのストラテジ関数は、すべて演算子関数 です。すなわち、それぞれの関数 は、関係演算子と関連付けされています。この場合には、関係演算子シンボルと関 連付けされています。詳しくは、72 ページの『関係演算子』 を参照してくださ い。 B ツリー サポート関数: btree_ops 演算子クラスには、1 つのサポート関数、つ まり compare() という名前の比較関数があります。compare() 関数は、整数値を 戻すユーザ定義関数です。この整数値は、最初の引数が 2 番目の引数と比べて、等 しいか、小さいか、大きいかを次のように示します。 v 最初の引数が 2 番目の引数と等しい 場合には、値は 0 v 最初の引数が 2 番目の引数より小さい 場合には、0 より小さい値 v 最初の引数が 2 番目の引数より大きい 場合には、0 より大きい値 B ツリー 2 次アクセス方式は、compare() 関数を使用して、汎用 B ツリー イン デックスのノードを全検索します。汎用 B ツリー インデックスのデータ値を検索 するために、2 次アクセス方式は、compare() 関数を使用して、問合せのキー値と インデックス ノードのキー値を比較します。比較の結果は、2 次アクセス方式が、 インデックスの次の低いレベルを検索する必要があるかどうか、またはキーが現行 ノードにあるかどうかを決定します。 汎用 B ツリー アクセス方式は、compare() 関数を使用して、汎用 B ツリー イン デックスに対する以下のタスクも実行します。 v インデックスの作成前にキーをソートする v 汎用 B ツリー インデックスでキーの線形順序を決定する v 関係演算子を評価する データベース サーバは、compare() 関数を使用して、SELECT 文で比較を評価し ます。不透明 (opaque) 型に対してこれらの比較のサポートを提供するには、 compare() 関数を作成する必要があります。詳しくは、108 ページの『不透明 (OPAQUE) 型の条件演算子』 を参照してください。 142 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド R ツリー インデックス演算子クラス R ツリー 2 次アクセス方式には、sysopclasses システム カタログ表で定義され た演算子クラスがあります。rtree_ops という名前のこの演算子クラスは、rtree 2 次アクセス方式に対するデフォルト演算子クラスです。データベース サーバは、シ ステム カタログ表にデフォルト R ツリー演算子クラスを定義します。ただし、こ の演算子クラスを実装するための演算子クラス関数は提供しません。 R ツリー インデックスを使用するには、Spatial DataBlade モジュール、Geodetic DataBlade モジュール、または R ツリー インデックスを実装する他のすべてのサ ード パーティ DataBlade モジュールなどのスペーシャル DataBlade モジュールを インストールします。 R ツリー インデックスについて詳しくは、「IBM Informix: R-Tree Index User’s Guide」を参照してください。スペーシャル DataBlade モジュ ールについて詳しくは、該当する DataBlade モジュールのユーザ ガイドを参照して ください。 既存演算子クラスの拡張 演算子クラスの演算子クラス関数は、既存の型に対してのみ定義できます。 UDT を作成する場合には、この型に対する演算子クラス関数の作成が必要かどうかを判 別する必要があります。既存演算子クラス関数を拡張するには、既存演算子クラス 関数と同じ名前の演算子クラス関数を新規に作成するのが最も一般的な方法です。 演算子クラス関数の機能を拡張するには、同じ名前と同じ戻り値を持つ関数を作成 します。ユーザは、新規の型のパラメータを提供して関数を作成し、新規パラメー タを処理します。ルーチン オーバロード によって、ユーザは、名前はすべて同一 ですが、それぞれ異なるパラメータ リストを持つ多数の関数を作成できます。次 に、データベース サーバは、ルーチン解決 を使用して、値の型に基づいて、どの オーバロード関数を使用するかを決定します。ルーチン オーバロードおよびルーチ ン解決について詳しくは、 17 ページの『第 3 章 ユーザ定義ルーチンの実行』 を 参照してください。 ユーザ定義の型に対して演算子クラス関数を定義するには: 1. どの 2 次アクセス方式が UDT をサポートできるかを決定する。 2. 選択した、1 つまたは複数の 2 次アクセス方式の演算子クラスを拡張する。 エンド ユーザが、2 次アクセス方式と関連付けされている演算子でユーザ定義 型を使用できるようにするには、新規ストラテジおよびサポート関数を作成し、 この新規の型を処理します。 btree_ops 演算子クラスの拡張機能 データベース サーバが UDT の汎用 B ツリー インデックスをサポートするには、 B ツリー 2 次アクセス方式と関連付けされた演算子クラスが、その型を処理できな ければなりません。汎用 B ツリー 2 次アクセス方式に対するデフォルト演算子ク ラスは、btree_ops と呼ばれます。btree_ops 演算子クラスの演算子クラス関数 (ストラテジ関数およびサポート関数) は、最初に組込み型を処理します。新規の型 を定義する場合には、型を処理するためにこれらの演算子クラス関数を拡張する必 要があります。 重要: 組込み型に対する btree_ops 演算子クラスは拡張できません。 第 11 章 演算子クラスの拡張 143 UDT の関係演算子の実装方法を決定すると、btree_ops 演算子クラスを拡張でき ます。これによって、問合せオプティマイザは、関係演算子を含む問合せに対し て、B ツリー インデックスの使用を検討できます。 汎用 B ツリー インデックスのデフォルト演算子クラスを拡張するには: 1. パラメータ リストに UDT を取る B ツリー ストラテジ関数に対する関数を作 成する。 関係演算子関数は、btree_ops 演算子クラスに対するストラテジ関数として機能 します。これらの関係演算子関数が UDT に対してすでに定義済みの場合には、 汎用 B ツリー インデックスは、これらの関数をそのストラテジ関数として使用 します。例えば、ユーザ定義タイプに対して集計関数を拡張した際に、関係演算 子関数を定義していたと仮定します。 (87 ページの『組込み集計関数の拡張の 例』を参照。) 2. CREATE FUNCTION 文を使用して、データベースにストラテジ関数を登録す る。 関係演算子関数が登録済みの場合には、それらをストラテジ関数として再登録す る必要はありません。 3. B ツリー サポート関数 compare() に対して、その B ツリー サポート関数の パラメータ リストに UDT を取る関数を C または Java で作成する。 (compare() 関数の形式は、SPL にはできません。) compare() 関数も、SELECT 文 (ORDER BY 節、または BETWEEN 演算子な ど) の比較演算で、UDT をサポートします。UDT に対して比較関数が既に定義 済みの場合には、汎用 B ツリー インデックスは、この定義をそのサポート関数 として使用します。 4. CREATE FUNCTION 文を使用して、サポート関数をデータベースに登録する。 不透明 (opaque) 型の場合には、この関数がすでに定義されていることがあり、 SELECT 文 (ORDER BY 節または BETWEEN 演算子など) においてユーザの 不透明 (opaque) 型に関する比較演算がサポートされている場合があります。 ストラテジ関数について詳しくは、142 ページの『B ツリー ストラテジ関数』を参 照してください。不透明 (opaque) 型の関係演算子について詳しくは、108 ページの 『不透明 (OPAQUE) 型の条件演算子』を参照してください。 サポート関数を登録したら、CREATE INDEX 文を使用して、UDT を含む表の列の B ツリー インデックスを作成します。 CREATE INDEX 文では、USING 節は必要 ありません。これは、UDT をサポートするために、デフォルトのインデックス型で ある汎用 B ツリー インデックス用のデフォルトのオペレーティング クラスが拡張 されているためです。 これによって、問合せオプティマイザは、この汎用 B ツリー インデックスを使用 して、問合せを効果的に実行することを検討できます。列インデックスのパフォー マンスについて詳しくは、「IBM Informix: Performance Guide」を参照してくださ い。 以上のステップにより、汎用 B ツリー インデックスのデフォルト演算子クラスが 拡張されます。また、新規演算子クラスを定義して、他のオーダー シーケンスを提 供することもできます。詳しくは、148 ページの『新規 B ツリーの演算子クラスの 作成』 を参照してください。 144 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド btree_ops を拡張する理由 btree_ops のストラテジ関数は、エンド ユーザが式で使用できる関係演算です。 (関係演算子のリストは、142 ページの『B ツリー ストラテジ関数』を参照してく ださい。) 汎用 B ツリー インデックスは、組込み型のみを処理します。新規 UDT を処理する関係演算子関数を作成する場合には、汎用 B ツリーを拡張します。これ によって、列内の UDT、またはユーザ定義関数内の UDT を処理できます。列また は新規の型の関数に B ツリー インデックスを作成するには、新規の型を処理する 新規関係演算子関数を作成する必要があります。 関係演算子関数では、B ツリー インデックスの以下の動作を決定します。 v B ツリー 2 次アクセス方式において、インデックスを並べ替えるために使用する 単一の値は? 特定の UDT では、関係演算子関数は、B ツリー インデックスに格納される型 に対して、この型の 2 つの値を比較する必要があります。 v B ツリー インデックスによって値がソートされる順序は? 特定の UDT では、関係演算子関数は、値のオーダー シーケンスが何によって構 成されるかを決定する必要があります。 新しい型の単一値の生成 B ツリー インデックスは、1 次元オブジェクトの索引付けを行います。このインデ ックスは、関係演算子関数を使用して、2 つの 1 次元値を比較します。次にこれら の値の間の関係を使用して、B ツリーが全検索する方法、および値を格納するノー ドを決定します。 関係演算子関数は、組込み型を処理します。 (組込み型について詳しくは、 「IBM Informix: SQL ガイド: 参照」の型に関する章を参照してください。) 組込み 型には、1 次元値が含まれます。例えば、INTEGER 型は、単一整数値を保持しま す。CHAR 型は、単一文字列を保持します。 DATE 型は、単一の日付の値を保持 します。これらすべての型の値は、線形に (1 次元で) 並べ替えることができます。 関係演算子関数は、これらの値を比較して、その線形順序を決定することができま す。 新規 UDT を作成する場合には、関係演算子関数が、2 つの UDT の値を比較でき ることを確認します。これができない場合には、比較は実行できず、UDT は B ツ リー インデックスで使用できません。 例えば、circle 不透明 (OPAQUE) 型を作成して circle (円) を実装すると仮定しま す。circle は、多次元オブジェクトを操作する R ツリーなどのユーザ定義 2 次ア クセス方式によって最適に索引付けされたスペーシャル オブジェクトです。ただ し、その領域の値に関係演算子を定義すると、B ツリー インデックスで、circle 型 を使用できます。すなわち、1 つの circle の領域が 2 番目の circle の領域よりも 小さい場合には、その circle は、2 番目の circle よりも小さくなっています。 ソート順の変更 汎用 B ツリーは、関係演算子を使用して、どの値が他の値よりも小さいかを判別し ます。これらの演算子は、並べ替えを行う値に対して、辞書式順序 (数値に対する 第 11 章 演算子クラスの拡張 145 数値順序、文字に対する英字順序、日時に対する日時順) を使用します。 広域言語サポート 関係演算子関数は、文字 (CHARACTER) 型 (CHAR、VARCHAR、および LVARCHAR) に対してはコード セット順序を使用し、NCHAR 型および NVARCHAR 型に対してはローカライズされた順序を使用します。デフォルト ロケ ールである 米国英語 (U.S. English) を使用する場合には、コード セット順序およ びローカライズされた順序は、ISO 8895-1 コード セットの順序になります。非デ フォルト ロケールを使用する場合には、これら 2 つの順序は異なる場合がありま す。ロケールについて詳しくは、「IBM Informix: GLS ユーザーズ ガイド」を参照 してください。 広域言語サポート の終り 一部の UDT では、デフォルト B ツリー演算子クラスにおける関係演算子は、ユー ザが希望する順序で並べ替えを行わない場合があります。特定のユーザ定義型に対 して関係演算子関数を定義することで、ソート順序を辞書式順序から他の順序に変 更できます。 ヒント: 演算子クラスを拡張する場合は、UDT のソート順を変更することができま す。B ツリー が処理するすべての型に対して代替のソート順序を提供する には、新規演算子クラスを定義する必要があります。詳しくは、148 ペー ジの『新規 B ツリーの演算子クラスの作成』 を参照してください。 例えば、スコットランド名を保持する ScottishName 不透明 (opaque) 型を作成し て、米国英語 (U.S. English) の照合順序とは異なる方法で型を順序付けするとしま す。電話番号リストに、名前 McDonald および MacDonald を一緒に表示させたい とします。この型は、B ツリー インデックスを使用できます。これは、この型が、 文字列 Mc および Mac を等価として評価する関係演算子を定義するためです。 この方法で型を並べ替えるには、関係演算子関数を作成して、この新規順序を実装 させます。文字列 Mc および Mac を等しくするには、以下のような関係演算子を 定義する必要があります。 v パラメータ リストに不透明 (opaque) 型 ScottishName を取る v Mc および Mac を等価にするコードを含む 以下のステップは、143 ページの『btree_ops 演算子クラスの拡張機能』 で説明さ れているステップを使用して、btree_ops 演算子クラスを拡張します。 ScottishName 型をサポートするには: 1. 以下の ScottishName 型を処理するストラテジ関数の準備および登録を行いま す (lessthan()、lessthanorequal()、equal()、greaterthan()、および greaterthanorequal())。 詳しくは、 37 ページの『第 4 章 ユーザ定義ルーチンの開発』 を参照してくだ さい。 2. ScottishName 型を処理する compare() サポート関数に対して、外部関数の準 備および登録を行う。 146 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド これで、以下のように ScottishName 列に、B ツリー インデックスを作成できま す。 CREATE TABLE scot_cust ( cust_id integer, cust_name ScottishName ... ); CREATE INDEX cname_ix ON scot_cust (cust_name); これで、オプティマイザは、次の問合せを評価する cname_ix インデックスを使用 するかどうかを選択できます。 SELECT * FROM scot_cust WHERE cust_name = ’McDonald’::ScottishName 演算子クラスの作成 ほとんどのインデックス機能は、2 次アクセス方式のデフォルト演算子クラスの演 算子によって、適切にサポートされています。ただし、デフォルト演算子クラスが 提供する順序とは異なる順序でデータを並べ変えするために、2 次アクセス方式に 新規演算子クラスを定義することができます。 CREATE OPCLASS 文は、演算子クラスを作成します。この文は、演算子クラスに 関する以下の情報をデータベース サーバに提供します。 v 演算子クラスの名前 v 演算子クラスの関数に関連付けられる 2 次アクセス方式の名前 v ストラテジ関数の名前、およびオプションでパラメータ v サポート関数名 データベース サーバは、この情報を sysopclasses システム カタログ表に格納し ます。演算子クラスを作成するには、ユーザは、そのデータベースに Resource 特権 を持つか、DBA でなければなりません。 データベース サーバは、汎用 B ツリー アクセス方式に対して、デフォルト演算子 クラス btree_ops を提供します。次の CREATE OPCLASS 文は、汎用 B ツリー アクセス方式に対して、新規演算子クラスを作成します。次に示されている順序 で、ストラテジ関数をリストする必要があります。 CREATE OPCLASS new_btree_ops FOR btree STRATEGIES (lessthan, lessthanorequal, equal, greaterthanorequal, greaterthan) SUPPORT(compare); 詳しくは、140 ページの『汎用 B ツリー インデックス』を参照してください。 以下に対して、新規演算子クラスを作成します。 v 汎用 B ツリー 2 次アクセス方式 新規演算子クラスは、B ツリー インデックスが処理できるすべてのデータ型に対 して、ソート順を追加できます。 v 任意のユーザ定義の 2 次アクセス方式 新規演算子クラスは、演算子クラスのストラテジ関数に機能を追加できます。 第 11 章 演算子クラスの拡張 147 新規 B ツリーの演算子クラスの作成 インデックス構造を全検索するために、汎用 B ツリーのインデックスは、関係演算 子が定義するシーケンスを使用します。デフォルトで、B ツリーは、データの辞書 式順序を使用します。これはデフォルト演算子クラス btree_ops に、関係演算子関 数が含まれているためです。この順序について詳しくは、145 ページの『ソート順 の変更』 を参照してください。) 汎用 B ツリーがこのインデックス値に対して異 なる順序を使用する場合には、btree 2 次アクセス方式に対する新規演算子クラス を作成できます。これで、その型にインデックスを定義する際に、新規演算子クラ スを指定できます。 汎用 B ツリー インデックスに対する新規演算子クラスを作成する際は、 B ツリ ー形式にデータを編成するための追加シーケンスを提供します。B ツリー インデッ クスを作成する際は、インデックスに列 (またはユーザ定義関数) を保持する順序を 指定できます。 汎用 B ツリー インデックスに対する新規演算子クラスを作成するには: 1. B ツリー ストラテジ関数のパラメータ リストに適切な型を取る、B ツリー ス トラテジ関数に対する関数を作成する。 B ツリー 2 次アクセス方式は、5 つのストラテジ関数を必要としています。し たがって、すべての新規演算子クラスは、正確に 5 つ定義します。パラメータ のデータ型は、組込みか、ユーザ定義にすることができます。ただし、それぞれ の関数は、ブール型の値を戻す必要があります。ストラテジ関数について詳しく は、142 ページの『B ツリー ストラテジ関数』を参照してください。 2. CREATE FUNCTION 文を使用して、データベースに新規ストラテジ関数を登録 する。 演算子クラスをサポートするそれぞれの型に対して、一連のストラテジ関数を登 録する必要があります。 3. パラメータ リストに適切な型を取る新規 B ツリー サポート関数に対して、外 部関数を作成する。 B ツリー 2 次アクセス方式は、1 つのサポート関数を必要としています。した がって、すべての新規演算子クラスは、1 つだけ定義します。パラメータ 型 は、組込みか、UDT にすることができます。ただし、戻りの型は整数にしま す。サポート関数について詳しくは、142 ページの『B ツリー サポート関数』 を参照してください。 4. CREATE FUNCTION 文を使用して、データベースに新規サポート関数を登録す る。 演算子クラスをサポートするそれぞれの型に対して、1 つのサポート関数を登録 する必要があります。 5. B ツリー 2 次アクセス方式 btree に対する新規演算子クラスを作成する。 演算子クラスを作成する場合、CREATE OPCLASS 文で以下を指定します。 v キーワード OPCLASS の後に、新規演算子クラス名 v FOR 節に、演算子クラスに関連付けられる 2 次アクセス方式の名前としての btree v STRATEGIES 節に、その演算子クラスに対するストラテジ関数の名前の括弧 付きのリスト 148 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド これらの関数は、ステップ 2 で登録済みです。B ツリー 2 次アクセス方式が 期待する順序で関数をリストする必要があります。すなわち、最初の関数は lessthan() の置き換えで、2 番目の関数は lessthanorequal() の置き換えに なり、以下同様です。 v SUPPORT 節に、インデックスの検索で使用するサポート関数名 この関数は、ステップ 4 で登録済みです。これは、compare() 関数を置き換 えるものです。 CREATE OPCLASS 文の使用方法について詳しくは、「IBM Informix: SQL ガイ ド: 構文」を参照してください。 これらのステップは、汎用 B ツリー インデックスの新規演算子クラスを作成しま す。デフォルト演算子クラスを拡張して、新規の型をサポートすることもできま す。詳しくは、143 ページの『btree_ops 演算子クラスの拡張機能』 を参照してく ださい。 新規演算子クラスを使用するには、CREATE INDEX 文の列名または関数名の後ろ に、演算子クラスの名前を指定します。 絶対値演算子クラスの作成 例として、整数に対する新規順序を定義すると仮定します。デフォルト B ツリー演 算子クラスの辞書式順序は、整数を数値の順で並べ替えます (-4 < -3 < -2 < -1 < 0 < 1 < 2 < 3)。ここではその代わりに、数字 -4、2、-1、-3 を絶対値の順に表示 するとします。 -1, 2, -3, -4 絶対値の順序を取得するには、負の整数を正整数として扱う外部関数を定義する必 要があります。以下のステップは、絶対値順序を提供するストラテジ関数およびサ ポート関数を持つ abs_btree_ops という名前の新規演算子クラスを作成します。 1. 新規ストラテジ関数 abs_lessthan()、abs_lessthanorequal()、abs_equal()、 abs_greaterthan()、および abs_greaterthanorequal() に対する外部関数の作 成および登録を行う。 詳しくは、 37 ページの『第 4 章 ユーザ定義ルーチンの開発』を参照してくだ さい。 2. CREATE FUNCTION 文を使用して、5 つの新規ストラテジ関数を登録する。 3. 新規サポート関数 abs_compare() に対する C 関数を作成する。 この関数をコンパイルして、absbtree.so 共有オブジェクト ファイルに格納し ます。 4. CREATE FUNCTION 文を使用して、新規サポート関数を登録する。 5. B ツリー 2 次アクセス方式に対して、新規 abs_btree_ops 演算子クラスを作 成する。 これで、以下のように、INTEGER 列の B ツリー インデックスを作成し、この列 と新規演算子クラスを関連付けできます。 CREATE TABLE cust_tab ( cust_name varchar(20), cust_num integer 第 11 章 演算子クラスの拡張 149 ... ); CREATE INDEX c_num1_ix ON cust_tab (cust_num abs_btree_ops); c_num1_ix インデックスは、列 cust_num に対して新規演算子クラス abs_btree_ops を使用します。エンド ユーザは、これで、次の例のように、SQL 文で絶対値関数を使用できます。 SELECT * FROM cust_tab WHERE abs_lt(cust_num, 7) また、abs_lt() 関数が演算子クラスの一部になっているため、問合せオプティマイ ザは、cust_num 値が -7 から 7 の間のすべての cust_tab 行を検索する場合に、 c_num1_ix インデックスを使用できます。 cust_num 値が -8 の場合は、この問 合せの条件を満たしません。 デフォルト演算子クラスは、インデックスに対しても使用可能です。次の CREATE INDEX 文は、列 cust_num の 2 次インデックスを定義します。 CREATE INDEX c_num2_ix ON cust_tab (cust_num); c_num2_ix インデックスは、列 cust_num に対するデフォルトの演算子クラス btree_ops を使用します。次の問合せは、デフォルトの less than (<) 演算子に対し て演算子関数を使用します。 SELECT * FROM cust_tab WHERE lessthan(cust_num, 7) 問合せオプティマイザは、cust_num 値が 7 より小さいすべての cust_tab 行を 検索する場合に、c_num2_ix インデックスを使用できます。 cust_num 値が -8 の場合は、この問合せの条件を満たします。 他の 2 次アクセス方式の演算子クラス定義 ユーザ定義 2 次アクセス方式に対しても、演算子クラスを定義できます。ユーザ定 義の 2 次アクセス方式 は、データベースの開発者が特定のインデックス型を実装 するために定義したものです。これらのアクセス方式は、DataBlade モジュールによ ってデータベースに定義されている場合があります。 ヒント: sysams システム カタログ表を検証して、どの 2 次アクセス方式をユー ザ データベースが定義するかを判別することができます。sysams システ ム カタログ表の列について詳しくは、「IBM Informix: SQL ガイド: 参 照」を参照してください。 ユーザ定義 2 次アクセス方式で演算子クラスを定義する場合には、汎用 B ツリー インデックスで演算子クラスを作成する場合と同様に、サポート関数およびストラ テジ関数を提供します。ユーザ定義 2 次アクセスクラスの任意の演算子クラス要件 に準拠する場合には、注意が必要です。ユーザ定義 2 次アクセス方式に対して演算 子クラスを実装する前に、その方式に関するマニュアルを参照してください。 ユーザ定義 2 次アクセス方式で演算子クラスを定義する場合には、汎用 B ツリー インデックスで演算子クラスを作成する場合に使用するのと同様のステップを実行 します。 (148 ページの『新規 B ツリーの演算子クラスの作成』 を参照してくだ 150 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド さい。) 唯一の違いは、インデックスを作成するために、CREATE INDEX 文の USING 節で、ユーザ定義 2 次アクセス方式の名前を指定する必要があることで す。 演算子クラスの廃棄 DROP OPCLASS 文は、演算子クラスの定義をデータベースから削除します。デー タベース サーバは、演算子クラス定義を sysopclasses システム カタログ表から 削除します。ユーザは、演算子クラスの定義をデータベースから削除するには、そ の演算子クラスの所有者、または DBA でなければなりません。 演算子クラスを削除する前に、すべての依存性のあるオブジェクトを削除する必要 があります。例えば、ユーザが、汎用 B ツリー インデックスに対して、 abs_btree_ops という名前の新規演算子クラスを作成したと仮定します。 (詳しく は、148 ページの『新規 B ツリーの演算子クラスの作成』 を参照してください。) データベースから abs_btree_ops 演算子クラスを削除するには、最初に以下を確 認します。 v ユーザが、所有者 (演算子クラスを作成したユーザ) または DBA である。 v abs_btree_ops 演算子クラスを使用するインデックスが現在定義されていない。 そのようなインデックスが存在している場合は、最初にそのインデックスをデー タベースから削除する必要があります。 上記の条件を満たした後で、次の文で、abs_btree_ops の定義をデータベースから 削除します。 DROP OPCLASS abs_btree_ops RESTRICT キーワード RESTRICT は、DROP OPCLASS 構文では必須です。 第 11 章 演算子クラスの拡張 151 152 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 12 章 ユーザ定義ルーチンの管理 ルーチンへの Execute 特権の割り当て . . . . . Execute 特権の付与および取り消し . . . . . UDR と関連付けされたオブジェクトに対する特権 DBA としての UDR の実行 . . . . . . . オブジェクトおよびネストされた UDR での DBA ユーザ定義ルーチンの修正 . . . . . . . . . C UDR の修正 . . . . . . . . . . . . 共有ライブラリからのルーチンの除去 . . . Java UDR の修正 . . . . . . . . . . . ユーザ定義ルーチンの変更 . . . . . . . . . ユーザ定義ルーチンの廃棄 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 特権の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 154 155 155 156 157 157 157 158 159 159 本章の内容 本章では、UDR の管理方法を説明します。説明するトピックは以下のとおりです。 v ルーチンへの Execute 特権の割り当て v ユーザ定義ルーチンの修正 v ユーザ定義ルーチンの変更 v ユーザ定義ルーチンの廃棄 ルーチンへの Execute 特権の割り当て Execute 特権によって、ユーザは UDR を呼び出しすることができます。UDR は、 EXECUTE 文や CALL 文、または式の関数から呼び出します。デフォルトで、以下 のユーザには Execute 特権があります。これらの特権によって、ユーザは UDR を 呼び出します。 v DBA 特権を持つすべてのユーザは、データベース内のすべてのルーチンを実行で きます。 v ルーチンが、修飾された CREATE DBA FUNCTION 文または CREATE DBA PROCEDURE 文で登録されている場合には、DBA 特権を持つユーザだけがデフ ォルトでそのルーチンの Execute 特権を持ちます。 v データベースが ANSI 標準準拠ではない場合には、 public ユーザ (Connect デ ータベース 特権を持つすべてのユーザ) は、キーワード DBA によって登録され ていないルーチンに対する Execute 特権を自動的に持ちます。 米国規格協会 (ANSI) v ANSI 標準準拠のデータベースで、そのプロシジャ所有者と DBA 特権を持つす べてのユーザは、追加の特権を取得しなくとも、そのルーチンを実行できます。 米国規格協会 (ANSI) の終り © Copyright IBM Corp. 1996, 2003 153 Execute 特権の付与および取り消し UDR の Execute 特権を制御するには、GRANT 文および REVOKE 文の EXECUTE ON 節を使用します。データベース サーバは、sysprocauth システム カタログ表に UDR の特権を格納します。 UDR には、Execute 特権に関する以下の GRANT 要件および REVOKE 要件があ ります。 v DBA は、データベース内の任意の ルーチンへの Execute 特権の付与、またはル ーチンからの Execute 特権や取り消しを行うことができる。 v ルーチンの作成者は、特定のルーチンへの Execute 特権の付与、または取り消し を行うことができる。作成者は、GRANT EXECUTE ON 文で AS grantor 節を 含むことで、付与または取り消しの権利を失います。 v 他のユーザは、その所有者が GRANT EXECUTE ON 文でキーワード WITH GRANT を適用している場合には、Execute 特権を付与できる。 DBA またはルーチンの所有者は、以下の条件では、非 DBA ユーザに Execute 特 権を明示的に付与する必要があります。 v ANSI 準拠のデータベースのルーチンを使用する v データベースの NODEFDAC 環境変数が yes に設定されている v ルーチンがキーワード DBA で登録されている 所有者は、データベース サーバがデフォルトで public ユーザに Execute 特権を付 与している場合でも、ルーチンの Execute 特権を制限できます。これを行うには、 REVOKE EXECUTE ON...PUBLIC 文を発行します。DBA および所有者は、この場 合でもそのルーチンを実行でき、可能であれば、特定のユーザに Execute 特権を付 与できます。 ユーザは、他のユーザに Execute 特権を付与するための、WITH GRANT オプショ ン権限を伴って、 Execute 特権を受け取ることがあります。ユーザがルーチンの Execute 特権を失うと、そのユーザが Execute 特権を付与したすべてのユーザから も Execute 特権が取り消されます。 次の例は、UDT および GRANT 文に対して定義された equal() 関数です。この関 数によって、ユーザ mary は equal() 関数の以下のバリエーションを実行できま す。 CREATE FUNCTION equal (arg1 udtype1, arg2 udtype1) RETURNING BOOLEAN EXTERNAL NAME "/usr/lib/udtype1/lib/libbtype1.so(udtype1_equal)" LANGUAGE C END FUNCTION; GRANT EXECUTE ON equal(udtype1, udtype1) to mary mary には、他のすべての equal() という名前の UDR を実行する権限がありませ ん。 詳しくは、「IBM Informix: SQL ガイド: 構文」の GRANT 文および REVOKE 文 を参照してください。 154 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド UDR と関連付けされたオブジェクトに対する特権 データベース サーバは、参照されるすべてのオブジェクトの存在を検査して、UDR を呼び出すユーザに、その参照されるオブジェクトにアクセスするために必要な特 権があることを検証します。例えば、ユーザが表のデータを更新する UDR を実行 する場合には、そのユーザには、UDR で参照される表または列に対する Update 特 権が必要です。 ルーチンは、以下のオブジェクトを参照できます。 v 表と列 v UDTs v ルーチンに実行される他のルーチン ルーチン実行の過程で、そのルーチンを実行したユーザではなく、そのルーチンの 所有者は、そのルーチンが作成するすべての非修飾オブジェクトを所有します。デ ータベース サーバは、そのオブジェクトが存在し、UDR 所有者がそのオブジェク トへのアクセスに必要な特権を持つことを検証します。UDR を実行するユーザは、 その UDR の所有者の特権で実行します。 次の例は、promo() という名前の SPL プロシジャです。2 つの表、hotcatalog お よび libby.mailers を作成します。 CREATE PROCEDURE promo() CREATE TABLE hotcatalog ( catlog_num INTEGER cat_advert VARCHAR(255, 65) cat_picture BLOB ) PUT cat_picturein sb1; CREATE TABLE libby.maillist ( cust_num INTEGER interested_in SET(catlog_num INTEGER) ); END PROCEDURE; ユーザ tony が CREATE PROCEDURE 文を実行して、SPL promo() プロシジャ を登録すると仮定します。ユーザ marty は、EXECUTE PROCEDURE 文で promo() プロシジャを実行します。このプロシジャは、hotcatalog 表を作成しま す。hotcatalog という表名を修飾する所有者はいないため、そのルーチン所有者 (tony) が hotcatalog を所有します。一方、修飾名 libby.maillist は、maillist の 所有者として libby を識別します。 DBA としての UDR の実行 キーワード DBA を使用して DBA がルーチンを作成する場合には、データベース サーバは、DBA 特権を持つ他のユーザにのみ自動的に Execute 特権を付与しま す。ただし、DBA は、DBA ルーチンの Execute 特権を明示的に非 DBA ユーザに 付与します。 ユーザが、キーワード DBA で登録されたルーチンを実行する場合には、そのユー ザは、そのルーチンの実行期間中の DBA の特権を想定しています。 DBA 特権を 持たないユーザが DBA ルーチンを実行する場合には、データベース サーバは暗黙 第 12 章 ユーザ定義ルーチンの管理 155 的に一時的な DBA 特権をルーチンの起動者に付与します。データベース サーバが DBA ルーチンから終了する前に、データベース サーバはその一時 DBA 特権を取 り消します。 オブジェクトおよびネストされた UDR での DBA 特権の使用 DBA ルーチンの実行過程で作成されたオブジェクトは、そのルーチン内の文で明示 的に所有者以外のユーザが指定されない限り、そのルーチンを実行するユーザによ って所有されます。例えば、ユーザ tony が 155 ページの promo() ルーチンを登 録すると仮定します。ただし、次のように、キーワード DBA を含むとします。 CREATE DBA PROCEDURE promo() ... END PROCEDURE; ユーザ tony はルーチンを所有していますが、ユーザ marty がそのルーチンを実 行すると、ユーザ marty が hotcatalog 表を所有します。ユーザ libby は、その 表名を修飾しているため、libby.maillist を所有しています。これによって libby は その表の所有者になります。 着呼側ルーチンは DBA 特権を継承しません。 DBA ルーチンがキーワード DBA なしで作成されたルーチンを実行する場合には、DBA 特権は、着呼側ルーチンに影 響を与えません。 キーワード DBA なしで登録されたルーチンが、 DBA ルーチンを呼び出す場合に は、発呼者は、着呼側 DBA ルーチンに対して Execute 特権を持つ必要がありま す。DBA ルーチン内の文は、DBA ルーチン内と同様に実行されます。 次の例は、DBA および非 DBA ルーチンが相互作用する場合に何が発生するかを示 しています。プロシジャ dbspace_cleanup() は、プロシジャ cluster_catalog() を実行します。プロシジャ cluster_catalog() は、インデックスを作成します。 cluster_catalog() の C 言語ソースには、以下の文が含まれています。 strcopy(statement, "CREATE INDEX stmt"); ret = mi_exec(conn, "create cluster index c_clust_ix on catalog(catalog_num)", MI_QUERY_NORMAL); DBA プロシジャ dbspace_cleanup() は、次の文で他のルーチンを呼び出します。 EXECUTE PROCEDURE cluster_catalog(hotcatalog) tony が、次のように、dbspace_cleanup() を DBA プロシジャとして登録し、 cluster_catalog() をキーワード DBA なしで登録したと仮定します。 CREATE DBA PROCEDURE dbspace_cleanup(loc CHAR) EXTERNAL NAME ... LANGUAGE C END PROCEDURE CREATE PROCEDURE cluster_catalog(catalog CHAR) EXTERNAL NAME ... LANGUAGE C END PROCEDURE GRANT EXECUTION ON dbspace_cleanup(CHAR) to marty; ユーザ marty は dbpace_cleanup() を実行します。インデックス c_clust_ix は、非 DBA ルーチンによって作成されます。したがって、両方のルーチンを所有 156 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド する tony も c_clust_ix を所有します。一方、marty は、cluster_catalog() が、 次の登録および GRANT 文のような DBA プロシジャの場合には、インデックス c_clust_ix を所有します。 CREATE PROCEDURE dbspace_cleanup(loc CHAR) EXTERNAL NAME ... LANGUAGE C END PROCEDURE CREATE DBA PROCEDURE cluster_catalog(catalog CHAR) EXTERNAL NAME ... LANGUAGE C END PROCEDURE GRANT EXECUTION ON cluster_catalog(CHAR) to marty; dbspace_cleanup() プロシジャは、DBA プロシジャを呼び出すために、DBA プロ シジャである必要はありません。 ユーザ定義ルーチンの修正 UDR を修正するには、ルーチンおよびそのルーチンのサポート関数を削除して再登 録し、ルーチンの実行可能バージョンを保持するファイルを新規実行可能ファイル で再ロードします。ただし、所定の個所を変更することができます。ALTER FUNCTION および ALTER PROCEDURE によって、ルーチンを削除せずにルーチ ンの一部の属性を修正できます。 C UDR の修正 データベース サーバがシャットダウンすると、そのデータベース サーバは、共有 オブジェクト モジュールのメモリを含む予約していたすべてのメモリを開放しま す。 データベース サーバを再起動せずにメモリから共有オブジェクト モジュールをア ンロードするには、共有ライブラリに含まれるすべての ルーチンを削除する必要が あります。SQL DROP ROUTINE 文、DROP FUNCTION 文、または DROP PROCEDURE 文を使用して、UDR を登録抹消します。これらの文は、システム カ タログ表から UDR に関する登録情報を削除します。 共有ライブラリからのルーチンの除去 以下の条件では、データベースはメモリ マップから共有オブジェクト ファイルを 削除します。 v モジュール内のすべてのルーチンを削除する。 v ルーチンのすべてのインスタンスの実行を終了する。 v ifx_unload_module を明示的に呼び出す。 これらの条件に当てはまる場合、データベース サーバは自動的に共有オブジェクト ファイルをメモリからアンロードします。データベース サーバは、ログ ファイル にメッセージを書き込んで、共有オブジェクトをアンロードすることを示します。 共有オブジェクトがアンロードされると、ディスク上の共有オブジェクト ファイル を置き換えて、データベース内のその UDR を再登録します。 onstat ユーティリティを使用して、モジュールが実際にアンロードされたことを検 証できます。 第 12 章 ユーザ定義ルーチンの管理 157 onstat -g dll メモリにディスク上の共有オブジェクト ファイルがロードされている間は、このフ ァイルを上書きしないようにしてください。これは、上書きされたモジュールへの アクセスまたはモジュールのアンロードが行われたときに、データベース サーバが エラーを生成することがあるためです。ifx_replace_module() 関数を使用して、ロ ードされている共有オブジェクト ファイルを新規バージョンで置き換えます。 ifx_replace_module() 関数について詳しくは、「IBM Informix: SQL ガイド: 構 文」の『式』セグメントにある『関数式』の説明を参照してください。 例えば、/usr/apps/opaque_types ディレクトリにある circle.so 共有 DataBlade API ライブラリを、/usr/apps/shared_libs ディレクトリにあるライブラリと置き 換えるには、次のように、EXECUTE FUNCTION 文を使用して ifx_replace_module() を実行できます。 EXECUTE FUNCTION ifx_replace_module("/usr/apps/opaque_types/circle.so", "/usr/apps/shared_libs/circle.so", "c") ifx_replace_module() 関数は、新規名または新規格納場所で sysprocedures シス テムを更新します。この関数は、以下の整数値のいずれか 1 つを戻します。 v ゼロは正常終了を示しています。 v 負の値はエラー メッセージ番号を示しています。 以下のように、SELECT 文で ifx_replace_module() 関数を実行することもできま す。 SELECT ifx_replace_module("/usr/apps/opaque_types/circle.so", "/usr/apps/shared_libs/circle.so", "c") FROM customer WHERE customer_id = 100 この SELECT 文で共有ライブラリを何度も置き換えたくない場合には、SELECT 文が値の行を 1 つのみ戻すことを確認します。 ESQL/C これらの関数を ESQL/C アプリケーション内から実行する場合には、EXECUTE FUNCTION 文と関数カーソルを関連付けする必要があります。ESQL/C アプリケー ションの作成について詳しくは、「IBM Informix: ESQL/C Programmer’s Manual」 を参照してください。 ESQL/C の終り Java UDR の修正 Java UDR の修正には、SQL/J replace_jar メソッドを使用できます。例えば、次の コマンドは、データベースの .jar ファイルを新規コピーに置き換えます。 execute procedure replace_jar( "file:/d:/informix/extend/Zip.1.0/Zip.jar", "ZipJar"); 158 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ユーザ定義ルーチンの変更 ALTER FUNCTION 文、ALTER PROCEDURE 文、および ALTER ROUTINE 文を 使用して、前に定義された UDR のルーチン修飾子またはパス名を変更できます。 これらの文によって、関数の実行方法を制御する特性を修正できます。オプティマ イザに代替手段を提供する関連 UDR を追加、または削除して、パフォーマンスを 向上させることもできます。 ユーザ定義ルーチンの廃棄 DROP FUNCTION 文、DROP PROCEDURE 文、および DROP ROUTINE 文を使 用して、前に定義した UDR を削除できます。これらの文は、データベースからル ーチンのテキスト・バージョンおよび実行可能バージョンを削除します。 不透明 (opaque) 型、型変換 (キャスト)、ユーザ定義集計関数、演算子クラス、また はアクセス方式の定義などの何らかのデータベース関数によって、使用中の UDR を削除することはできません。 これらの SQL 文について詳しくは、「IBM Informix: SQL ガイド: 構文」の説明を 参照してください。 第 12 章 ユーザ定義ルーチンの管理 159 160 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 第 13 章 UDR パフォーマンスの向上 ユーザ定義ルーチンの最適化 . . . . . . . . . . . . SPL ルーチンの最適化 . . . . . . . . . . . . . 最適化レベル . . . . . . . . . . . . . . . 自動最適化 . . . . . . . . . . . . . . . . SPL ルーチンの統計情報の更新 . . . . . . . . . . SQL 文の関数の最適化 . . . . . . . . . . . . . . 問合せ予定の計算 . . . . . . . . . . . . . . . コストと選択の水準の指定 . . . . . . . . . . . . 一定のコストおよび選択の水準の値 . . . . . . . . 動的なコストおよび選択の水準の値 . . . . . . . . コストの計算 . . . . . . . . . . . . . . . . 選択の水準とコストの例. . . . . . . . . . . . . UPDATE STATISTICS の拡張 . . . . . . . . . . . . UPDATE STATISTICS の使用 . . . . . . . . . . . UPDATE STATISTICS のサポート関数 . . . . . . . . stat 型 . . . . . . . . . . . . . . . . . . statcollect() 関数 . . . . . . . . . . . . . . statprint() 関数 . . . . . . . . . . . . . . . ユーザ定義統計関数の例. . . . . . . . . . . . 否定関数の使用. . . . . . . . . . . . . . . . . 仮想プロセッサ クラスの使用 . . . . . . . . . . . . 仮想プロセッサ クラスの選択 . . . . . . . . . . . CPU 仮想プロセッサ クラス . . . . . . . . . . ユーザ定義仮想プロセッサ クラス (C のみ) . . . . . JVM 仮想プロセッサ クラス (Java のみ) . . . . . . C で作成された UDR での仮想プロセッサの使用 . . . . 仮想プロセッサの管理 . . . . . . . . . . . . . 仮想プロセッサの追加および削除. . . . . . . . . 仮想プロセッサ クラスの監視 . . . . . . . . . . 並列 UDR . . . . . . . . . . . . . . . . . . UDR の並列実行 . . . . . . . . . . . . . . . 問合せ式での UDR の実行 . . . . . . . . . . . WHERE 節における並列 UDR. . . . . . . . . 結合における並列 UDR . . . . . . . . . . . 選択リストにおける並列 UDR . . . . . . . . . GROUP BY による並列 UDR . . . . . . . . . 並列挿入のための選択リストの並列 UDR . . . . . DataBlade API における UDR の FastPath 実行 (C のみ). ユーザ定義集計関数の暗黙的な UDR 実行 . . . . . 比較演算子の暗黙的な UDR 実行 . . . . . . . . Assign UDR の暗黙的な実行 . . . . . . . . . . ソートのための compare UDR の実行 . . . . . . . UDT 列のインデックスによる UDR の実行 . . . . . 並列 UDR の有効化 . . . . . . . . . . . . . . 修飾子 PARALLELIZABLE の指定 . . . . . . . . PDQ スレッド セーフ UDR の作成 . . . . . . . . PDQ の有効化および他の構成パラメータの検討 . . . . 並列 UDR を有効化するための段階的な手順 . . . . . 仮想プロセッサ数の設定. . . . . . . . . . . . . 並列 UDR の監視 . . . . . . . . . . . . . . . © Copyright IBM Corp. 1996, 2003 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 162 162 163 164 165 165 166 166 166 167 167 168 168 168 169 169 170 170 170 171 172 172 173 173 173 174 174 174 175 175 176 176 177 177 177 178 178 178 178 179 179 179 179 180 180 180 181 181 182 161 メモリに関する考慮事項. . . . . . . . . C UDR のメモリ接続期間 . . . . . . . スタック サイズに関する考慮事項 (Ext のみ) ルーチンの仮想メモリ キャッシュ . . . . システム カタログ表 sysprocedures . . . UDR キャッシュ . . . . . . . . . 入出力に関する考慮事項. . . . . . . . . システム カタログ表の分離 . . . . . . 入出力動作のバランシング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 183 183 184 185 185 185 186 186 本章の内容 この章では、UDR に関するパフォーマンスについての考慮事項について説明しま す。次のトピックが含まれます。 v ユーザ定義ルーチンの最適化 v SQL 文の関数の最適化 v UPDATE STATISTICS の拡張 v 否定関数の使用 v 仮想プロセッサ クラスの使用 v 並列 UDR v メモリに関する考慮事項 v 入出力に関する考慮事項 ユーザ定義ルーチンの最適化 問合せオプティマイザでは、問合せを実行する方法が決定されます。問合せ予定 は、問合せを実行する特定の方法です。問合せ予定には、問合せに含まれる表にア クセスする方法、表を結合する順序、一時表の使用が含まれます。問合せオプティ マイザは、すべての可能な問合せ予定を検出します。オプティマイザは各計画を実 行するコストを見積もり、見積もりコストが最小の計画を選択します。 ヒント: 問合せの最適化の詳細については、「IBM Informix: Performance Guide」を 参照してください。 SPL ルーチンの最適化 SPL 最適化時には、問合せオプティマイザは可能な問合せ予定を評価し、コストが 最小となる問合せ計画を選択します。データベース サーバは各 SQL 文に対して選 択された問合せ予定を SPL ルーチン向けの実行計画に収めます。データベース サ ーバは SPL ルーチン内の各 SQL 文を最適化し、選択された問合せ予定を実行計画 に含めます。 最適化レベル SPL ルーチンに設定された現行の最適化レベル は、SPL ルーチンを最適化する方 法に影響を与えます。SQL 文、SET OPTIMIZATION により最適化レベルが設定さ れ、問合せオプティマイザが使用するアルゴリズムが、次のように順次決定されま す。 162 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド SET OPTIMIZATION 文 使用するアルゴリズム SET OPTIMIZATION HIGH すべての適切な問合せ計画を検証して最適 な代替案を選択する、コストに基づく洗練 されたストラテジを呼び出します。大規模 な結合の場合、このアルゴリズムにより予 想以上にオーバーヘッドが増大することが あります。極端なケースでは、メモリが不 足することがあります。 初期段階で不適切な結合ストラテジを除去 し、最適化時に使用される時間とリソース を低減するストラテジを呼び出します。た だし、低レベルの最適化を指定した場合 は、アルゴリズムの初期段階で検討から除 外されるために、最適なストラテジが選択 されないことがあります。 SET OPTIMIZATION LOW 変更されない SPL ルーチン、あるいはわずかに変更される SPL ルーチンの場合 は、ルーチンを作成するときに SET OPTIMIZATION 文を HIGH に設定します。こ の最適化レベルではルーチンの最適な問合せ予定が格納されます。次に、最適化を LOW に設定してから、ルーチンを実行します。ルーチンは最適な問合せ予定を使用 し、最適化を再度行う場合は、さらにコストの有効性の高いレートで実行します。 自動最適化 SPL ルーチンを作成する場合、データベース サーバは、ルーチン内の SQL 文の最 適化を試行します。コンパイル時に表を検査できない場合 (存在しないか、使用可 能ではない場合) に、作成が失敗することはありません。この場合、データベース サーバは、SPL ルーチンが初めて実行されるときに SQL 文を最適化します。デー タベース サーバは、最適化された実行計画を他のプロセスが使用できるようにシス テム カタログ表 sysprocplan に格納します。 データベース サーバは、依存性リストを使用して、SPL ルーチンを次に実行すると きに最適化が再度行われる原因となる変更を追跡します。データベース サーバは、 SPL ルーチンが次回実行される前に、以下の状況のいずれかが発生した場合、 SQL 文を再度最適化します。 v 問合せ予定を変更するデータ定義言語 (DDL) 文 (ALTER TABLE、DROP INDEX、または CREATE INDEX など) が実行された場合 v いずれかの方向に参照制約を持つ他の表にリンクされた表を変更する場合 v 問合せに含まれる表に対して UPDATE STATISTICS FOR TABLE を実行する場 合 UPDATE STATISTICS FOR TABLE 文は、systables の指定された表のバージ ョン番号を変更します。 データベース サーバは、再度最適化された実行計画を使用してシステム カタログ 表 sysprocplan を更新します。 第 13 章 UDR パフォーマンスの向上 163 SPL ルーチンの統計情報の更新 データベース サーバは、システム カタログ表 systables、syscolumns、 sysindices の表にデータの量と性質に関する統計情報を格納します。データベース サーバが格納する統計情報は、次のとおりです。 v 行数 v 列の最大値と最小値 v 固有値の数 v インデックス キーの一部である列および関数値を含む、表に存在するインデック ス 問合せオプティマイザは、これらの統計情報を使用して各問合せ予定のコストを判 別します。表に多数の変更が行われるごとに、UPDATE STATISTICS を実行して、 これらの値を更新してください。 UPDATE STATISTICS 文では、次の文のように、修飾する節を指定しないか、修飾 する節を幾つか指定することができます。 UPDATE STATISTICS FOR TABLE tablename UPDATE STATISTICS FOR ROUTINE routinename UPDATE STATISTICS を実行すると、最適化に影響が及び、システム カタログが 次のように変更されます。 v UPDATE STATISTICS 文を実行しない場合 表のサイズまたは内容が変更された後に、UPDATE STATISTICS を実行しない場 合、SPL ルーチン内の SQL 文は再度最適化されません。ルーチンを次に実行す ると、ルーチンで参照されるオブジェクトが変更された場合、データベース サー バは実行計画を再度最適化します。 v UPDATE STATISTICS 追加の節を指定しない場合、データベース サーバは、すべての SPL ルーチン内 の SQL 文を再度最適化し、すべての 表の統計情報を変更します。 v UPDATE STATISTICS FOR TABLE 表名を指定せずに FOR TABLE 節を指定すると、データベース サーバはすべて の表の統計情報を変更し、SPL ルーチンの SQL 文を再度最適化しません。 v UPDATE STATISTICS FOR TABLE table name FOR TABLE 節に表名を指定すると、データベース サーバは指定された表の統計 情報を変更します。データベース サーバは、SPL ルーチンの SQL 文の再度最適 化は行いません。 v UPDATE STATISTICS... 次の節のいずれかを指定すると、データベース サーバは、すべての SPL ルーチ ン内の SQL 文を再度最適化します。データベース サーバは、システム カタロ グ表の統計情報を更新しません。 – FOR FUNCTION – FOR PROCEDURE – FOR ROUTINE v UPDATE STATISTICS... routine name 164 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 次の節のいずれかにルーチン名を指定すると、データベース サーバは、指定され たルーチン内の SQL 文を再度最適化します。データベース サーバは、システム カタログ表の統計情報を更新しません。 – FOR FUNCTION routine name – FOR PROCEDURE routine name – FOR ROUTINE routine name データベース サーバは、SQL 文を再度最適化した後、再度最適化された実行計画 を使用してシステム カタログ表 sysprocplan を更新します。sysprocplan の詳細 については、「IBM Informix: SQL ガイド: 参照」を参照してください。UPDATE STATISTICS 文の詳細については、「IBM Informix: SQL ガイド: 構文」を参照して ください。 SQL 文の関数の最適化 オプティマイザ単独では、複雑なロジックやユーザ定義型などが使用される可能性 があるために、SQL 文の関数の実行にかかるコストを評価することはできません。 実行にかかるコストが高い関数もあるため、関数の作成者は SQL 文の最適化に役 立つように関数のコストと選択の水準に関する情報を提供する必要があります。 例えば、次の SQL 文には 2 つの関数が含まれています。 SELECT * FROM T WHERE expensive(t1) and cheap(t2); cheap() 関数の実行にかかるコストが expensive() 関数より低い場合、オプティマイ ザは最初に cheap() 関数を実行計画に入れます。 以下のセクションで説明する UDR は、SQL 文の WHERE 節または HAVING 節 に指定します。これらの UDR は、TRUE または FALSE の値を戻します。 問合せ予定の計算 オプティマイザは、すべての可能な計画のコストを計算し、コストが最小の計画を 選択します。コストには、ディスク アクセス数、ネットワーク アクセス数、行に アクセスしてデータをソートするためのメモリ内の作業数が含まれます。 選択の水準も合計コストの一因です。選択の水準は、フィルタを通過する行の割合 を示します。オプティマイザは、選択の水準を 0 から 1 までの数値で表し、フィ ルタを通過する表内の行の割合を示します。 選択の水準の値が大きいほど、行がフィルタを通過しない可能性が低くなります。 したがって、データベース サーバは選択の水準の値が小さい UDR を評価してか ら、選択の水準の値が大きい UDR を評価します。同様に、データベース サーバは 通常、コストが低い UDR を評価してから、コストが高いものを評価します。UDR フィルタ評価の最終的な順序は、UDR のコストと選択の水準の組合せによって異な ります。 オプティマイザによる問合せ予定の計算方法の詳細については、「IBM Informix: Performance Guide」を参照してください。 第 13 章 UDR パフォーマンスの向上 165 コストと選択の水準の指定 関数のコストと選択の水準をオプティマイザに提供できます。データベース サーバ はコストと選択の水準をともに使用して最適なパスを決定します。 関数のコストと選択の水準を提供するには、CREATE FUNCTION 文に修飾子を指 定します。コストと選択の水準の値を CREATE FUNCTION 文に含むか、または最 適化時に呼び出される関数を使用して値を計算することができます。 関数のコストと選択の水準の値を指定しない場合は、データベース サーバはデフォ ルトの選択の水準 0.1 およびデフォルトのコスト 0 を使用します。デフォルトの コストと選択の水準は低いため、データベース サーバは UDR の実行にかかるデフ ォルトのコストと選択の水準は低いものとみなし、WHERE 節の他の UDR より前 にその UDR を実行します。 データベース サーバは、コスト 0 を SIN および DATE などのすべての組込み関 数に割り当てます。 一定のコストおよび選択の水準の値 次の修飾子は、CREATE FUNCTION 文を実行するときのコストおよび選択の水準 の値を指定します。コストと選択の水準の値は、関数を呼び出すごとに変わること はありません。 v percall_cost=integer 修飾子 percall_cost は、関数を 1 回実行する際のコストを指定します。integer 値 は数値です。 v selconst=float 修飾子 selconst は関数の選択の水準を指定します。浮動値 は、0 から 1 までの 浮動小数点値であり、ルーチンが TRUE を戻す行の小数部を示します。 動的なコストおよび選択の水準の値 関数のコストと選択の水準は、関数への入力に応じて大幅に異なる場合がありま す。入力によって最適化が変わることがある場合、次の修飾子を使用してコストと 選択の水準を実行時に計算する関数を指定します。 v costfunc=CostFunction この修飾子は、関数を 1 回実行する際のコストを検出するために、オプティマイ ザによって実行される関数 CostFunction の名前を指定します。 v selfunc=SelectivityFunction この修飾子は、関数の選択の水準を検出するために、オプティマイザによって実 行される関数 SelectivityFunction の名前を指定します。 これらのコスト関数と選択水準関数を記述して、関数に関する十分な情報をオプテ ィマイザに提供し、最適な問合せ予定を作成します。 UDT の選択水準関数では、列 UDT のデータの性質に関する統計情報が必要なこと があります。データベース サーバは、UDT の分散値または最大値と最小値の統計 情報は生成しません。ユーザ定義統計関数を作成して登録し、UDT の統計情報を生 成し、システム カタログ表の、組込み型に関する統計情報と同じ場所に格納する必 要があります。ユーザ定義統計の詳細については、168 ページの『UPDATE 166 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド STATISTICS の拡張』を参照してください。これらの関数の作成の詳細について は、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 コストの計算 関数に対して指定するコストは、SQL 文の他の部分に関してオプティマイザによっ て計算されるコストと互換性がある必要があります。次の公式は、オプティマイザ によって使用されるコスト計算アルゴリズムと似た 1 つの方法です。 1. 次の SQL 文を DB–Access から実行します。bigtable は任意の大きな表です。 SET EXPLAIN ON; SELECT count(*) from bigtable; 問合せの時間を計ります。 2. secost は、走査のためにオプティマイザによって割り当てられるコストとしま す。ファイル sqexplain.out を読み取り、secost を取得します。 sqexplain.out については、「IBM Informix: Performance Guide」を参照してく ださい。 3. satime は、SQL 文を完了するために必要な時間とします。 4. 関数を実行し、時間を計ります。facost は関数を 1 回実行するために必要な実 際の時間とします。 関数を 1 回実行する際のコストは次のように概算することができます。 ((secost/satime)*facost) 計算されたコストの小数点以下を切り捨て、整数値にします。 選択の水準とコストの例 次の例は、点が円の内部にあるかどうかを決定する関数を作成します。SQL 文にこ の関数を指定すると、オプティマイザは関数 contains_sel() を実行し、contains() 関数の選択の水準を決定します。 CREATE FUNCTION contains(c circle, p point) RETURNING boolean WITH(selfunc=contains_sel) EXTERNAL NAME "$USERFUNCDIR/circle.so" LANGUAGE C; 次の例では、コストと選択の水準の値が指定された 2 つの関数が作成されます。 CREATE FUNCTION expensive(cust int) RETURNING boolean WITH(percall_cost=50,selconst=.1) EXTERNAL NAME "/ix/9.4/exp_func.so" LANGUAGE c; CREATE FUNCTION cheap(cust int) RETURNING boolean WITH(percall_cost=1,selconst=.1) EXTERNAL NAME "/ix/9.4/exp_func.so" LANGUAGE C; これらの関数を両方とも同じ SQL 文に指定すると、cheap() 関数のコストの方が 低いため、オプティマイザは最初にこの関数を実行します。次の SET EXPLAIN 出 力は、最初に Filters: 行に cheap() をリストし、実際にオプティマイザが最初に cheap() を実行したことを示します。 QUERY: -----select * from customer where expensive(customer_num) and cheap(customer_num) 第 13 章 UDR パフォーマンスの向上 167 Estimated Cost: 8 Estimated # of Rows Returned: 1 1) informix.customer: SEQUENTIAL SCAN Filters: (lsuto.cheap(informix.customer.customer_num )AND lsuto.expensive(informix.customer.customer_num )) コストを動的に計算する C 関数の例については、DBDK をインストールした後に \%INFORMIXDIR\dbdk\examples\Types\dapi\Statistics\Box\src\c ディレクトリを 参照してください。 UPDATE STATISTICS の拡張 UPDATE STATISTICS 文は、データベース内のデータに関する統計情報を収集しま す。オプティマイザは、これらの統計情報を使用して SQL 文の最適なパスを決定 します。 UDT を使用する SQL 文の場合、オプティマイザはカスタムの選択水準関数とコス ト関数を呼び出すことができます。 (選択水準関数とコスト関数の作成の詳細につ いては、165 ページの『SQL 文の関数の最適化』を参照してください。) 選択水準 関数とコスト関数では、列のデータの性質に関する統計情報を使用することが必要 な場合があります。UDT の統計情報を収集する statcollect() 関数を作成すると、 ユーザがキーワード MEDIUM または HIGH を指定して UPDATE STATISTICS 文 を実行するときに、データベース サーバはこの関数を自動的に実行します。 UPDATE STATISTICS の使用 UPDATE STATISTICS の構文は、組込み型の UDT と同じです。データ分散により オプティマイザに同等な統計情報が提供されるため、データベース サーバは UDT に対する colmin および colmax を計算しません。 statcollect() 関数は、UPDATE STATISTICS 実行時にデータベース サーバが走査 する各行に対して 1 回実行されます。データベース サーバが走査する行数は、モ ードと信頼水準によって異なります。UPDATE STATISTICS を HIGH モードで実 行すると、データベース サーバは表のすべての行を走査します。MEDIUM モード では、データベース サーバは信頼水準に基づいて走査する行数を選択します。信頼 水準が高いほど、データベース サーバが走査する行数は多くなります。UPDATE STATISTICS については、「IBM Informix: SQL ガイド: 構文」を参照してくださ い。 データベース サーバが収集する統計情報には、格納するためのスマート ラージ オ ブジェクトが必要な場合があります。構成パラメータ SBSSPACENAME は、この 情報を格納するための SB 領域を指定します。SBSSPACENAME を設定しない場 合、データベース サーバは指定された統計情報を収集できないことがあります。 UPDATE STATISTICS のサポート関数 statcollect() 関数と statprint() 関数は、統計情報の収集をサポートします。 UPDATE STATISTICS で UDT に関する統計情報を生成する場合は、これらの関数 を作成する必要があります。 168 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド stat 型 statcollect() 関数と statprint() 関数は、stat という SQL 型を使用します。 C 言語サポート 対応する C 言語構造体は、mi_statretval と呼ばれます。 mi_statretval については、 libmi ヘッダ ファイルを参照してください。 mi_statretval の多くの情報は内部で処理されます。ただし、以下の 2 つのフィール ドは statcollect() により入力する必要があります。 v フィールド statdata には分散用のヒストグラムが含まれます。UDT は複数表現形 式で格納されます。 v フィールド szind は MI_MULTIREP_SMALL または MI_MULTIREP_LARGE に 設定する必要があります。 C 言語サポート の終り statcollect() 関数 UPDATE STATISTICS を実行すると、データベース サーバは、走査する各列に対 して適切な statcollect() 関数を呼び出します。 statcollect() 関数は以下の 4 つの引数を取ります。 v 最初の引数は、statcollect() 関数が呼び出される UDT と同じ型となります。 データベース サーバはこの引数を使用して関数を解決し、値を渡します。 データベース サーバが初めてこの関数を呼び出すときは、このパラメータは NULL に設定されます。以降の呼出しでは、この引数に列の値が格納されます。 v 2 番目の引数は、データベース サーバが統計情報を収集するために走査する必要 がある行数を示す倍精度値です。 v 3 番目の引数は、UPDATE STATISTICS 文によって指定される解決値を示す倍精 度値です。解決値は分散のためのバケット サイズを指定します。ただし、UDT が認識できない場合、このパラメータは無視することができます。 v 4 番目の引数は、データベース サーバが UDR および状態情報の格納場所に情報 を渡すために使用する MI_FPARAM 構造体です。 statcollect() への最初の呼出しで、MI_FPARAM は SET_INIT 値を含みます。 statcollect() のこの値をチェックし、メモリの割当てと値の初期化などの初期化動作 を実行します。 statcollect() への以降の呼出しでは、MI_FPARAM には SET_RETONE 値が格納され ます。このとき、statcollect() は最初の引数から列の値を読み取り、分散構造体に格 納します。 すべての列が処理された後、statcollect() への最後の呼出しにより SET_END の値が MI_FPARAM に格納されます。この最後の呼出しでは、statcollect() は、統計情報を stat 型に格納し、メモリ割当てを解除します。 HANDLESNULLS を指定して statcollect() 関数を宣言する必要がありますが、こ の関数自体は NULL を無視することができます。 第 13 章 UDR パフォーマンスの向上 169 プール PER_COMMAND から statcollect() の複数の呼出しに使用するメモリを割り 当て、できる限り速やかにこれを解放します。statcollect() の複数の呼出しに使用 しないメモリは、プール PER_ROUTINE から割り当てる必要があります。 statprint() 関数 statprint() 関数は、statcollect() 関数によって収集された統計情報データを、デー タベース サーバが情報表示のために使用できるラージ可変長文字 (LVARCHAR) 型 値に変換します。ユーティリティ dbschema は、statprint() 関数を実行します。 statprint() 関数は 2 つの引数を取ります。最初の引数は必須の型のダミー引数で す。データベース サーバはこの引数を使用して関数を解決します。データベース サーバはこの関数を初めて実行するときに、最初のパラメータを NULL に設定しま す。 2 番目の引数は、stat 型の値です。stat 型は、マルチ表現型であり、データベース サーバはこのデータ型を使用して statcollect() 関数が収集するデータを格納しま す。 statprint() 関数は、マルチ表現フォームで格納されているヒストグラムを取得し、出 力可能フォームに変換します。 関数を登録した後、DBA 特権を持つユーザまたは表所有者が、 statcollect() およ び statprint() UDR を実行できることを確認します。 ユーザ定義統計関数の例 C で作成された statprint() 関数と statcollect() 関数の例については、DataBlade Developer's Kit をインストール後にディレクトリ \%INFORMIXDIR\dbdk\examples\Types\dapi\Statistics\Box\src\ を参照してくだ さい。 否定関数の使用 否定関数 は比較関数と同じ引数を同じ順序で取りますが、ブール型補数を戻しま す。つまり、関数が引数の任意の集合に対して TRUE を戻す場合、同じ引数を同じ 順序で渡すときに、その否定関数は FALSE を戻します。場合によっては、問合せの 意味を逆にすると、つまり、問合せが “Is y less than or equal to x? (y は x 以下 か?)” ではなく、“Is x greater than y? (x は y より大か?)” である場合、データベ ース サーバは問合せをさらに効率的に処理できます。 CREATE FUNCTION 文の修飾子 NEGATOR は、比較関数、否定関数を現行の関数 に指定します。否定関数を提供する場合、オプティマイザは、指定した関数ではな く、否定関数を使用することができます (効率的な場合)。関数が否定関数を持つ場 合、関数を実行するユーザは、関数と否定関数の両方に対する Execute 特権を持つ 必要があります。また、関数は、否定関数と同じ所有者を持つ必要があります。 否定関数は SPL、C、または Java で作成することができます。次の例は、否定関数 を指定する CREATE FUNCTION 文を示します。 CREATE ROW TYPE complex(real FLOAT, imag FLOAT); CREATE FUNCTION equal (c1 complex, c2 complex) RETURNING BOOLEAN WITH (NEGATOR = notequal) 170 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド DEFINE a BOOLEAN; IF (c1.real = c2.real) AND (c1.imag = c2.imag) THEN LET a = ’t’; ELSE LET a = ’f’; END IF; RETURN a; END FUNCTION; CREATE FUNCTION notequal (c1 complex, c2 complex) RETURNING BOOLEAN WITH (NEGATOR = equal) DEFINE a BOOLEAN; IF (c1.real != c2.real) OR (c1.imag != c2.imag) THEN LET a = ’t’; ELSE LET a = ’f’; END IF; RETURN a; END FUNCTION; 仮想プロセッサ クラスの使用 仮想プロセス は、データベース サーバが問合せを実行したり、ディスク入出力お よびネットワーク管理などの他のタスクを実行するために使用するプロセスです。 データベース サーバはクライアント アプリケーション要求をスレッド という要素 に分割するので、多数のクライアント アプリケーションの代わりに少数の仮想プロ セッサ (VP) がタスクを実行できます。 VP は処理のために、個別のスレッドを内 部でスケジュールすることができます。したがって、複数の同時スレッドを実行で きるため、VP はマルチスレッド プロセスです。 データベース サーバは、独自のスレッドを実装し、クライアント アプリケーショ ン要求をスケジュールすることができます。これらのスレッドは、マルチスレッド オペレーティング システムによって提供されるオペレーティング システム スレッ ドとは異なります。 仮想プロセッサは、仮想プロセッサ クラス、つまり VP クラス にグループ化され ます。特定の VP クラスのすべての VP は同じタイプの処理を実行します。データ ベース サーバは次の VP クラスをサポートしています。 仮想プロセッサ クラス 説明 CPU 中央処理 (クライアント アプリケーション要求を制 御する主 VP クラス) AIO 非同期ディスク入出力 SHM 共有メモリ ネットワーク通信 JVP Java UDR 実行のための特殊 VP クラス ユーザ定義 追加のタイプの処理のための特殊 VP クラス 仮想プロセッサの詳細については、「IBM Informix: Administrator’s Guide」を参照 してください。 第 13 章 UDR パフォーマンスの向上 171 仮想プロセッサ クラスの選択 データベース サーバは、UDR を実行するために次のクラスの仮想プロセッサをサ ポートしています。 仮想プロセッサ クラス 説明 CPU VP SPL ルーチンの実行に必要な VP。C UDR の実行のためのデフ ォルト VP です。UDR は CPU VP で実行されるため、正常に 動作する必要があります。 動作が不正な特性を持つ C 言語の UDR の実行のための VP Java UDR の実行のための VP。この VP クラスは Java 仮想マ シン (Java VM) を含みます。 ユーザ定義 VP JVP データベース サーバは、CPU VP および JVP クラスを定義します。 CPU 仮想プロセッサ クラス CPU 仮想プロセッサ クラスは、データベース サーバの主 VP クラスです。次の種 類のスレッドを実行します。 v すべてのセッション スレッド セッション スレッドは SQL クライアント アプリケーションからの要求を処理 します。 v 内部スレッド 内部スレッドはデータベース サーバ内部のサービスを実行します。 CPU VP クラスは、UDR のデフォルトの VP クラスです。 UDR を CPU VP ク ラスで実行するには、CREATE FUNCTION 文または CREATE PROCEDURE 文に CLASS ルーチン修飾子を指定する必要はありません。 ストアド プロシジャ言語サポート SPL ルーチンは、必ず CPU VP で実行する必要があります。したがって、SPL ル ーチンに CLASS ルーチン修飾子を指定する必要はありません。次の CREATE FUNCTION 文は、 CPU VP で実行される getTotal() SPL ルーチンを登録しま す。 CREATE FUNCTION getTotal(order_num, state_code) RETURNS MONEY ... END FUNCTION ユーザ定義 VP で SPL ルーチンを実行することはできません。 ストアド プロシジャ言語サポート の終り C 言語サポート デフォルトでは、C UDR は CPU VP クラスで実行されます。通常、UDR は、問 合せ実行時にスレッドがオペレーティング システム プロセス間で移行する必要が ないため、CPU VP クラスで最適に実行されます。ただし、CPU VP で実行するに は、 C UDR が正常に動作している 必要があります。つまり、次のプログラミング 要件を満たす必要があります。 172 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v CPU VP の並行性を保持する。 – 集中的な計算を行うための CPU VP を生成します。 – ブロック オペレーティング システム呼出しを行いません。 v スレッド セーフである。 – 静的データまたはグローバル データを変更しません。 – ローカル リソースを割り当てません。 – グローバル VP 状態を変更しません。 v 安全ではないオペレーティング システム呼出しを行わない。 重要: CPU VP は注意して使用してください。UDR にエラーが含まれるか、これら のガイドラインに沿わない場合、このルーチンは他のユーザ問合せの正常な 処理に影響を及ぼすことがあります。 ユーザ定義 VP クラスで C UDR を実行する場合は、これらのプログラミング要件 の一部を緩和することができます。詳しくは、173 ページの『ユーザ定義仮想プロ セッサ クラス (C のみ)』を参照してください。 C 言語サポート の終り ユーザ定義仮想プロセッサ クラス (C のみ) C で作成されるルーチンでは、ユーザ定義クラスの仮想プロセッサ (ユーザ定義 VP) を指定してルーチンを実行できます。 問合せは通常、CPU VP で実行され、問合せスレッドをユーザ定義 VP に移行して 外部ルーチンを評価する必要があるため、ユーザ定義 VP を使用すると、パフォー マンスが低下することがあります。 JVM 仮想プロセッサ クラス (Java のみ) Java ルーチンは 常に Java VP で実行されます。Java を登録する場合、読み取りや すくするために次の CLASS ルーチン修飾子を指定できますが、必須ではありませ ん。 CLASS = jvp C で作成された UDR での仮想プロセッサの使用 CPU VP クラスで実行するには、C UDR は正常に動作している必要があります。 つまり、特殊なプログラミング要件を満たす必要があります。ユーザ定義 VP で実 行すると、ルーチンの正常動作のプログラミング要件の一部が緩和されますが、す べてが緩和されるわけではありません。例えば、これらのルーチンは、入出力が完 了するまで仮想プロセッサによる以降の処理をブロックする直接ファイルシステム 呼出しを発行することができます。ただし、仮想プロセッサは CPU 仮想プロセッ サではないため、ユーザ問合せの標準処理には影響が及びません。また、VP 間で移 行することがあるため、これらのルーチンはローカル リソース割当てを行うことは できません。 ヒント: IBM Informix Developer Zone (www.ibm.com/software/data/developer/informix) の DataBlade Developers コ 第 13 章 UDR パフォーマンスの向上 173 ーナーに、ユーザ定義 VP とともにオペレーティング システム関数を使用 するときのデータ安全性に関する詳細記事が掲載されています。 C 言語の UDR をユーザ定義 VP クラスに割り当てるには: 1. 外部関数またはプロシジャを登録するときに、CREATE FUNCTION 文または CREATE PROCEDURE 文の CLASS ルーチン修飾子を使用して仮想プロセスの クラスに割り当てます。 CLASS ルーチン修飾子は、次の構文で仮想プロセッサ クラスを指定します。 CLASS = vpclass_name この構文では、vpclass_name は、データベース サーバに設定したユーザ定義 VP クラス名です。クラス名では大文字と小文字は区別されません。 2. 構成パラメータ VPCLASS を使用してファイル ONCONFIG に新規ユーザ定義 仮想プロセッサ クラスを構成します。 次の ONCONFIG エントリの例ではユーザ定義 VP クラス newvp が作成され ます。 VPCLASS newvp,num=3 # New VP class for testing オプション num は、データベース サーバが起動する仮想プロセッサ数を指定 します。仮想プロセッサ クラス newvp の場合、データベース サーバは最初に 3 つの仮想プロセッサを起動します。 ルーチンを登録するときに VP クラスは存在していなくても構いません。ただし、 ルーチンを実行するときには、クラスが存在し、仮想プロセッサを割り当てる必要 があります。クラスに仮想プロセッサが割り当てられていない場合、SQL エラーを 受け取ります。 C UDR に対して仮想プロセッサ クラスを選択する方法の詳細については、 「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。構成パ ラメータ VPCLASS については、「IBM Informix: 管理者の参照」を参照してくだ さい。 仮想プロセッサの管理 ユーティリティ onmode と onstat を使用して仮想プロセッサを管理できます。 onmode および onstat の詳細については、「IBM Informix: 管理者の参照」を参 照してください。 仮想プロセッサの追加および削除 データベース サーバがオンライン状態のときに、ユーザ定義 VP クラスまたは CPU VP クラスで、仮想プロセッサを追加または削除できます。onmode -p を使 用して仮想プロセッサをクラスに追加します。例えば、次のコマンドは 2 つの仮想 プロセッサをクラス newvp に追加します。 onmode -p +2 newvp 仮想プロセッサ クラスの監視 ユーティリティ onstat を使用して VP を監視できます。オプション -g glo を使 用すると、仮想プロセッサの CPU 使用率およびセッション合計数などのグローバ 174 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド ル マルチスレッド化に関する情報が出力されます。ユーザ定義 VP クラスは、新規 プロセスとして onstat -g glo 出力に表示されます。 並列 UDR 並列データベース問合せ (PDQ) 機能は、複数のスレッドを並列して単一の問合せを 実行します。別の機能である表のフラグメント化により、表の一部を異なるディス クに格納することができます。 PDQ は、問合せをしているデータがフラグメント 化された表にある場合に最高のパフォーマンスを発揮します。 PDQ 機能により、データベース サーバは SQL 文の 1 つの局面の作業を複数のプ ロセッサに分散することができます。例えば、SQL 文で、異なるディスク上にある 表の一部を走査する必要がある場合、複数の走査を同時に実行できます。 PDQ は、オプティマイザが並列実行を選択したときに PDQ 技法を使用してデータ ベース サーバが処理する問合せです。データベース サーバが PDQ を使用して問 合せを処理すると、最初に問合せを副プランに分割します。次に、データベース サ ーバは副プランを並列して処理する複数のスレッドに割り当てます。各副プランは オリジナルの問合せと比較して処理時間の合計が短く、各副プランは他のすべての 副プランと同時に処理されるため、データベース サーバが問合せを処理するために 必要な時間を大幅に削減することができます。 PDQ 機能の詳細については、「IBM Informix: Administrator’s Guide」を参照してく ださい。PDQ のパフォーマンスの詳細については、「IBM Informix: Performance Guide」を参照してください。 UDR の並列実行 データベース サーバは、以下の UDR が PDQ の一部であり、PDQPRIORITY が有 効である場合に、これらの UDR を並列実行することができます。 v PDQ スレッド セーフである DataBlade API 関数のみを呼び出す C 言語の UDR は、並列実行できます。 v PDQ スレッド セーフである DataBlade API 関数のみを呼び出す Java UDR は、 並列実行できます。 詳しくは、180 ページの『PDQ スレッド セーフ UDR の作成』を参照してくだ さい。 v 組込み関数 UDR 組込み関数 UDR の例には、汎用 B ツリー インデックスに使用する次の演算子 を含む、UDT に対するオーバーロードされた演算子が含まれます。 – lessthan (<) – lessthanorequal (<=) – equal (=) – greaterthanorequal (>=) – greaterthan (>) UDR が PDQ の一部であり、PDQPRIORITY が有効である場合、次の状態において 並列実行することができます。 v 問合せで UDR を式として使用する 第 13 章 UDR パフォーマンスの向上 175 v DataBlade API FastPath によって UDR が実行される v ユーザ定義型の列のユーザ定義集計関数を評価する際に UDR を暗黙的に実行す る v 比較演算子をオーバーロードするために UDR を暗黙的に実行する v Assign UDR を暗黙的に実行する v ソートを行うために compare UDR を実行する v 汎用 B ツリー インデックスによって UDR が実行される UDR は次の SQL 文を並列実行することはできません。 v DB–Access または ESQL/C における EXECUTE FUNCTION 文による単一の実 行 v INSERT INTO tablename EXECUTE udr() v FOREACH EXECUTE udr() END FOREACH v OPEN CURSOR EXECUTE udr() v 遠隔 UDR 実行 問合せ式での UDR の実行 UDR を実行する 1 つの方法は、問合せに式として指定することです。UDR が、次 のような問合せの一部の式に含まれる場合、並列実行を活用することができます。 v WHERE 節 v SELECT リスト v GROUP by リスト v オーバーロードされた比較演算子 v ユーザ定義集計関数 v HAVING 節 v 並列挿入文のための選択リスト v 複数のインデックス フラグメント上の汎用 B ツリー走査 (B ツリー インデック ス走査で使用する比較関数が並列化できる場合) v 仮想表インターフェイス (VTI) または仮想インデックス インターフェイス (VII) フラグメント (VTI または VII のすべての am_purpose 関数が並列化できる場 合) WHERE 節における並列 UDR: す。 次の例は、2 つの UDR を含む標準的な PDQ で SELECT c_udr1(tabid) FROM tab WHERE tabname = c_udr2(3) AND tabid > 100; 表 tab に複数のフラグメントがあり、オプティマイザが SELECT 文を並列実行す る場合は、次の操作を並列実行することができます。 v 表 tab の走査は、複数の走査スレッドによって並列実行されます。各走査スレッ ドでは tab のフラグメントから行が取り出されます。 v 各走査スレッドでは WHERE 条件も並列して評価されます。各走査スレッドでは UDR c_udr2() が並列実行されます。 v 各走査スレッドでは、選択リストの UDR c_udr1() も並列実行されます。 176 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 結合における並列 UDR: す。 次の問合せの例には、表 t1 と t2 の結合が含まれま SELECT t1.x, t2.y FROM t1, t2 where t1.x = t2.y and c_udr(t1.z, t2.z, 3) > 5 and c_udr1(t1.u) > 4 and c_udr2(t2.u) < 5; 表 t1 と t2 に複数のフラグメントがあり、オプティマイザが SELECT 文を並列実 行する場合、次の操作を並列実行することができます。 v 表 t1 の走査は、複数の走査スレッドによって並列実行されます。各走査スレッ ドでは t1 のフラグメントから行が取り出され、UDR c_udr1() が並列実行され ます。 v 表 t2 の走査は、複数の走査スレッドによって並列実行されます。各走査スレッ ドでは t2 のフラグメントから行が取り出され、UDR c_udr2() が並列実行され ます。 v 表 t1 と t2 の結合は、複数の結合スレッドによって並列実行されます。各結合 スレッドでは t2 のフラグメントから行が取り出され、UDR c_udr() が並列実行 されます。 選択リストにおける並列 UDR: 選択リストに UDR を使用し、WHERE 節を指定 しない場合、次の条件に該当する場合は、UDR を並列実行できます。 v GROUP BY 節が問合せに指定されている。 v ORDER BY 節が問合せに指定されている。 v MIN、MAX、AVG などの集計関数が問合せに指定されている。 v 問合せが並列 INSERT...SELECT 文である。 v 問合せが SELECT...INTO 文である。 次のセクションでは、選択リストに UDR があり、WHERE 節が指定されていない 問合せの例を示します。 GROUP BY による並列 UDR: 次の問合せの例には GROUP BY 節が含まれま す。この問合せの例では、選択リストに UDR があり、WHERE 節は指定されてい ません。 SELECT c_udr1(tabid), COUNT(*) FROM t1 GROUP BY 1; オプティマイザが SELECT 文を並列実行する場合は、次の操作を並列実行すること ができます。 v 表 t1 の走査は、複数の走査スレッドによって並列実行されます。表 t1 には複 数のフラグメントがあります。各走査スレッドでは t1 のフラグメントから行が 取り出されます。 v 複数のスレッドにより UDR c_udr2() が並列実行され、GROUP BY 節が処理さ れます。表 t1 がフラグメント化されていない場合、走査は並列実行されません が、GROUP BY 操作は並列実行することができます。 第 13 章 UDR パフォーマンスの向上 177 並列挿入のための選択リストの並列 UDR: 次の問合せの例は、並列 INSERT 文で す。不透明 (opaque) 型 circle を作成するとして、タイプ circle の列を定義する表 cir_t を作成し、UDR area を作成し、次の問合せの例を実行します。 INSERT INTO cirt_t_target SELECT circle, area(circle) FROM cir_t WHERE circle > "(6,2,4)"; この問合せでは、次の操作を並列実行することができます。 v WHERE 節の式 circle > “(6,2,4)” 表 cir_t がフラグメント化されている場合、表の複数の走査を並列実行すること ができます (フラグメントごとに走査を 1 回ずつ)。次に、複数の比較演算子 > を並列実行することができます (フラグメントごとに演算子を 1 つずつ)。 v 選択リストの UDR area(circle) 表 cir_t に複数のフラグメントがある場合、複数の area UDR を並列実行する ことができます (フラグメントごとに UDR を 1 つずつ)。 v cir_t_target への INSERT 表 cir_t_target に複数のフラグメントがある場合、複数の INSERT 文を並列実 行することができます (フラグメントごとに 1 つずつ)。 DataBlade API における UDR の FastPath 実行 (C のみ) C UDR は次の DataBlade API 呼出しを使用して UDR を直接呼び出すことができ ます。 v mi_routine_get() v mi_routine_exec() UDR が並列化されて、PDQ スレッド セーフである DataBlade API 関数のみを呼 び出す場合は、UDR の DataBlade API FastPath 実行は並列実行されます。 ユーザ定義集計関数の暗黙的な UDR 実行 UDR が並列化されて、PDQ スレッド セーフである DataBlade API 関数のみを呼 び出す場合は、ユーザ定義集計関数 (UDA) を並列実行することができます。 例えば、uda という UDA を作成し、次の SQL 問合せに使用するとします。 select grp, uda(udt_col) FROM tab GROUP BY grp; 列 udt_col の型が、集計に UDR 呼出しが必要な UDT である場合、次の操作を並 列実行することができます。 v 各グループ スレッドで集計 UDR uda を並列実行します。 v GROUP BY 列 grp が列 UDT である場合、列 UDT の equal() UDR 関数は、 group by キーのハッシュ再区画化のために走査スレッドによって並列実行されま す。 v 表 tab がフラグメント化されている場合、複数の走査スレッドが並列して表を読 み取ることができます。 比較演算子の暗黙的な UDR 実行 不透明 (opaque) 型を作成すると、equal (=) または greaterthanorequal (>=) など の比較演算子に対してオーバーロードされるルーチンを作成することができます。 178 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 次の問合せの例では、列 UDT でフィルタを使用して行を選択します。 SELECT * FROM tab WHERE udt_col = "xyz"; データベース サーバは列 udt_col の equal UDR を呼び出すために比較演算子 = を変換します。表 tab がフラグメント化されている場合、次の操作を並列実行する ことができます。 v 表の複数の走査を並列実行することができます (フラグメントごとに走査を 1 回 ずつ)。 v 複数の比較演算子 = を並列実行することができます (表 tab のフラグメントご とに演算子を 1 つずつ)。 Assign UDR の暗黙的な実行 不透明 (opaque) 型を作成するとき、表の UDT データの挿入、更新、またはロード を行うためにサポート関数 assign() を作成します。 次の SQL 文の例では列 UDT にデータが挿入されます。 INSERT INTO tab (udtcol) SELECT udtcol FROM t1; 表 tab に複数のフラグメントがあり、udtcol 型が assign() 関数を持つ場合、表 tab のフラグメントを挿入する各挿入スレッドでは、assign() UDR が並列実行さ れます。 destroy() UDR は、並列実行されない DELETE 文内で呼び出されるため、UDT に 対するサポート関数 destroy() は、並列実行されません。 ソートのための compare UDR の実行 不透明 (opaque) 型を作成するとき、ORDER BY、UNIQUE、DISTINCT、および UNION 節および CREATE INDEX 操作時の UDT データをソートするためにサポ ート関数 compare() を作成します。 SELECT udtcol FROM t ORDER BY 1; 列 udtcol に、並列化可能な compare UDR があり、クライアントが並列ソートを 有効化している場合、order by 節に対する並列ソートに関連する各ソート スレッド で compare UDR が並列実行されます。 UDT 列のインデックスによる UDR の実行 データベース サーバは、UDT 列のインデックス機能をサポートしています。した がって、インデックスの作成、検索、および復旧を行うには、UDT 列を操作する UDR を実行する必要があります。 現時点で、データベース サーバは、UDT 列の式によるフラグメント化をサポート していません。したがって、インデックスのフラグメント化はフラグメント化が式 に基づく場合にのみ有効であるため、データベース サーバによる UDT 列で作成さ れるインデックスはフラグメント化されません。 並列 UDR の有効化 デフォルトでは、UDR は並列実行を行いません。 UDR の並列実行を有効にするに は、次の操作を行います。 第 13 章 UDR パフォーマンスの向上 179 v CREATE FUNCTION 文または ALTER FUNCTION 文に修飾子 PARALLELIZABLE を指定します。 v UDR が非 PDQ スレッド セーフ関数を呼び出さないようにします。 v PDQ を有効にします。 v PDQ の UDR を使用します。 修飾子 PARALLELIZABLE の指定 UDR を登録する場合、CREATE FUNCTION 文または ALTER FUNCTION 文に修 飾子 PARALLELIZABLE を指定する必要があります。ただし、並列化できることを 宣言した場合でも、SPL ルーチンは並列化されません。 PDQ スレッド セーフ UDR の作成 外部言語 UDR は、PDQ スレッド セーフ DataBlade API 関数である限り、並列実 行することができます。 次の DataBlade API 関数カテゴリは、PDQ スレッド セーフです。 v データ処理 このカテゴリの例外: コレクション操作関数 (mi_collection_*) は PDQ スレッ ド セーフではありません。 v セッション、スレッド、およびトランザクション管理 v 関数実行 v メモリ管理 v 例外処理 v コールバック v その他 外部言語 UDR が修飾子 PARALLELIZABLE を指定して作成された非 PDQ スレッ ド セーフ関数を呼び出す場合、データベース サーバは問合せを中断し、次のエラ ー メッセージを発行します。 -7422 Can not issue DAPI function %s in a secondary PDQ thread. データベース サーバは、このエラー メッセージの %s 文字列に DataBlade API 関 数名を表示します。 PDQ の有効化および他の構成パラメータの検討 問合せの並列実行は、デフォルトでは無効です。並列実行を有効にするには、次の いずれかの方法を使用します。 v 環境変数 PDQPRIORITY を 0 より大きい値に設定します。 v SQL 文 SET PDQPRIORITY を実行します。 PDQ 構成パラメータは、通常の PDQ 問合せに対するのと同じように並列 UDR に 影響を及ぼします。例えば、パラメータ DS_MAX_SCANS は、データベース サー バが同時に実行可能な走査スレッド数の最大値を指定します。 PDQ 構成パラメータの調整方法については、「IBM Informix: Performance Guide」 を参照してください。 180 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 並列 UDR を有効化するための段階的な手順 次の手順では、前のセクションで説明したタスクの例が含まれています。 並列 UDR を有効化するには: 1. フラグメント化された表を作成し、データをロードします。 例えば、次の SQL 文を使用してフラグメント化された表を作成します。 CREATE TABLE natural_number (x integer) FRAGMENT BY round robin IN dbspace1, dbspace2; 2. PDQ スレッド セーフな関数を作成します。 C 言語サポート 例えば、次の C プロトタイプ関数は整数値を取り、その値が素数であるかどう かを判別します。 mi_boolean is_prime_number (x mi_integer); C 言語サポート の終り PDQ スレッド セーフな関数の作成方法の詳細については、180 ページの『PDQ スレッド セーフ UDR の作成』を参照してください。 3. 関数を外部 UDR として登録し、キーワード PARALLELIZABLE を指定しま す。 例えば、次の SQL 文は is_prime_number UDR を登録します。 CREATE FUNCTION is_prime_number (x integer) RETURNS boolean WITH (parallelizable) EXTERNAL NAME "$USERFUNCDIR/math.udr" LANGUAGE C; 4. PDQ を有効にし、問合せの UDR を実行します。 次の SQL 文の例では、PDQ を有効にし、問合せの UDR を実行します。 SET PDQPRIORITY 100; SELECT x FROM natural_number WHERE is_prime_number(x) ORDER BY x; データベース サーバは、表 natural_number の各フラグメントを走査し、複数 の走査スレッドを並列実行します。各走査スレッドでは UDR is_prime_number() が並列実行されます。 仮想プロセッサ数の設定 仮想プロセッサの動的なマルチスレッド機能により並列処理を行うことができま す。CPU クラスの仮想プロセッサは、UDR に含まれる SQL 文に対して複数のセ ッション スレッドを並列実行できます。 ファイル ONCONFIG の構成パラメータ VPCLASS を使用して CPU 仮想プロセッ サ数を増やすことができます。例えば、次のパラメータはデータベース サーバが cpu クラスに対して 4 つの仮想プロセッサを起動することを指定します。 VPCLASS cpu,num=4 第 13 章 UDR パフォーマンスの向上 181 ヒント: スレッドはプロセス間で移行することがあるため、複数の CPU がある場 合、デバッグは難しくなります。データベース サーバの通信機構では SIGUSR1 シグナルが使用されます。デバッグ実行中は、データベース サ ーバ プロセスがハングすることを防止するため、SIGUSR1 を使用しない ようにする必要があります。 Java 言語サポート Windows では、すべての仮想プロセッサが同じプロセス領域を共用します。したが って、Java UDR を並列実行するために Java VP の複数のインスタンスを起動する 必要はありません。UNIX では、データベース サーバは、Java UDR 呼出しを並列 化するために、JVP の複数のインスタンスを持つ必要があります。異なる VP に埋 め込まれた Java 仮想マシンは状態を共用しないので、Java クラス変数を使用して グローバル状態を格納することはできません。すべてのグローバル状態は、整合性 を保つため、データベースに格納する必要があります。 Java 言語サポート の終り 並列 UDR の監視 PDQ を有効にすると、SET EXPLAIN 出力にオプティマイザが問合せを並列実行す るかどうかが表示されます。オプティマイザが並列走査を選択した場合、出力に PARALLEL が表示されます。PDQ を無効にすると、出力に SERIAL が表示されま す。 ユーティリティ onstat の次のオプションを使用して PDQ および並列 UDR の並 列実行を監視することができます。 v onstat -g ath このオプションは、各セッションで現在実行されているスレッドを表示します。 各セッションには主 (sqlexec) スレッドがあります。この問合せが並列実行され ている場合は、onstat -g ath に、scan および sort などの 2 次スレッドが表 示されます。 v onstat -g mem このオプションは、セッションに割り当てられたプール サイズを表示します。こ の出力は、UDR によって使用されるメモリ容量に関するヒントを示すことができ ます。 v onstat -g ses このオプションは、各セッションに割り当てられたスレッド数と使用されるメモ リ容量を表示します。この出力も、UDR によって使用されるメモリ容量に関する ヒントを示すことができます。 これらの onstat オプションの出力の解釈の詳細については、「IBM Informix: Performance Guide」を参照してください。 182 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド メモリに関する考慮事項 UDR を作成する場合、メモリ使用量を最小化する方法を考慮してください。このセ クションでは、UDR の次のメモリに関する考慮事項について説明します。 v 外部ルーチンのメモリ接続期間 v 外部ルーチンのスタック サイズの検討事項 v SPL および外部ルーチンのための仮想メモリ キャッシュ C UDR のメモリ接続期間 C UDR はデータベース サーバのメモリ領域で実行されるので、動的なメモリ割当 てによりデータベース サーバのメモリ使用量が増えることがあります。この理由か ら、UDR がこのメモリにアクセスする必要がなくなった場合すぐに、動的に割り当 てられたメモリを解放することが非常に重要です。 不要なメモリを解放するために、データベース サーバはメモリ接続期間とその共有 メモリから行われたメモリ割当てを関連付けます。データベース サーバはそのメモ リ接続期間に基づいて共有メモリを自動的に再利用します。 戻り値のために安全な期間を提供するため、SQL 文の有効期間にわたり持続するメ モリ接続期間を使用してください。PER_STATEMENT 期間ではなく、次のメモリ接 続期間を使用することをお勧めします。 v PER_STMT_EXEC PER_STMT_EXEC メモリ接続期間は、PER_STATEMENT 期間ほどメモリを保持 しないので、データベース サーバ全体のパフォーマンスを向上させるために役立 ちます。 v PER_STMT_PREP 作成された文の有効期間にわたりメモリを保持するには、PER_STMT_PREP メモ リ持続期間を使用します。 これらのメモリ持続期間および C UDR のメモリ使用量を監視するためのユーティ リティ onstat のオプションの使用については、「IBM Informix: DataBlade API Programmer’s Guide」を参照してください。 スタック サイズに関する考慮事項 (Ext のみ) データベース サーバは共有メモリから外部ルーチンにローカル ストレージを割り 当てます。このローカル ストレージはスレッド スタック と呼ばれます。スタック は固定長です。したがって、外部ルーチンは、大きなローカル変数の宣言、または 長すぎる呼出しチェーンや再帰などにより、スタック領域を過度に消費しないよう にする必要があります。 警告: スタックに割り当てられた共有メモリ領域をオーバーランした外部ルーチン は、隣接する共有メモリを上書きし、予測不能で望ましくない結果を招くこ とがあります。 また、スレッドにより割り当てられる非スタック記憶域は共有メモリ内にある必要 があります。それ以外の場合、スレッドがある VP から他の VP に移動するときに メモリが可視になりません。 第 13 章 UDR パフォーマンスの向上 183 データベース サーバのルーチン マネージャは、ユーザ定義関数を呼び出す前に ス レッドが大きなスタック領域を使用できることを保証するため、通常、スタック不 足が問題になることはありません。 C 言語サポート C UDR の場合、スタック領域を動的に割り当てることができます。また、 DataBlade API では、個別の処理ごとに割り当てられるメモリではなく、共有メモ リから領域を割り当てるメモリ管理ルーチンが用意されています。DataBlade API を使用する場合は、メモリの可視性が問題になることはありません。 C 言語サポート の終り デフォルトでは、ルーチン マネージャは、構成パラメータ STACKSIZE に指定さ れたサイズを使用して UDR のスタック サイズを割り当てます。STACKSIZE が設 定されていない場合、ルーチン マネージャはデフォルトのスタック サイズである 32 キロバイトを使用します。UDR に必要なスタック領域のサイズを判別するに は、次のユーティリティ onstat を使用してシステム プロンプトから UDR をモニ タします。 onstat -g sts オプション onstat -g sts を使用して、各スレッドのスタック サイズ使用に関す る情報を取得します。出力には次のフィールドが含まれます。 v スレッド ID v 各スレッドに設定された最大スタック サイズ v スレッドが使用する最大スタック サイズ ユーザ セッションに対して構成された最大スタック サイズを変更する必要がある かどうか決定する場合、ユーザ セッションに属するスレッドの出力を使用すること ができます。すべてのユーザ セッションの最大スタック サイズを変更するには、 構成パラメータ STACKSIZE の値を変更します。1 つのユーザ セッションの最大 スタック サイズを変更するには、環境変数 INFORMIXSTACKSIZE の値を変更し ます。詳しくは、「IBM Informix: 管理者の参照」の構成パラメータ STAGEBLOB および「IBM Informix: SQL ガイド: 参照」の環境変数 INFORMIXSTACKSIZE を 参照してください。 ユーティリティ onstat およびオプション -g sts の詳細については、 「IBM Informix: 管理者の参照」を参照してください。 スタック サイズが UDR に対して十分ではない場合、CREATE FUNCTION 文また は CREATE PROCEDURE 文の WITH 節にルーチン修飾子 STACK を指定してス タック サイズを指定することができます。 UDR のスタック サイズを指定する と、データベース サーバはルーチンを呼び出すごとに 指定されたメモリ容量を割 り当てます。ルーチンに大きなスタックが必要ではない場合は、スタック サイズを 指定しないでください。 ルーチンの仮想メモリ キャッシュ データベース サーバは共有メモリの仮想部分に次の項目をキャッシュします。 184 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド v システム カタログ表 sysprocedures の情報 (SPL ルーチンと他の UDR の場 合) v UDR キャッシュのルーチンの実行可能形式 (SPL ルーチンの場合のみ) システム カタログ表 sysprocedures セッションで SPL ルーチンを初めて使用する必要がある場合、データベース サー バはシステム カタログ表 sysprocedures を読み取り、情報を共有メモリのバッフ ァ プールに格納します。データベース サーバは、UDR を呼び出したセッション以 降の情報がある場合、共有メモリのこの情報を使用します。 データベース サーバは、MRU (Most Recently Used) の基準に基づいて sysprocedures システム カタログ情報をバッファ プールに保持します。 表 sysprocedures には次の情報が含まれます。 v ルーチン名 v 戻り値のコンパイル済みサイズ (バイト) v ルーチンの疑似コードのコンパイル済みサイズ (バイト) v 引数の数 v パラメータのデータ型 v ルーチンのタイプ (関数またはプロシジャ) v 外部ルーチンの格納場所 v ルーチンが実行される仮想プロセッサ クラス UDR キャッシュ セッションで SPL ルーチンを初めて使用する必要がある場合、データベース サー バはシステム カタログ表を読み取り、SPL ルーチンのためのコードを取得します。 データベース サーバは疑似コードを実行可能形式に変換します。データベース サ ーバは SPL ルーチンのこの実行可能形式を共有メモリの仮想部にキャッシュしま す。 データベース サーバは、MRU (Most Recently Used) の基準に基づいて SPL ルーチ ンの実行可能形式を UDR キャッシュに保持します。 ユーティリティ onstat のオプション -g prc を使用して UDR キャッシュをモニ タすることができます。onstat -g prc および構成パラメータ PC_POOLSIZE の UDR キャッシュのサイズ調整の詳細については、「IBM Informix: Performance Guide」を参照してください。 入出力に関する考慮事項 データベース サーバは UDR とトリガを次のシステム カタログ表に格納します。 v sysprocbody v sysprocedures v sysprocplan v sysprocauth v systrigbody 第 13 章 UDR パフォーマンスの向上 185 v systriggers これらのシステム カタログ表は、データベース内で UDR を多数使用すると、大き くなることがあります。頻繁に使用されるデータ表として、重要なシステム カタロ グ表を調整することができます。パフォーマンスを向上させるには、次の方法を使 用してください。 v システム カタログ表を分離します。 v 入出力動作のバランスを取ります。 システム カタログ表の分離 データベース サーバで複数の物理ディスクが使用可能な場合は、単一のデバイス上 のシステム カタログ表を分離し、アプリケーションの表を異なるデバイス上にある 別の DB 領域に配置することができます。このように分離すると、同じデバイスの 競合が削減されます。 入出力動作のバランシング 複数のエクステントにわたる多数の UDR がある場合は、システム カタログ表を同 じ DB 領域内の別の物理デバイス (チャンク) に広げることにより、入出力動作の バランスを取ることができます。 ユーザ定義ルーチン カタログを複数のデバイスにわたって広げるには: 1. 幾つかのチャンクを持つ UDR システム カタログ表の DB 領域を作成します。 DB 領域の各チャンクを別のディスク上に作成します。 2. IN dbspace 節を指定した CREATE DATABASE 文を使用してシステム カタロ グ表をその DB 領域内で分離します。 3. CREATE PROCEDURE 文または CREATE FUNCTION 文を使用して UDR の 約半数をロードします。 4. DB 領域に一時表を作成します。エクステント サイズは、最初のチャンクでデ ィスク領域の残りを使用するために十分なエクステント サイズにします。 5. 残りの UDR をロードします。ルーチンの残りの半数は 2 番目のチャンクに格 納されます。 6. 一時表を削除します。 186 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 特記事項 本書に記載の製品、サービス、または機能が日本においては提供されていない場合 があります。日本で利用可能な製品、サービス、および機能については、日本 IBM の営業担当員にお尋ねください。本書で IBM 製品、プログラム、またはサービス に言及していても、その IBM 製品、プログラム、またはサービスのみが使用可能 であることを意味するものではありません。これらに代えて、IBM の知的所有権を 侵害することのない、機能的に同等の製品、プログラム、またはサービスを使用す ることができます。ただし、IBM 以外の製品とプログラムの操作またはサービスの 評価および検証は、お客様の責任で行っていただきます。 IBM は、本書に記載されている内容に関して特許権 (特許出願中のものを含む) を 保有している場合があります。本書の提供は、お客様にこれらの特許権について実 施権を許諾することを意味するものではありません。実施権についてのお問い合わ せは、書面にて下記宛先にお送りください。 〒106-0032 東京都港区六本木 3-2-31 IBM World Trade Asia Corporation Licensing 以下の保証は、国または地域の法律に沿わない場合は、適用されません。IBM およ びその直接または間接の子会社は、本書を特定物として「現存するままの状態」で 提供し、商品性の保証、特定目的適合性の保証および法律上の瑕疵担保責任を含む すべての明示もしくは黙示の保証責任を負わないものとします。 国または地域によ っては、法律の強行規定により、保証責任の制限が禁じられる場合、強行規定の制 限を受けるものとします。 この情報には、技術的に不適切な記述や誤植を含む場合があります。本書は定期的 に見直され、必要な変更は本書の次版に組み込まれます。 IBM は予告なしに、随 時、この文書に記載されている製品またはプログラムに対して、改良または変更を 行うことがあります。 本書において IBM 以外の Web サイトに言及している場合がありますが、便宜のた め記載しただけであり、決してそれらの Web サイトを推奨するものではありませ ん。それらの Web サイトにある資料は、この IBM 製品の資料の一部ではありませ ん。それらの Web サイトは、お客様の責任でご使用ください。 IBM は、お客様が提供するいかなる情報も、お客様に対してなんら義務も負うこと のない、自ら適切と信ずる方法で、使用もしくは配布することができるものとしま す。 本プログラムのライセンス保持者で、(i) 独自に作成したプログラムとその他のプロ グラム (本プログラムを含む) との間での情報交換、および (ii) 交換された情報の 相互利用を可能にすることを目的として、本プログラムに関する情報を必要とする 方は、下記に連絡してください。 IBM Corporation © Copyright IBM Corp. 1996, 2003 187 J46A/G4 555 Bailey Avenue San Jose, CA 95141-1003 U.S.A. 本プログラムに関する上記の情報は、適切な使用条件の下で使用することができま すが、有償の場合もあります。 本書で説明されているライセンス・プログラムまたはその他のライセンス資料は、 IBM 所定のプログラム契約の契約条項、IBM プログラムのご使用条件、またはそれ と同等の条項に基づいて、 IBM より提供されます。 この文書に含まれるいかなるパフォーマンス・データも、管理環境下で決定された ものです。そのため、他の操作環境で得られた結果は、異なる可能性があります。 一部の測定が、開発レベルのシステムで行われた可能性がありますが、その測定値 が、一般に利用可能なシステムのものと同じである保証はありません。さらに、一 部の測定値が、推定値である可能性があります。実際の結果は、異なる可能性があ ります。お客様は、お客様の特定の環境に適したデータを確かめる必要がありま す。 IBM 以外の製品に関する情報は、その製品の供給者、出版物、もしくはその他の公 に利用可能なソースから入手したものです。IBM は、それらの製品のテストは行っ ておりません。したがって、他社製品に関する実行性、互換性、またはその他の要 求については確証できません。 IBM 以外の製品の性能に関する質問は、それらの 製品の供給者にお願いします。 IBM の将来の方向または意向に関する記述については、予告なしに変更または撤回 される場合があり、単に目標を示しているものです。 表示されている IBM の価格は IBM が小売り価格として提示しているもので、現行 価格であり、通知なしに変更されるものです。卸価格は、異なる場合があります。 本書には、日常の業務処理で用いられるデータや報告書の例が含まれています。よ り具体性を与えるために、それらの例には、個人、企業、ブランド、あるいは製品 などの名前が含まれている場合があります。これらの名称はすべて架空のものであ り、名称や住所が類似する企業が実在しているとしても、それは偶然にすぎませ ん。 著作権ライセンス: 本書には、様々なオペレーティング・プラットフォームでのプログラミング手法を 例示するサンプル・アプリケーション・プログラムがソース言語で掲載されていま す。お客様は、サンプル・プログラムが書かれているオペレーティング・プラット フォームのアプリケーション・プログラミング・インターフェイスに準拠したアプ リケーション・プログラムの開発、使用、販売、配布を目的として、いかなる形式 においても、IBM に対価を支払うことなくこれを複製し、改変し、配布することが できます。このサンプル・プログラムは、あらゆる条件下における完全なテストを 経ていません。従って IBM は、これらのサンプル・プログラムについて信頼性、 利便性もしくは機能性があることをほのめかしたり、保証することはできません。 お客様は、IBM のアプリケーション・プログラミング・インターフェイスに準拠し 188 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド たアプリケーション・プログラムの開発、使用、販売、配布を目的として、いかな る形式においても、IBM に対価を支払うことなくこれを複製し、改変し、配布する ことができます。 それぞれの複製物、サンプル・プログラムのいかなる部分、またはすべての派生的 創作物にも、次のように、著作権表示を入れていただく必要があります。 © (お客様の会社名) (西暦年). このコードの一部は、IBM Corp. のサンプル・プ ログラムから取られています。 © Copyright IBM Corp. (西暦年をご記入くださ い)。All rights reserved. この情報をソフトコピーでご覧になっている場合は、写真やカラーの図表は表示さ れない場合があります。 特記事項 189 商標 AIX、 C-ISAM®、 Client SDK™、 Cloudscape™、 Cloudsync™、 DB2 Universal Database、 DB2、 Distributed Relational Database Architecture、 Dynamic Connect™、 Foundation.2000™、 i.Financial Services™、 IBM Informix ® 4GL、 IBM Informix® SE、 IBM Informix® SQL、 IBM Informix®、 IBM Informix®Connect、 IBM Informix®DataBlade®Module、 IBM Informix®Driver for JDBC、 IBM Informix®Dynamic Scalable Architecture™(DSA)、 IBM Informix®Dynamic Server™、 IBM Informix®Enterprise Gateway Manager (Enterprise Gateway Manager)、 IBM Informix®Extended Parallel Server™、 InformiXML™、 J/Foundation™、 MaxConnect™、 NUMA-Q、 Object Translator™、 OS/2、 OS/390、 OS/400、 Red Brick™、 RedBack®、 SystemBuilder™、 U2™、 UniData®、 UniVerse®、 wintegrate® は、IBM Corporation の商標です。 Java およびすべての Java 関連の商標およびロゴは、Sun Microsystems, Inc. の米国 およびその他の国における商標または登録商標です。 Windows、Windows NT および Excel は、Microsoft Corporation の米国およびその 他の国における商標または登録商標です。 UNIX は、The Open Group の米国およびその他の国における登録商標です。 他の会社名、製品名およびサービス名はそれぞれ各社の商標または登録商標です。 190 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 索引 日本語, 数字, 英字, 特殊文字の 順に配列されています。なお, 濁 音と半濁音は清音と同等に扱われ ています。 [ア行] アイコン オンライン ヘルプ xiv xiv 重要 xiv カーソル関数 44 外部ファイル 外部ルーチン 60 アクティブ セット xiv xii インデックス 説明 140 参照: 2 次アクセス方式 参照: R ツリー インデックス 参照: 汎用 B ツリー 永続外部ファイル 60 永続メモリ オブジェクト 60 エラー メッセージ用のメッセージ ファイ ル xvii 演算子 関係型 6 定義 67, 72 テキスト 72 演算子関数 関係 109 関係型 72 定義 67, 72 テキスト 72 不透明 (OPAQUE) 型 99, 108 演算子クラス 作成 147 使用 11 定義 3, 11, 139, 141 特権 147 廃棄 151 演算子バインド 10, 11, 72 エンド ユーザ ルーチン 定義 68 不透明 (OPAQUE) 型 100 オペレーティング システム (OS) 関数 174 © Copyright IBM Corp. 1996, 2003 28 154 72 しない 57 xiii 仮想テーブル 反復関数 45 仮想プロセッサ (VP) 数の設定 181 監視 174 クラス 171 使用 171 定義 171 ユーザ定義 105, 113 不透明 (OPAQUE) 型 109 関数インデックス 140 スマート ラージ オブジェクトに関係 拡張性のエンハンスメント 拡張データ型 105 72 77 説明 拡張仮想プロセッサ 参照: ユーザ定義仮想プロセッサ 拡張識別子 105 72 算術計算 定義 定義 環境変数、NODEFDAC 関係演算子 183 登録 56 戻り値 40 ルーチン修飾子 44 暗黙的キャスト 79 依存関係、ソフトウェアの 一括コピー 126 37 6 80 明示的 80 ルーチン分析 20 設計 説明 直接 CAST AS キーワード 79, 80 参照: ユーザ定義キャスト スタック使用 製品 xiv ヒント xiv プラットフォーム 削除 84 サポート関数による xvi [カ行] 実行 機能 警告 型変換 (続き) xvi オンライン マニュアル 173 CPU 172 UDR の選択 172 VP クラス 172 型 コレクション 参照: コレクション (collection) 型 名前付き行 (ROW) 型 参照: 名前付き行 (ROW) 型 不透明 (opaque) 型 参照: 不透明 (opaque) 型 型階層 25, 29, 31 型の継承 31 型変換 暗黙的 79 演算子 79, 80 型 77 関数、エンド ユーザ ルーチン 100 関数、ユーザ定義 81 許可されない 78 組込み 77, 81, 84 41 疑似コード 185 サイズ 185 定義 55 SPL ルーチン 20 参照: SPL 疑似コード 規則 マニュアル xiii 機能アイコン xiv キャスト (::) 演算子 79, 80 行 (row) 型、名前付きの 参照: 名前付き行 (ROW) 型 業界標準、準拠 xviii 共有オブジェクト ファイル アンロード 157 再ロード 157 ロード 21 共有ライブラリ 参照: 共有オブジェクト ファイル 組込み型 67 説明 63 ルーチン分析 29 組込み関数 オーバーロード可能な 27 定義 68, 74 不透明 (OPAQUE) 型の 100, 108 ユーザがオーバロード可能な 74 ユーザがオーバロードできない 74 組込みキャスト 77, 81, 84 組込み集計関数 10, 85 警告アイコン xiv 結果セット、反復関数 45 言語 外部 6, 60 SPL 6 コーディング標準 51 191 コード セット、ISO 8859-1 コード、 サンプル、規則 コード例の表記 xv xii xv 広域言語サポート (GLS) 説明 xii API 136 高可用性データ レプリケーション (HDR) 21, 52, 60 構成パラメータ STACKSIZE 184 VPCLASS 174, 181 構成パラメータ STACKSIZE 184 構成パラメータ VPCLASS 174, 181 構造化照会言語 (SQL) 参照: SQL 文 コスト関数 13 コメント アイコン xiv 固有のルーチン名 定義 26 割当て 25 コレクション (COLLECTION) 型 集計関数 88 コレクション (collection) 型 型階層 62 型変換 78 定義 65 ルーチン分析 29, 34 [サ行] 最適化関数 13 最適化レベル 162 サポート関数 一括コピー 126 型変換としての 105 説明 141 登録 117 特権 113 廃棄 113 汎用 B ツリー 142 命名 117 要約 115 ルーチン識別子 118 export 116 exportbinary 116 IBM Informix GLS API 136 import 116 importbinary 116 input 116 lohandles() 117 output 116 send 116 算術演算子 説明 72 不透明 (OPAQUE) 型の 108 式戻り名 43 192 シグネチャ 準拠 参照: ルーチンのシグネチャ システム カタログ表 分離 186 sysams 150 syscasts 78, 106 syscolumns 164 sysindices 164 syslangauth 7 sysprocauth 7, 55, 118, 154, 185 sysprocbody 20, 55, 60, 185 sysprocedures 7, 55, 185 sysprocplan 55, 60, 163, 165, 185 sysroutinelangs 7 systables 164 systrigbody 185 systriggers 186 sysxtdtypeauth 65, 107 sysxtdtypes 65, 105 システム カタログ表 syscolumns 164 システム カタログ表 sysindices 164 システム カタログ表 sysprocauth 185 システム カタログ表 sysprocbody 185 システム カタログ表 sysprocedures 内容 185 入出力に関する考慮事項 185 メモリのキャッシュ 185 システム カタログ表 sysprocplan 163, 165, 185 システム カタログ表 systables 164 システム カタログ表 systrigbody 185 システム カタログ表 systriggers 186 システム要件 ソフトウェア xii database xii 実行計画 20, 54, 162 実行時、照合順序の設定 136 集計関数 暗黙的な実行 176 演算子のオーバーロード 86 オーバロード 74 組込み 10, 85 組込み関数の拡張 86 設定引数 89 定義 68 廃棄 96 不透明 (OPAQUE) 型の 100 修飾子 参照: ルーチン修飾子 修飾子 HANDLESNULLS statcollect() 関数 169 重要パラグラフ、アイコン xiv 主キー、不透明 (OPAQUE) 型 UDT の使 用 109 出力サポート関数 キャスト関数 82, 83 業界標準への 上位型 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド xviii 参照: 名前付き行 (ROW) 型 照合順序 136 所有者 参照: ルーチンの所有者 新機能 xiii スタック サイズのモニタ 184 スタック、スタック サイズのモニタ スタック領域 183 ストラテジ関数 説明 141 汎用 B ツリー 142 スマート ラージ オブジェクト 99 関数インデックスにない 41 集計関数 88 スレッド 結合 177 主 182 ソート 走査 挿入 定義 179 176, 177, 178, 182 178, 179 171 2 次 182 sqlexec 182 スレッド セーフ UDR 180 製品アイコン xiv 制約、不透明 (OPAQUE) 型の 制約事項、反復関数 設定引数、集計関数 109 46 89 選択水準関数 13 操作 演算子関数 72 キャスト関数 参照: 型変換 組込み関数 74 走査、並列 182 ソフトウェア依存関係 xii [タ行] データ型 組込み 63 定義 61 複合 65 DataBlade モジュール 67 データのコピー 126 データベース レベル 特権 53 ディスティンクト (DISTINCT) 型 型変換 78, 81 説明 66 ディスティンクト (distinct) 型 説明 32 ルーチン分析 25 184 反復関数 (続き) テキスト演算子 説明 72 不透明 (OPAQUE) 型の 108 デフォルト ロケール xii 問合せオプティマイザ 11, 20, 164 問合せパーサー 20, 27 問合せ予定 拡張 選択リスト ソート 143, 148 新規演算子クラス 148 ストラテジ関数 142 デフォルト演算子クラス 20, 162 統計関数 13 ドキュメント ノート 使用時 176 説明 13 汎用 B ツリー xii デモンストレーション データベース 並列 UDR (続き) 登録 44 呼出し 45 177, 178 179 走査 176, 177 反復関数 46 141, 143 有効化 181 ドキュメント ノート、プログラム項目 非カーソル関数 44 引数 参照: ルーチンの引数 並列データベース問合せ xvii 特定のルーチン名 否定関数 170 否定素子関数 13 並列データベース問合せ (PDQ) 機能 ヘルプ xvi 登録 xvi 非バリアント関数 60 ヒント アイコン 特権 演算子クラス 本製品の機能、新規の 41 ポリモーフィズム xiv 副型 参照: 名前付き行 (ROW) 型 147 型レベル 107 サポート関数 113 サポート関数に対する 118 データベース レベル 53 不透明 (OPAQUE) 型 105, 113 ユーザ定義ルーチン 53 ルーチン レベル 54, 118, 153 複合データ型 65 複数の表現が可能なデータ 99 複数の表現が可能なデータ型 ハッシュ不可能な 複数表現のデータ 定義 99 太字体 DBA 53, 155 Execute 54, 153 110 xiv 構造体のサイズ 78 名前付き行 (row) 型 型階層 25, 31 説明 65 ルーチン分析の優先順位 29 名前なし行型、集計関数 88 入力サポート関数 キャスト関数 82, 83 ネーム スペース、DataBlade モジュール オブジェクト 51 [ハ行] パラメータ 戻す 43 OUT 41 参照: ルーチン パラメータ バリアント関数 40 反復関数 45 アクティブ セット 44 作成 16, 44 制約事項 46 定義 44 46 xiii 25, 38 42 [マ行] マシン ノート マッピング xvi 104 マニュアル、タイプ xvi ドキュメント ノート xvi マシン ノート xvi リリース ノート 外部表現 119 拡張識別子 105 可変長 102 [ナ行] 178 ポンド (#) 記号、SLV 標識 作成 104 SQL と Java 間 不透明 (OPAQUE) 型 値渡し 123 インデックス 110 Resource 53 トランスポート関数 123 トリガ アクション文 15 名前付き行 (ROW) 型 ユーザ定義の型変換 GROUP BY 177 INSERT 178 xvi 明示的キャスト 80 メモリ 反復関数 46 102 固定長 98, 102 システム カタログ表 制約 109 107, 118 定義 2, 98 登録 104 特権 113 内部構造体 98 廃棄 112 パラメータとしての 103 比較 135 メモリ位置合せ 103 ロケール固有のデータ 135 sysxtdtypeauth 表内 118 sysxtdtypeauth 表における 107 不透明 (opaque) 型 型変換 78 定義 67 プラットフォーム アイコン xiv プラットフォーム移植性 51 プログラム グループ ドキュメント ノート xvii リリース ノート xvii 並列 UDR 結合 177 実行 175 メモリ オブジェクト 60 メモリ割当て、反復関数 46 メモリ割当て関数 131 モーダル ルーチン 39 戻り値 参照: ルーチンの戻り値 戻りパラメータ 命名 43 戻りパラメータの命名 43 [ヤ行] ユーザ、対象とする xi ユーザ状態、SPL ルーチン ユーザ定義仮想プロセッサ 削除 174 追加 174 ユーザ定義型変換 暗黙的 79 キャスト関数 81 削除 84 作成 78 種類 79 直接 80 定義 78 21 索引 193 ユーザ定義ルーチン (UDR) (続き) ユーザ定義関数 カーソル 44 式での呼出し 定義 19 反復 44 非カーソル ルーチン レベル 特権 44 ユーザ状態 呼出し 18 ルーチン解決 目的 143 ユーザ定義キャスト 参照: 型変換 HDR 指定 176, 178 6 118 57 60 HANDLESNULLS 60 ロシジャ ユーザ定義ルーチンの登録 手順 52 58 INTERNAL 58 ITERATOR 16, 44, 58 NEGATOR 58 NOT VARIANT 58 PARALLELIZABLE 59 PERCALL_COST 58 SELCONST 58 特権 53 ユーティリティ onmode 174 ユーティリティ onstat 175, 184 SELFUNC 58 STACK 58, 184 VARIANT 41, 58 ルーチン修飾子 STACK [ラ行] ルーチン状態領域 ルーチン所有者 登録 60 ラージ オブジェクト 127 ラージ可変長文字 (LVARCHAR) 型 型変換 105 ロケールを区別するデータ input 関数のパラメータ リリース ノート xvi 54, 153 CLASS 57, 58, 172, 174 COSTFUNC 58 34 VP クラスの選択 172 参照: ユーザ定義関数; ユーザ定義プ 96 CALL を使用した呼出し 19 参照: ユーザ定義ルーチン ユーザ定義ルーチン (UDR) 値を戻す 40 アンロード 157 オーバーロード 参照: ルーチン オーバロード 格納場所 60 管理 153 コーディング標準 51 最大サイズ 38 最適化 162 再ロード 157 シグネチャ 参照: ルーチンのシグネチャ 実行 19, 23, 175 正常動作 172, 173 設計 37 説明 1 タスク 7 データベース レベル 特権 53 デフォルト VP クラス 172 統計情報の更新 164 登録 52 登録特権 53 特権 153 特権の割当て 53 廃棄 54, 159 パフォーマンスに関する考慮事項 162 引数 参照: ルーチンの引数 非モーダル 39 並列 13 並列実行の有効化 181 並列処理 175 変更 159 命名 38 194 22 21 ワイルドカード引数 DBA タスク 24 ユーザ定義集計関数 定義 10, 85 ユーザ定義プロシジャ 登録 52 ルーチン状態領域 ルーチン分析 27 ルーチン修飾子 外部ルーチン 54 21 21 ルーチン識別子、説明 21 ルーチン レベル 特権 ロード ロール 22 ルーチン シーケンス 170 並列実行 ルーチン シーケンスの作成 ルーチンの実行の管理 23 戻り値 参照: ルーチンの戻り値 非バリアント 41 CALL を使用した呼出し 19 参照: ユーザ定義ルーチン 廃棄 ルーチン マネージャ (続き) 183 40 5 バリアント 否定 メモリに関する考慮事項 モーダル 39 ルーチンのオーバーロード 参照: ルーチン オーバロード ルーチンのシグネチャ 137 117 リリース ノート、プログラム項目 ルーチン 1 ルーチン オーバロード xvii 演算子バインド 11 オーバーロード ルーチンの呼出し 26 組込み SQL 関数 27 組込み関数 74 固有のルーチン名の割当て 26 集計関数 74 使用 71, 143 状態関数 74 説明 25, 38 定義 23 光関数 74 ルーチン シーケンス、定義 21 ルーチン シグネチャ 説明 24 ルーチン タイプ 60 ルーチン パラメータ 登録 60 ルーチン マネージャ 共有オブジェクト ファイルのロード 21 スタック領域 184 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 184 22 一意性 24 登録 24 ルーチン分析における ANSI 標準準拠 24 ルーチンのタイプ 24 23, 27 ルーチンの所有者 固有のルーチン名における 26 ルーチンのシグネチャのコンポーネン ト 24 ANSI 標準準拠データベース 24 ANSI 標準非準拠のデータベース 24 ルーチンのパラメータ オーバーロード 25 シグネチャのコンポーネント 24 ルーチンの戻り値 ルーチン状態領域内 22 ルーチン引数 定義 39 ディスティンクト (DISTINCT) 型 32 登録 60 名前付き行 (ROW) 型 31 パラメータの型に一致しない 31 モーダル 39 ルーチン状態領域内の 22 ルーチン分析における 27 ルーチン引数 (続き) ワイルドカード ルーチン分析 型階層 候補リスト 27, 28 定義 23, 27 優先順位 理解 23 ルーチン名 オーバーロード 38 登録 60 CAST AS キーワード 47 CLIENT_LOCALE 環境変数 compare() 関数 74 ルーチンの候補 28 ルーチンのシグネチャのコンポーネン ト 24 compare() サポート関数 非バリアント 使用 110 説明 142 データのソート CREATE OPCLASS 文 57 削除 追加 定義 デフォルト xii en_us.8859-1 xii ワイルドカード、ルーチンの引数 34 [数字] 2 次アクセス方式 新規演算子クラスの定義 150 定義 140 定義、データベース サーバによる 140 ユーザ定義 140 A ALTER FUNCTION 文 26, 54, 159 ALTER PROCEDURE 文 26, 54, 159 ALTER ROUTINE 文 26, 54, 159 ALTER TABLE 文 113 ANSI 標準準拠 ユーザ定義 (user-defined) 型 66 ルーチンのシグネチャ 24 レベル xviii assign() サポート関数 130, 134 説明 131 必要な特権 53 184 56 24, 52 24 DBA キーワード 53 DBA、キーワード 156 108 SPECIFIC キーワード WITH 節 55, 57 CREATE TABLE 文 26 106 D CREATE CAST 文 [ワ行] 59 ユーザ定義 VP の選択 174 ユーザ定義プロシジャの登録 ルーチンのシグネチャの作成 135 使用 105 特権 106 EXPLICIT キーワード 引数の登録 プロシジャの登録 戻り値の登録 59 174 174 172 102 147 スタック サイズの指定 concat() 関数 72 COSTFUNC ルーチン修飾子 58 CPU 仮想プロセッサ (CPU VP) 40 109 CREATE PROCEDURE 文 固有名の割り当て 26 136 BETWEEN 演算子を持った 列、仮想 45 例、CLASS を使用した ロケール 42 79, 80 特定の 参照: 特定のルーチン名 104 INTERNALLENGTH キーワード MAXLEN 修飾子 102, 103 CLASS ルーチン修飾子 57, 58, 172, 174 参照: VPCLASS 構成パラメーター 参照: 仮想プロセッサ クラス 24 142 CREATE OPAQUE TYPE 文 CANNOTHASH 修飾子 CALL 文 19, 20 CallableStatement インターフェイス 34 142 不透明 (OPAQUE) 型の登録 ALIGNMENT 修飾子 103 C 言語の反復関数の例 23, 25 ANSI 標準準拠 ルーチン戻り値 使用 40 135 C 31 27, 28 NULL 値の引数の効果 選択 USING 節 BETWEEN 演算子、compare() での 31 引数の順序 デフォルト演算子クラス compare() 関数 135 B ツリー 参照: 汎用 B ツリー 31 継承の効果 CREATE INDEX 文 (続き) B 34 DataBlade API 型 mi_lvarchar 119 80 IMPLICIT キーワード 79 WITH 節 81 CREATE DISTINCT TYPE 文 DataBlade API データ型 mi_float 101 66 CREATE FUNCTION 文 外部関数の登録 56, 57 関数の登録 24, 52, 54, 56 固有名の割り当て 26 使用 67 スタック サイズの指定 184 特権 118 反復関数の登録 44 引数の登録 59 必要な特権 53 戻り値の登録 59 ユーザ定義 VP の選択 174 ルーチンのシグネチャの作成 24 DBA キーワード 53 DBA、キーワード 156 RETURNING 節 56 SPECIFIC キーワード 26 SPL 関数の登録 54 WITH 節 55, 57 CREATE INDEX 文 組込み 2 次アクセス方式 140 mi_integer 101 mi_real 103 mi_unsigned_integer 103 mi_unsigned_smallint 103 DataBlade API メモリ管理 184 DataBlade モジュール (DataBlade Module) 型 67 DBA 特権 53, 155 DB_LOCALE 環境変数 136 deepcopy() サポート関数 130, 134 destroy() サポート関数 130, 132, 134 スマート ラージ オブジェクト 99 divide() 関数 72 DROP AGGREGATE 文 96 DROP CAST 文 84, 113 DROP FUNCTION 文 26, 54, 113, 157, 159 DROP OPCLASS 文 151 DROP PROCEDURE 文 26, 54, 159 DROP ROUTINE 文 26, 54, 113, 157, 159 DROP TYPE 文 113 索引 195 GRANT 文 (続き) E en_us.8859-1 ロケール xii equal() 関数 73, 108, 109, 142, 175, 178 EVP 参照: ユーザ定義仮想プロセッサ EXECUTE FUNCTION 文 関数の呼出し 18 OUT パラメータを持った SPL 文 42 20 EXECUTE PROCEDURE 文 ユーザ定義プロシジャの呼出し SPL 文 54 DBA、キーワード 155 EXP VP 参照: ユーザ定義仮想プロセッサ Export サポート関数 105 スマート ラージ オブジェクトに対す る 134 説明 127, 128 パラメータの型 戻りの型 117 117 要約 73, 142, 175 Exportbinary サポート関数 キャスト関数として 105 exportbinary サポート関数 スマート ラージ オブジェクトに対す 117 F filetoblob() 関数 127 filetoclob() 関数 127 finderr ユーティリティ xvii FROM 節、反復関数 45 G GRANT 文 固有名を使用する例 26 シグネチャの使用例 154 シグネチャを使用する例 26 Execute 特権 118, 154 Resource 特権 105, 147 117 117 116 例 121 ロケールを区別するデータ 136 H INTERNAL ルーチン修飾子 HANDLESNULLS 修飾子 ISO 8859-1 コード セット xii ITERATOR ルーチン修飾子 16, 44, 58 C ルーチン 説明 58 Java ルーチン 58 Java の反復関数の例 IBM Informix Developers Zone IBM Informix GLS API IMPEXP 型 からの型変換 105 131 49 JDBC CallableStatement インターフェイス 42 136 L lessthanorequal() 関数 73, 142, 175 lessthan() 関数 73, 142, 175 説明 128 への型変換 105 戻り値 117 like() 関数 72 lohandles() 関数 IMPEXPBIN 型 要約 117 lotofile() 関数 型変換 105 説明 129 戻り値 117 キャスト関数として 127 105 import サポート関数 スマート ラージ オブジェクトに対す る 134 説明 127, 128 パラメータの型 戻りの型 117 58 J Import 関数 filetoclob()、filetoblob() Import サポート関数 要約 116 例 128 lotofile() 127 る 134 説明 128, 130 パラメータの型 戻りの型 117 要約 116 例 130 戻りの型 I ルーチンに関する 196 greaterthan() 関数 18 Execute 特権 153 付与 154 タスク 121 パラメータの型 73, 142, 175, 178 20 キャスト関数として export サポート関数 input サポート関数 (続き) Usage 特権 54 greaterthanorequal() 関数 117 要約 116 Importbinary サポート関数 キャスト関数として 105 importbinary サポート関数 スマート ラージ オブジェクトに対す る 134 説明 128, 129 パラメータの型 117 戻りの型 117 要約 116 IN 演算子 109 IN パラメータ 41 informix ユーザ 54 informix ユーザ アカウント 28 INFORMIXDIR/bin ディレクトリ xiii Input サポート関数 型変換関数としての 105 input サポート関数 説明 120 IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド 134 127 M matches() 関数 72 minus() 関数 72 mi_fp_request() ルーチン 44 mi_fp_setisdone() ルーチン 44, 46 mi_lvarchar 型 定義 119 ロケールを区別するデータ 137 mi_real データ型 103 mi_sendrecv 型 ロケールを区別するデータ 137 mi_unsigned_integer データ型 103 mi_unsigned_smallint データ型 103 N negate() 関数 72 NEGATOR ルーチン修飾子 58 NODEFDAC 環境変数 154 NOT VARIANT ルーチン修飾子 58 notequal() 関数 73 NULL 値 関数 statcollect() 169 サポート関数 92 集計関数初期化 89 ワイルドカード引数としての 34 NULL 値 (続き) 参照: HANDLESNULL 修飾子 O SQL 型 (続き) UNIQUE キーワード 110, 135 SELECT 文、反復関数 45 POINTER 59 SQL コード xv SELFUNC ルーチン修飾子 SQL 文 58 Send サポート関数 onstat ユーティリティ 21 キャスト関数として 説明 105 要約 説明 122 タスク 122 117 問合せ予定 137 SENDRECV 型 ロケールを区別するデータ 136 PARALLELIZABLE ルーチン修飾子 59 PERCALL_COST ルーチン修飾子 58 plus() 関数 72 POINTER 型 59 演算子関数 ロケールを区別するデータ send 関数の戻りの型 117 72 137 136 シリアル走査 182 並列走査 182 SET OPTIMIZATION 文 setUDTExtName 104 162 R R ツリー インデックス 使用 140 SPL UDR、戻りパラメータ SPL の反復関数の例 47 キャスト関数として receive サポート関数 説明 125 143 105 パラメータの型 117 戻りの型 117 例 125 ロケールを区別するデータ 137 Resource 特権 53 RETURN WITH RESUME 文 47 REVOKE 文 固有名の使用 26 Execute 特権 113, 154 Usage 特権 54, 113 S SELCONST ルーチン修飾子 58 SELECT 文 BETWEEN 演算子 135 DISTINCT キーワード 110, 135 GROUP BY 節 109 ORDER BY 節 110, 135 UNION キーワード 110, 135 43 SPL プロシジャ 42 SPL ルーチン 依存性リスト 20, 54 疑似コード 72 キャスト関数 81 組込み関数 74 定義 71 不透明 (OPAQUE) 型 107 STACK ルーチン修飾子 58 statement-local 変数 反復関数 47 SIGUSR1 シグナル 182 SLV 参照: 文ローカル変数 (SLV) SPECIFIC キーワード 26 デフォルト演算子クラス Receive サポート関数 42 18 SQL 呼出し関数 105 105 SERVER_LOCALE 環境変数 SET COLLATION 文 136 SET EXPLAIN P 20 20 無効な場合 41 statement-local 変数 UDR の呼出し からの型変換 123 54 問合せオプティマイザ 問合せパーサー 20 116 への型変換 20, 54 26 20, 54, 162 実行計画 117 例 126 ロケールを区別するデータ 戻りの型 117 要約 116 positive() 関数 固有名 最適化 105 125 パラメータの型 戻りの型 117 output サポート関数 パラメータの型 構文解析 キャスト関数として send サポート関数 OUT パラメータ 41, 42 Output サポート関数 例 SELECT 文 (続き) 20, 55 最適化 162 最適化レベル 162 実行 20 実行計画 162 設計 37 説明 6 定義 6 デフォルト仮想プロセッサ クラス 172 統計情報の更新 164 登録 54 FOREACH ループ 45 SPL キャッシュ 185 sysprocedures のキャッシュ 185 UDR の呼出し 19 SQL Explain 出力、反復関数 46 SQL 型 組み込み 29 登録における 59 IMPEXP 128 IMPEXPBIN 129 Statement-local 変数 (SLV) 関数での参照 42 宣言 定義 範囲 42 42 42 42 OUT パラメータおよび 42 stores_demo データベース xii Streamread サポート関数 キャスト関数として 105 Streamwrite サポート関数 キャスト関数として 105 superstores_demo データベース xii sysams システム カタログ表 150 syscasts システム カタログ表 78, 84, 106, 113 syslangauth システム カタログ表 7 sysopclasses システム カタログ表 151 sysprocauth システム カタログ表 7, 55, 113, 118, 154 sysprocbody システム カタログ表 7, 20, 55, 60 sysprocedures システム カタログ表 118 説明 7, 113 パス列 158 ルーチンの候補 28 列 60 path 列 21 UDR 情報 55 sysprocplan システム カタログ表 55, 60 sysroutinelangs システム カタログ表 7 sysxtdtypeauth システム カタログ表 65, 107, 113 索引 197 sysxtdtypes システム カタログ表 65, 105, 113, 118 T times() 関数 72 U UDR 参照: ユーザ定義ルーチン UDREnv インターフェイス 44 UDREnv.setSetIterationIsDone() メソッド 46 UNIX オペレーティング・システム、デフ ォルト ロケール xii UPDATE STATISTICS 文 26, 164 update() サポート関数 130, 132, 134 V VARIANT ルーチン修飾子 41, 58 VP 参照: 仮想プロセッサ (VP) W Windows、デフォルト ロケール xii X X/Open 準拠レベル 198 xviii IBM Informix: ユーザ定義ルーチンおよびデータ タイプ開発者ガイド Printed in Japan GB88-8639-00