[DB-SIG] Re: [DB-SIG] http://www.python.org/topics/database/DatabaseAPI-2.0.ht ml

Matthew T. Kromer matt@zope.com
Fri, 30 Aug 2002 13:16:18 -0400

Anthony Tuininga wrote:

>There is no DB independent way of doing this that I am aware of. In
>Oracle you use the "returning" clause. I am not familiar with DCOracle2
>but I suspect something similar can be done.
>import cx_Oracle
>v_Connection = cx_Oracle.connect("user/pw@tns")
>v_Cursor = v_Connection.cursor()
>v_Vars = v_Cursor.setinputsizes(p_PrimaryKeyValue = cx_Oracle.NUMBER)
>    insert into SomeTable (
>      SomeValue
>    ) values (
>      :p_SomeValue
>    ) returning PrimaryKey into :p_PrimaryKeyValue""")
>print "PrimaryKeyValue:", v_Vars["p_PrimaryKeyValue"].getvalue()
>This method is also not compatible with the DB-API as the DB-API does
>not specify a method for handling output variables in anything other
>than stored procedures. If you want to conform to the DB-API, you will
>have to use a stored procedure and use the cursor method callproc()
>instead of the method above.

DCOracle does this similarly, albeit in yet another incompatible way <smirk>

import DCOracle2
db = DCOracle2.connect('scott/tiger')
c = db.cursor()
rval = db.BindingArray(1, 45, 'SQLT_STR')
c.execute('Insert into foo values(...) returning SomeVar into :rval', 

print rval[0]

BindingArrays in DCOracle2 are incredibly primative; and not exactly 
pleasant to use.  One quirk is they can't decode Oracle types for you to 
Python numbers -- so you use SQLT_STR as the format to have Oracle 
convert the value to a string instead (they really provide something 
like a raw buffer for input/output values).  Normally the Python layer 
handles all of this for you, but it doesn't understand how to do that 
for RETURNING clauses.