2012-10-25 10 views
5

SQL IN句では、PHP OCI8でSQLをバインドする際に、未知数のパラメータをどのように処理しますか?また、入力array($bind_array)または私の特定の状況であることに注意することが重要含まれていない場合があり、そのPHP OCI8 'IN'ステートメントのバインド数が不明です

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

をバインドするために、次のクエリ

と変数の配列を指定して、例えば

、バインド要素のサブ配列oci_bind_array_by_name

http://php.net/manual/en/function.oci-bind-array-by-name - それはちょうどだけでなく、あなたが別の機能を持つ配列をバインドする必要があり

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

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

ociでINにバインドできますか? PDOではINにバインドできないと思います – JvdBerg

答えて

2

によってoci_bind_by_nameのドキュメントに記述のようにIN句の値の小さな固定数の結合された1つの方法。また、可変数の値で複数の条件をバインドするソリューションもあります。

<?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); 

?> 
関連する問題