機械翻訳について

2 SQL Serverゲートウェイの機能と制限

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

トピック:

2.1 リモート挿入Rowsource

リモート挿入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パッケージを使用して、SQL Serverコマンドまたは文をアプリケーションからSQL Serverデータベースに渡すことができます。

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

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

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

  • BEGIN TRANSACTION

  • COMMIT

  • ROLLBACK

  • SAVE

  • SHUTDOWN

  • RELEASE

  • SAVEPOINT

  • CONNECT

  • SQL Serverツール・コマンド

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

ノート:

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

関連項目:

DBMS_HS_PASSTHROUGHパッケージの詳細については、「Oracle Database異機種間接続ユーザーズ・ガイド」Oracle Database PL/SQLパッケージと型リファレンスおよび第3章、「Oracle Databaseゲートウェイの機能」を参照してください。

2.3 ストアド・プロシージャおよびストアド・ファンクションの実行

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

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

ゲートウェイは、相互に排他的な3つのモードでストアド・プロシージャをサポートします:

  • ノーマル・モード: IN/OUT引数のみにアクセスできます

  • 戻り値モード: すべてのストアド・プロシージャの戻り値を持つ

  • 結果セット・モード: アウト値は最後の結果セットとして使用可能です

2.4 CHARセマンティクス

この機能により、ゲートウェイはオプションでCHARセマンティクス・モードで実行できます。 SQL ServerのCHAR列をCHAR(n BYTE)として記述するのではなく、CHAR(n CHAR)およびVARCHAR(n CHAR)として記述します。 この概念は、OracleデータベースのCHARセマンティクスに似ています。 このオプションをアクティブにするには、HS_NLS_LENGTH_SEMANTICS=CHARゲートウェイ・パラメータを指定する必要があります。 詳細は「初期化パラメータ」を参照してください。

2.5 マルチバイト文字セット比率抑制

この機能は、オプションでマルチバイト文字セットを含むSQL ServerデータベースからOracleデータベースへの比率の拡張を抑制します。 デフォルトでは、Oracleゲートウェイは、データが切り捨てられたり、バッファ・サイズが不十分な状態にならないように、最悪の比率を想定しています。 ただし、SQL Serverデータベースに関する特定の知識があり、展開が発生しないようにするには、HS_KEEP_REMOTE_COLUMN_SIZEパラメータを指定して展開を抑制します。 詳細は「初期化パラメータ」を参照してください。

2.6 IPv6のサポート

Oracleデータベースとゲートウェイ間の完全なIPv6サポートに加えて、IPv6はこのゲートウェイとSQL Serverデータベース間でもサポートされています。 詳細は、「初期化パラメータ」HS_FDS_CONNECT_INFOパラメータを参照してください。

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

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

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

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

関連項目:

Oracle以外のデータベースでユーザー定義関数を実行する方法の詳細は、Oracle Database異機種間接続ユーザーズ・ガイドを参照してください。

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

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

関連項目:

初期化パラメータ・ファイルとHS_FDS_PROC_IS_FUNCパラメータの編集に関する情報は、「初期化パラメータ」を参照してください。

ノート:

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

次の例では、従業員名JOHN SMYTHEがSQL Serverストアド・プロシージャREVISE_SALARYに渡されます。 ストアド・プロシージャは、SQL Serverデータベースから給与額を取得して、JOHN SMYTHEの新しい年俸を計算します。 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データ型に自動的に変換します。

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

Oracle Database Gateway for SQL Serverは、結果セットを返すストアド・プロシージャをサポートしています。

デフォルトでは、すべてのストアド・プロシージャおよびファンクションからユーザーに結果セットが戻されることはありません。 結果セットを使用可能にするには、HS_FDS_RESULTSET_SUPPORTパラメータ値をTRUEに設定します。

関連項目:

初期化パラメータ・ファイルとHS_FDS_RESULTSET_SUPPORTパラメータの編集に関する情報は、「初期化パラメータ」を参照してください。 Oracle以外のデータベースの結果セットに対するOracleサポートの詳細は、Oracle Database異機種間接続ユーザーズ・ガイドを参照してください。

ノート:

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

Oracle Database Gateway for SQL Serverを使用して結果セットを含むストアド・プロシージャにアクセスすると、異機種間サービスの順次モードになります。

Oracle Database Gateway for SQL Serverは、プロシージャの説明中に異機種間サービスに以下の情報を戻します:

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

  • 出力引数はなし

  • タイプがref cursorの1つの引数(ストアド・プロシージャから返される最初の結果セットに対応)

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

