MLE JavaScriptドライバを使用したデータの選択
ResultSet
オブジェクトを使用してデータを選択できます。
出力形式としては配列とオブジェクトのどちらかを選択できます。デフォルトでは、JavaScriptオブジェクトを使用してデータが直接フェッチで戻されます。
トピック
- 直接フェッチ: 配列
直接フェッチは、MLE JavaScriptドライバのデフォルトです。 - 直接フェッチ: オブジェクト
直接フェッチを使用すると、デフォルトでJavaScriptオブジェクトが戻されます。 - ResultSetとしての行のフェッチ: 配列
直接フェッチを使用するかわりに、ResultSet
オブジェクトを使用できます。 - ResultSetとしての行のフェッチ: ResultSetオブジェクトの反復処理
ResultSet.getRow()
およびResultSet.getRows()
ファンクションに加えて、MLE JavaScriptドライバのResultSet
は、ResultSet
を反復処理するプロセスを簡略化するiterableプロトコルとiteratorプロトコルを実装します。
直接フェッチ: 配列
直接フェッチでは、問合せ結果がresult.rows
で提供されます。outFormat
をoracledb.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のドキュメントを参照してください。
直接フェッチ: オブジェクト
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
としてフェッチするには、outFormat
をoracledb.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