ヘッダーをスキップ
Oracle Transparent Gateway for Microsoft SQL Server管理者ガイド
10gリリース2(10.2)for Microsoft Windows(32-bit)
B25367-01
  目次
目次
索引
索引

戻る
戻る
次へ
次へ
 

3 Microsoft SQL Serverのゲートウェイ機能および制限事項

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

この章の内容は次のとおりです。

3.1 パススルー機能の使用

ゲートウェイでは、DBMS_HS_PASSTHROUGHパッケージを使用して、Microsoft SQL Serverコマンドまたは文をアプリケーションからMicrosoft SQL Serverデータベースに渡すことができます。

次のように、PL/SQLブロックのDBMS_HS_PASSTHROUGHパッケージを使用して、Microsoft SQL Serverデータベースに渡す文を指定します。

DECLARE
    num_rows INTEGER;
BEGIN
    num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@MSQL('command');
END;
/

commandには、次のいずれも使用できません。

DBMS_HS_PASSTHROUGHパッケージでは、バインド値を渡すこと、およびSELECT文を実行することがサポートされています。


注意:

TRUNCATEはパススルー文では使用できません。


関連資料:

DBMS_HS_PASSTHROUGHパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』、および『Oracle Database Heterogeneous Connectivity管理者ガイド』の第3章を参照してください。

3.2 ストアド・プロシージャおよび関数の実行

ゲートウェイでは、プロシージャ機能を使用して、Microsoft SQL Serverデータベースに定義されているストアド・プロシージャを実行できます。ゲートウェイを再リンクしたり、ゲートウェイに対してプロシージャを定義する必要はありませんが、プロシージャのアクセス権により、ゲートウェイのログインに使用されているユーザーによるアクセスが許可される必要があります。


関連資料:

ストアド・プロシージャの実行の詳細は、『Oracle Database Heterogeneous Connectivity管理者ガイド』を参照してください。

ストアド・プロシージャの実行には、標準のPL/SQL文が使用されます。

3.3 リモート・ユーザー定義関数のサポート

Oracle以外のリモート・データベースのユーザー定義関数は、SQL文で使用できます。


関連資料:

Oracle以外のデータベースにおけるユーザー定義関数の実行の詳細は、『Oracle Database Heterogeneous Connectivity管理者ガイド』を参照してください。

3.3.1 戻り値とストアド・プロシージャ

デフォルトでは、すべてのストアド・プロシージャおよび関数は、ユーザーに戻り値を返しません。戻り値を使用できるようにするには、HS_FDS_PROC_IS_FUNCパラメータを初期化パラメータ・ファイルで設定します。


関連項目:

初期化パラメータ・ファイルの編集およびHS_FDS_PROC_IS_FUNCパラメータの詳細は、付録D「異機種間サービス初期化パラメータ」を参照してください。


注意:

HS_FDS_PROC_IS_FUNCゲートウェイ初期化パラメータを設定する場合、すべての既存のストアド・プロシージャについて、プロシージャ実行文の構文を変更する必要があります。

次の例では、従業員名JOHN SMYTHEがMicrosoft SQL Serverストアド・プロシージャREVISE_SALARYに渡されます。このストアド・プロシージャは、JOHN SMYTHEの新しい年俸を計算するために、Microsoft SQL Serverデータベースから給与額の値を取り出します。RESULTで返された変更後の給与額を使用して、OracleデータベースのEMP表が更新されます。

DECLARE
  INPUT VARCHAR2(15);
  RESULT NUMBER(8,2);
BEGIN
  INPUT := 'JOHN SMYTHE';
  RESULT := REVISE_SALARY@MSQL(INPUT);
  UPDATE EMP SET SAL = RESULT WHERE ENAME =: INPUT;
END;
/

プロシージャ機能により、Oracle以外のデータ型とPL/SQLデータ型との間の変換は自動的に行われます。

3.3.2 結果セットとストアド・プロシージャ

Oracle Transparent Gateway for Microsoft SQL Serverでは、結果セットを返すストアド・プロシージャがサポートされています。

デフォルトでは、すべてのストアド・プロシージャおよび関数は、ユーザーに結果セットを返しません。結果セットを使用できるようにするには、HS_FDS_RESULTSET_SUPPORTパラメータを初期化パラメータ・ファイルで設定します。


関連資料:

