Доброго времени суток! Проблема такая: есть пользовательская процедура 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
|