バッチ操作
connection.execute()ファンクションをコールすることに加えて、connection.executeMany()を使用してバッチ操作を実行することもできます。
connection.executeMany()を使用することはconnection.execute()を複数回コールすることと似ていますが、必要な作業が少なくなります。これは、複数の行を挿入または更新するときなど、バッチ変更を処理するための効率的な方法です。connection.executeMany()メソッドを問合せに使用することはできません。
connection.execute()には、SQL文で処理する変数を含む配列が必要です。例7-11のbindData配列には、SQL文で定義されたバインド変数ごとに1つずつ、複数のJavaScriptオブジェクトが含まれます。forループによって、それらのオブジェクトが構成され、bindData配列に追加されます。
バッチ操作に渡される値に加えて、MLE JavaScript SQLドライバは値のデータ型を把握する必要があります。この情報は、connection.executeMany()のオプション・パラメータでbindDefsプロパティとして渡されます。例7-11の古い姓と新しい姓はどちらも、日付として定義されたchangeDateを持つ文字列です。
connection.execute()ファンクションと同様に、connection.executeMany()はrowsAffectedプロパティを戻すため、バッチ処理された行の数を簡単に識別できます。
例7-11 バッチ操作の実行
この例では古い姓と新しい姓を監査表に挿入して例7-9を拡張しています。
CREATE OR REPLACE PROCEDURE ret_into_audit_ex_proc(
"firstEmpID" NUMBER,
"lastEmpID" NUMBER
)
AS MLE LANGUAGE JAVASCRIPT
{{
if (firstEmpID === null || lastEmpID === null){
throw new Error(
`must provide deptName and sal to ret_into_audit_ex_proc()`
);
}
let result = session.execute(
`UPDATE
hr.employees
SET
last_name = upper(last_name)
WHERE
employee_id between :firstEmpID and :lastEmpID
RETURNING
old last_name,
new last_name
INTO
:oldLastName,
:newLastName`,
{
firstEmpID: {
dir: oracledb.BIND_IN,
val: firstEmpID,
type: oracledb.NUMBER
},
lastEmpID: {
dir: oracledb.BIND_IN,
val: lastEmpID,
type: oracledb.NUMBER
},
oldLastName: {
type: oracledb.STRING,
dir: oracledb.BIND_OUT
};
newLastName: {
type: oracledb.STRING,
dir: oracledb.BIND_OUT
}
}
);
if (result.rowsAffected > 1){
// store the old data and new values in an audit table
let bindData = [];
const changeDate = new Date();
for (let i = 0; i < result.outBinds.oldLastName.length, i++){
bindDate.push(
{
oldLastName: result.outBinds.oldLastName[i],
newLastName: result.outBinds.newLastName[i],
changeDate: changeDate
}
);
}
// use executeMany() with the newly populated array
result = session.executeMany(
`insert into EMPLOYEES_AUDIT_OPERATIONS(
old_last_name,
new_last_name,
change_date
) values (
:oldLastName,
:newLastName,
:changeDate
)`,
bindData,
{
bindDefs: {
oldLastName: {type: oracledb.STRING, maxSize: 30},
newLastName: {type: oracledb.STRING, maxSize: 30},
changeDate: {type: oracledb.DATE}
}
}
);
} else {
throw new Error(
`found no row to update in range ${firstEmpID} to ${lastEmpID}`
);
}
}};
/
初期更新文が完了すると、データベースは、更新の影響を受けたlast_name列の古い値と新しい値をresultオブジェクトのoutBindsプロパティで提供します。oldLastNameとnewLastNameはどちらも配列です。配列の長さは、更新された行の数を表します。
親トピック: バインド変数