Во-первых, мои знания об Oracle очень ограничены.
Я унаследовал большой проект Delphi с использованием Oracle, он был обновлен до Oracle 11g. И теперь у меня проблемы с вызовом хранимых процедур с параметрами IN и OUT:
Начнем с SP (находится в пакете)
PROCEDURE GetAccessObjects(AAccessObjects OUT CURSOR_TYPE);
и определение CURSOR_TYPE
TYPE CURSOR_TYPE IS REF CURSOR;
Затем код Delphi:
procedure TDBApi.GetAccessObjects(var ResultSet: TADOStoredProc);
var
SP: TDbStoredProc;
begin
SP := CreateStoredProc(SQLPackage + 'GetAccessObjects');
try
SP.MaxRecords := mrAll;
SP.Open;
ResultSet := SP;
except
SP.Free;
raise;
end;
end;
При выполнении кода Delphi он отлично работает!
Затем я создал GetAccessObjects2 и добавил в интерфейс параметр IN:
PROCEDURE GetAccessObjects2(ALotteryID IN INT, AAccessObjects OUT CURSOR_TYPE);
ALotteryID ни для чего не используется внутри SP, это просто фиктивный параметрер!
Затем я вызываю его из Delphi:
procedure TDBApi.GetAccessObjects2(var ResultSet: TADOStoredProc);
var
SP: TDbStoredProc;
begin
SP := CreateStoredProc(SQLPackage + 'GetAccessObjects2');
try
ParamAdd(SP.Parameters, 'ALOTTERYID', 1, ftInteger, pdInput, -1);
SP.MaxRecords := mrAll;
SP.Open;
ResultSet := SP;
except
SP.Free;
raise;
end;
end;
И я получаю сообщение об ошибке:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'GETACCESSOBJECTS2'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
Код Delphi работает около 10 лет, поэтому в базе данных должно быть какое-то отличие! Либо из-за обновления, либо из-за.
Вкратце: для справки требовался вызов GetAccessObjects2 из заданного кода Delphi.
Я предоставляю ALotteryID, но не предоставляю AAccessObjects
Конечно! моя ошибка.
В своем последнем вопросе вы сказали, что собираетесь поговорить с Oracle об использовании SP как функции. Что они ответили?
Ооо, я совсем забыл об этом. Я завтра спрошу.
Я должен сказать, что, глядя на веб-сайт Oracle, вы, похоже, злоупотребляете хранимыми процедурами. Чтобы избежать противоречий и двусмысленностей и просто с точки зрения ясности, если бы я хотел использовать сохраненную функцию, я бы определил ее как ФУНКЦИЮ (которую поддерживает Oracle), а не как ПРОЦЕДУРУ с параметром вне. Под капотом они могут быть эквивалентны сегодня, но это не значит, что они будут завтра ...
@Dsm можешь показать мне пример
Возможно, вам также потребуется включить параметр в курсор, поскольку теперь вы предоставляете параметр ALotterID. Если вы уже объявляете курсор в методе CreateStoredProc (мы не видим ваш код !!), вам необходимо удалить его и объявить после параметра ALotteryId. Или измените объявление вашей процедуры так, чтобы ваш курсор был первым, а ALotteryID - после
К сожалению, у меня не установлен Oracle, и я использовал его много лет назад, поэтому я не могу тестировать. Я предлагаю вам просмотреть веб-руководство по хранимым процедурам и функциям и представить себе, как вы решите проблему самостоятельно, а не просто принимаете чужой код. Попробуйте сами на простой тестовой процедуре / функции. Так вы научитесь работать с Oracle и сможете лучше поддерживать этот код.





ALotteryID по-прежнему является параметром, и вам все равно нужно указать его, даже если он игнорируется в рамках процедуры.