初期化パラメータ・ファイルの編集およびHS_FDS_RESULTSET_SUPPORTパラメータの詳細は、付録D「異機種間サービス初期化パラメータ」を参照してください。Oracle以外のデータベースでの結果セットに対するOracleサポートの詳細は、『Oracle Database Heterogeneous Connectivity管理者ガイド』を参照してください。


注意:

HS_FDS_RESULTSET_SUPPORTゲートウェイ初期化パラメータを設定する場合、すべての既存のストアド・プロシージャについて、プロシージャ実行文の構文を変更する必要があります。変更を行わないとエラーが発生します。

Oracle Transparent Gateway for Microsoft SQL Serverを介して、結果セットのあるストアド・プロシージャにアクセスする場合は、異機種間サービスのシーケンシャル・モードで作業する必要があります。

Oracle Transparent Gateway for Microsoft SQL Serverは、プロシージャ記述時に次の情報を異機種間サービスに返します。

  • リモート・ストアド・プロシージャのすべての入力引数

  • 出力引数については情報なし

  • REF CURSOR型の1つの出力引数(ストアド・プロシージャにより返された最初の結果セットに対応)

クライアント・プログラムでは、仮想パッケージ関数dbms_hs_result_set.get_next_result_setを使用し、後続の結果セットについて参照カーソルを取得する必要があります。返された最後の結果セットは、プロシージャの出力引数です。

結果セットへのアクセスには次の制限事項があります。

  • リモート・ストアド・プロシージャにより返された結果セットは、送信された順序で取り出す必要があります。

  • 複数のストアド・プロシージャを実行する場合、各プロシージャの結果セットを完全に取り出してから、次のストアド・プロシージャを実行する必要があります。

  • ストアド・プロシージャの実行時に、すでに実行されたストアド・プロシージャにより返された結果セットはすべて(データが完全に取り出されたかどうかに関係なく)クローズされます。

次の例では、Microsoft SQL Serverからemp表およびdept表の内容をフェッチするために、Microsoft SQL Serverストアド・プロシージャが実行されます。

create procedure REFCURPROC (@arg1 varchar(255), @arg2 varchar(255) output)
as
select @arg2 = @arg1
select * from EMP
select * from DEPT
go

このストアド・プロシージャでは、出力パラメータarg2に入力パラメータarg1を割り当て、参照カーソルrc1で問合せSELECT * FROM EMPをオープンし、参照カーソルrc2で問合せSELECT * FROM DEPTをオープンしています。

3.3.2.1 シーケンシャル・モードでのOCIプログラムによる結果セットからのフェッチ

次の例では、シーケンシャル・モードでのOCIプログラムによる結果セットからのフェッチを示します。

OCIEnv *ENVH;
OCISvcCtx *SVCH;
OCIStmt *STMH;
OCIError *ERRH;
OCIBind *BNDH[3];
OraText arg1[20];
OraText arg2[255];
OCIResult *rset;
OCIStmt *rstmt;
ub2 rcode[3];
ub2 rlens[3];
sb2 inds[3];
OraText *stmt = (OraText *) "begin refcurproc@MSQL(:1,:2,:3); end;";
OraText *n_rs_stm = (OraText *)
  "begin :ret := DBMS_HS_RESULT_SET.GET_NEXT_RESULT_SET@MSQL; end;";

/* Prepare procedure call statement */

/* Handle Initialization code skipped */
OCIStmtPrepare(STMH, ERRH, stmt, strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);

/* Bind procedure arguments */
inds[0] = 0;
strcpy((char *) arg1, "Hello World");
rlens[0] = strlen(arg1);
OCIBindByPos(STMH, &BNDH[0], ERRH, 1, (dvoid *) arg1, 20, SQLT_CHR,
             (dvoid *) &(inds[0]), &(rlens[0]), &(rcode[0]), 0, (ub4 *) 0,
             OCI_DEFAULT);

inds[1] = -1;
OCIBindByPos(STMH, &BNDH[1], ERRH, 1, (dvoid *) arg2, 20, SQLT_CHR,
             (dvoid *) &(inds[1]), &(rlens[1]), &(rcode[1]), 0, (ub4 *) 0,
             OCI_DEFAULT);

