81 DBMS_HS_PASSTHROUGH

DBMS_HS_PASSTHROUGH PL/SQLパッケージを使用すると、Oracleサーバーによる解釈がなくてもOracle以外のシステムに文を直接送信できます。この機能は、Oracle以外のシステムで使用できる文と同等の文がOracleにない場合に役立ちます。

この章では、以下のトピックについて説明します。

81.1 DBMS_HS_PASSTHROUGHの概要

PL/SQLパッケージDBMS_HS_PASSTHROUGHを使用すると、パススルーSQL文をOracle以外のシステムで直接実行できます。このパッケージで実行される文は、標準のSQL文と同じトランザクションで実行されます。

参照:

このパッケージの詳細は、『Oracle Database Heterogeneous Connectivityユーザーズ・ガイド』を参照してください。

81.2 DBMS_HS_PASSTHROUGHの使用上の注意

DBMS_HS_PASSTHROUGHパッケージは仮想パッケージです。概念上は、Oracle以外のシステムに常駐します。ただし、実際には、このパッケージのコールは異機種間サービスにより仲介され、1つ以上の異機種間サービス・コールにマップされます。次に、これらの異機種間サービス・コールは、ドライバによりOracle以外のシステムのAPIにマップされます。クライアント・アプリケーションは、Oracle以外のシステムのストアド・プロシージャをコールする場合と同じ方法で、データベース・リンクを介してパッケージ内のプロシージャをコールする必要があります。異機種間サービスにより実行される特殊処理は、ユーザーに対して透過的です。

81.3 DBMS_HS_PASSTHROUGHサブプログラムの要約

この表は、DBMS_HS_PASSTHROUGHサブプログラムを示し、簡単に説明しています。

表81-1 DBMS_HS_PASSTHROUGHパッケージのサブプログラム

サブプログラム 説明

BIND_INOUT_VARIABLEプロシージャ

IN OUTバインド変数をバインドします。

BIND_INOUT_VARIABLE_RAWプロシージャ

データ・タイプRAWIN OUTバインド変数をバインドします。

BIND_OUT_VARIABLEプロシージャ

OUT変数をPL/SQLプログラム変数にバインドします。

BIND_OUT_VARIABLE_RAWプロシージャ

データ・タイプRAWOUT変数をPL/SQLプログラム変数にバインドします。

BIND_VARIABLEプロシージャ

位置を基準にしてIN変数をPL/SQLプログラム変数にバインドします。

BIND_VARIABLE_RAWプロシージャ

RAWタイプのIN変数をバインドします。

CLOSE_CURSORプロシージャ

SQL文がOracle以外のシステムで実行された後は、カーソルをクローズして、関連メモリーを解放します。

EXECUTE_IMMEDIATEプロシージャ

バインド変数を使用せずに、(SELECT以外の)SQL文を即時実行します。

EXECUTE_NON_QUERYファンクション

(SELECT以外の)SQL文を実行します。

FETCH_ROWファンクション

問合せから行をフェッチします。

GET_VALUEプロシージャ

SELECT文から列値を取り出すか、またはOUTバインド・パラメータを取り出します。

GET_VALUE_RAWプロシージャ

GET_VALUEと同様ですが、データ・タイプRAWに使用します。

OPEN_CURSORファンクション

Oracle以外のシステムでパススルーSQL文を実行するためのカーソルをオープンします。

PARSEプロシージャ

Oracle以外のシステムでSQL文を解析します。

81.3.1 BIND_INOUT_VARIABLEプロシージャ

このプロシージャは、IN OUTバインド変数をバインドします。

構文

DBMS_HS_PASSTHROUGH.BIND_OUT_VARIABLE (
   c      IN  BINARY_INTEGER NOT NULL,
   p      IN  BINARY_INTEGER NULL,
   v      OUT <dty>,
   n      IN  VARCHAR2);

<dty>DATENUMBERまたはVARCHAR2のいずれかです。

参照:

RAWデータ・タイプのOUT変数のバインド方法については、「BIND_OUT_VARIABLE_RAWプロシージャ」を参照してください。

プラグマ

Purity level defined : WNDS, RNDS

パラメータ

表81-2 BIND_INOUT_VARIABLEプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数の位置。1から始まります。

v

この値は次の2つの目的で使用されます。

- SQL文が実行される前にINの値を設定します。

- OUT値のサイズを判別します。

n

(オプション)バインド変数名。

たとえば、SELECT * FROM emp WHERE ename=:enameでは、バインド変数:enameの位置は1、名前は:enameです。このパラメータは、Oracle以外のシステムで位置によるバインドではなく名前によるバインドがサポートされている場合に使用できます。この場合も位置を渡す必要があります。

