如何在 Django 中接收存储过程 Oracle 的输出参数(sys_refcursor)
How to receive a out parameter(sys_refcursor) of stored procedure Oracle in Django
我创建了一个存储过程 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(): unhandled data type VariableWrapper
我也尝试过使用其他带有输出参数编号类型的存储过程并在 python 代码中进行修改 listado= cursor.var(cx_Oracle.NUMBER) 我得到了同样的错误
NotSupportedError: Variable_TypeByValue(): unhandled data type VariableWrapper
我和
一起工作
- python 2.7.12
- Django 1.10.4
- cx_Oracle 5.2.1
- 甲骨文 12c
有人能帮我解决这个问题吗?
谢谢
问题是 Django 的包装器不完整。因此,您需要确保使用 "raw" 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()
然后使用"raw"游标创建变量并调用存储过程。
查看 Django 中变量包装器的定义,您似乎也可以访问包装器上的 "var" 属性。您也可以将其直接传递给存储过程——但我不知道这是否是一个更好的长期选择!
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))
我创建了一个存储过程 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(): unhandled data type VariableWrapper
我也尝试过使用其他带有输出参数编号类型的存储过程并在 python 代码中进行修改 listado= cursor.var(cx_Oracle.NUMBER) 我得到了同样的错误
NotSupportedError: Variable_TypeByValue(): unhandled data type VariableWrapper
我和
一起工作- python 2.7.12
- Django 1.10.4
- cx_Oracle 5.2.1
- 甲骨文 12c
有人能帮我解决这个问题吗?
谢谢
问题是 Django 的包装器不完整。因此,您需要确保使用 "raw" 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()
然后使用"raw"游标创建变量并调用存储过程。
查看 Django 中变量包装器的定义,您似乎也可以访问包装器上的 "var" 属性。您也可以将其直接传递给存储过程——但我不知道这是否是一个更好的长期选择!
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))