結果セットへのアクセスの制限は次のとおりです:

  • リモート・ストアド・プロシージャによって返される結果セットは、ワイヤー上に置かれた順序で取得する必要があります

  • ストアド・プロシージャの実行時に、前に実行したストアド・プロシージャによって返されたすべての結果セットが閉じられます(データが完全に取得されたかどうかにかかわらず)。

次の例では、SQL Serverストアド・プロシージャを実行して、SQL Serverからempおよびdept表の内容をフェッチします:

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

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

2.8.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 */
2.8.2.2 順次モードで結果セットからフェッチするPL/SQLプログラム

loc_empは、SQL Serverのemp表とまったく同じローカル表であるとします。 同じ仮定がloc_deptに適用されます。 outargsには、SQL Serverストアド・プロシージャのout引数に対応する列があります。

create table outargs (outarg varchar2(255), retval number);
create or replace package rcpackage is
  type RCTYPE is ref cursor;
end rcpackage;
/
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 outargs table
  fetch rc3 into rec3;
  insert into outargs (rec3.outarg, rec3.retval);

  -- Close ref cursor
  close rc3;

end;
/

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

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

2.9.1 暗黙的トランザクション(チェーン・モード)

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

2.9.2 列の定義

デフォルトでは、列定義にNULLが指定されていない限り、「SQL Server」表の列にはNULL値を含めることはできません。 「SQL Server」は、このデフォルトを上書きするように「SQL Server」オプションを設定しない限り、すべての列にNULL値を含めることはできないものとします。

Oracle表の場合、NOT NULLが列定義で指定されていないかぎり、NULL値が列に使用できます。

2.9.3 命名規則

ネーミング・ルールの問題には、次のものがあります:

2.9.3.1 オブジェクトのネーミングに関するルール

OracleとSQL Serverでは、異なるデータベース・オブジェクト命名規則が使用されます。 たとえば、各オブジェクト名に許可される最大文字数は異なっていてもかまいません。 また、一重引用符と二重引用符、大/小文字の区別、および英数字の使用はすべて異なっていてもかまいません。

関連項目:

Oracle DatabaseリファレンスとSQL Serverのドキュメントを参照してください。

2.9.3.2 大文字と小文字の区別

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

SQL> SELECT * FROM "emp"@MSQL;

ただし、OracleアプリケーションからScottが所有するempという「SQL Server」表を参照するには、次のように入力します:

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

empという名前の「SQL Server」表がSCOTTによって所有されている場合、表所有者の名前は大文字で、次のように二重引用符を付けないで所有者名を入力できます:

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

または

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

すべてのSQL Serverオブジェクト名を二重引用符で囲み、SQL Serverデータ・ディクショナリに表示されるオブジェクト名には大文字と小文字を使用することをお薦めします。 この規則は、サポートされているOracleデータ・ディクショナリ表または「データ辞書」にリストされているビューを参照する場合には必要ありません。

これらの規則に従って既存のアプリケーションを変更できない場合は、Oracleでビューを作成して、SQL Serverの名前を正しい大文字とするようにします。 たとえば、大文字のみを使用して既存のOracleアプリケーションから「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;

ビューの使用は、SQL Serverのデータ・ディクショナリで生成されたデータ・ディクショナリ情報を複製する回避策です。 SQL Serverデータベースで対応する表のデータ定義が変更されると、Oracleビュー定義を更新する準備が必要です。

2.9.4 データ型

データ型の問題には、次のものがあります:

2.9.4.1 バイナリ・リテラル表記法

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

この表記は、SQL ServerのVARBINARYおよびBINARYデータ型(0x の後ろに16進数を1つの引用符で囲む)と互換性のある構文に変換されません。

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

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

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

2.9.4.2 LONG列を含むバインド変数

ゲートウェイは、データ型LONGの列を更新するためにバインド変数を使用することをサポートしていません。

2.9.4.3 データ型変換

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")

関連項目:

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

2.9.5 問合せ

問合せに関する問題には、次のものがあります:

2.9.5.1 行選択

SQL Serverは、すべての行を返す前に、選択したすべての行の問合せ条件を評価します。 評価プロセスで1行以上の行に対してエラーが発生した場合、残りの行が条件を満たしていても行は返されません。

Oracleでは、問合せ条件行が評価され、評価が成功した場合は行が返されます。 行の評価が失敗するまで、行が戻されます。

2.9.5.2 空の文字列

Oracleでは、SQL文の空の文字列がnull値として処理されます。 SQL Serverは、空の文字列を空の文字列として処理します。

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

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

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

空の文字列を選択するには:

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

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

2.9.5.3 空のバインド変数

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