例外

表81-3 BIND_INOUT_VARIABLEプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.2 BIND_INOUT_VARIABLE_RAWプロシージャ

このプロシージャは、データ・タイプRAWIN OUTバインド変数をバインドします。

構文

DBMS_HS_PASSTHROUGH.BIND_INOUT_VARIABLE_RAW (
   c      IN     BINARY_INTEGER NOT NULL,
   p      IN     BINARY_INTEGER NOT NULL,
   v      IN OUT RAW,
   n      IN     VARCHAR2);

プラグマ

Purity level defined : WNDS, RNDS 

パラメータ

表81-4 BIND_INOUT_VARIABLE_RAWプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数の位置。1から始まります。

v

この値は次の2つの目的で使用されます。

- SQL文が実行される前にINの値を設定します。

- OUT値のサイズを判別します。

n

(オプション)バインド変数名。

たとえば、SELECT * FROM emp WHERE ename=:enameでは、バインド変数:enameの位置は1、名前は:enameです。このパラメータは、Oracle以外のシステムで位置によるバインドではなく名前によるバインドがサポートされている場合に使用できます。この場合も位置を渡す必要があります。

例外

表81-5 BIND_INOUT_VARIABLE_RAWプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.3 BIND_OUT_VARIABLEプロシージャ

このプロシージャは、OUT変数をPL/SQLプログラム変数にバインドします。

構文

DBMS_HS_PASSTHROUGH.BIND_OUT_VARIABLE (
   c      IN  BINARY_INTEGER NOT NULL,
   p      IN  BINARY_INTEGER NULL,
   v      OUT <dty>,
   n      IN  VARCHAR2);

<dty>DATENUMBERまたはVARCHAR2のいずれかです。

参照:

RAWデータ・タイプのOUT変数のバインド方法については、「BIND_OUT_VARIABLE_RAWプロシージャ」を参照してください。

プラグマ

Purity level defined : WNDS, RNDS 

パラメータ

表81-6 BIND_OUT_VARIABLEプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数の位置。1から始まります。

v

OUTバインド変数がその値を格納する変数。パッケージは、変数のサイズのみ記憶しています。SQL文が実行された後、GET_VALUEを使用してOUTパラメータの値を取り出せます。取り出される値のサイズが、BIND_OUT_VARIABLEを使用して渡されたパラメータのサイズを超えないようにしてください。

n

(オプション)バインド変数名。

たとえば、SELECT * FROM emp WHERE ename=:enameでは、バインド変数:enameの位置は1、名前は:enameです。このパラメータは、Oracle以外のシステムで位置によるバインドではなく名前によるバインドがサポートされている場合に使用できます。この場合も位置を渡す必要があります。

例外

表81-7 BIND_OUT_VARIABLEプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.4 BIND_OUT_VARIABLE_RAWプロシージャ

このプロシージャは、データ・タイプRAWOUT変数をPL/SQLプログラム変数にバインドします。

構文

DBMS_HS_PASSTHROUGH.BIND_OUT_VARIABLE_RAW (
   c     IN  BINARY_INTEGER NOT NULL,
   p     IN  BINARY_INTEGER NOT NULL,
   v     OUT RAW,
   n     IN  VARCHAR2);

プラグマ

Purity level defined : WNDS, RNDS 

パラメータ

表81-8 BIND_OUT_VARIABLE_RAWプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数の位置。1から始まります。

v

OUTバインド変数がその値を格納する変数。パッケージは、変数のサイズのみ記憶しています。SQL文が実行された後、GET_VALUEを使用してOUTパラメータの値を取り出せます。取り出される値のサイズが、BIND_OUT_VARIABLE_RAWを使用して渡されたパラメータのサイズを超えないようにしてください。

n

(オプション)バインド変数名。

たとえば、SELECT * FROM emp WHERE ename=:enameでは、バインド変数:enameの位置は1、名前は:enameです。このパラメータは、Oracle以外のシステムで位置によるバインドではなく名前によるバインドがサポートされている場合に使用できます。この場合も位置を渡す必要があります。

例外

表81-9 BIND_OUT_VARIABLE_RAWプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.5 BIND_VARIABLEプロシージャ

このプロシージャは、位置を基準にしてIN変数をPL/SQLプログラム変数にバインドします。

構文

DBMS_HS_PASSTHROUGH.BIND_VARIABLE (
   c      IN BINARY_INTEGER NOT NULL,
   p      IN BINARY_INTEGER NOT NULL,
   v      IN <dty>,
   n      IN VARCHAR2);

<dty>DATENUMBERまたはVARCHAR2のいずれかです。

参照:

