Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача массива записей Делфи в процедуру Oracle 
:(
    Опции темы
AleksandraN
Дата 30.6.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 11.8.2009
Где: Пермь

Репутация: нет
Всего: нет



Доброго времени суток!
Проблема такая:
есть пользовательская процедура Oracle.
Код

  FUNCTION ARRAY_CONFIRM
  ( p_mlt_id  cls.mlt_id%TYPE
    , p_clf_id  cls.clf_id%TYPE
    , p_cls_id  cls.cls_id%TYPE
    , p_dvs_id_m t_number2 := t_number2()
    , p_dvs_id_d t_number1 := t_number1()
    , p_vsn_id_m t_varchar2 := t_varchar2()
    , p_vsn_id_d t_varchar2 := t_varchar2()
  ) RETURN varchar2

тут t_number1, t_number2, t_varchar2 - коллекции
t_number1 просто массив чисел, t_varchar2 массив строк - их у меня хорошо получается передавать из делфи в оракл

проблемы возникли при передачи t_number2
Код

t_number2 - table of t_number;

TYPE t_number is OBJECT
  ( num1    NUMBER(8)
  , num2    NUMBER(8)
  )


Пытаюсь делать так:
Код

procedure TfrmDvsView.CallFunctionConfirm;
var
  iDvsM, iDvsD, iVsn, i    : integer;
  pDvsIdMain, pDvsIdDepend : TOracleObject;
  pVsnIdMain, pVsnIdDepend : TOracleObject;
  num1, num2 : Integer;
  Result                   : String;
  Qur                      : TOracleQuery;
  SQLText                  : string;
  IOValue                  : Variant;
begin

  iDvsM      := tvwDementionHorizontal.Items.Count;
  pDvsIdMain := TOracleObject.Create(DM.DB, 't_number2', '');
  For i := 0 to iDvsM -1 do begin
    pDvsIdMain.AddElement;
// пробовала так
    pDvsIdMain.SetAttr('num1', SGN_ID_TYPE(tvwDementionHorizontal.Items[i].Data).sgn_id);
    pDvsIdMain.SetAttr('num2', SGN_ID_TYPE(tvwDementionHorizontal.Items[i].Data).dvs_id);
// и так 
    pDvsIdMain.ObjAttr('num1').Elements[i] := SGN_ID_TYPE(tvwDementionHorizontal.Items[i].Data).sgn_id;
    pDvsIdMain.ObjAttr('num2').Elements[i] := SGN_ID_TYPE(tvwDementionHorizontal.Items[i].Data).dvs_id;
  end;

  iDvsD        := tvwDementionVertical.Items.Count;
  pDvsIdDepend := TOracleObject.Create(DM.DB, 't_number1', '');
  For i := 0 to iDvsD -1 do begin
    pDvsIdDepend.AddElement;
    pDvsIdDepend.Elements[i] := SGN_ID_TYPE(tvwDementionVertical.Items[i].Data).dvs_id;
  end;

  iVsn          := Length(BodyGrid);
  pVsnIdMain    := TOracleObject.Create(DM.DB, 't_varchar2', '');
  pVsnIdDepend  := TOracleObject.Create(DM.DB, 't_varchar2', '');
  For i := 0 to iVsn-1 do begin
    pVsnIdMain.AddElement;
    pVsnIdDepend.AddElement;
    pVsnIdMain.Elements[i]   := BodyGrid[i].VsnRow;
    pVsnIdDepend.Elements[i] := BodyGrid[i].VsnCol;
  end;

  try
   try
    Qur := TOracleQuery.Create(nil);
    Qur.Session:= DM.DB;
    Qur.DeclareVariable('function_result', otString);
    
    Qur.DeclareVariable('p_mlt_id'  , otInteger);
    Qur.SetVariable    ('p_mlt_id'  , p_mlt_id);
    Qur.DeclareVariable('p_clf_id'  , otInteger);
    Qur.SetVariable    ('p_clf_id'  , p_clf_id);
    Qur.DeclareVariable('p_cls_id'  , otInteger );
    Qur.SetVariable    ('p_cls_id'  , p_cls_id);

    Qur.DeclareVariable('p_dvs_id_m', otObject);
    Qur.SetComplexVariable('p_dvs_id_m', pDvsIdMain);

    Qur.DeclareVariable('p_dvs_id_d', otObject);
    Qur.SetComplexVariable('p_dvs_id_d', pDvsIdDepend);

    Qur.DeclareVariable('p_vsn_id_m', otObject);
    Qur.SetComplexVariable('p_vsn_id_m', pVsnIdMain);

    Qur.DeclareVariable('p_vsn_id_d', otObject);
    Qur.SetComplexVariable('p_vsn_id_d', pVsnIdDepend);

    SQLTEXT :=
      'begin' +
        ' :function_result := "AP_EXP_SYSTEM"."ARRAY_CONFIRM"(     p_mlt_id => :p_mlt_id'+
                                                                ', p_clf_id => :p_clf_id'+
                                                                ', p_cls_id => :p_cls_id'+
                                                                ', p_dvs_id_m => :p_dvs_id_m'+
                                                                ', p_dvs_id_d => :p_dvs_id_d'+
                                                                ', p_vsn_id_m => :p_vsn_id_m'+
                                                                ', p_vsn_id_d => :p_vsn_id_d'+
                                                                 ');'+
      ' end;';

    Qur.SQL.Text := SQLTEXT;
    Qur.Execute;
    Result := Qur.GetVariable('function_result');
    Qur.Free;
   except
     on E: Exception do  begin
       SQLText := string(E.Message);
       DM.DB.Rollback;
       Exit;
     end;
   end;
   finally
   end;


В общем, подскажите, как правильно передавать подобные структуры. Заранее спасибо

Добавлено через 3 минуты и 11 секунд
использую DOA
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.