oci_bind_by_name() для переменных Оракл типа DATE

Ireruss

Новичок
Запрос к БД: просуммировать данные за интервал времени (данные почасовки).
Хотел сделать парсинг , а потом в цикле биндить интервалы времени и выполнять, биндить и выполнять..., т.е. парсинг один раз, а выполнять столько сколько интервалов.
Если написать запрос так:
$q= "select sum(V) as VS
from
(SELECT distinct trunc(dt,'hh') as H, VALUE as V
FROM schem.table
WHERE DT BETWEEN TO_DATE:)tbegin,'DD-MM-YYYY HH24:MI:SS') AND
TO_DATE:)tend,'DD-MM-YYYY HH24:MI:SS'))";

,то после (перед этим, естественно, парсим $stmt = oci_parse($c,$q);) :

oci_bind_by_name($stmt,":tbegin",$tb);
oci_bind_by_name($stmt,":tend",$te);

- получим в запросе дату без одиночных кавычек, как я понимаю.
Примерно так:
select sum(V) as VS
from
(SELECT distinct trunc(dt,'hh') as H, VALUE as V
FROM schem.table
WHERE DT BETWEEN TO_DATE(01-01-2011 01:00:00,'DD-MM-YYYY HH24:MI:SS') AND
TO_DATE(01-02-2011 00:59:59,'DD-MM-YYYY HH24:MI:SS'))
На это Оракл, естественно, негодует, упрекая меня в неправильном типе данных.

Но если поставить злополучные кавычки в запрос:
$q= "select sum(V) as VS
from
(SELECT distinct trunc(dt,'hh') as H, VALUE as V
FROM schem.table
WHERE DT BETWEEN TO_DATE(':tbegin','DD-MM-YYYY HH24:MI:SS') AND
TO_DATE(':tend','DD-MM-YYYY HH24:MI:SS'))";

То выскакиивает предупреждение:
Warning: oci_bind_by_name() [function.oci-bind-by-name]: ORA-01036: illegal variable name/number in script.php on line 94
Что в переводе на русский значит: "оракл не нашел переменную ( имя другое у переменной)".
Насколько я понимаю, в кавычках переменная становится невидима для Оракла (и РНР?).

В php.ini:
; - magic_quotes_gpc = Off
(закомментировано)
Пробовал и
magic_quotes_gpc = Off

Можно ли как-то побороть это недоразумение, или "забить" - тупо формировать строку запроса с уже подставленными зачениями даты и на каждой итерации парсить запрос?
 

tony2001

TeaM PHPClub
>получим в запросе дату без одиночных кавычек, как я понимаю.
нет, бинд - это не тупо подстановка строки, всё немного сложнее.
кавычек там не надо.

>01-01-2011 01:00:00
не вижу нигде кода, который бы делал эту дату.
по всей видимости, проблема именно в нём.

http://ru2.php.net/manual/en/function.oci-bind-by-name.php#72290 - тут аналогичный пример кода.
 

iceman

говнокодер
> - получим в запросе дату без одиночных кавычек, как я понимаю.

не правильно понимаешь, читаем мануал http://ru2.php.net/oci_bind_by_name описание к параметру type, по умолчанию у тебя varchar,

а саму bind :tbegin - воспринимай как переменную.

Установи PL/SQL Developer и открой test window, там отлаживай.

$q= "select sum(V) as VS
from
(SELECT distinct trunc(dt,'hh') as H, VALUE as V
FROM schem.table
WHERE DT BETWEEN TO_DATE:)tbegin,'DD-MM-YYYY HH24:MI:SS') AND
TO_DATE:)tend,'DD-MM-YYYY HH24:MI:SS'))";
Ошибку в студию!

VALUE - у тебя точно числовое значение?
DT - точно дата?

код создания таблицы тоже в студию.
 
Сверху