ociでsqlに値バインドする
概要
PHPのOCI APIを使って、OracleのDBに接続する時の話
バインドとは
sqlの可変な部分の値をバインドという形で結びつけてあげる事で、DB側は、一部の値が以前実行したsqlと異なっていても、同じsqlだと判断してくれます。
これによって、実行回数の多いsqlに対しては、bindで可変部分を挿入してあげると、実行速度の向上が期待できます。
PHPの変数をバインドする
例えば以下のようにWHERE句のidの値をバインドする場合、
SELECT
*
FROM
hoge_table
WHERE
id = 100
;
下のように書いてあげると、バインドしてくれます。
$sql = "
SELECT
*
FROM
hoge_table
WHERE
id = :id
";
$id = 200;
$conn = oci_connect('user', 'pass', 'tns');
$statementId = oci_parse($this->conn, $sql);
oci_bind_by_name($statementId, :id, $id); // バインド
oci_execute($statementId); //実行
/**
SELECT * FROM hoge_table WHERE id = 200; というクエリが実行されます。
*/
PHPの配列の値をバインドする
次に配列の値をバインドする時の方法をご紹介します。
$sql = "
SELECT
*
FROM
hoge_table
WHERE
id in (:ids)
";
$ids = array(0, 1, 2, 3, 4)
$conn = oci_connect('user', 'pass', 'tns');
$statementId = oci_parse($this->conn, $sql);
$ociCollection = oci_new_collection($conn, 'ODCINUMBERLIST', 'SYS');
foreach ($ids as $id) {
$ociCollection->append($id);
}
oci_bind_by_name($statementId, ':ids', $ociCollection, -1, SQLT_INT);
oci_execute($statementId);
/**
SELECT * FROM hoge_table WHERE id in (0, 1, 2, 3, 4); というクエリが実行されます。
*/
配列の場合は、oci_new_collection
という配列に一度移し替えてあげる事によって実現します。
また、18行目のoci_bind_by_name
の、第五引数のSQLT_INT
ですが、バインドしたい値の型によって変える必要があります。例えば、バインドする変数をVARCHARとして認識させたければ、SQLT_CHR
に設定してあげる必要があります。
参考