Working with user defined types

Discussion of open issues, suggestions and bugs regarding ODAC (Oracle Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
dados
Posts: 82
Joined: Thu 18 Aug 2005 14:06

Working with user defined types

Post by dados » Wed 31 Oct 2012 12:21

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

AlexP
Devart Team
Posts: 5530
Joined: Tue 10 Aug 2010 11:35

Re: Working with user defined types

Post by AlexP » Fri 02 Nov 2012 10:08

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.

AlexP
Devart Team
Posts: 5530
Joined: Tue 10 Aug 2010 11:35

Re: Working with user defined types

Post by AlexP » Tue 11 Dec 2012 12:39

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.

Post Reply