inds[2] = 0;
rlens[2] = 0;
OCIDescriptorAlloc(ENVH, (dvoid **) &rset, OCI_DTYPE_RSET, 0, (dvoid **) 0);
OCIBindByPos(STMH, &BNDH[2], ERRH, 2, (dvoid *) rset, 0, SQLT_RSET,
             (dvoid *) &(inds[2]), &(rlens[2]), &(rcode[2]),
             0, (ub4 *) 0, OCI_DEFAULT);

/* Execute procedure */
OCIStmtExecute(SVCH, STMH, ERRH, 1, 0, (CONST OCISnapshot *) 0,
               (OCISnapshot *) 0, OCI_DEFAULT);

/* Convert result set to statement handle */
OCIResultSetToStmt(rset, ERRH);
rstmt = (OCIStmt *) rset;

/* After this the user can fetch from rstmt */
/* Issue get_next_result_set call to get handle to next_result set */
/* Prepare Get next result set procedure call */

OCIStmtPrepare(STMH, ERRH, n_rs_stm, strlen(n_rs_stm), OCI_NTV_SYNTAX,
               OCI_DEFAULT);

/* Bind return value */
OCIBindByPos(STMH, &BNDH[1], ERRH, 1, (dvoid *) rset, 0, SQLT_RSET,
             (dvoid *) &(inds[1]), &(rlens[1]), &(rcode[1]),
             0, (ub4 *) 0, OCI_DEFAULT);

/* Execute statement to get next result set*/
OCIStmtExecute(SVCH, STMH, ERRH, 1, 0, (CONST OCISnapshot *) 0,
               (OCISnapshot *) 0, OCI_DEFAULT);

/* Convert next result set to statement handle */
OCIResultSetToStmt(rset, ERRH);
rstmt = (OCIStmt *) rset;

/* Now rstmt will point to the second result set returned by the
remote stored procedure */

/* Repeat execution of get_next_result_set to get the output arguments */

3.3.2.2 シーケンシャル・モードでのPL/SQLプログラムによる結果セットからのフェッチ

表loc_empは、Microsoft SQL Serverのemp表とまったく同じローカル表であるとします。表loc_deptにも同じ前提があるとします。outargsは、Microsoft SQL Serverストアド・プロシージャの出力引数に対応する行を持つ表です。

declare
  rc1 rcpackage.rctype;
  rec1 loc_emp%rowtype;
  rc2 rcpackage.rctype;
  rec2 loc_dept%rowtype;
  rc3 rcpackage.rctype;
  rec3 outargs%rowtype;
  out_arg varchar2(255);

begin

  -- Execute procedure
  out_arg := null;
  refcurproc@MSQL('Hello World', out_arg, rc1);

  -- Fetch 20 rows from the remote emp table and insert them into loc_emp
  for i in 1 .. 20 loop
    fetch rc1 into rec1;
    insert into loc_emp (rec1.empno, rec1.ename, rec1.job,
    rec1.mgr, rec1.hiredate, rec1.sal, rec1.comm, rec1.deptno);
  end loop;

  -- Close ref cursor
  close rc1;

  -- Get the next result set returned by the stored procedure
  rc2 := dbms_hs_result_set.get_next_result_set@MSQL;

  -- Fetch 5 rows from the remote dept table and insert them into loc_dept
  for i in 1 .. 5 loop
    fetch rc2 into rec2;
    insert into loc_dept values (rec2.deptno, rec2.dname, rec2.loc);
  end loop;

  --Close ref cursor
  close rc2;

  -- Get the output arguments from the remote stored procedure
  -- Since we are in sequential mode, they will be returned in the
  -- form of a result set
  rc3 := dbms_hs_result_set.get_next_result_set@MSQL;

  -- Fetch them and insert them into the outarguments table
  fetch rc3 into rec3;
  insert into outargs (rec3.outarg, rec3.retval);

  -- Close ref cursor
  close rc3;

end;
/

3.4 Microsoft SQL Serverのデータベース互換性の問題

Microsoft SQL ServerとOracleデータベースはいくつかの点で機能が異なるため、互換性に問題があります。この項では、次の互換性の問題について説明します。

3.4.1 暗黙的トランザクション(連鎖モード)

ゲートウェイでは、ANSI規格の暗黙的トランザクションがサポートされています。Microsoft SQL Serverストアド・プロシージャは、このモード用に作成する必要があります。暗黙的トランザクションを実行すると、ゲートウェイではOracleデータベースおよびMicrosoft SQL Serverデータベースを更新するトランザクションにOracleの2フェーズ・コミット保護を拡張できます。

