我正在尝试使用python中的Oracle存储过程,并且用户定义的类型有问题。
以下是重现问题的最小示例
create or replace
TYPE test_type AS TABLE OF VARCHAR2(4000);
/
create or replace procedure python_test (
a in number,
b in test_type) as
begin
null;
end;
/
我实际上并不想从python中传递任何test_type,只是没有将它设置为任何东西(现实生存存储过程允许)。
在SQL中,以下工作:
execute python_test(1,null);
但是,从python和cx_Oracle,以下命令
cursor.callproc('python_test', [1, None])
给了我以下错误:
PLS-00306:调用' PYTHON_TEST'
时参数的数量或类型错误
有没有办法让这项工作?
答案 0 :(得分:0)
是。您需要使用cursor.setinputsizes()才能使其按预期工作。如果您只是使用默认处理,则将None视为字符串,这不是此处的预期。相反,做以下事情:
import cx_Oracle
conn = cx_Oracle.Connection("cx_Oracle/welcome@oracle-laptop/T122")
cursor = conn.cursor()
var = cursor.var(cx_Oracle.OBJECT, typename = "TEST_TYPE")
cursor.setinputsizes(None, var)
cursor.callproc("python_test", [1, None])