6

SQL IN 句の場合、SQL を PHP OCI8 にバインドするときに不明な数のパラメーターを処理するにはどうすればよいですか?

たとえば、次のクエリがあるとします。

select * from table1
where id > :id_1
and id in (:id_array_of_unknown_size)

およびバインドする変数の配列

$bind_array = array(
    ':id_1' => '1',
    ': id_array_of_unknown_size' => array('7','2','5',),
);

array($bind_array)また、私の特定の状況では、入力にバインド要素のサブ配列が含まれる場合と含まれない場合があることに注意することも重要です。次のようにすることもできます

select * from table1
where id > :id_1
and id !=  :id_2

$bind_array = array(
    ':id_1' => '1',
    ':id_2' => '5',
);
4

2 に答える 2

4

1 つの方法は、 oci_bind_by_nameのドキュメントで説明されているように、IN 句で少数の固定数の値をバインドすることです。複数の条件を可変数の値にバインドするソリューションもあります。

<?php
$ids = array(
    103,
    104
);

$conn         = oci_pconnect($user, $pass, $tns);
// Using ORACLE table() function to get the ids from the subquery
$sql          = 'SELECT * FROM employees WHERE employee_id IN (SELECT column_value FROM table(:ids))';
$stmt         = oci_parse($conn, $sql);
// Create collection of numbers. Build in type for strings is ODCIVARCHAR2LIST, but you can also create own types.
$idCollection = oci_new_collection($conn, 'ODCINUMBERLIST', 'SYS');

// Maximum length of collections of type ODCINUMBERLIST is 32767, maybe you should check that!
foreach ($ids as $id) {
    $idCollection->append($id);
}

oci_bind_by_name($stmt, ':ids', $idCollection, -1, SQLT_NTY);
oci_execute($stmt, OCI_DEFAULT);
oci_fetch_all($stmt, $return);
oci_free_statement($stmt);

oci_close($conn);

?>
于 2016-08-24T12:58:47.107 に答える
0

別の関数で配列をバインドする必要があります - oci_bind_array_by_name

http://php.net/manual/en/function.oci-bind-array-by-name .

:variable を oci_bind_by_name http://php.net/manual/en/function.oci-bind-by-name.phpで配列オブジェクトに置き換えることはできません

于 2012-11-23T13:00:16.680 に答える