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。
-
DELETE
、INSERT
、UPDATE
または"SELECT... FOR UPDATE...
"元のOracleデータベースで実行する必要があるSQL関数または文を含むSQL文。これらのSQL関数には、
USER
、USERENV
、および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のBINARY
、BYTE
およびTEXT
データ型(0xの後に16進数を1つの引用符で囲む)と互換性のある構文に変換されません。
たとえば、次の文はサポートされていません。
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では、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.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
を設定します。
関連項目:
「初期化パラメータ」および「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では、ゲートウェイは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.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文を変更して、オブジェクトのスキーマ名を含めます。