2.9.6 ロック中

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

  • 読取りアクセスは書込みアクセスをブロックする可能性があります

  • 書込みアクセスは読取りアクセスをブロックする可能性があります

  • 文レベルの読取り一貫性は保証されません。

    関連項目:

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

2.10 既知の制限事項

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

ノート:

制限について不明点や懸念がある場合は、Oracle Support Servicesにお問い合せください。

2.10.1 複数のオープン文

SQL Serverへのアクセスには、各接続に対して1つのオープン文またはカーソルが許可されているという制限があります。 2番目の文またはカーソルを同じトランザクションでオープンしてSQL Serverにアクセスする必要がある場合は、新しい接続が必要です。

この制限のため、同じトランザクション内の複数のオープンされた文またはカーソルは、SQL Serverへの異なる接続を使用するため、互いにロックできます。

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

2.10.2 トランザクション整合性

次の場合、ゲートウェイはトランザクションの整合性を保証できません:

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

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

    ノート:

    Oracleは、次のことを強く推奨します:

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

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

2.10.3 トランザクション機能

ゲートウェイでは保存ポイントはサポートされません。 分散更新トランザクションがゲートウェイを含む方法で、ユーザーが保存ポイントを作成しようとすると、次のエラーが発生します:

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

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

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

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

ORA-1002:  fetch out of sequence 

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

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

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

Oracle Database Gateway for SQL Serverを使用して結果セットを含むストアド・プロシージャにアクセスする場合は、異機種間サービスの順次モードで作業する必要があります。

Oracle Database Gateway for SQL Serverを使用して複数の結果セットを持つストアド・プロシージャにアクセスする場合は、続行する前にすべての結果セットを読み込む必要があります。

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

2.10.6 パススルー機能

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

2.10.7 DDL文

SQL Serverでは、独自のトランザクションで実行されるDDL文が必要であり、特定のトランザクションで実行できるDDL文は1つだけです。

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

次のSQL Server DDL文は、パススルー機能を使用して渡す場合、またはパススルー機能を含むSQL Serverストアド・プロシージャを実行する場合、エラー状態を引き起こす可能性があります:

  • 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文の詳細については、SQL Serverのドキュメントを参照してください。

2.10.8 SQL構文

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

関連項目:

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

2.10.8.1 WHERE CURRENT OF句

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

2.10.8.2 CONNECT BY句

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

2.10.8.3 副問合せでの関数

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

2.10.8.4 副問合せのパラメータ

SQL Serverの制限により、サブ問合せでパラメータを使用することはできません。

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

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

2.10.8.6 ROWID

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

2.10.8.7 TO_DATE

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

2.10.8.8 EXPLAIN PLAN文

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

2.10.9 関数

関数の使用には、次の制限事項が適用されます:

  • サポートされていない関数は、LONG列を参照する文では使用できません。

  • SUBSTR関数の第2パラメータとして負の数を使用すると、不正な結果が返されます。 これは、Oracle SUBSTR関数とそれに相当するSQL Serverの間の非互換性が原因です。

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

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

次に例を示します。

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

2.10.11 データベース・リンク

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

2.11 既知の問題点

この項では、既知の問題点について説明し、可能な場合は問題を修正するための提案を示します。 問題についての疑問は、Oracleサポート・サービスに問い合せてください。 現在の問題のリストは、オンライン上で入手できます。 リストへのアクセスの詳細は、ローカルのOracleオフィスに問い合せてください。

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

2.11.1 暗号化形式のログイン

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

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

現在のリリースでは、DBLINK_ENCRYPT_LOGIN初期化パラメータは廃止されているため、確認する必要はありません。

2.11.2 日付計算

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

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

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

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

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

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

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

  • IMAGETEXT、およびNTEXTデータはパススルー問合せで読み取ることはできません。

  • SQL文がIMAGETEXT、またはNTEXT列を含む表にアクセスしている場合、文は2つの独立した文としてSQL Serverに送信されます。 IMAGETEXTまたはNTEXT列にアクセスするための1つの文、および元の文内の他の列の2番目の文。

ゲートウェイは、DBMS_SQLパッケージのPL/SQL関数COLUMN_VALUE_LONGをサポートしていません。

関連項目:

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

2.11.4 文字列関数

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

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

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

2.11.5 スキーマ名とPL/SQL

PL/SQLブロック内のSQL文にSQL Serverデータベース・オブジェクトのスキーマ名をプレフィクスとして指定しないと、次のエラー・メッセージが表示されます:

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

オブジェクトのスキーマ名を含めるようにSQL文を変更します。

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

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

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

結果セットを返すストアド・プロシージャの戻り値が正しくありません。