機械翻訳について

2 Informixゲートウェイの機能と制限事項

ゲートウェイをインストールして構成したら、ゲートウェイを使用してInformixデータにアクセスしたり、アプリケーションからInformixコマンドをInformixデータベースに渡したり、分散問合せを実行したり、データをコピーしたりすることができます。

2.1 リモート挿入Rowsource

リモート挿入行ソース機能を使用すると、ローカルOracleデータをOracleデータベースおよびOracle Databaseゲートウェイで処理する必要があるリモート挿入が可能になります。 この機能を使用するには、OracleデータベースとOracle Databaseゲートウェイをバージョン12.2以降にする必要があります。

Oracle Databaseデザインでは、データベース・リンク・サイトで分散文を実行する必要があります。 しかし、特定の状況では、これらの問合せを実行するために必要なデータがあります。このデータは、元のOracle Databaseからフェッチする必要があります。 同種の接続では、リモートOracleデータベースは、そのようなデータのソースOracleデータベースをコールバックします。 しかし、異種の接続では、これは実行可能ではありません。これは、外部データストアが、問合せを発行したOracleインスタンスによってのみ提供できるコールバック関数またはデータを問合せする必要があることを意味するためです。 一般的に、これらの種類の文は、Oracle Databaseゲートウェイでサポートできるものではありません。

次のカテゴリのSQL文では、コールバックが発生します:

  • Oracleデータベース内の表を参照するサブ選択付きDML。

  • DELETEINSERTUPDATEまたは"SELECT... FOR UPDATE..."元のOracleデータベースで実行する必要があるSQL関数または文を含むSQL文。

    これらのSQL関数には、USERUSERENV、およびSYSDATEが含まれます。元のOracleデータベースからのデータの選択を伴います。

  • Oracleデータベース内の表を含むSQL文、およびリモート表のLONGまたはLOB列。

リモート挿入rowsource機能を使用して動作するリモート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サポートに加えて、IPv6はこのゲートウェイとInformixデータベース間でもサポートされています。

関連項目:

HS_FDS_CONNECT_INFOパラメータの詳細は、「初期化パラメータ」を参照してください。

2.6 ゲートウェイ・セッションIDLEタイムアウト

必要に応じて、ゲートウェイ・パラメータHS_IDLE_TIMEOUTを使用して、長いアイドル・ゲートウェイ・セッションを自動的に終了することもできます。 具体的には、ゲートウェイ・セッションが指定された制限時間を超えてアイドル状態になると、保留中の更新がロールバックされてゲートウェイ・セッションが終了します。 詳細については、「初期化パラメータ」HS_IDLE_TIMEOUTパラメータを参照してください。

2.7 Informixのデータベース互換性の問題

InformixとOracleデータベースは、一部の領域で機能が異なるため、互換性の問題が発生します。 互換性の問題については、次のリンクで説明しています:

2.7.1 ANSI SQL標準

