Получение имен столбцов из курсора ref с помощью cx_Oracle - PullRequest
0 голосов
/ 17 мая 2018

Используя cx_Oracle для вызова простой хранимой процедуры, я могу легко получить данные из процедуры следующим образом:

db = db_class() #Sets up stuff, etc.
conn = db.connect() #Returns a connection to the database

cursor = conn.cursor()
l_results = cursor.var(cx_Oracle.CURSOR)

res = cursor.callproc("PROG.DATA.GET_EVENTS", [1,2,l_results]) 
#params = siteID, userID, ref cursor

res[2] в конечном итоге является неким перечислимым типом, который я легко могу перебрать, какИтак:

data = [row for row in res[2]]

Я получаю список списков / кортежей, который дает мне значения, но мне также нужны имена столбцов.Я пробовал следующее:

cols = cursor.description if cursor.description is not None else [] #Returns None
cols = res[2].description if res[2].description is not None else [] 
#Returns an error. Same if l_results is used instead

Как мне получить имена столбцов из l_results?Я определил, что l_results - это объект Variable, а не курсор, поэтому он не будет работать.То же самое с res [2].Но я просто не могу получить столбцы из curs.

curs.description после того, как это выглядит как значение None, когда оно должно быть списком из 7 элементов

Что вМир, я пропустил?


РЕДАКТИРОВАТЬ 1: я пытался изменить его с callproc на следующее.Та же проблема.

res = cursor.execute("BEGIN PROG.DATA.GET_EVENTS(:1,:2,:3); END;", {"1": 1,"2": 2,"3":, l_results})
cols = cursor.description #Returns None, again.

Вызов возвращает данные, поэтому я не уверен, почему description не устанавливается.

1 Ответ

0 голосов
/ 18 мая 2018

Столбцы для курсора ref могут быть определены из самого курсора ref.Как показано ниже:

refCursorVar = cursor.var(cx_Oracle.CURSOR)
cursor.callproc("so50399550", [1, 2, refCursorVar])
refCursor = refCursorVar.getvalue()
print("Rows:")
for row in refCursor:
    print(row)
print()
print("Column Info:")
for column in refCursor.description:
    print(column)
print()

НО, вы можете сделать это намного проще, используя следующий код.Вам не нужно создавать переменную.Вы можете привязать курсор напрямую.

refCursor = conn.cursor()
cursor.callproc("so50399550", [1, 2, refCursor])
print("Rows:")
for row in refCursor:
    print(row)
print()
print("Column Info:")
for column in refCursor.description:
    print(column)
print()
...