3.4.2 列定義

デフォルトでは、列定義にNULLが指定されていなければ、Microsoft SQL Server表の列にNULL値を含めることはできません。Microsoft SQL Serverの前提では、Microsoft SQL Serverオプションをこのデフォルトに優先するように設定しないかぎり、すべての列にNULL値を含めることはできません。

Oracle表では、列定義にNOT NULLが指定されていなければ、列にNULL値を含めることができます。

3.4.3 ネーミング規則

ネーミング規則の問題は次のとおりです。

3.4.3.1 オブジェクトのネーミング規則

OracleおよびMicrosoft SQL Serverでは、異なるデータベース・オブジェクトのネーミング規則を使用しています。たとえば、各オブジェクト名に認められている最大文字数が違います。また、一重引用符および二重引用符の使用、大/小文字の区別、英数字の使用もすべて異なります。


関連資料:

『Oracle Databaseリファレンス』およびMicrosoft SQL Serverのドキュメントを参照してください。

3.4.3.2 大/小文字の区別

Oracleデータベース・サーバーでは、識別子を二重引用符で囲まないかぎり、デフォルトの大文字になります。たとえば、Microsoft SQL Serverのemp表を参照するには、次のように名前を二重引用符で囲んで入力します。

SQL> SELECT * FROM "emp"@MSQL;

一方、OracleアプリケーションからScottが所有するMicrosoft SQL Serverのemp表を参照するには、次のように入力します。

SQL> SELECT * FROM "Scott"."emp"@MSQL;

Microsoft SQL Serverのemp表の所有者がSCOTT(表の所有者名が大文字)である場合は、所有者名を二重引用符で囲まず、次のように入力します。

SQL> SELECT * FROM SCOTT."emp"@MSQL;

または

SQL> SELECT * FROM scott."emp"@MSQL;

すべてのMicrosoft SQL Serverのオブジェクト名を二重引用符で囲み、Microsoft SQL Serverデータ・ディクショナリに表示されるとおり、オブジェクト名の大/小文字を正確に使用することをお薦めします。この表記規則は、付録C「データ・ディクショナリ」に示す、サポート対象のOracleデータ・ディクショナリ表またはビューを参照する際には適用されません。

この表記規則に従って既存のアプリケーションを変更できない場合、Oracleでビューを作成してMicrosoft SQL Serverの名前を正確な大/小文字と関連付けます。たとえば、大文字のみの名前を使用して既存のOracleアプリケーションからMicrosoft SQL Serverのemp表を参照するには、次のようなビューを定義します。

SQL> CREATE VIEW EMP (EMPNO, ENAME, SAL, HIREDATE)
      AS SELECT "empno", "ename", "sal", "hiredate"
      FROM "emp"@MSQL;

このビューを使用して、アプリケーションは次のような文を発行できます。

SQL> SELECT EMPNO, ENAME FROM EMP;

ビューの使用は、Microsoft SQL Serverデータ・ディクショナリに基づいたデータ・ディクショナリ情報を複製する次善の解決策です。Microsoft SQL Serverデータベースで対応する表のデータ定義に変更が発生するたびにOracleのビュー定義の更新準備をする必要があります。

3.4.4 データ型

データ型の問題は次のとおりです。

3.4.4.1 バイナリのリテラル表記

Oracle SQLでは、一重引用符で囲まれた16進数を使用してリテラル値を表します。この値は、RAWデータ型として定義された列と比較されたり、列に挿入されます。

この表記は、Microsoft SQL ServerのVARBINARYおよびBINARYデータ型(一重引用符で囲まれた、0xとそれに続く16進数)と互換性のある構文に変換されません。

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

SQL> INSERT INTO BINARY_TAB@MSQL VALUES ('0xff')

BINARY_TABには、データ型VARBINARYまたはBINARYの列が含まれます。VARBINARYおよびBINARYデータ型に対する挿入または更新には、バインド変数を使用します。

3.4.4.2 LONG列に対するバインド変数

ゲートウェイでは、バインド変数を使用したLONGデータ型の列の更新はサポートされていません。

3.4.4.3 データ型変換