RAW変数をバインドするには、BIND_VARIABLE_RAWプロシージャを使用してください。

プラグマ

Purity level defined: WNDS, RNDS 

パラメータ

表81-10 BIND_VARIABLEプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数の位置。1から始まります。

v

バインド変数名に渡す必要がある値。

n

(オプション)バインド変数名。

たとえば、SELECT * FROM emp WHERE ename=:enameでは、バインド変数:enameの位置は1、名前は:enameです。このパラメータは、Oracle以外のシステムで位置によるバインドではなく名前によるバインドがサポートされている場合に使用できます。この場合も位置を渡す必要があります。

例外

表81-11 BIND_VARIABLEプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.6 BIND_VARIABLE_RAWプロシージャ

このプロシージャは、RAWタイプのIN変数をバインドします。

構文

DBMS_HS_PASSTHROUGH.BIND_VARIABLE_RAW (
   c    IN BINARY_INTEGER NOT NULL,
   p    IN BINARY_INTEGER NOT NULL,
   v    IN RAW,  
   n    IN VARCHAR2); 

プラグマ

Purity level defined : WNDS, RNDS 

パラメータ

表81-12 BIND_VARIABLE_RAWプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数の位置。1から始まります。

v

バインド変数に渡す必要がある値。

n

(オプション)バインド変数名。

たとえば、SELECT * FROM emp WHERE ename=:enameでは、バインド変数:enameの位置は1、名前は:enameです。このパラメータは、Oracle以外のシステムで位置によるバインドではなく名前によるバインドがサポートされている場合に使用できます。この場合も位置を渡す必要があります。

例外

表81-13 BIND_VARIABLE_RAWプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.7 CLOSE_CURSORプロシージャ

このファンクションは、SQL文がOracle以外のシステムで実行された後に、カーソルをクローズし、関連メモリーを解放します。カーソルがオープンされていない場合、操作は何も行われません。

構文

DBMS_HS_PASSTHROUGH.CLOSE_CURSOR (
   c IN BINARY_INTEGER NOT NULL);

プラグマ

Purity level defined : WNDS, RNDS

パラメータ

表81-14 CLOSE_CURSORプロシージャのパラメータ

パラメータ 説明

c

解放するカーソル

例外

表81-15 CLOSE_CURSORプロシージャの例外

例外 説明

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.8 EXECUTE_IMMEDIATEプロシージャ

このファンクションは、SQL文を即時実行します。有効なSQLコマンド(SELECTを除く)をすぐに実行できます。

文にバインド変数を含めることはできません。文は引数でVARCHAR2として渡されます。SQL文は、内部的には、OPEN_CURSORPARSEEXECUTE_NON_QUERYおよびCLOSE_CURSORPASSTHROUGH SQLプロトコル・シーケンスを使用して実行されます。

構文

DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE ( 
   s IN VARCHAR2 NOT NULL)  
RETURN BINARY_INTEGER; 

パラメータ

表81-16 EXECUTE_IMMEDIATEプロシージャのパラメータ

パラメータ 説明

s

即時実行対象の文を含むVARCHAR2変数

戻り値

SQL文の実行によって影響を受ける行数。

例外

表81-17 EXECUTE_IMMEDIATEプロシージャの例外

例外 説明

ORA-28551

SQL文が正しくありません。

ORA-28554

オープンしているカーソルが最大数に達しました。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.9 EXECUTE_NON_QUERYファンクション

このファンクションはSQL文を実行します。SQL文にSELECT文は使用できません。SQL文を実行する前に、カーソルをオープンし、SQL文を解析する必要があります。

構文

DBMS_HS_PASSTHROUGH.EXECUTE_NON_QUERY ( 
   c IN BINARY_INTEGER NOT NULL)
  RETURN BINARY_INTEGER;

パラメータ

表81-18 EXECUTE_NON_QUERYファンクションのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

戻り値

Oracle以外のシステムでSQL文によって影響を受ける行数。

例外

表81-19 EXECUTE_NON_QUERYファンクションの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.10 FETCH_ROWファンクション

このファンクションは、結果セットから行をフェッチします。

結果セットは、SQL SELECT文で定義されます。それ以上フェッチする行がなくなると、例外NO_DATA_FOUNDが発生します。行をフェッチする前に、カーソルをオープンし、SQL文を解析する必要があります。

構文

DBMS_HS_PASSTHROUGH.FETCH_ROW (
   c   IN BINARY_INTEGER NOT NULL,
   f   IN BOOLEAN)
  RETURN BINARY_INTEGER;

プラグマ

Purity level defined : WNDS 

パラメータ

表81-20 FETCH_ROWファンクションのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

