如何在Django中接收存储过程Oracle的out参数(sys_refcursor)

时间:2017-01-07 20:44:51

标签: python django oracle stored-procedures cx-oracle

我创建了一个存储过程 usuarios_get ,我在oracle控制台中测试它并且工作正常。这是存储过程的代码

create or replace PROCEDURE USUARIOS_GET(
text_search     in VARCHAR2,
usuarios_list   out sys_refcursor
)  
AS
--Variables
BEGIN
open usuarios_list for select * from USUARIO
END USUARIOS_GET;

python代码是这样的:

with connection.cursor() as cursor:
    listado = cursor.var(cx_Oracle.CURSOR)
    l_query = cursor.callproc('usuarios_get', ('',listado))  #in this sentence produces error
    l_results = l_query[1]

错误如下:

  

NotSupportedError:Variable_TypeByValue():未处理的数据类型VariableWrapper

我还尝试过使用out参数编号类型的其他存储过程,并在python代码中修改 listado = cursor.var(cx_Oracle.NUMBER),我得到同样的错误

  

NotSupportedError:Variable_TypeByValue():未处理的数据类型VariableWrapper

我使用

  • python 2.7.12
  • Django 1.10.4
  • cx_Oracle 5.2.1
  • Oracle 12c

有人可以帮我吗?

谢谢

2 个答案:

答案 0 :(得分:0)

问题是Django的包装器是不完整的。因此,你需要确保你有一个" raw"改为使用cx_Oracle游标。您可以使用以下代码执行此操作:

djangoCursor = connection.cursor()
rawCursor = djangoCursor.connection.cursor()

然后使用" raw" cursor创建变量并调用存储过程。

看看Django中变量包装器的定义,看起来你也可以访问" var"包装上的属性。您也可以将其直接传递给存储过程 - 但我不知道这是否是更好的长期选择!

答案 1 :(得分:0)

Anthony的解决方案适用于Django 2.2和Oracle 12c。谢谢!在网络上其他任何地方都找不到此解决方案。

dcursor = connection.cursor()
cursor = dcursor.connection.cursor()
import cx_Oracle
out_arg = cursor.var(cx_Oracle.NUMBER)
ret = cursor.callproc("<procedure_name>", (in_arg, out_arg))