Page 1 of 1

Working with user defined types

Posted: Wed 31 Oct 2012 12:21
by dados
Hi, I have a question regarding user defined types.
Here is an example with a standard Oracle defined type:

create table test (location SDO_GEOMETRY)

insert into test values(SDO_GEOMETRY(1,6, SDO_POINT_TYPE(10,15,30), SDO_ELEM_INFO_ARRAY(350), SDO_ORDINATE_ARRAY(2000)))

commit

select location from test


dbForge return this result:
MDSYS.SDO_GEOMETRY(1, 6, MDSYS.SDO_POINT_TYPE(10, 15, 30), MDSYS.SDO_ELEM_INFO_ARRAY(350), MDSYS.SDO_ORDINATE_ARRAY(2000))

SQLPLUS returns this result:
SDO_GEOMETRY(1, 6, SDO_POINT_TYPE(10, 15, 30), SDO_ELEM_INFO_ARRAY(350), SDO_ORDINATE_ARRAY(2000))

SQL Developer returns this result:
MDSYS.SDO_GEOMETRY(1,6,MDSYS.SDO_POINT_TYPE(10,15,30),MDSYS.SDO_ELEM_INFO_ARRAY(350),MDSYS.SDO_ORDINATE_ARRAY(2000))

TOraQuery returns this result (.AsString)
(1; 6; (10; 15; 30) ; (350; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ) ; (2000; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ) )


Is there another way of getting the result value other that .AsString? I would like to be able to get the value more like the other samples (other than TOraQuery) do.
FieldType is fkData and DataType is ftADT

Reg,
Arni Thor

Re: Working with user defined types

Posted: Fri 02 Nov 2012 10:08
by AlexP
hello,

Thank you for the information, we will review the possibility to change data display from such fields when using the AsString method in one of the next versions.

Re: Working with user defined types

Posted: Tue 11 Dec 2012 12:39
by AlexP
Hello,

For the time being, you can generate a string yourself by looking over all elements of the SDO_GEOMETRY type, e.g.:

Code: Select all

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Ora,
  OraObjects;

var
  OraSession: TOraSession;
  OraQuery: TOraQuery;
  OraObject: TOraObject;
  OraArray: TOraArray;
  i: integer;
  s: String;
begin
  OraSession := TOraSession.Create(nil);
  OraQuery := TOraQuery.Create(nil);
  try
    OraSession.ConnectString := 'scott/tiger@orcl1020';
    OraSession.Connect;
    OraQuery.Session := OraSession;
    OraQuery.SQL.Text := 'select * from dados';
    OraQuery.ObjectView := true;
    OraQuery.Open;
    OraObject := TOraObject.Create(TOraType.Create(OraSession.OCISvcCtx, 'MDSYS.SDO_GEOMETRY'));
    OraObject.Assign(OraQuery.GetObject('Location'));

    s := 'SDO_GEOMETRY(' + IntToStr(OraObject.AttrAsInteger['SDO_GTYPE']) + ',';
    s := s + IntToStr(OraObject.AttrAsInteger['SDO_SRID']) + ',';
    s := s + 'SDO_POINT_TYPE(' + IntToStr(OraObject.AttrAsObject['SDO_POINT'].AttrAsInteger['X']) + ',';
    s := s + 'SDO_POINT_TYPE(' + IntToStr(OraObject.AttrAsObject['SDO_POINT'].AttrAsInteger['Y']) + ',';
    s := s + 'SDO_POINT_TYPE(' + IntToStr(OraObject.AttrAsObject['SDO_POINT'].AttrAsInteger['Z']) + '),';

    OraArray := TOraArray.Create(TOraType.Create(OraSession.OCISvcCtx, 'MDSYS.SDO_ELEM_INFO_ARRAY'));
    OraArray :=  OraObject.AttrAsArray['SDO_ELEM_INFO'];

    s := s + 'SDO_ELEM_INFO_ARRAY(';
    for i := 0 to OraArray.Size - 1 do
      if i = OraArray.Size - 1 then
        s := s + IntToStr(OraArray.ItemAsInteger[0]) + ')'
      else
        s := s + IntToStr(OraArray.ItemAsInteger[0]) + ',';

    s := s + ',SDO_ORDINATE_ARRAY(';

    OraArray := TOraArray.Create(TOraType.Create(OraSession.OCISvcCtx, 'MDSYS.SDO_ORDINATE_ARRAY'));
    OraArray :=  OraObject.AttrAsArray['SDO_ORDINATES'];

    for i := 0 to OraArray.Size - 1 do
      if i = OraArray.Size - 1 then
        s := s + IntToStr(OraArray.ItemAsInteger[0]) + ')'
      else
        s := s + IntToStr(OraArray.ItemAsInteger[0]) + ',';
    s := s + ')';

    Writeln(s);
  finally
    OraArray.free;
    OraQuery.Free;
    OraSession.Free;
    readln;
  end;
end.