Microsoft SQL Serverでは、暗黙的データ変換はサポートされていません。このような変換は明示的にする必要があります。

たとえば、次のようなSELECT文には、ゲートウェイからエラーが発行されます。

SELECT DATE_COL FROM TEST@MSQL WHERE DATE_COL = "1-JAN-2004";

暗黙的変換の問題を回避するには、次のように明示的変換を追加します。

SELECT DATE_COL FROM TEST@MSQL WHERE DATE_COL = TO_DATE("1-JAN-2004")


関連項目:

データ型に関する制限事項の詳細は、付録A「データ型変換」を参照してください。

3.4.5 問合せ

問合せの問題は次のとおりです。

3.4.5.1 行の選択

Microsoft SQL Serverでは、行を返す前に、すべての選択された行に対して問合せ条件を評価します。1行以上について評価処理でエラーが発生すると、残りの行が条件を満たしていても行は一切返されません。

Oracleでは、1行ずつ問合せ条件を評価し、評価処理でエラーが発生しなければ行を返します。行の評価処理でエラーが発生するまで、行は返されます。

3.4.5.2 空の文字列

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

空の文字列との比較

ゲートウェイは、空の文字列を変換せずにMicrosoft SQL Serverデータベースに渡します。空の文字列がNULL値を表すつもりでも、Microsoft SQL Serverではそのように文は処理されず、空の文字列が使用されます。

次のように、空の文字列構文のかわりにSQL文でNULLまたはIS NULLを使用すると、この問題は回避できます。

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

空の文字列の選択

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

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

3.4.5.3 空のバインド変数

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

3.4.6 ロック

Microsoft SQL Serverデータベースのロック・モデルは、Oracleのモデルとは大きく異なります。ゲートウェイは基礎となるMicrosoft SQL Serverの動作に依存しているため、次の使用例に該当する場合、ゲートウェイを介してMicrosoft SQL ServerにアクセスするOracleアプリケーションは影響を受ける可能性があります。

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

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

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


    関連資料:

    Microsoft SQL Serverのロック・モデルの詳細は、Microsoft SQL Serverのドキュメントを参照してください。

3.5 既知の制限事項

この項または「既知の問題点」で示されていない非互換性の問題が発生した場合は、オラクル社カスタマ・サポート・センターに問い合せてください。この項では、次の既知の制限事項について説明し、可能な場合はそれらに対処するための提案を示します。

3.5.1 複数のオープン文

ゲートウェイでは、Microsoft SQL Serverとの通信にMicrosoft ODBCドライバを使用します。MicrosoftのODBCドライバには、接続ごとに許可されるオープン文またはカーソルは1つのみという制限があります。SQL Serverにアクセスする同じトランザクションで、2つ目の文またはカーソルをオープンする必要がある場合、新しい接続が必要です。

この制限のため、同じトランザクション内の複数のオープン文またはカーソルは、Microsoft SQL Serverに対して異なる接続を使用するので、互いにロックする可能性があります。

この制限を回避するには、コミットの発行またはロジックの変更、あるいはその両方を行います。

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

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

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

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


    注意:

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


Microsoft SQL Serverデータベースへの接続が確立されると、ゲートウェイにより、自動コミット・モードはオフに設定されます。

3.5.3 トランザクション機能

ゲートウェイでは、セーブポイントはサポートされていません。分散更新トランザクションがゲートウェイを介して進行中で、ユーザーがセーブポイントを作成しようとすると、次のエラーが発生します。

ORA-02070: database dblink does not support savepoint in this context

デフォルトでは、ゲートウェイはCOMMIT_CONFIRMとして構成されます。

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

PL/SQLカーソル・ループで発行されたCOMMITまたはROLLBACKは、すべてのオープン・カーソルをクローズするため、次のエラーが発生する可能性があります。

ORA-1002:  fetch out of sequence

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

3.5.5 ストアド・プロシージャ

コミットまたはロールバックを埋め込んだストアド・プロシージャを介して発行される変更は、Oracleトランザクション・マネージャまたはOracleのCOMMITコマンドまたはROLLBACKコマンドでは制御できません。

Oracle Transparent Gateway for Microsoft SQL Serverを介して、結果セットのあるストアド・プロシージャにアクセスする場合は、異機種間サービスのシーケンシャル・モードで作業する必要があります。

