Как я могу вызвать функцию Oracle из Delphi? - PullRequest
7 голосов
/ 26 февраля 2011

Я создал функцию в Oracle, которая вставляет записи в определенные таблицы и возвращает выходные данные в соответствии с тем, что происходит внутри функции. например (номер возврата ins_rec)

Как мне вызвать эту функцию и увидеть ее вывод в Delphi?

Я получил ответ (со всем моим спасибо) за SQL плюс, но мне нужно знать, как я могу сделать это в Delphi

Ответы [ 3 ]

6 голосов
/ 26 февраля 2011

Просто передайте пользовательскую функцию в качестве имени столбца в запросе, и она будет работать.

Пример:

Var
  RetValue: Integer;
begin
  Query1.Clear;
  Query1.Sql.Text := 'Select MyFunction(Param1) FunRetValue from dual';
  Query1.Open;

  if not Query1.Eof then
  begin
    RetValue := Query1.FieldByName('FunRetValue').AsInteger;
  end;
end;
5 голосов
/ 26 февраля 2011

Как это сделать, может зависеть от того, какую библиотеку доступа к БД вы используете (BDE? DbExpress? ADO? Другие), некоторые могут предлагать компонент "хранимой процедуры", который также может работать с функциями.

Общий подход к использованию анонимного блока PL / SQL для вызова функции (и параметра для чтения возвращаемого значения), PL / SQL во многом напоминает Паскаль ...:

Qry.SQL.Clear;
Qry.SQL.Add('BEGIN');
Qry.SQL.Add('  :Rez := ins_rec;');
Qry.SQL.Add('END;');
// Set the parameter type here...
...
Qry.ExecSQL;
...
ReturnValue :=  Qry.ParamByName('Rez').Value;

Я бы не использовал функцию, но хранимую процедуру со значением OUT. Более того, Oracle предлагает пакеты , которые являются очень хорошим способом организации процедур и функций, и они также предлагают полезные функции, такие как переменные сеанса и секции инициализации / финализации ... очень похожие на модуль Delphi.

0 голосов
/ 28 февраля 2011

мы запускаем хранимую процедуру Oracle, используя этот код, который использует BDE (я знаю, пожалуйста, не используйте bash, потому что мы использовали BDE!)

Try
  DMod.Database1.Connected:= False;
  DMod.Database1.Connected:= True;
  with DMod.StoredProc1 do
  begin
    Active:= False;

    ParamByName('V_CASE_IN').AsString:= Trim(strCaseNum);
    ParamByName('V_WARRANT_IN').AsString:= strWarrantNum;
    ParamByName('V_METRO_COMMENTS').AsString:= strComment;

    Prepare;
    ExecProc;

    Result:= ParamByName('Result').AsString;
  end;
Except
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...