Курсорная переменная может возвращаться в качестве результата хранимой процедуры, написанной на PL/SQL. Например, вот такой:
create or replace procedure test_cur(
a number,
b number,
p_ret out sys_refcursor)
is
begin
open p_ret for select a + level-1 v from dual
connect by level <= b;
end;
Для работы с СУБД Oracle из Python есть весьма хорошая библиотека cx_Oracle . С курсорами работа построена там очень просто - они объявляются как обычные типизированные переменные библиотеки, в данном случае с типом курсора. Всё очень просто, смотрим на примере:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cx_Oracle as db
try:
conn = db.connect('user', 'password', 'server')
except db.DatabaseError, err:
print 'DB Error: ', err
exit()
cur = conn.cursor()
# так объявляется курсорная переменная
ret = cur.var(db.CURSOR)
# Не забываем, что есть dir(), с чьей помощью можно узнать очень
# много полезного об инстансе курсорной переменной
print 'ret: ', dir(ret)
print 'ret.getvalue(): ', dir(ret.getvalue())
cur.execute('''begin test_cur(1, 20, :ret); end; ''', ret=ret)
# описание полей запроса
print ret.getvalue().description
# А вот по этому можно уже пройтись через for ;-)
print ret.getvalue().fetchall()
# не забываем закрывать за собой соединение с Ораклом
conn.close()
Кстати, вот тут лежит неплохой мануал по cx_Oracle на русском языке.