php oci_bind_by_name плавать в числовой - PullRequest
4 голосов
/ 14 января 2012

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

Что я делаю:

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

В моей базе данных Oracle 'цена' является аргументом хранимой процедуры иэто тип NUMERIC.

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

Сообщение: oci_execute () [function.oci-execute]: ORA-06502: PL/ SQL: ошибка числа или значения: ошибка преобразования символа в число ORA-06512: в строке 1

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

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

Ответы [ 2 ]

0 голосов
/ 09 августа 2017

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

// 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);
}
0 голосов
/ 24 июня 2015

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

...