首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Django中接收存储过程Oracle的out参数(Sys_refcursor)

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

Stack Overflow用户
提问于 2017-01-07 20:44:50
回答 2查看 1.4K关注 0票数 2

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

代码语言:javascript
复制
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代码如下:

代码语言:javascript
复制
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

有谁能帮我吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-09 20:54:26

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

代码语言:javascript
复制
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()

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-04-23 02:31:31

Anthony的解决方案适用于Django 2.2和Oracle 12c。谢谢!在网上其他地方找不到这个解决方案。

代码语言:javascript
复制
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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41526352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档