問合せでは、非問合せとは異なり、SELECT
文から結果セットが取得されます。結果セットは、カーソルの使用により取得されます。
図3-2に、パススルーSQL問合せのステップを示します。システムでSELECT
文が解析された後、FETCH_ROW
プロシージャで結果セットの各行を取得できます。行が取得された後、GET_VALUE
プロシージャを使用してSELECT構文のリスト項目をプログラム変数に取り出します。すべての行が取得された後に、カーソルをクローズできます。
すべての行を取得する必要はありません。カーソルのオープン後は、いつでもカーソルをクローズできます。
注意:
取得するのは一度に1行ですが、異機種間サービスでは、複数行をバッファに入れて1回のラウンドトリップでOracle以外のデータ・システムからフェッチすることで、Oracle DatabaseとOracle以外のシステム間のラウンドトリップが最適化されます。
次の例では、問合せが実行されます。
DECLARE val VARCHAR2(100); c INTEGER; nr INTEGER; BEGIN c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@salesdb; DBMS_HS_PASSTHROUGH.PARSE@salesdb(c, 'select ENAME from EMP where DEPTNO=10'); LOOP nr := DBMS_HS_PASSTHROUGH.FETCH_ROW@salesdb(c); EXIT WHEN nr = 0; DBMS_HS_PASSTHROUGH.GET_VALUE@salesdb(c, 1, val); DBMS_OUTPUT.PUT_LINE(val); END LOOP; DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@salesdb(c); END;
SELECT
文の解析後は、FETCH_ROW
ファンクションが0
(ゼロ)を戻すまで、ループ内で行がフェッチされて出力されます。