2012-10-25 13 views
5

Dla klauzuli SQL IN, jak poradzić sobie z nieznaną liczbą parametrów podczas wiązania SQL z PHP OCI8?PHP OCI8 bind (nieznana liczba) params dla instrukcji "IN"

Na przykład, biorąc pod uwagę następujące zapytanie

i tablica zmiennych związać

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

również ważne, aby pamiętać, że w mojej konkretnej sytuacji wejście array($bind_array) mogą lub nie mogą zawierać pod-tablica dla elementu wiążącego. To może równie dobrze być następujące

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

i

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

Czy można powiązać z IN w oci? Myślę, że w PDO nie można powiązać z IN – JvdBerg

Odpowiedz

2

Jednym ze sposobów jest wiązanie małej stałej liczby wartości w klauzula jak opisane w docs oci_bind_by_name. Istnieje również rozwiązanie do wiązania wielu warunków za pomocą zmiennej liczby wartości.

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

?> 
Powiązane problemy