Re: [cx-oracle-users] New features?
Brought to you by:
atuining
|
From: Anthony T. <ant...@gm...> - 2016-03-07 15:03:12
|
Hi Walter,
Yes, that was indeed an issue. Apparently data with a type of
OCI_TYPECODE_INTEGER is actually stored as OCINumber, not as a native
integer. So as long as you remain in Python all is well. But as soon as you
try to use it within PL/SQL you get strange results as you noted above.
This has been corrected. Thanks!
I'll look into adding the custom repr as well. I agree that would be
useful. :-)
Anthony
On Mon, Mar 7, 2016 at 3:06 AM, Walter Dörwald <wa...@li...>
wrote:
> On 6 Mar 2016, at 3:23, Anthony Tuininga wrote:
>
> > Hi Walter,
> >
> > Apologies for the lengthy delay in responding to you!
> >
> > The reason for the failure was that integer was not supported (it is
> > now,
> > though). If you had used number or varchar2 instead all would have
> > worked
> > as expected!
> >
> > I also added support for the following, as suggested (thanks for the
> > suggestion!)
> >
> > typeObj = connection.gettype("INTEGERS")
> > obj = typeObj.newobject([1, 2, 3, 4])
> > obj2 = typeObj([1, 2, 3, 4])
> >
> > Let me know if you have any other difficulties or suggestions! Thanks.
>
> Now I can create INTEGERS objects. However there still seems to be a
> problem. I tried the following:
>
> import cx_Oracle
>
> db = cx_Oracle.connect("user/pwd@db")
> c = db.cursor()
>
> c.execute("create type integers as table of integer")
>
> c.execute("create table debug (dbg_text varchar2(4000), dbg_time
> timestamp)")
>
> c.execute("""
> create or replace procedure debug_insert(p_dbg_text varchar2)
> as
> pragma autonomous_transaction;
> begin
> insert into debug (dbg_text, dbg_time) values (p_dbg_text,
> systimestamp);
> commit;
> end;
> """)
>
> c.execute("""
> create or replace function SEARCH
> (
> p_ids in integers,
> p_searchvalue in integer
> )
> return integer
> as
> begin
> debug_insert('searching for ' || p_searchvalue);
> for i in 1..p_ids.count loop
> debug_insert('testing ' || p_ids(i));
> if p_ids(i) = p_searchvalue then
> debug_insert('found');
> return 1;
> end if;
> end loop;
> debug_insert('not found');
> return 0;
> end;
> """)
>
> integers = db.gettype("INTEGERS")
>
> print(c.callfunc("SEARCH", int, [integers([1,2,3,4]), 2]))
>
> The output of this script is 0. However I would have expected it to be
> 1.
>
> Looking into the DEBUG table gives me the following:
>
> searching for 2
>
> testing -~
>
> testing
>
> testing
>
> -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+125
>
> testing
>
> -0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E+125
>
> not found
>
> So either I'm doing something stupid, or passing an INTEGERS object
> still has problems.
>
> BTW, it would be great if custom objects had a repr that at least
> displayed the underlying Oracle type, not just:
>
> <cx_Oracle.Object object at 0x108b8f450>
>
> i.e. something like
>
> <cx_Oracle.Object object type='INTEGERS' at 0x108b8f450>
>
> > Anthony
> > [...]
>
> Servus,
> Walter
>
>
> ------------------------------------------------------------------------------
> Transform Data into Opportunity.
> Accelerate data analysis in your applications with
> Intel Data Analytics Acceleration Library.
> Click to learn more.
> http://makebettercode.com/inteldaal-eval
> _______________________________________________
> cx-oracle-users mailing list
> cx-...@li...
> https://lists.sourceforge.net/lists/listinfo/cx-oracle-users
>
|