Re: [cx-oracle-users] insert using executemanyprepared
Brought to you by:
atuining
From: Chris D. <cdu...@ya...> - 2005-03-21 19:01:28
|
Anthony, It works a treat. Thanks very much, Chris PS I'll give executemanyprepared a miss for now but I may come back for help later. --- Chris Dunscombe <cdu...@ya...> wrote: > Thanks very much for that. I'll give it a go when I get home to-night. > > Chris > --- Anthony Tuininga <ant...@gm...> wrote: > > > 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 > > > > > > > > > ------------------------------------------------------- > > 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 > > > > > __________________________________________________ > Do You Yahoo!? > Tired of spam? Yahoo! Mail has the best spam protection around > http://mail.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 > __________________________________ Do you Yahoo!? Make Yahoo! your home page http://www.yahoo.com/r/hs |