Цитата:
Сообщение от
fed
А ты, я полагаю, хочешь включить Case Insensitive collation в самом оракле и работать с ним так, как аксапта с SQL Server работает.
К слову, как минимум в трешке такая возможность была (как выясняется

): не знаю, интересно ли это кому на фоне разговоров про AX 2012, но в ядре трешки обнаружились как-то хинты, которые позволяют отключить использование SUBSTR() и NLS_LOWER() при работе с оракловой базой. После этого остается только перебить NLS_SORT в ktd-шниках на binary_ci, как было описано
здесь, - и готово

Правда, в промышленной эксплуатации эта идея мной не опробовалась. Так вот, по поводу хинтов: для эксперимента я тогда использовал нижеприведенный запрос в Х++ и игрался на лету хинтами для текущей сессии с помощью SqlSystem::databasehints().
X++:
select firstonly forceliterals RecId
from salesTable
where salesTable.SalesId == 'ЗаКаЗ012345'
join RecId
from salesLine
where salesLine.SalesId == salesTable.SalesId;
Если использовать в коде forceplaceholders, то ядро не будет создавать новые запросы при изменении хинтов, а будет гнать один и тот же запрос, созданный в первый раз – это на случай, если повторять эксперимент. Вот хинты и запросы, которые при них получаются:
0x000000A7 – хинты для Оракла по умолчанию
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A,SALESLINE B
WHERE ((SUBSTR(NLS_LOWER(A.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (SUBSTR(NLS_LOWER(A.SALESID),1,20)=NLS_LOWER(' ЗаКаЗ012345')))
AND ((SUBSTR(NLS_LOWER(B.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (SUBSTR(NLS_LOWER(B.SALESID),1,20)=SUBSTR(NLS_LOWER(A.SALESID),1,20)))
0x00000000 – отключено всё
PHP код:
SELECT A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A,SALESLINE B
WHERE ((SUBSTR(NLS_LOWER(A.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (SUBSTR(NLS_LOWER(A.SALESID),1,20)=NLS_LOWER(' ЗаКаЗ012345')))
AND ((SUBSTR(NLS_LOWER(B.DATAAREAID),1,3)=NLS_LOWER('dat'))
AND (SUBSTR(NLS_LOWER(B.SALESID),1,20)=SUBSTR(NLS_LOWER(A.SALESID),1,20)))
0x00004000 – 14-й бит
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A,SALESLINE B
WHERE ((A.DATAAREAID=NLS_LOWER('dat'))
AND (A.SALESID=NLS_LOWER(' ЗаКаЗ012345')))
AND ((B.DATAAREAID=NLS_LOWER('dat'))
AND (B.SALESID=A.SALESID))
0x00008000 – 15-й бит
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A,SALESLINE B
WHERE ((A.DATAAREAID='dat')
AND (A.SALESID=' ЗаКаЗ012345'))
AND ((B.DATAAREAID='dat')
AND (B.SALESID=A.SALESID))
0x0000C000 – 14-й + 15-й
PHP код:
SELECT /*+ USE_NL(A) USE_NL(B) */A.RECID,A.RECVERSION,B.RECID,B.RECVERSION
FROM SALESTABLE A,SALESLINE B
WHERE ((A.DATAAREAID='dat')
AND (A.SALESID=' ЗаКаЗ012345'))
AND ((B.DATAAREAID='dat')
AND (B.SALESID=A.SALESID))
Если с хинтом 32768 (0x8000) пересоздать индексы, то они тоже создаются "как положено" без всяких там функций от строковых полей.