2016-06-30 2 views
0

Возможно ли получить описание для типа данных курсора в представлении Django?
Дело в том, что когда я выполняю необработанный SQL, я могу получить описание, вызвав cursor().description, но когда я выполняю cursor().callfunc('oracleTestFunc',cx_Oracle.CURSOR,)
(oracleTestFunc возвращает курсор) Я не могу получить описание полей. Таким образом, проблема состоит в том, чтобы получить description. Как я могу это реализовать?Django cx_Oracle connection.cursor(). Description for oracle cursor datatype

UPDATE

Моя функция оракул

create or replace package body test_cl is 

function ret_proc_run return sys_refcursor is 
    retval sys_refcursor; 
begin 

open retval for 
    select id_proc,inst_id,run_now from proc_run; 

return retval; 
end; 

end test_cl; 

В связи Джанго я называю это таким образом

cursor = connection.cursor() 
results=cursor.callfunc('test_cl.ret_proc_run',cx_Oracle.CURSOR,) 

Так что я хочу сделать, чтобы получить доступ к отдельным полям возвращаются функцией oracle (это id_proc, inst_id, run_now) позже использовать в шаблоне.
Я думал, что это будет возможно с помощью метода cursor.description, но после дальнейшего чтения документации я узнал, что это невозможно в этом случае, потому что оно вернет none для типов данных курсора.

+0

Вы спрашиваете, как получить описание из курсора, который возвращается из функции? –

+0

Я хочу вызвать функцию описания на курсор. когда я его не получаю в случае курсора, но когда я выполняю необработанный sql-запрос в представлении, я могу вызвать метод описания на нем. – arminrock

+0

Django немного обертывает вещи. Вы можете попробовать непосредственно с помощью cx_Oracle, чтобы узнать, отлично ли работает то, что вы хотите, за пределами Django. Вы можете получить исходное соединение cx_Oracle из Django. Я могу отслеживать код, если вам это нужно. Дай мне знать. –

ответ

1

Да, cursor.description - это правильный атрибут для изучения, но из вашего описания вопроса вы смотрите на неправильный курсор! Вам нужно использовать курсор, который был возвращен из функции (в вашем случае с именем «results»). Другой курсор (тот, который вызывает хранимую процедуру) вернет None, как ожидалось, так как вы не выполнили запрос.

Если вам нужно получить в сырой cx_Oracle курсор (распакованных Джанго), вы можете сделать следующее:

from django.db import connection 
connection.cursor() 
rawCursor = connection.connection.cursor() 

Вторая линия гарантирует, что соединение действительно установлено. Конечная строка получает необработанное соединение и создает курсор, используя его.

+0

Ваш совет, который я не должен называть '' description'' на '' cursor'', очень помог. Я просто добавил '' res = results.fetchall() '', а затем мне удалось получить доступ к '' res.description''. Спасибо. – arminrock

+0

Добро пожаловать. Можете ли вы отметить это как правильный ответ? –