OraStoredProc parameters default value

Discussion of open issues, suggestions and bugs regarding ODAC (Oracle Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
Xerby
Posts: 1
Joined: Thu 10 Jan 2019 22:12

OraStoredProc parameters default value

Post by Xerby » Thu 10 Jan 2019 22:52

Добрый день. Подскажите, как в TOraStoredProc можно не задавать параметры у которых есть default значение. В ODAC 9.0 и более ранних можно было удалять параметры, чтобы они получили значение по умолчанию. ODAC 10.3.8 в той же ситуации вызывает оракловую ошибку ORA-01008: not all variables bound.
Delphi XE3, Oracle 11.2.0.4

Есть процедура.

Code: Select all

CREATE OR REPLACE FUNCTION TEST.GetSeven (a integer default 7) 
    RETURN INTEGER
IS
BEGIN
    RETURN a; 
END;
Как мне выполнить её из Делфи, чтобы она вернула 7? В старых версиях ODAC это было возможно, для этого надо было удалить параметры (если не удалять, то они становятся не default, а null).


Делфи код

Code: Select all

function ExecOraProc (procName:String; Param:variant):variant;
var
  Proc:TOraStoredProc;
  j:Integer;
  parCnt:Integer;
begin
  if Param<>null then parcnt:=1 else parcnt:=0;
  Proc:=TOraStoredProc.Create(nil);
  Proc.Options.DefaultValues:=True;
  try
    Proc.StoredProcName:=procname;
    Proc.Prepare;
    j:=0;

    if (Proc.ParamCount>0) and (Proc.Params[0].name='RESULT') then j:=1;
    if Proc.ParamCount>=parcnt+j then
      while Proc.ParamCount>parcnt+j do Proc.Params.Delete(parcnt+j);

    if (Proc.ParamCount>j) and (param<>null)
      then Proc.Params[j].Value:=Param;

    Proc.ExecProc;
    if Proc.Params.FindParam('Result')<>nil
      then result:=Proc.ParamByName('Result').value
      else result:=varNull;
  finally
    Proc.Free;
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(ExecOraProc('Test.GetSeven', null)));
end;

MaximG
Devart Team
Posts: 1822
Joined: Mon 06 Jul 2015 11:34

Re: OraStoredProc parameters default value

Post by MaximG » Thu 17 Jan 2019 11:27

Please, ask questions in Russian on our Russian-language forum: ru/viewforum.php?f=27
To implement the behavior you described with helo of the latest ODAC version, you can try the following approach:

Code: Select all

  ...
  Proc.StoredProcName := 'GETSEVEN';
  Proc.Prepare;
  Proc.SQL.Text := 'begin :RESULT := GETSEVEN; end;';
  Proc.Execute;
  Result := Proc.ParamByName('RESULT').Value;
   ...

Post Reply