2 Informix Gatewayの機能と制限
ゲートウェイをインストールして構成した後、ゲートウェイを使用してInformixデータにアクセスし、アプリケーションからInformixデータベースにInformixコマンドを渡し、分散問合せを実行し、データをコピーできます。
2.1 リモート挿入行ソース
リモート挿入行ソース機能を使用すると、OracleデータベースおよびOracle Databaseゲートウェイを介してローカルのOracleデータを処理する必要があるリモート挿入が可能になります。 この機能を使用するには、OracleデータベースおよびOracle Databaseゲートウェイのバージョンが12.2以上である必要があります。
Oracle Database設計では、一部の分散文をデータベース・リンク・サイトで実行する必要があります。 ただし、特定の状況では、元のOracle Databaseからフェッチする必要があるこれらの問合せを実行するために必要なデータがあります。 同機種間接続では、リモートOracleデータベースがソースOracleデータベースをコールバックして、このようなデータを取得します。 ただし、異機種間接続では、これは実行できません。これは、外部データ・ストアが、問合せを発行したOracleインスタンスでのみ提供できるコールバック関数(データ)を問い合せる必要があることを意味します。 通常、これらの種類の文は、Oracle Databaseゲートウェイを介してサポートできるものではありません。
次のカテゴリのSQL文では、コールバックが発生します:
-
Oracleデータベースの表を参照するサブ選択を含むDML。
-
元のOracleデータベースで実行する必要があるSQL関数または文を含む
DELETE
,INSERT
,UPDATE
またはSELECT... FOR UPDATE..."
SQL文。これらのSQL関数には、
USER
、USERENV
およびSYSDATE
が含まれ、元のOracleデータベースからのデータの選択が含まれます。 -
Oracleデータベース内の表、およびリモート表の
LONG
またはLOB
列を含むSQL文。
リモート挿入行ソース機能を介して機能するリモートINSERT
文の例を次に示します:
INSERT INTO gateway_table@gateway_link select * from local_table;
2.2 パススルー機能の使用
ゲートウェイは、DBMS_HS_PASSTHROUGH
パッケージを使用して、アプリケーションからInformixデータベースにInformixコマンドまたは文を渡すことができます。
次のように、PL/SQLブロック内のDBMS_HS_PASSTHROUGH
パッケージを使用して、Informixデータベースに渡される文を指定します:
DECLARE
num_rows INTEGER;
BEGIN
num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@IFMX('command');
END;
/
commandには、次のいずれも使用できません。
-
COMMIT
-
CREATE DATABASE
-
DROP DATABASE
-
ROLLBACK
-
ROLLFORWARD DATABASE
-
Informixツール・コマンド
DBMS_HS_PASSTHROUGH
パッケージでは、バインド値を渡すこと、およびSELECT
文を実行することがサポートされています。
ノート:
パススルーで各DDL文の後にCOMMIT
を使用することをお薦めします。
関連項目:
DBMS_HS_PASSTHROUGH
パッケージの詳細は、「Oracle Database異機種間接続ユーザー・ガイド」の「Oracle Database PL/SQLパッケージおよびタイプ・リファレンス」および「第3章 Oracle Databaseゲートウェイの機能」を参照してください。
2.3 CHARセマンティクス
この機能により、ゲートウェイはオプションでCHAR
セマンティクス・モードで実行できます。
常にInformixのCHAR
列をCHAR(n BYTE)
と記述するのではなく、この機能では、これらをCHAR(n CHAR)
およびVARCHAR(n CHAR)
と記述します。 この概念は、OracleデータベースのCHAR
セマンティクスに似ています。 このオプションをアクティブ化するには、HS_NLS_LENGTH_SEMANTICS=CHAR
ゲートウェイ・パラメータを指定する必要があります。
関連項目:
2.4 マルチバイト文字セットの比率の抑制
この機能は、オプションで、マルチバイト文字セットを含むInformixデータベースからOracleデータベースへの比率の拡大を抑制します。
デフォルトでは、Oracleゲートウェイは、データが切り捨てられたり、不十分なバッファ・サイズにならないように最低比率を想定します。 ただし、Informixデータベースに関する特定の知識があり、拡張を実行しない場合は、HS_KEEP_REMOTE_COLUMN_SIZE
パラメータを指定して拡張を抑制できます。
関連項目:
2.5 IPv6のサポート
Oracleデータベースとゲートウェイ間の完全なIPv6サポートに加えて、このゲートウェイとInformixデータベース間でIPv6もサポートされます。
関連項目:
HS_FDS_CONNECT_INFO
パラメータの詳細は、「初期化パラメータ」を参照してください。
2.6 ゲートウェイ・セッションIDLEタイムアウト
オプションで、ゲートウェイ・パラメータHS_IDLE_TIMEOUT
を使用して、アイドル状態の長いゲートウェイ・セッションを自動的に終了するように選択できます。 具体的には、ゲートウェイ・セッションが指定された時間制限を超えてアイドル状態になると、ゲートウェイ・セッションが終了し、保留中の更新がロールバックされます。 詳細は、「初期化パラメータ」のHS_IDLE_TIMEOUT
パラメータを参照してください。
2.7 Informixのデータベース互換性の問題
InformixデータベースとOracleデータベースは、一部の領域で機能が異なるため、互換性の問題が発生します。 互換性の問題については、次のリンクで説明します:
2.7.1 ANSI SQL Standard
American National Standards Institute(ANSI)は、SQLの業界標準を確立しました。 ゲートウェイは、ANSI標準に準拠するInformixデータベースのみをサポートします。 ANSI準拠のInformixデータベースを作成または起動する方法の詳細は、Informixのドキュメントを参照してください。
2.7.2 命名規則
命名規則の問題には、次のものがあります:
2.7.2.1 オブジェクトの命名規則
OracleとInformixでは、異なるデータベース・オブジェクトの命名規則が使用されます。 たとえば、各オブジェクト名に使用できる最大文字数は異なる場合があります。 また、一重引用符と二重引用符、大/小文字の区別、および英数字の使用はすべて異なる場合があります。
関連項目:
「Oracle Databaseリファレンス」およびInformixのドキュメント。
2.7.2.2 オブジェクト名
Informixデータベース・オブジェクトの名前は、最大18文字に制限されています。 オブジェクト名は、次の文字で構成できます:
-
0から9の数値
-
小文字aからz
-
大文字AからZ
-
アンダースコア(_)
2.7.2.3 大文字と小文字の区別
Informixは、Oracleとは異なる方法で文字の大/小文字を処理します。 Informixでは、次のルールを使用します:
-
表の所有者名は、二重引用符で囲まれていないかぎり、デフォルトで大文字になります
-
列名、表名、ビュー名などは、常に小文字として扱われます
識別子を二重引用符で囲む場合を除き、Oracleデータベースはデフォルトで大文字になります。 たとえば、emp
というInformix表を参照するには、次のように二重引用符で名前を入力します:
SQL> SELECT * FROM "emp"@IFMX;
ただし、OracleアプリケーションからSCOTT
が所有するemp
というInformix表を参照するには、次のように入力します:
SQL> SELECT * FROM "Scott"."emp"@IFMX;
emp
というInformix表がSCOTT
(表の所有者名は大文字)によって所有されている場合、次のように二重引用符文字なしで所有者名を入力できます:
SQL> SELECT * FROM SCOTT."emp"@IFMX;
または
SQL> SELECT * FROM scott."emp"@IFMX;
Oracleでは、すべてのInformixオブジェクト名を二重引用符で囲み、Informixデータ・ディクショナリに表示されるオブジェクト名に正確な大文字と小文字を使用することをお薦めします。 「データ・ディクショナリ」にリストされている、サポートされているOracleデータ・ディクショナリ表またはビューを参照する場合は、この規則は必要ありません。
これらの規則に従って既存のアプリケーションを変更できない場合は、Oracleでビューを作成し、Informix名を正しい大文字と小文字に関連付けます。 たとえば、大文字の名前のみを使用して既存のOracleアプリケーションからInformix表emp
を参照するには、次のビューを定義します:
SQL> CREATE VIEW EMP (EMPNO, ENAME, SAL, HIREDATE) AS SELECT "empno", "ename", "sal", "hiredate" FROM "emp"@IFMX;
このビューを使用すると、アプリケーションは次のような文を発行できます:
SQL> SELECT EMPNO, ENAME FROM EMP;
ビューの使用は、Informixデータ・ディクショナリに由来するデータ・ディクショナリ情報を複製する回避策です。 対応する表のデータ定義がInformixデータベースで変更されるたびに、Oracleビュー定義を更新する準備が必要です。
2.7.3 データ型
データ型の問題は次のとおりです:
2.7.3.1 バイナリ、バイト、およびテキスト・リテラル表記法
Oracle SQLでは、一重引用符で囲まれた16進数を使用して、データ型RAW
として定義されている列に比較または挿入されるリテラル値を表します。
この表記法は、Informix BINARY
、BYTE
およびTEXT
データ型(0xの後に16進数、一重引用符で囲まれた)と互換性のある構文には変換されません。
たとえば、次の文はサポートされていません。
SQL> INSERT INTO BYTE_TAB@IFMX VALUES ('Oxff');
ここで、BYTE_TAB
には、BINARY
、BYTE
またはTEXT
データ型の列が含まれます。 BINARY
、BYTE
またはTEXT
データ型への挿入または更新時にバインド変数を使用します。
2.7.3.2 データ型変換
Informixでは、暗黙的な日付変換はサポートされていません。 このような変換は明示的である必要があります。
たとえば、ゲートウェイは次のSELECT
文に対してエラーを発行します:
SQL> SELECT DATE_COL FROM TEST@IFMX WHERE DATE_COL = "1-JAN-2001";
暗黙的な変換の問題を回避するには、次のように明示的な変換を追加します:
SQL> SELECT DATE_COL FROM TEST@IFMX WHERE DATE_COL = TO_DATE("1-JAN-2001");
関連項目:
データ型の制限の詳細は、「データ型変換」を参照してください。
2.7.4 問合せ
2.7.4.1 行選択
Informixは、選択したすべての行の問合せ条件を評価してから、いずれかの行を返します。 1つ以上の行の評価プロセスでエラーが発生した場合、残りの行が条件を満たしていても、行は返されません。
Oracleは、問合せ条件の行ごとに評価し、評価が成功すると行を返します。 行は、行が評価に失敗するまで返されます。
2.7.4.2 空の文字列
Oracleは、SQL文の空の文字列をNULL値として処理します。 Informixは、空の文字列を空の文字列として処理します。
空の文字列との比較
ゲートウェイは、リテラルの空の文字列を変換せずにInformixデータベースに渡します。 空の文字列でNULL値を表す場合は、Informixはそのように文を処理せず、空の文字列を使用します。
この問題を回避するには、次の例のように、空の文字列構文ではなくSQL文でNULL
またはIS NULL
を使用します:
SELECT * from "emp"@IFMX where "ename" IS NULL;
空の文字列の選択
VARCHAR
列の場合、ゲートウェイは空の文字列をNULL
値としてOracleデータベースに返します。
CHAR
列の場合、ゲートウェイは列のフル・サイズを戻し、各文字を空白(')として返します。
2.8 既知の制限事項
この項または「既知の問題点」で示されていない非互換性の問題が発生した場合は、Oracleサポート・サービスに連絡してください。 次のトピックでは、既知の制限について説明し、可能な場合に対処するための推奨事項を示します:
ノート:
制限に関するご質問や懸念がある場合は、Oracle Support Servicesまでお問い合わせください。
2.8.1 トランザクションの整合性
次の場合、ゲートウェイはトランザクションの整合性を保証できません:
-
ゲートウェイによって処理された文によってターゲット・データベースで暗黙的なコミットが発生した場合
-
自動コミット・モードで動作するようにターゲット・データベースが構成されている場合
ノート:
Oracleでは、次のことを強くお薦めします:
-
特定の文を実行するとターゲット・データベースで暗黙的なコミットが発生することがわかっている場合は、この文が独自のトランザクションで実行されていることを確認します。
-
自動コミット・モードで動作するようにターゲット・データベースを構成しないでください。
-
2.8.2 トランザクション機能
ゲートウェイは保存ポイントをサポートしていません。 分散更新トランザクションがゲートウェイに関係していて、ユーザーが保存ポイントを作成しようとすると、次のエラーが発生します:
ORA-02070: database dblink does not support savepoint in this context
デフォルトでは、ゲートウェイはCOMMIT_CONFIRM
として構成され、このトランザクション・モードでは、Informixデータベースがトランザクションによって更新されると、常にコミット・ポイント・サイトになります。
Informixシステムでロギングを使用しない場合、デフォルトのトランザクション機能は使用できません。 Informixシステムのロギングを有効にすることを強くお薦めします。 ロギングを使用せず、読取り専用要件がある場合は、ゲートウェイ初期化パラメータ・ファイルでHS_TRANSACTION_MODEL=READ_ONLY_AUTOCOMMIT
を設定します。 ロギングを使用せず、Informixデータベースを更新する必要がある場合は、ゲートウェイ初期化パラメータ・ファイルでHS_TRANSACTION_MODEL=SINGLE_SITE_AUTOCOMMIT
を設定します。
関連項目:
初期化パラメータ・ファイルのカスタマイズの詳細は、「初期化パラメータ」および「Oracle Database異機種間接続ユーザー・ガイド」を参照してください。
2.8.3 PL/SQLカーソル・ループのCOMMITまたはROLLBACKによるオープン・カーソルのクローズ
PL/SQLカーソル・ループで発行されたCOMMIT
またはROLLBACK
は、オープンしているすべてのカーソルをクローズし、次のエラーが発生する可能性があります:
ORA-1002: fetch out of sequence
このエラーを回避するには、COMMIT
またはROLLBACK
文をカーソル・ループの外に移動します。
2.8.6 SQL構文
2.8.6.3 SELECT文でのNULLキーワードの使用
NULL
キーワードは、構文がANSI SQL
ではないため、SELECT
文の選択リストでは使用できません。
たとえば、次の文は使用できません:
SQL> SELECT NULL FROM . . .
2.8.6.4 INSERT文の副問合せ
INSERT
文の副問合せでは、同じ表に複数の別名を使用できません。 たとえば、次の文はサポートされていません。
SQL> INSERT INTO "emp_target"@IFMX SELECT a."empno" FROM "emp_source"@IFMX a, "emp_source"@IFMX b WHERE b."empno"=9999
2.8.6.5 DELETE文、INSERT文およびUPDATE文の副問合せ
DELETE
文、INSERT
文およびUPDATE
文の副問合せのSQL文は、外部問合せで指定された表と同じ表を参照できません。 これは、Informixのロック・メカニズムによるものです。
2.8.7 SQL*Plus
SQL*Plusでは、ゲートウェイは、データ型BYTE
として定義されているInformix列からデータを取得するためのSELECT
文の使用をサポートしていません。
小文字の表名を囲むには、二重引用符を使用する必要があります。次に例を示します:
copy from tkhouser/tkhouser@inst1 insert loc_tkhodept using select* from "tkhodept"@holink2;
2.8.8 データベース・リンク
ゲートウェイはマルチスレッド化されていないため、共有データベース・リンクをサポートできません。 ゲートウェイ・セッションはそれぞれ別のゲートウェイ・プロセスを起動し、接続は共有されません。
2.8.9 ゲートウェイのデータ・ディクショナリ・ビュー
ゲートウェイ・データ・ディクショナリでALL_VIEWS
およびUSER_VIEWS
を問い合せると、ビュー定義の最初の64文字のみが返されます。
2.9 既知の問題点
この項では、既知の問題をリストし、可能な場合は問題を修正するための提案を示します。 問題についての疑問は、Oracleサポート・サービスに問い合せてください。 現在の問題のリストは、オンライン上で入手できます。 リストへのアクセスに関する情報は、Oracleサポート・サービスに連絡してください。
既知の問題は次のとおりです:
2.9.1 暗号化形式のログイン
Oracleデータベースでは、初期化パラメータDBLINK_ENCRYPT_LOGIN
はサポートされなくなりました。 バージョン7.3までは、このパラメータのデフォルトのTRUE
値は、ログイン・ユーザーIDのパスワードがネットワーク上に(クリア・テキストで)送信されることを防ぎました。 それより後のバージョンでは、パスワードが自動的に暗号化されます。
2.9.2 Informix BYTEおよびTEXTのデータ型
BYTE
およびTEXT
データ型を使用する場合は、次の制限が適用されます:
-
サポートされていないSQL関数は、Informixデータ型
TEXT
として定義されている列にアクセスするSQL文では使用できません。 -
データの長さが80文字を超える場合、SQL*Plusを使用して、Informixデータ型
TEXT
として定義されている列からデータを選択することはできません。 Oracleでは、Pro*CまたはOracle Call Interfaceを使用して、Informixデータベース内のこのようなデータにアクセスすることをお薦めします。 -
INSERT
またはUPDATE
が機能するには、BYTE
およびTEXT
データ型がNULLABLE
である必要があります。 -
BYTE
列またはTEXT
列を含む表には、表に定義された一意の索引が必要です。そうしないと、表に主キーとして機能する個別の列が必要です。 -
ビュー内の
BYTE
およびTEXT
データにはアクセスできません。 -
BYTE
およびTEXT
データは、パススルー問合せを介して読み取れません。 -
バインド変数を使用して、32,739バイト未満のデータを
BYTE
列およびTEXT
列に挿入することはできません。
ゲートウェイは、DBMS_SQL
パッケージのPL/SQL関数COLUMN_VALUE_LONG
をサポートしていません。
関連項目:
2.9.3 スキーマ名およびPL/SQL
PL/SQLブロック内のSQL文で、Informixデータベース・オブジェクトにスキーマ名をプレフィクスとして付けない場合は、次のエラー・メッセージが表示されます:
ORA-6550 PLS-201 Identifier table_name must be declared.
SQL文を変更して、オブジェクトのスキーマ名を含めます。