Настраивая механизм поиска дублей в проекте на Terrasoft 3.X, работающем на базе Oracle, для таблицы контактов получал ошибку при попытке объединить дубли. При автоматической генерации хранимых процедур для объединения дублей возникло несоответствие порядка двух полей в таблице, что и привело к проблемам. В сгенерированной серверной логике они были в одном порядке, а на стороне клиентского приложения они перебирались в другом. Поля назывались, для примера, Com1 и Communication.
При этом ошибка воспроизводилась, если поиск дублей настраивали из клиента Terrasoft на одном компьютере и не воспроизводилась, если настраивали на другом. К сожалению или к счастью, первым компьютером был мой.
Как оказалось, причина возникновения проблемы была в этом фрагменте хранимой процедуры:
SELECT column_name,
data_type,
data_precision,
data_scale,
char_length,
char_used
FROM all_tab_columns
WHERE table_name = 'tbl_Contact'
AND owner = SYS_CONTEXT ('USERENV', 'CURRENT_SCHEMA')
ORDER BY column_name;
На первый взгляд безобидная строка
сортирует различно в зависимости от локали на компьютере, откуда запускаем TSClient или Toad!
На моём ПК, если посмотреть:
SELECT * FROM nls_session_parameters;
Получим:
Цитата:
NLS_LANGUAGE RUSSIAN
NLS_TERRITORY RUSSIA
NLS_CURRENCY р.
NLS_ISO_CURRENCY RUSSIA
NLS_NUMERIC_CHARACTERS ,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD.MM.RR
NLS_DATE_LANGUAGE RUSSIAN
NLS_SORT RUSSIAN
NLS_TIME_FORMAT HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT DD.MM.RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD.MM.RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY р.
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
Вот из-за чего проблема! Надо использовать вместо RUSSIAN режим сортировки BINARY, где цифры расположены впереди латинских букв. А в RUSSIAN – позади. И в хранимке для объединения дублей передаются поля таблицы не в том порядке, что в ядре программы-клиента. Использование функции NLSSORT принудительно сортирует нужным образом.
Проблемная строка была заменена на:
ORDER BY NLSSORT(column_name, 'NLS_SORT=BINARY');
Модификации подверглись tsp_GenerateSearchSP, tsp_GenerateLiveSearchSP, tsp_GenerateDuplicateSearch, и tsp_GenerateDuplicateMerge. В новых версиях Terrasoft 3.X изменение внесено, остальным рекомендую исправить самостоятельно.