Мне интересно, может ли oci_connect () вызвать ошибку 1438, потому что я получаю это все время:
Предупреждение: oci_connect () [function.oci-connect]: ORA-00604: ошибка на рекурсивном уровне SQL 1 ORA-01438: значение, превышающее указанную точность, разрешено для этого столбца ORA-06512: строка 8 в / xxxxxx / some. php в строке 220
- Настройка MySQL и Oracle Database Mac OS X
- Как вы указываете предложение IN в динамическом запросе с использованием переменной?
- установить и настроить OCI8 для подключения oracle к php
- Функции OCI8 не найдены при запуске apache с php5
- Вызов неопределенной функции oci_connect, php_oci8_12c.dll, windows 8.1, php5.6.6
Это не зависит от того, какая таблица запрашивается. Кажется, что oci_connect () вставляет некоторый элемент отслеживания в некоторую таблицу sys, или, возможно, триггер связан с входом в систему. Но у меня нет разрешения выяснить эту проблему в sys.
Любая идея, что может быть причиной этой ошибки?
Обновить
Оракул выполняет некоторую регистрацию где-то автоматически из коробки без настройки специально? Могу ли я каким-то образом сказать, что оракул или PHP показывают мне, какая таблица или столбец затронута?
Обновление. Я узнал, что, когда я вызываю PHP Script в Bash напрямую, он работает нормально. Но вызов из Интернета вызовет озаглавленную проблему. Есть идеи?
error occurred at recursive SQL level 1
сообщения error occurred at recursive SQL level 1
подсказывает мне, что ошибка возникает в триггере. Я предполагаю, что есть триггер AFTER LOGON ON SCHEMA
или DATABASE
, и по какой-то причине он вызывает ошибку при попытке подключения к веб-серверу.
Вот пример того, как генерировать ошибку, которую вы получаете. У меня есть таблица под названием TINY
с одним столбцом, который может принимать значения до 99:
SQL> desc tiny; Имя Null? Тип ----------------------------------------- -------- - --------------------------- N НОМЕР (2)
Теперь давайте создадим учетную запись пользователя и убедитесь, что они могут подключаться:
SQL> создать пользователя fred, идентифицированного разблокировкой учетной записи fred; Пользователь создан. SQL> предоставить подключение к fred; Грант преуспел. SQL> connect fred / fred Связанный.
Хорошо – давайте запишемся назад как я и создаем триггер, который вызовет ошибку, если FRED
попытается подключиться:
SQL> connect luke / password Связанный. SQL> создать или заменить триггер after_logon_error_if_fred 2 после входа в базу данных 3 начинается 4, если пользователь = 'FRED', тогда 5 вставить в крошечные (n) значения (100); 6 end if; 7 конец; 8 / Создан триггер.
Напомним, что наша таблица TINY
может хранить только до 99. Итак, что происходит, когда FRED
пытается подключиться?
SQL> connect fred / fred ОШИБКА: ORA-00604: ошибка на рекурсивном уровне SQL 1 ORA-01438: значение, превышающее указанную точность, разрешено для этого столбца ORA-06512: в строке 3
Помимо номера строки и добавленного бита PHP, это именно то сообщение, которое вы получили.
Если вы хотите увидеть, есть ли триггеры AFTER LOGON
в вашей базе данных, попробуйте запустить запрос
SELECT trigger_name, owner FROM all_triggers WHERE TRIM(triggering_event) = 'LOGON';
В моей базе данных (Oracle 11g XE beta) я получаю следующий вывод:
ВЛАДЕЛЬЦЫ TRIGGER_NAME ------------------------------ -------------------- ---------- AFTER_LOGON_ERROR_IF_FRED LUKE
Я не верю, что Oracle делает какие-либо изъяты из коробки, и я был бы удивлен, если и будет oci_connect
PHP.
Я могу только предположить, почему ошибка возникает только для вашего веб-сервера, а не при запуске PHP из сценария bash. Возможно, триггер запрашивает V$SESSION
и пытается выяснить, какая учетная запись пользователя пытается подключиться к базе данных?
Ну, в зависимости от столбца вы пытаетесь вставить число, которое больше разрешенных границ для numeric
столбца, или вы пытаетесь вставить строку в varchar2(n)
которого больше, чем n
символов. Вот более подробная информация о типах данных Oracle.
Без более конкретной информации о том, что вставляется в какой столбец в какой таблице в строке 220 some.php
, я не могу быть более прямой.