【问题标题】:How to receive a out parameter(sys_refcursor) of stored procedure Oracle in Django如何在 Django 中接收存储过程 Oracle 的输出参数(sys_refcursor)
【发布时间】:2017-05-22 10:26:43
【问题描述】:

我已经创建了一个存储过程 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

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

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

我和我一起工作

  • python 2.7.12
  • Django 1.10.4
  • cx_Oracle 5.2.1
  • 甲骨文 12c

谁能帮帮我?

谢谢

【问题讨论】:

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


【解决方案1】:

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

django_cursor = connection.cursor()
raw_cursor = django_cursor.connection.cursor()
out_arg = raw_cursor.var(int) # or raw_cursor.var(float)
raw_cursor.callproc("<procedure_name>", (in_arg, out_arg))
out_val = out_arg.getvalue()

然后使用“原始”游标创建变量并调用存储过程。

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

【讨论】:

  • 如果游标返回值是数组呢???这适用于那种情况.. ??
  • 是的,应该的。
【解决方案2】:

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))

【讨论】:

  • 我调整了我的答案以包含您放入的附加代码,但进一步简化。希望现在是一站式商店!
猜你喜欢
  • 2017-08-18
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2021-06-22
  • 2021-11-09
  • 1970-01-01
  • 2012-12-24
相关资源
最近更新 更多