Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Передача массива Оракловской процедуре


Автор: AleksandraN 23.11.2009, 12:51
Каким образом можно передать массив оракловской процедуре( функции)?
Делаю по образцу...в образце работает, у меня нет...
Код

procedure TfrmTabVarFillValue.btnOKClick(Sender: TObject);
var

  Str : TPLSQLTable;
  packApTESTest: TApTESTest;
  AOwner : TComponent;

begin
  AOwner:= nil;
  packApTESTest:= TApTESTest.Create(AOwner);
  packApTESTest.Name:= 'packApTESTest';
  packApTESTest.Session:= DM.DB;

  packApTESTest.Test_1(Str);

  Close;
end;



- это процедура, описанная в отдельном юните:
Код

function TApTESTest.Test_1( Str: TPLSQLTable): integer;
begin
  Str := TPLSQLTable.Create(DefaultPLSQLTableSize, 0);
  try
    GetQuery;
    OCPQuery.DeclareVariable('function_result', otFloat);
    OCPQuery.DeclareVariable('param1', otFloat);
    OCPQuery.DimPLSQLTable('param1', Str.TableSize, Str.StringSize);
    OCPQuery.SQL.Add('begin');
    OCPQuery.SQL.Add(' :function_result := "TEST_TEST"."Test_1"(');
    OCPQuery.SQL.Add('    param1 => :param1);');
    OCPQuery.SQL.Add('end;');
    OCPQuery.Execute;
    Result := ConvertVariant(OCPQuery.GetVariable('function_result'));
  except
    Str.Free;
    raise;
  end;
end;




Заранее, большое спасибо)

Автор: AleksandraN 23.11.2009, 13:07
да,  использую DOA.

Автор: AleksandraN 24.11.2009, 11:43
Что? Никто с подобным не сталкивался? 
Почитала документацию DOA , но что-то понятней от этого не стало...буду очень признательна, если кто-нибудь все-таки откликнется!

Автор: AleksandraN 24.11.2009, 16:00
Если кому-то интересно, то конечный вариант таков:

Код

procedure TfrmTabVarFillValue.btnOKClick(Sender: TObject);
var

  Table        : Variant;
  packApTESTest: TApTESTest;
  AOwner       : TComponent;
  i, j         : Integer;
  t            : TOracleQuery;
begin
  AOwner := nil;
  t := TOracleQuery.Create(AOwner);
  t.Session:= DM.DB;
  t.DeclareVariable('function_result', otFloat);
  t.DeclareVariable('param1', otFloat);
  t.SQL.Add('begin');
  t.SQL.Add(' :function_result := TEST_TEST.DVsHistParam(');
  t.SQL.Add('    param1 => :param1);');
  t.SQL.Add('end;');

  DeclareVariable('param1', otFloat);
  DimPLSQLTable('param1', 100, 0);
  j := Length(GridDataValue);
  If j > 0 then begin
     Table := VarArrayCreate([0, j-1], varVariant);
      For i := 0 to j-1 do
        Table[i] := GridDataValue[i].SGN_ID
  end
  else Table := VarArrayCreate([0, j], varVariant);
  t.SetVariable('param1', Table);
  t.Execute;

end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)