Отладка ошибки Oracle, которая происходит только с PHP / OCI - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть запрос, рассчитанный на общее количество часов, и я присваиваю значение в зависимости от состава тех часов, которые написаны для базы данных Oracle.

Запрос работает нормально в Navicat и Toad, и все же я получаю следующую ошибку при выполнении запроса с использованием OCI / PHP:

ORA-00972: идентификатор слишком длинный

Я понимаю, что означает это сообщение, но ни один из моих идентификаторов не превышает 30 символов. На случай, если я наложил псевдонимы на имена таблиц, и это не имеет значения.

Мой код выглядит следующим образом:

$query ="SELECT
   SUM( ROUND((A.SCHED_DATE_TO - A.SCHED_DATE_FROM)* 24, 1 )),
   SUM( CASE WHEN A.ACTION_TYPE_CODE = 'INSV' THEN ROUND((A.SCHED_DATE_TO-A.SCHED_DATE_FROM)* 24, 1)*30 ELSE 42.50 END)
FROM
   WAREHOUSE.DM_DIM_ACTION \"A\",
   WAREHOUSE.DM_FCT_ACTION \"C\", 
   WAREHOUSE.DM_DIM_TECHNICIAN \"B\"
WHERE
   A.SHUB_ID = C.SHUB_ID
   AND C.FK_TECHNICIAN_WID = B.ROW_WID
   AND A.SITE_VISIT_YN = 'Y'
   AND A.ACTION_TYPE_CODE IN('INSV', 'SURV')
   AND A.STATUS_CODE IN('FDSP', 'DISP', 'ASSN')
   AND A.ASSIGNED_CONTRACTOR_CODE = 'NOCO'
   AND TRUNC( A.SCHED_DATE_FROM )= '20-Sep-11'
   AND B.CELL = 'C04'";

   $stid = oci_parse($conn, $sql); if (!$stid) { echo oci_error($conn); $e = oci_error($conn); print htmlentities($e['message']); }
   $r = oci_execute($stid, OCI_DEFAULT); if (!$r) { $e = oci_error($stid); echo htmlentities($e['message']); }
   $planned = oci_fetch_array($stid, OCI_RETURN_NULLS);

Что я делаю неправильно, и есть ли какие-либо методы / инструменты, которые я могу использовать для дальнейшей диагностики подобных проблем в будущем?

EDIT: Согласно комментариям, я попытался удалить более крупные поля и упростить запрос, чтобы попытаться сузить проблему. Следующий запрос также предоставляет ту же ошибку, при этом наибольшее имя поля удаляется.

SELECT
   SUM( ROUND((A.SCHED_DATE_TO - A.SCHED_DATE_FROM)* 24, 1 )),
   SUM( CASE WHEN A.ACTION_TYPE_CODE = 'INSV' THEN ROUND((A.SCHED_DATE_TO-A.SCHED_DATE_FROM)* 24, 1)*30 ELSE 42.50 END)
FROM
   WAREHOUSE.DM_DIM_ACTION "A"
WHERE
   AND A.SITE_VISIT_YN = 'Y'
   AND TRUNC( A.SCHED_DATE_FROM )= '20-Sep-11'

1 Ответ

0 голосов
/ 21 сентября 2011

Проблема была не в формировании SQL, а в передаче функции OCI_parse неправильной строки запроса.

Если вы изучите код в вопросе, вы заметите, что я пытаюсь передать $sql, а не переменную $query, которую я только что определил.

Вы никогда не будете слишком осторожны с несколькими запросами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...