Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pyodbc return multiple cursors from stored procedure with DB2

I have a python program that calls a stored procedure from db2 database. I am using results = cursor.fetchall() to process the results of my stored procedure. However, my stored procedure returns two cursors. results only contains the first one. I need a way to loop through as many cursors as I want. I was hoping fetchmany() would be my answer but it is not.

I need to be able to do multiple result sets as the program I am writing can only call one stored procedure. It would take a lot to go back and make it to be able to call two. Besides with one of these things I need to make 10 cursors return. Everything is dynamic, so the application doesn't know what procedure it is running, it just gets the data and spits it into excel not knowing the meaning. I need one cursor for the data, and the other cursors for different types of counts and totals.

I am looking for a built in function to do this, or maybe even a different library because I have done my share of googling and it looks like pyodbc does not do this for DB2. DB2 is a requirement.

like image 733
KacieHouser Avatar asked Dec 16 '22 10:12

KacieHouser


2 Answers

Use the nextset() method of the cursor: https://github.com/mkleehammer/pyodbc/wiki/Cursor#nextset

Sample code:

# fetch rows from first set
rows = cursor.fetchall()    
# process first set rows here

# advance to next result set
while (cursor.nextset()):    
    # fetch rows from next set, discarding first
    rows = cursor.fetchall()    
    # process next set rows here

nextset() will return True if additional result sets are available, and subsequent cursor fetch methods will return rows from the next set. The method returns None if no additional sets are available.

like image 145
Bryan Avatar answered Jan 14 '23 01:01

Bryan


Just a small simplification for the record:

while True:    
    rows = cursor.fetchall()
    # process all result sets in the same place
    if not cursor.nextset():
        break    
like image 34
Alias_Knagg Avatar answered Jan 14 '23 02:01

Alias_Knagg