2012-01-14 5 views
4

Мне нужно связать число с плавающей точкой с инструкцией OCI.php oci_bind_by_name float to numeric

Что я делаю:

$price = 0.1 
oci_bind_by_name($resource, 'price', $price); 

В моей Oracle DB «цена» является аргументом хранимой процедуры, и это тип NUMERIC.

После выполнения моего заявления я получаю следующее сообщение об ошибке:

Message: oci_execute() [function.oci-execute]: ORA-06502: PL/SQL: numeric or value error: character to number conversion error ORA-06512: at line 1

Если $ цены целое все работает отлично. В PHP docs http://lv.php.net/manual/en/function.oci-bind-by-name.php Я не нашел специальный тип для float для пятого параметра (int $ type = SQLT_CHR).

Ответ найденный: Я только что изменил десятичный символ в моей ОС от "," до "." и теперь все работает нормально

ответ

-1

Попытка: oci_bind_by_name($resource, 'price', $price, -1, SQLT_NUM); SQLT_NUM просто отсутствует в документации.

0

Если вы не можете изменить десятичный символ вашей ОС (или просто не хотите), единственным решением этой проблемы является отказ от параметров float. Вы должны ввести значение непосредственно в sql. Вы также должны знать, что для правильного десятичного разделителя используйте en_US как locale.

// Ensure that the period is used as decimal separator when converting float to string 
setlocale(LC_ALL, 'en_US'); 

// Generate SQL 
// ... 
$variables = array(); 
if(is_int($myValue)) 
{ 
    $sql .= ':MYVALUE'; 
    $variables[':MYVALUE'] = $myValue; 
} 
else if(is_float($myValue)) 
{ 
    $sql .= (string) $myValue; 
} 
// ... 

// Generate statement 
// $resource = oci_parse(...); 

// Bind parameters (if neccessary) 
if(count($variables) > 0) 
{ 
    foreach($variables as $name => &$variable) 
     oci_bind_by_name($resource, $name, $variable); 
}