first

(オプション)SELECT文を再実行します。有効な値は、次のとおりです。

- TRUE: SELECT文を再実行します。

- FALSE: 次の行をフェッチするか、または初めて実行する場合は、実行して行をフェッチします(デフォルト)。

戻り値

フェッチされた行数が戻されます。最終行がすでにフェッチされている場合は、0(ゼロ)が戻されます。

例外

表81-21 FETCH_ROWファンクションの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.11 GET_VALUEプロシージャ

このプロシージャには、2つの目的があります。すなわち、行がフェッチされた後にSELECT文の選択リスト項目を取得すること、およびSQL文が実行された後にOUTバインド値を取得することです。

構文

DBMS_HS_PASSTHROUGH.GET_VALUE (
   c      IN  BINARY_INTEGER NOT NULL,
   p    IN  BINARY_INTEGER NOT NULL,
   v    OUT <dty>);

<dty>DATENUMBERまたはVARCHAR2のいずれかです。

参照:

RAWデータ・タイプの値を取り出す方法については、「GET_VALUE_RAWプロシージャ」を参照してください。

プラグマ

Purity level defined : WNDS

パラメータ

表81-22 GET_VALUEプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数または選択リスト項目の位置。1から始まります。

v

OUTバインド変数または選択リスト項目がその値を格納する変数。

例外

表81-23 GET_VALUEプロシージャの例外

例外 説明

ORA-1403

最終行がフェッチされた後に、GET_VALUEを実行するとNO_DATA_FOUND例外が戻されます(FETCH_ROWによって0(ゼロ)が戻されます)。

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.12 GET_VALUE_RAWプロシージャ

このプロシージャはGET_VALUEと同様ですが、データ・タイプRAWに使用します。

構文

DBMS_HS_PASSTHROUGH.GET_VALUE_RAW (
   c    IN  BINARY_INTEGER NOT NULL,
   p    IN  BINARY_INTEGER NOT NULL,
   v    OUT RAW);

プラグマ

Purity level defined : WNDS 

パラメータ

表81-24 GET_VALUE_RAWプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。カーソルは、ルーチンOPEN_CURSORを使用してオープンし、PARSEを使用して解析する必要があります。

p

SQL文におけるバインド変数または選択リスト項目の位置。1から始まります。

v

OUTバインド変数または選択リスト項目がその値を格納する変数。

例外

表81-25 GET_VALUE_RAWプロシージャの例外

例外 説明

ORA-1403

最終行がフェッチされた後に、GET_VALUEを実行するとNO_DATA_FOUND例外が戻されます(FETCH_ROWによって0(ゼロ)が戻されます)。

ORA-28550

渡されたカーソルが無効です。

ORA-28552

プロシージャが正しい順序で実行されません。(最初にカーソルをオープンし、SQL文を解析する必要があります)。

ORA-28553

バインド変数の位置が有効範囲外です。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。

81.3.13 OPEN_CURSORファンクション

このファンクションは、Oracle以外のシステムでパススルーSQL文を実行するためのカーソルをオープンします。このファンクションは、すべてのタイプのSQL文に対してコールする必要があります。

後続のコールで使用する必要があるカーソルが戻されます。このコールによってメモリーが割り当てられます。関連付けられたメモリーの割当てを解除するには、プロシージャCLOSE_CURSORをコールします。

構文

DBMS_HS_PASSTHROUGH.OPEN_CURSOR 
  RETURN BINARY_INTEGER;

プラグマ

Purity level defined : WNDS, RNDS

戻り値

後続のプロシージャおよびファンクション・コールで使用されるカーソル。

例外

表81-26 OPEN_CURSORファンクションの例外

例外 説明

ORA-28554

カーソルの最大オープン数を超えました。異機種間サービスのOPEN_CURSORS初期化パラメータの値を増やしてください。

81.3.14 PARSEプロシージャ

このプロシージャは、Oracle以外のシステムでSQL文を解析します。

構文

DBMS_HS_PASSTHROUGH.PARSE (
   c       IN  BINARY_INTEGER NOT NULL,
   stmt    IN  VARCHAR2 NOT NULL);

プラグマ

Purity level defined : WNDS, RNDS

パラメータ

表81-27 PARSEプロシージャのパラメータ

パラメータ 説明

c

パススルーSQL文に関連付けられたカーソル。ファンクションOPEN_CURSORを使用してオープンする必要があります。

stmt

解析する文。

例外

表81-28 PARSEプロシージャの例外

例外 説明

ORA-28550

渡されたカーソルが無効です。

ORA-28551

SQL文が正しくありません。

ORA-28555

NOT NULLのパラメータにNULL値が渡されました。