У меня есть база данных Oracle и вам нужно вставить строку с датой в формате YYYY-MM-DD HH: MM: SS в поле метки времени Oracle. Для этого я написал этот код:
$date = '2013-01-01 10:10:10'; $sql = oci_parse($c,"INSERT INTO MY_TABLE (ID, SEND_DATE) VALUES (MY_SEQ.nextval, TO_TIMESTAMP(:send_date, 'YYYY-MM-DD HH24:MI:SS'))"); oci_bind_by_name($sql, ':send_date', $date, null, SQLT_CHR); oci_execute($sql);
Таблица выглядит так:
CREATE TABLE "MY_TABLE" ( "ID" NUMBER NOT NULL ENABLE, "SEND_DATE" TIMESTAMP (0) NOT NULL ENABLE );
Если я выполню запрос выше, я получаю эту ошибку:
ORA-01461: может связывать значение LONG только для вставки в столбцы LONG
Уже есть много вопросов относительно ORA-01461 о переполнении стека, но я не смог найти решение этой проблемы. Я действительно не могу понять, где находится это созвездие, в которое входит LONG.
Из ( http://www.php.net/manual/en/function.oci-bind-by-name.php#92334 ):
Иногда вы получаете сообщение об ошибке «ORA-01461: может привязывать значение LONG только для вставки в столбцы LONG». Эта ошибка сильно вводит в заблуждение, особенно если у вас нет LONG-столбцов или значений LONG.
Из моего тестирования кажется, что эта ошибка может быть вызвана, когда значение связанной переменной превышает выделенную длину.
Чтобы избежать этой ошибки, убедитесь, что вы указываете длины при привязке varchars, например
<?php oci_bind_by_name($stmt,':string',$string, 256); ?>
И для чисел используйте длину по умолчанию (-1), но скажите оракуле его целое число, например
<?php oci_bind_by_name($stmt,':num',$num, -1, SQLT_INT); ?>