Oracle Transparent Gateway for Microsoft SQL Serverを介して、複数の結果セットのあるストアド・プロシージャにアクセスする場合は、処理を続行する前にすべての結果セットを読み取る必要があります。

ストアド・プロシージャの出力パラメータは、空の文字列に初期化する必要があります。

3.5.6 パススルー機能

ゲートウェイをSQL文がパススルーした結果、Microsoft SQL Serverデータベースで暗黙的コミットが発生した場合、Oracleトランザクション・マネージャはそのコミットを認識できず、トランザクションのロールバックにOracleのROLLBACKコマンドを使用できません。

3.5.7 DDL文

Microsoft SQL Serverでは、独自のトランザクションで実行されるDDL文がいくつか必要です。また、特定のトランザクションで実行できるDDL文は1つのみです。

Microsoft SQL Serverストアド・プロシージャでこれらのDDL文を使用し、プロシージャ機能を使用してゲートウェイを介してそのストアド・プロシージャを実行したり、パススルー機能を使用してゲートウェイを介してDDL文を実行すると、エラーが発生する可能性があります。これは、ゲートウェイのプロシージャ機能およびパススルー機能では、DDL文がそれぞれ異なるトランザクションで実行されることが保証できないためです。

ゲートウェイのパススルー機能を使用して次のMicrosoft SQL ServerのDDL文を渡そうとしたり、これらのDDL文が含まれるMicrosoft SQL Serverストアド・プロシージャを実行すると、エラーが発生する可能性があります。

表3-1 制限されるDDL文

文の名前
ALTER DATABASE
CREATE DATABASE
CREATE INDEX
CREATE PROCEDURE
CREATE TABLE
CREATE VIEW
DISK INIT
DROP <object>
DUMP TRANSACTION
GRANT
LOAD DATABASE
LOAD TRANSACTION
RECONFIGURE
REVOKE
SELECT INTO
TRUNCATE TABLE
UPDATE STATISTICS


関連資料:

DDL文の詳細は、Microsoft SQL Serverのドキュメントを参照してください。

3.5.8 SQL構文

この項では、次のSQL構文に関する制限事項を示します。

3.5.8.1 WHERE CURRENT OF句

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

3.5.8.2 CONNECT BY句

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

3.5.8.3 副問合せ中の関数

バインド変数および式は、INSERT、UPDATEまたはDELETE SQL文の副問合せの一部である場合、文字列関数または数学関数ではオペランドとしてサポートされていません。

3.5.8.4 副問合せ中のパラメータ

Microsoft SQL Serverでの制限により、副問合せでパラメータは使用できません。

3.5.8.5 UPDATE文中のデータ・ディクショナリ表およびビュー

UPDATE文のSET句では、データ・ディクショナリ表およびビューはサポートされていません。

3.5.8.6 ROWID

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

3.5.8.7 TO_DATE

TO_DATEは予約語であるため、データベース識別子の名前として使用できません。

3.5.8.8 EXPLAIN PLAN文

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

3.5.9 関数

関数の使用には、次の制限事項があります。

  • サポート対象外の関数は、LONG列を参照する文では使用できません。

  • 負の数値がSUBSTR関数の2番目のパラメータとして使用されると、不正な結果が返されます。これは、OracleのSUBSTR関数と対応するMicrosoft SQL Serverの関数との非互換性に原因があります。

3.5.10 小文字の表名を使用するSQL*PlusのCOPYコマンド

小文字の表名は二重引用符で囲む必要があります。

次に例を示します。

copy from tkhouser/tkhouser@inst1 insert loc_tkhodept using select * from "tkhodept"@holink2;

3.5.11 データベース・リンク

ゲートウェイはマルチスレッド化されていないため、共有データベース・リンクをサポートできません。ゲートウェイ・セッションはそれぞれ別のゲートウェイ・プロセスを起動し、接続は共有されません。

3.6 既知の問題点

この項では、既知の問題点について説明し、可能な場合は問題を修正するための提案を示します。問題についての疑問は、オラクル社カスタマ・サポート・センターに問い合せてください。問題の最新リストはオンラインで入手可能です。リストへのアクセス方法については、オラクル社カスタマ・サポート・センターに問い合せてください。

この項では、次の既知の問題点について説明します。

3.6.1 FLOATデータ型

FLOATデータ型の精度は(7)です。

