[DB-SIG] update where current of

Stephen J. Turner sjturner@ix.netcom.com
Fri, 03 Dec 1999 16:21:59 -0500


This is a multi-part message in MIME format.
--------------1F06F5647D70875CDF56B84C
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Chuck Jackson wrote:
> Is it possible to do the following code w/Python and informixdb?
> 
> update sometable
>     set somecolumn = "some value"
> where current of THIS_HERE_CURSOR
> 
> It's the THIS_HERE_CURSOR that I can't figure out how to address.

At first, I was going to say "no," since the DB-API spec doesn't appear
to address positioned UPDATEs and DELETEs -- only searched ones.  Then I
started digging, and the answer surprised me.  It turns out it _is_
possible, though technically it's a cheat, since it (a) is nonportable
to any other DB-API implementation, and (b) requires that you know how
informixdb generates cursor IDs.

Attached is a contrived example showing how to do it.  The magic is in
the construction of the positioned UPDATE statement:
  "update ... where current of CUR%lX" % id(cursor)

Perhaps a future revision to the DB-API spec should add a read-only
'name' attribute to cursor objects, so that this could be done more
portably as:
  "update ... where current of %s" % cursor.name

Thoughts, anyone?

--
Stephen J. Turner <sjturner@ix.netcom.com>
--------------1F06F5647D70875CDF56B84C
Content-Type: text/plain; charset=us-ascii;
 name="ifxposupd.py"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="ifxposupd.py"

import string

# connect to the database
import informixdb
db = informixdb.informixdb('stores7')

# allocate cursor and statement objects
cur = db.cursor()
stmt = db.cursor()

# create the positioned update string
update = 'update orders set backlog=? where current of CUR%lX' % id(cur)

# open an updateable cursor
cur.execute('select backlog from orders for update')
while 1:
    row = cur.fetchone()
    if not row:
        break
    backlog, = row

    # toggle the case of the backlog column and update in place
    backlog = string.swapcase(backlog)
    stmt.execute(update, (backlog,))


--------------1F06F5647D70875CDF56B84C--