LoginSignup
3
3

More than 3 years have passed since last update.

OCIでSQLに変数のバインドをする

Posted at

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に設定してあげる必要があります。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3