3.6.2 VARBINARYデータ型

VARBINARYデータ型は、BINARYとしてレポートされます。

3.6.3 暗号化形式のログイン

Oracle9iデータベース・サーバー(リリース9.2以下)では、Oracle初期化パラメータDBLINK_ENCRYPT_LOGINがサポートされていました。このパラメータをTRUEに設定すると、ログイン・ユーザーIDのパスワードはネットワークを介して送信されません。

このパラメータがOracle9iデータベース・サーバーで使用される初期化パラメータ・ファイルでTRUEに設定されている場合、設定をデフォルト設定のFALSEに変更し、Oracle9iがゲートウェイと通信できるようにする必要があります。

最新のリリース、Oracle Database 10gリリース10.2では、DBLINK_ENCRYPT_LOGIN初期化パラメータは廃止されているため、確認する必要はありません。

3.6.4 日付計算

次のSQL式は、ゲートウェイでは正しく機能しません。

date + number
number + date
date - number
date1 - date2

前述の式が指定された文は、変換されずにMicrosoft SQL Serverデータベースに送信されます。Microsoft SQL Serverでは、これらの日付計算関数はサポートされていないため、文はエラーを返します。

3.6.5 Microsoft SQL ServerのIMAGE、TEXTおよびNTEXTデータ型

次の制限事項は、IMAGE、TEXTおよびNTEXTデータ型を使用する際に適用されます。

  • サポート対象外のSQL関数は、Microsoft SQL Serverデータ型のIMAGE、TEXTまたはNTEXTとして定義されている列にアクセスするSQL文では使用できません。

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

  • IMAGE、TEXTおよびNTEXTデータ型は、INSERTまたはUPDATEが機能するためにNULLABLEである必要があります。

  • IMAGE、TEXTまたはNTEXTの列が含まれる表には、一意索引を定義する必要があります。あるいは、主キーとして機能する別の列を含む必要があります。

  • IMAGE、TEXTおよびNTEXTのデータは、パススルー問合せを介して読み取ることはできません。

  • SQL文がIMAGE、TEXTまたはNTEXTの列を含む表にアクセスする場合、その文は2つの別の文としてMicrosoft SQL Serverに送信されます。1つ目の文はIMAGE、TEXTまたはNTEXTの列にアクセスするためのもので、2つ目の文は元の文のその他の列のためのものです。このため、接続ごとに許可される文は1つのみというMicrosoft ODBCドライバの制限事項により、Microsoft SQL Serverへの2つの接続が確立され、SQL文の順序によっては停止する可能性があります。この問題が発生した場合は、コミットを発行し、別のトランザクションで文を分けてみます。

ゲートウェイでは、DBMS_SQLパッケージのPL/SQLファンクションCOLUMN_VALUE_LONGはサポートされていません。


関連項目:

SQL構文に関する制限事項の詳細は、付録B「サポート対象のSQL構文および関数」を参照してください。

3.6.6 文字列関数

ゲートウェイを使用してMicrosoft SQL Serverデータベースに問い合せる際に||またはCONCAT演算子を使用して数値リテラルを連結する場合、結果は加算されます。たとえば、次の文の結果は18です。

SQL> SELECT 9 || 9 FROM DUAL@MSQL;

Oracleを使用してOracleデータベースに問い合せると、結果は99になります。

3.6.7 スキーマ名とPL/SQL

PL/SQLブロック内のSQL文でMicrosoft SQL Serverデータベース・オブジェクトの前にスキーマ名を付けないと、次のエラー・メッセージが発生します。

ORA-6550 PLS-201 Identifier table_name must be declared.

SQL文を変更して、オブジェクトのスキーマ名を含めます。

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

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

3.6.9 ストアド・プロシージャ

複数のストアド・プロシージャを実行する場合、各プロシージャの結果セットを完全に取り出してから、次のストアド・プロシージャを実行する必要があります。

CHARデータ型で定義された出力パラメータを持つストアド・プロシージャは、VARCHARデータ型の出力パラメータを返します。

NUMERICまたはDECIMALのデータ型で定義された入力または出力パラメータを持つストアド・プロシージャは、入力値としてNULL値を指定するか、または値を指定しないで渡された場合、小数部分のない出力値を返します。この問題を回避するには、使用しない場合でも入力パラメータ値を必ず指定します。