pyodbc возвращает несколько курсоров из хранимой процедуры с DB2

У меня есть программа на Python, которая вызывает хранимую процедуру из базы данных db2. Я использую results = cursor.fetchall() для обработки результатов моей хранимой процедуры. Однако моя хранимая процедура возвращает два курсора. results содержит только первый. Мне нужен способ перебрать столько курсоров, сколько я захочу. Я надеялся, что fetchmany() будет моим ответом, но это не так.

Мне нужно иметь возможность создавать несколько наборов результатов, поскольку программа, которую я пишу, может вызывать только одну хранимую процедуру. Потребовалось бы много времени, чтобы вернуться и сделать это, чтобы иметь возможность позвонить двоим. Кроме того, с помощью одной из этих вещей мне нужно вернуть 10 курсоров. Все динамично, поэтому приложение не знает, какую процедуру оно выполняет, оно просто получает данные и выкладывает их в Excel, не зная смысла. Мне нужен один курсор для данных, а другие курсоры для разных типов подсчетов и итогов.

Я ищу встроенную функцию для этого или, может быть, даже другую библиотеку, потому что я выполнил свою долю поиска в Google, и похоже, что pyodbc не делает этого для DB2. DB2 - это требование.


person KacieHouser    schedule 31.08.2011    source источник


Ответы (2)


Используйте nextset() метод курсора: https://github.com/mkleehammer/pyodbc/wiki/Cursor#nextset

Образец кода:

# 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() вернет True, если доступны дополнительные наборы результатов, а последующие методы выборки курсора вернут строки из следующего набора. Метод возвращает None, если дополнительных наборов нет.

person Bryan    schedule 31.08.2011

Небольшое упрощение записи:

while True:    
    rows = cursor.fetchall()
    # process all result sets in the same place
    if not cursor.nextset():
        break    
person Alias_Knagg    schedule 19.08.2016