Re: [cx-oracle-users] insert using executemanyprepared
Brought to you by:
atuining
From: Anthony T. <ant...@gm...> - 2005-03-19 18:31:16
|
First, your code demonstrates a problem with cx_Oracle that appears to be rather subtle. I'm not sure exactly what the problem is yet but I'll look into it a bit more yet. However, I do have a solution for you that solves your problem. If you set your arraysize large enough to accomodate the amount of data you are inserting, your problem goes away. In other words cursor.arraysize = len(listDict) BTW, I tried this code with cx_Oracle 4.0.1 and it fails as well but for a different reason (arraysize not large enough) so I'm not sure why it works for you. For performance purposes, executemanyprepared() definitely helps but another solution will get you most of that performance while at the same time making your code much easier to read. Your example can be rewritten as follows: # this part is identical except that the massaging of the list is unnecessary cur1 = db1.cursor() db1 = cx_Oracle.connect("regt/test@sxl920d2") cur1 = db1.cursor() cur1.execute("select * from binary_source") data = cur1.fetchall() # this is the part that differs curInsert = db1.cursor() curInsert.arraysize = len(data) # this shouldn't be necessary but at the moment it is curInsert.prepare("insert into WAREHOUSES_STOCK (PRODUCT_ID,WAREHOUSE_ID,QUANTITY_ON_HAND) values (:1,:2,:3)") curInsert.setinputsizes(cx_Oracle.NUMBER, cx_Oracle.BINARY, cx_Oracle.NUMBER) curInsert.executemany(None, data) # None means use the prepared statement # or you can do curInsert.executemany(curInsert.statement, data), whichever you find more appealing cx_Oracle 4.1 allows binding by position. Thus, you can simply perform the fetch() on the one cursor and the executemany() on the other cursor without having to massage it. This should provide all of the performance you require. If you still think you need help with executemanyprepared() I can try to help you on that front as well. Hope this helps. On Sat, 19 Mar 2005 06:17:17 -0800 (PST), Chris Dunscombe <cdu...@ya...> wrote: > All, > > Upto now I've been using executemany to bulk insert data. Upto 4.0.1 this has been fine but now > with 4.1.0 it doesn't seem to work with RAW columns, see below for a simple example: > > import cx_Oracle > db1 = cx_Oracle.connect("regt/test@sxl920d2") > cur1 = db1.cursor() > cur1.execute("select * from binary_source") > data = cur1.fetchall() > listDict = [] > for row in data: > tempDict = {} > x = 1 > for item in row: > tempDict["arg" + str(x)] = item > x = x + 1 > listDict.append(tempDict) > > curInsert = db1.cursor() > curInsert.setinputsizes( arg1 = cx_Oracle.NUMBER, arg2 = cx_Oracle.BINARY, arg3 = > cx_Oracle.NUMBER) > insStr = "insert into WAREHOUSES_STOCK (PRODUCT_ID,WAREHOUSE_ID,QUANTITY_ON_HAND) values > (:arg1,:arg2,:arg3)" > curInsert.prepare(insStr) > curInsert.executemany(insStr, listDict) > > This gives the following error using 4.1.0, works OK for 4.0.1 (Oracle 9.2 on Linux): > > Traceback (most recent call last): > File "binary2.py", line 19, in ? > curInsert.executemany(insStr, listDict) > cx_Oracle.DatabaseError: ORA-01465: invalid hex number > > As I'm concerned about performance I've look at using executemanyprepared (looked at copydata.py > in cx_OracleTools) but haven't managed to get it to work. > > Pls does someone have a simple step-by-step example of using executemanyprepared with an insert > that could be used in my example above to replace the executemany. > > Thanks very much, > > Chris > > __________________________________ > Do you Yahoo!? > Yahoo! Sports - Sign up for Fantasy Baseball. > http://baseball.fantasysports.yahoo.com/ > > ------------------------------------------------------- > SF email is sponsored by - The IT Product Guide > Read honest & candid reviews on hundreds of IT Products from real users. > Discover which products truly live up to the hype. Start reading now. > http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click > _______________________________________________ > cx-oracle-users mailing list > cx-...@li... > https://lists.sourceforge.net/lists/listinfo/cx-oracle-users > |