14.04.2009, 14:47 | #1 |
Участник
|
ORA-01480 в фильтрах
Описание проблемы :
Ax3.0 KR3 База ORACLE Если фильтруем таблицу по полю, например так : X++: static void Job492(Args _args) { // пример сделан для стандартной длины поля LedgerJournalTable.JournalNum - 10 символов // выравнивание роли не играет LedgerJournalTable LedgerJournalTable; ; select LedgerJournalTable where LedgerJournalTable.JournalNum like "012_456789" + "*" // будет ошибка ORA-01480 // LedgerJournalTable.JournalNum like "012_45678" + "*" // будет ошибка ORA-01480 // LedgerJournalTable.JournalNum like "012_4567" + "*" // все нормально // LedgerJournalTable.JournalNum like "012_4567" + "**" // будет ошибка ORA-01480 // LedgerJournalTable.JournalNum like "*" + "012_4567" + "*" // будет ошибка ORA-01480 // LedgerJournalTable.JournalNum like "0123456789" + "*" // все нормально // LedgerJournalTable.JournalNum like "012345678" + "*" // все нормально ; info("Ок"); } Ошибка происходит когда выполнено 4 условия 1. Используется like (не важно статический запрос или range с * в Query) 2. В фильтре использован символ _ 3. Длина строки + число символов "_" в строке больше длины поля в БД (11 и 12 символов для нашего примера) 4. Запрос на БД идет с параметрами. (т.е. использованы placeholders) Судя по всему аксапта при формировании запроса к БД посредство интерфейса OCI использует строки оканчивающиеся нулем. http://www.sey.ru/~basile/ociProgGuide/oci03typ.htm Цитата:
....
STRING The null-terminated STRING format behaves like the VARCHAR2 format (datatype code 1), except that the string must contain a null terminator character. This datatype is most useful for C language programs. Input The string length supplied in the OCIBindByName() or OCIBindByPos() call limits the scan for the null terminator. If the null terminator is not found within the length specified, Oracle issues the error ORA-01480: trailing null missing from STR bind value .... Символ "_" является служебным для БД и поэтому чтобы корректно выполнить запрос с условие like на оракл уходит в качестве параметр значение '012\_45678%' а не 012_45678% т.е. длина строки параметра неожиданно увеличивается, и становится больше заявленной, что приводит к ошибке ORA-01480. Кто как обходит такие глюки ? Неприятно то что может вылезти на безобидных запросах - например пользователь ищет нужный ему журнал (а автоматически настраиваемые номерные серии часто содержат символ "_" ) Можно везде навтыкать литералов для обхода указанного глюка, но хочется более изящное решение. Последний раз редактировалось Logger; 14.04.2009 в 15:28. Причина: Уточнение |
|
|
За это сообщение автора поблагодарили: dn (1). |
15.04.2009, 15:27 | #2 |
Участник
|
Кто-нибудь может проверить багу в последних версиях Аксапты на Оракле ? Например, в ax2009.
|
|
16.04.2009, 11:53 | #3 |
MCITP
|
Цитата:
3.0 sp3 kr3 9i & 10g - воспроизводится 4.0 sp2 10g - не воспроизводится 2009 sp1 10g - не воспроизводится
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: dn (1), Logger (5). |
Теги |
like, oracle, баг, ядро, ax3.0 |
|
Похожие темы | ||||
Тема | Ответов | |||
Ошибка ORA-01406 | 9 | |||
Ошибка синхронизации | 4 | |||
Axapta & Oracle 9 | 13 | |||
"On MSSQL" or "On Oracle" | 5 |
|