Показать сообщение отдельно
Старый 22.12.2008, 16:51   #22  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Цитата:
Сообщение от DSPIC Посмотреть сообщение
2 ZVV: можно взглянуть на код?
Проверил сам - получилось не более 476 критериев.
+ Проверил, тема обсуждалась (Поиск на форуме по "476" или "477")
+ см. вложение
Я проверял вот это:
Цитата:
Сообщение от DSPIC
Может прозвучит нелогично, но помнится, когда я с этим экспериментировал, получалось ограничение именно на количество рэнджей, а не на длину в 250 символов. При этом было не важно, сколько самих рэнджей на одно поле наложить:
(2x125 или 1x250) - если в сумме получалась магическая цифра немногим больше 250 то запрос не проходил...
Это не верно, можно это проверить без всякого кода, сформировав в фильтре ручками пару-тройку рэнджей на одно поле, длиной по 250 символов каждый и убедиться что он работает. Проверив уходящий запрос на сторону БД, естественно.

А обсуждаемая магическая цифра 476 (например тут соединить query и временную таблицу) - это уже ограничение несколько другого рода. И не на кол-во ренджей, как могло бы показаться, а на размер SQL-оператора, насколько я понимаю.
Очевидно, ваш пример проверялся на сиквеле, где, помнится размер оператора максимальный 32К (могу ошибаться)? Ну вот оно где-то так и выходит, по моим прикидкам.
На оракле это ограничение выше - 64К (для 9-ой версии, например). (Причём из документации по 10-ке и 11-ке данное ограничение вообще исчезло почему-то) Соответсвенно данный пример может отрабатывать с гораздо большим значением
У меня например успешно отрабатывает такой джоб на оракле:
X++:
static void Job_QueryRangeLimit(Args _args)
{
    Query       query;
    QueryRun    queryRun;

    QueryBuildDataSource    qbds;
    QueryBuildRange         qbr;

    int         nextI;
    ;

    query = new Query();

    qbds = query.addDataSource(tablenum(InventTable));

    for (nextI = 1; nextI <= 1200 ; nextI++)
    {
        qbr = qbds.addRange(fieldNum(InventTable, ItemId));
        qbr.value(queryValue(int2str(nextI)));
    }


    queryRun = new QueryRun(query);
    queryRun.next();
}
при дальнейшем увеличении этого кол-ва начинает падать соединение Аксапта с Ораклом
Цитата:
ORA-00600: internal error code, arguments: [733], [36332372], [pga heap], [], [], [], [], []
Точную цифру падения не искал, т.к. не интересно, не очень важно, лень и к тому же она может варьировать в зависимости от некоторых факторов.

Кстати, даже в этом случае (1200), размер SQL-оператора уходящего в БД превышает задекларированные 64к, но работает.

Тестировал на 3.0сп3кр3 + Оракл 9208Вин
__________________
Zhirenkov Vitaly