Массив хостов SQLCA.SQLERRD в Pro*C

Как мы знаем, во многих документах упоминается, что 3-й элемент массива Host SQLCA.SQLERRD, т. е. sqlca.sqlerrd[2], содержит совокупное количество строк, обработанных оператором SQL до сих пор (в терминах Pro * C).

Кто-нибудь знает о значении других элементов, то есть [0], [1], и что они означают?


person AnBisw    schedule 03.10.2012    source источник


Ответы (2)


Согласно документации по обработке ошибок, они не ничего не делать; они зарезервированы для использования в будущем, хотя маловероятно, что они когда-либо будут использованы. sqlerrd объявлен как long[6], но, по-видимому, используются только [2] и [4], причем последний является смещением в операторе SQL для ошибки синтаксического анализа.

Интересно, что они не используют [0], [1] или [3]; интересно, использовались ли они для чего-то еще в более ранней версии. Этот старый ссылка informix имеет аналогичную структуру с похожими значениями для [2] и [4], поэтому может дать подсказку о том, для чего они ожидали использовать другие; а может и бессмысленное совпадение...

Похоже, PostgreSQL имеет ту же структуру, что и DB2 и SQL Server имеет нечто похожее. Это начинает подозрительно походить на стандарт... хотя Oracle придерживается его лишь частично.

person Alex Poole    schedule 03.10.2012
comment
В некоторых старых документах я вижу, что они ссылаются на sqlerrd[3] как на количество обработанных записей вместо sqlerrd[2]. Также любопытно, почему [6] почему не больше или меньше? - person AnBisw; 04.10.2012
comment
Я помню информацию в URL-адресе IBM в углу моей головы, но теперь документация по обработке ошибок сбила меня с толку. Теперь это похоже на массив, в котором используются только 2 элемента: не [0] и [1], а [2] и [4]. - person AnBisw; 04.10.2012
comment
@Annjawn - это в документах Oracle? Я видел ссылки на него как примерное количество строк после синтаксического анализа, а ссылка Informix намекает на что-то подобное, но я не думаю, что когда-либо видел это в чем-то конкретно связанном с Oracle. Было бы интересно увидеть это, если вы можете дать ссылку на это. - person Alex Poole; 04.10.2012
comment
Да, вроде бы так - шесть элементов, а используются только два. Я не знаю навскидку (но могу проверить завтра, если вспомню), всегда ли другие равны нулю, неинициализированы или могут содержать информацию, которая просто не документирована. - person Alex Poole; 04.10.2012
comment
Честно говоря, я не помню, где я видел информацию, и это было одной из причин, почему я задал этот вопрос. Но я покопаюсь еще немного, чтобы посмотреть, смогу ли я найти какие-либо старые ссылки. - person AnBisw; 04.10.2012

Из «Informix Guide to SQL» (февраль 1998 г.):

(«Первый», «Второй» и т. д., потому что не все языки индексируют массивы, начинающиеся с 0.)

Первый — после успешного выполнения оператора PREPARE для оператора SELECT, UPDATE, INSERT или DELETE или после открытия курсора выбора это поле содержит предполагаемое количество затронутых строк.

Второй — когда SQLCODE содержит код ошибки, это поле содержит либо ноль, либо дополнительный код ошибки, называемый кодом ошибки ISAM, объясняющий причину основной ошибки. После успешной операции вставки одной строки это поле содержит значение любого значения SERIAL, сгенерированного для этой строки.

Третий — после успешной операции вставки, обновления или удаления нескольких строк это поле содержит количество обработанных строк. После операции вставки, обновления или удаления нескольких строк, завершившейся ошибкой, это поле содержит количество строк, которые были успешно обработаны до обнаружения ошибки.

Четвертое — после успешного выполнения оператора PREPARE для оператора SELECT, UPDATE, INSERT или DELETE или после открытия курсора выбора это поле содержит расчетную взвешенную сумму обращений к диску и общее количество обработанных строк.

Пятое — после синтаксической ошибки в операторе PREPARE, EXECUTE IMMEDIATE, DECLARE или статическом SQL это поле содержит смещение в тексте оператора, где была обнаружена ошибка.

Шестое — после успешного извлечения выбранной строки или успешной операции вставки, обновления или удаления это поле содержит идентификатор строки (физический адрес) последней обработанной строки. Соответствует ли это значение rowid строке, которую сервер базы данных возвращает пользователю, зависит от того, как сервер базы данных обрабатывает запрос, особенно для операторов SELECT.

person Menachem    schedule 04.12.2013
comment
Вопрос касается Oracle, но этот ответ, похоже, касается IBM Informix. Есть ли связь между ними, которая сделала бы этот ответ актуальным? - person Burhan Ali; 05.12.2013
comment
Извините, не заметил ваш тег [Oracle]. Но если SQLCA является стандартной (или полустандартной), вполне вероятно, что вы найдете аналогичные функции во всех реализациях баз данных. И нет, это не от IBM Informix; он принадлежит Informix до его выкупа IBM. - person Menachem; 10.12.2013