LargeInt and Object tables

Discussion of open issues, suggestions and bugs regarding ODAC (Oracle Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
m.ghilardi
Posts: 41
Joined: Thu 13 Mar 2014 11:14

LargeInt and Object tables

Post by m.ghilardi » Fri 14 Mar 2014 07:59

Let's say I have an object table like this

Code: Select all

create type my_type as object(
	a_id number(18),
	a_name varchar2(160 char)
);
create table my_table of my_type; 
With this values inserted:

Code: Select all

insert into my_table values (999999999999999999,'value1');
insert into my_table values (9007199254740992,'value2');
Create a simple TOraQuery (MyQuery) with this SQL statement:

Code: Select all

select value(x) obj, x.a_id id from my_table x order by id
in the TOraSession I have enableintegers=true, enablelargeint=true.

Code: Select all

MyQuery->Open();

__int64 int1 = MyQuery->FieldByName(L"obj.a_id")->AsLargeInt;
__int64 int2 = MyQuery->FieldByName(L"id")->AsLargeInt;
MyQuery->Next();
__int64 int3 = MyQuery->FieldByName(L"obj.a_id")->AsLargeInt;
__int64 int4 = MyQuery->FieldByName(L"id")->AsLargeInt;
The Result is

int1 9007199254740992 int2 9007199254740992 int3 999999999999999872 int4 999999999999999999

2^53=9007199254740992 is the biggest integer that can be stored in a double.

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

Re: LargeInt and Object tables

Post by AlexP » Fri 14 Mar 2014 09:37

Hello,

We cannot reproduce the problem. Please try to reproduce the problem on the latest ODAC version 9.2.7

m.ghilardi
Posts: 41
Joined: Thu 13 Mar 2014 11:14

Re: LargeInt and Object tables

Post by m.ghilardi » Fri 14 Mar 2014 11:29

Hello,
I was able to reproduce the problem using ODAC 9.2.7.

Rad Studio XE4
Oracle 11g Express

Execute this SQL script using sqlplus

Code: Select all

create type my_type as object(
	a_id number(18),
	a_name varchar2(160 char)
);

create table my_table of my_type; 

insert into my_table values (999999999999999999,'value1');
insert into my_table values (9007199254740992,'value2');
Create a new C++ VCL project. Only one form is needed.

Unit1.h

Code: Select all

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "DBAccess.hpp"
#include "MemDS.hpp"
#include "Ora.hpp"
#include "OraCall.hpp"
#include <Data.DB.hpp>
#include <Vcl.DBGrids.hpp>
#include <Vcl.Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TOraSession *OraSession1;
	TOraQuery *OraQuery1;
	TMemo *Memo1;
	void __fastcall FormShow(TObject *Sender);
private:	// User declarations
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp

Code: Select all

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "DBAccess"
#pragma link "MemDS"
#pragma link "Ora"
#pragma link "OraCall"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	OraQuery1->Open();
	OraQuery1->Open();

	__int64 int1 = OraQuery1->FieldByName(L"obj.a_id")->AsLargeInt;
	__int64 int2 = OraQuery1->FieldByName(L"id")->AsLargeInt;
	OraQuery1->Next();
	__int64 int3 = OraQuery1->FieldByName(L"obj.a_id")->AsLargeInt;
	__int64 int4 = OraQuery1->FieldByName(L"id")->AsLargeInt;

	Memo1->Lines->Add(UnicodeString().sprintf(L"int1 %Ld",int1));
	Memo1->Lines->Add(UnicodeString().sprintf(L"int2 %Ld",int2));
	Memo1->Lines->Add(UnicodeString().sprintf(L"int3 %Ld",int3));
	Memo1->Lines->Add(UnicodeString().sprintf(L"int4 %Ld",int4));
}
//---------------------------------------------------------------------------
Unit1.dfm

Code: Select all

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 279
  ClientWidth = 475
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 96
    Top = 8
    Width = 185
    Height = 89
    TabOrder = 0
  end
  object OraSession1: TOraSession
    Options.EnableLargeint = True
    Options.EnableNumbers = True
    Left = 360
    Top = 72
  end
  object OraQuery1: TOraQuery
    Session = OraSession1
    SQL.Strings = (
      'select value(x) obj, x.a_id id from my_table x order by id')
    Left = 160
    Top = 40
  end
end

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

Re: LargeInt and Object tables

Post by AlexP » Wed 07 May 2014 12:19

This behavior is due to the fact that these options (EnableLargeint, EnableNumbers) are not applied to object attributes (fields). We will consider the possibility to change this behavior in the future.

m.ghilardi
Posts: 41
Joined: Thu 13 Mar 2014 11:14

Re: LargeInt and Object tables

Post by m.ghilardi » Wed 17 Sep 2014 07:27

Has this feature been implemented in ODAC 9.4? Is this planned for the near future?
Sorry for bumping this, but I use a lot of Objects in my project, and I was forced to limit the size of Integers on DB because of this limitation in the client.

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

Re: LargeInt and Object tables

Post by AlexP » Wed 17 Sep 2014 10:09

No, this feature is not yet implemented. We have added it to our roadmap, however, we cannot say the exact timing of its implementation.

Post Reply