米国規格協会(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;

すべての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のBINARYBYTEおよびTEXTデータ型(0xの後に16進数を1つの引用符で囲む)と互換性のある構文に変換されません。

たとえば、次の文はサポートされていません。

SQL> INSERT INTO BYTE_TAB@IFMX VALUES ('Oxff');

BYTE_TABには、BINARYBYTEまたはTEXTというデータ型の列が含まれています。 BINARYBYTEまたは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では、1行ずつ問合せ条件を評価し、評価処理でエラーが発生しなければ行を返します。 行の評価処理でエラーが発生するまで、行は返されます。

2.7.4.2 空の文字列

Oracleでは、SQL文の空の文字列をNULL値として処理します。 Informixは空文字列を空文字列として処理します。

空の文字列との比較

ゲートウェイは、文字通り空の文字列を変換せずにInformixデータベースに渡します。 空の文字列がnull値を表すことを意図した場合、Informixはそのように文を処理しません。それは空の文字列を使用します。

次の例のように、空の文字列構文ではなく、SQL文でNULLまたはIS NULLを使用することで、この問題を回避できます:

SELECT * from "emp"@IFMX where "ename" IS NULL;

空の文字列の選択

VARCHAR列の場合、ゲートウェイは空の文字列をOracleデータベースにNULLの値として返します。

CHAR列の場合、ゲートウェイは各文字を空白( '')として列のフル・サイズを戻します。

2.7.4.3 空のバインド変数

VARCHARバインド変数の場合、ゲートウェイは空のバインド変数をInformixデータベースにNULL値として渡します。

2.7.5 ロック

Informixデータベースのロック・モデルは、Oracleモデルと大きく異なります。 ゲートウェイは、基礎となるInformixの動作に依存するため、次のようなシナリオが、ゲートウェイを介してInformixにアクセスするOracleアプリケーションに影響を与える可能性があります:

  • 読取りアクセスで書込みアクセスをブロックする場合

  • 書込みアクセスで読取りアクセスをブロックする場合

  • 文レベルの読取り一貫性が保証されない場合

    関連項目:

    Informixのロック・モデルに関する情報は、Informixのドキュメントを参照してください。

2.8 既知の制限事項

この項または既知の問題点で示されていない非互換性の問題が発生した場合は、Oracleサポート・サービスに連絡してください。 次のトピックでは、既知の制限事項について説明し、可能な場合はそれらの制限事項を処理するための推奨事項を示します:

注意:

制限事項については、Oracleサポート・サービスに問い合せてください。

2.8.1 トランザクションの整合性

次のような場合、ゲートウェイではトランザクションの整合性が保証されません。

  • ゲートウェイで処理される文により、ターゲット・データベースで暗黙的コミットが発生する場合

  • ターゲット・データベースが自動コミット・モードで動作するように構成されている場合

    注意:

    次のことをお薦めします。

    • 特定の文を実行するとターゲット・データベースで暗黙的コミットが発生することがわかっている場合は、その文が独自のトランザクションで実行されるようにします。

    • 自動コミット・モードで動作するようにターゲット・データベースを構成しないでください。

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を設定します。

2.8.3 PL/SQLカーソル・ループのCOMMITまたはROLLBACKによるオープン・カーソルのクローズ

PL/SQLカーソル・ループで発行されたCOMMITまたはROLLBACKは、開いているすべてのカーソルを閉じます。これにより、次のエラーが発生する可能性があります:

ORA-1002:  fetch out of sequence

このエラーを回避するには、COMMITまたはROLLBACK文をカーソル・ループの外に移動します。

2.8.4 パススルー機能

ゲートウェイを通過するSQL文がInformixデータベースで暗黙的にコミットされた場合、Oracleトランザクション・マネージャはコミットを認識せず、OracleのROLLBACKコマンドを使用してトランザクションをロールバックすることはできません。

2.8.5 Informix SMALLFLOATおよびREALデータ型

Informix SMALLFLOATおよび REALデータ型の精度は6です。

2.8.6 SQL構文

SQL構文の制限事項は次のとおりです:

関連項目:

SQL構文の制限事項の詳細は、「サポートされているSQL構文と関数」を参照してください。

2.8.6.1 WHERE CURRENT OF句

UPDATE CURRENT OF句を使用するUPDATEおよびDELETE文は、Oracle ROWID実装に依存しているため、ゲートウェイではサポートされていません。 ゲートウェイを通じて特定の行を更新または削除するには、条件スタイルとしてWHERE句を使用する必要があります。

2.8.6.2 CONNECT BY句

ゲートウェイは、SELECT文のCONNECT BY句をサポートしていません。

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文の副問合せ

DELETEINSERT、およびUPDATE文の副問合せにあるSQL文は、外部問合せで指定されたものと同じ表を参照できません。 これは、Informixのロック機構が原因です。

2.8.6.6 ROWID

Oracle ROWIDの実装はサポートされていません。

2.8.6.7 EXPLAIN PLAN文

EXPLAIN PLAN文はサポートされていません。

2.8.7 SQL*Plus

SQL*Plusでは、ゲートウェイはSELECT文を使用してデータ型BYTEとして定義されたInformix列からデータを取得することをサポートしていません。

小文字の表名を二重引用符で囲む必要があります。たとえば、次のようになります:

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.8.10 ストアド・プロシージャ

ゲートウェイは、Oracle以外のデータベースでストアド・プロシージャを実行できるプロシージャ機能をサポートしていません。

2.9 既知の問題点

このセクションでは、既知の問題のリストと、可能な場合にそれらを修正するための提案を示します。 問題についての疑問は、Oracleサポート・サービスに問い合せてください。 問題の最新リストはオンラインで入手可能です。 リストへのアクセス方法については、地域のOracleのオフィスに問い合せてください。

既知の問題は次のとおりです:

2.9.1 暗号化形式のログイン

Oracleデータベースでは、初期化パラメータDBLINK_ENCRYPT_LOGINはサポートされなくなりました。 バージョン7.3までは、このパラメータのデフォルトのTRUE値は、ログイン・ユーザーIDのパスワードがネットワーク上に(クリア・テキストで)送信されることを防ぎました。 それより後のバージョンでは、パスワードが自動的に暗号化されます。

2.9.2 Informix BYTEおよびTEXTデータ型

BYTEおよびTEXTデータ型を使用する場合、次の制限が適用されます:

  • Informixデータ型TEXTとして定義されている列にアクセスするSQL文では、サポートされていないSQL関数を使用することはできません。

  • データが80文字を超える場合、SQL*Plusを使用してInformixデータ型TEXTとして定義された列からデータを選択することはできません。 Pro * CまたはOracle Call Interfaceを使用して、Informixデータベース内のそのようなデータにアクセスすることをお薦めします。

  • BYTEおよびTEXTデータ型は、INSERTまたはUPDATEが機能するためには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文を変更して、オブジェクトのスキーマ名を含めます。

2.9.4 データ・ディクショナリ・ビューとPL/SQL

PL/SQLブロック内にあるSQL文では、データ・ディクショナリ・ビューは参照できません。