MLE JavaScriptドライバを使用したデータの選択

直接フェッチまたはResultSetオブジェクトを使用してデータを選択できます。

出力形式としては配列とオブジェクトのどちらかを選択できます。デフォルトでは、JavaScriptオブジェクトを使用してデータが直接フェッチで戻されます。

トピック

直接フェッチ: 配列

直接フェッチは、MLE JavaScriptドライバのデフォルトです。

直接フェッチでは、問合せ結果がresult.rowsで提供されます。outFormatoracledb.OUT_FORMAT_ARRAYとして指定した場合、これは多次元JavaScript配列です。行の反復処理では、select文内の位置に基づいて列にアクセスできます。select文内の列の順序を変更するには、出力の解析の変更が必要です。これにより、検出が困難なバグが発生する可能性があるため、MLE JavaScript SQLドライバは、配列ではなく、デフォルトでオブジェクト(oracledb.OUT_FORMAT_OBJECT)を戻します。

例7-3に、同期実行モデルを使用した直接フェッチを示します。

例7-3 直接フェッチを使用したデータの選択: 配列

CREATE OR REPLACE PROCEDURE dir_fetch_arr_proc
AS MLE LANGUAGE JAVASCRIPT
{{
const result = session.execute(
    `SELECT
        department_id,
        department_name
    FROM
        hr.departments
    FETCH FIRST 5 ROWS ONLY`,
    [],
    {
        outFormat: oracledb.OUT_FORMAT_ARRAY
    }
);
for (let row of result.rows) {
    const deptID = String(row[0]).padStart(3, '0');
    const deptName = row[1];
    console.log(`department ID: ${deptID} - department name: ${deptName}`);
}
}};
/

BEGIN 
    dir_fetch_arr_proc;
END;
/

結果:

department ID: 010 - department name: Administration
department ID: 020 - department name: Marketing
department ID: 030 - department name: Purchasing
department ID: 040 - department name: Human Resources
department ID: 050 - department name: Shipping

execute()ファンクションは、resultオブジェクトを戻します。文のタイプ(select、insert、deleteなど)に応じて、さらに処理するために様々なプロパティを使用できます。

mle-js-oracledbの詳細は、サーバー側JavaScript APIのドキュメントを参照してください。

直接フェッチ: オブジェクト

直接フェッチを使用すると、デフォルトでJavaScriptオブジェクトが戻されます。

selectリスト内の列の順序に関する潜在的な問題に対処するために、結果は配列ではなくJavaScriptオブジェクトとして戻されます。

例7-4 直接フェッチを使用したデータの選択: オブジェクト

CREATE OR REPLACE PROCEDURE dir_fetch_obj_proc
AS MLE LANGUAGE JAVASCRIPT 
{{
const result = session.execute(
    `SELECT
        department_id,
        department_name
    FROM
        hr.departments
    FETCH FIRST 5 ROWS ONLY`,
    [],
    { outFormat: oracledb.OUT_FORMAT_OBJECT }
);

for (let row of result.rows) {
    const deptID = String(row.DEPARTMENT_ID).padStart(3, '0');
    const deptName = row.DEPARTMENT_NAME;
    console.log(`department ID: ${deptID} - department name: ${deptName}`);
}
}};
/

BEGIN
    dir_fetch_obj_proc();
END;
/

結果:

department ID: 010 - department name: Administration
department ID: 020 - department name: Marketing
department ID: 030 - department name: Purchasing
department ID: 040 - department name: Human Resources
department ID: 050 - department name: Shipping

PL/SQLとは異なり、JavaScriptでは名前付きパラメータという概念がサポートされていません。execute()メソッドは、SQL文、bindParamsおよびオプションをそのとおりの順序で受け入れます。問合せではバインド変数が使用されないため、空の配列はファンクションのシグネチャと一致します。

関連項目:

mle-js-oracledb組込みモジュールの詳細は、サーバー側JavaScript APIのドキュメントを参照してください

ResultSetとしての行のフェッチ: 配列

直接フェッチを使用するかわりに、ResultSetオブジェクトを使用できます。

直接フェッチの使用に加えて、ResultSetオブジェクトを使用することもできます。オプション・プロパティresultSetがtrueに設定されている場合、ResultSetが作成されます。ResultSetの行は、getRow()またはgetRows()を使用してフェッチできます。

デフォルトでは行は配列ではなくJavaScriptオブジェクトとしてフェッチされるため、行をResultSetとしてフェッチするには、outFormatoracledb.OUT_FORMAT_ARRAYとして定義する必要があります。

例7-5 ResultSetを使用した行のフェッチ

CREATE OR REPLACE PROCEDURE dir_fetch_rs_arr_proc
AS MLE LANGUAGE JAVASCRIPT
{{
const result = session.execute(
    `SELECT
        department_id,
        department_name
    FROM
        hr.departments
    FETCH FIRST 5 ROWS ONLY`,
    [],
    {
        resultSet: true,
        outFormat: oracledb.OUT_FORMAT_ARRAY
    }
);

const rs = result.resultSet;
let row;
while ((row = rs.getRow())){
    const deptID = String(row[0]).padStart(3, '0');
    const deptName = row[1];
    console.log(`department ID: ${deptID} - department name: ${deptName}`);
}
rs.close();
}};
/

フェッチ操作では、オブジェクトではなく配列が明確にリクエストされたことに注意してください。デフォルトではオブジェクトが戻されます。

EXEC dir_fetch_rs_arr_proc();

結果:

department ID: 010 - department name: Administration
department ID: 020 - department name: Marketing
department ID: 030 - department name: Purchasing
department ID: 040 - department name: Human Resources
department ID: 050 - department name: Shipping

ResultSetとしての行のフェッチ: ResultSetオブジェクトの反復処理

ResultSet.getRow()およびResultSet.getRows()ファンクションに加えて、MLE JavaScriptドライバのResultSetは、ResultSetを反復処理するプロセスを簡略化するiterableプロトコルとiteratorプロトコルを実装します。

iterableプロトコルまたはiteratorプロトコルを使用できます。どちらも、ResultSetの操作を大幅に簡略化します。iterableオプションを例7-6に示します。

ノート:

ResultSetオブジェクトが不要になったら、クローズする必要があります。

例7-6 ResultSetでのiterableプロトコルの使用

この例では、ResultSet.getRow()のかわりにiterableプロトコルを使用する方法を示します。列の値の配列を提供するのではなく、かわりにJavaScriptオブジェクトが戻されます。

CREATE OR REPLACE PROCEDURE rs_iterable_proc
AS MLE LANGUAGE JAVASCRIPT
{{
const result = session.execute(
    `SELECT
        department_id,
        department_name
    FROM
        hr.departments
    FETCH FIRST 5 ROWS ONLY`,
    [],
    {
        resultSet: true
    }
);
const rs = result.resultSet;
for (let row of rs){
    const deptID = String(row.DEPARTMENT_ID).padStart(3, '0');
    const deptName = row.DEPARTMENT_NAME;
    console.log(`department ID: ${deptID} - department name: ${deptName}`);
}
rs.close();
}};
/

BEGIN
    rs_iterable_proc();
END;
/

結果:

department ID: 010 - department name: Administration
department ID: 020 - department name: Marketing
department ID: 030 - department name: Purchasing
department ID: 040 - department name: Human Resources
department ID: 050 - department name: Shipping