我已经创建了一个存储过程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
我合作
能帮到我吗?
谢谢
问题是Django的包装器是不完整的。因此,您需要确保使用“原始”cx_Oracle游标。您可以使用以下代码执行此操作:
djangoCursor = connection.cursor()
rawCursor = djangoCursor.connection.cursor()
然后使用“原始”光标创建变量并调用存储过程。
看一下Django中变量包装器的定义,看起来你也可以访问包装器上的“var”属性。您也可以将其直接传递给存储过程 - 但我不知道这是否是更好的长期选择!
安东尼的解决方案适用于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))