Есть ли ограничение на количество параметров в TStoredProc?

Есть ли ограничения на количество параметров или общий размер параметров в вызове TStoredProc ExecProc?

В настоящее время работает система, которая все еще использует BDE для подключения к Oracle, и недавнее изменение количества параметров в процедуре пакета привело к нарушениям прав доступа. Количество параметров теперь достигает 291, и AV создается в вызове ExecProc для TStoredProc.

Если мы удалим один параметр из списка (любой параметр, не обязательно определенный параметр), вызов ExecProc будет работать нормально.

Я выполнил отладку кода, и нарушение прав доступа было вызвано процедурой TStoredProc.BindParams в DBTables.pas. У меня настроено несколько часов, один из которых — SizeOf(FRecordBuffer), и когда я выполняю эту процедуру, значение равно 65535. Это MaxWord (Windows.pas). Я не вижу каких-либо ограничений в коде DBTables.

Стек вызовов представляет собой TStoredProd.ExecProc -> TStoredProc.CreateCursor -> TStoredProc.GetCursor -> TStoredProc.BindParams, и нарушение прав доступа вызывается в цикле for, который перебирает FParams.

Заранее спасибо, нам нужно найти что-то точное, чтобы держаться подальше.


person Mike Howard    schedule 27.07.2012    source источник
comment
Woohoo, у вас есть 291 параметр в хранимой процедуре? Вам не чего не хватает :-)?   -  person TLama    schedule 27.07.2012
comment
Да, я не писал эту вещь, но мы должны ее поддерживать. (›_‹)   -  person Mike Howard    schedule 27.07.2012
comment
Я не вижу каких-либо установленных ограничений в коде DBTables › В DBTables используются различные 'Word'ы, такие как 'FRecordSize'/'FRecBufSize'... Разработчики могли просто подумать, что «Word» должно быть достаточно для частей дизайна.   -  person Sertac Akyuz    schedule 28.07.2012


Ответы (1)


Я совсем не разбираюсь в Oracle SQL, но, поскольку вы поддерживаете эту вещь, я хотел бы посмотреть, смогу ли я изменить вызов со всеми этими параметрами на одну вставку в новую выделенную таблицу (с таким количеством столбцов плюс автонумерация первичный ключ) и измените хранимую процедуру, чтобы она принимала этот ключ в качестве входных данных и вызывала значения из этой новой записи для выполнения своей работы. Это может быть немного быстрее, чем выяснить максимальное количество параметров и попытаться найти там исправление. (Хотя это немного странное число, так как оно не является степенью двойки, вполне может быть 291...)

person Stijn Sanders    schedule 27.07.2012
comment
и автовызов SP из триггера после вставки :-D - person Arioch 'The; 30.07.2012