You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Python向Oracle存储过程传递自定义类型NULL值报错求助

解决cx_Oracle调用Oracle存储过程时自定义类型参数传NULL的问题

我之前也碰到过一模一样的问题!直接在SQL里执行execute python_test(1,null);完全正常,但用cx_Oracle传None就报PLS-00306错误,核心原因是cx_Oracle无法自动推断自定义类型参数的类型,哪怕你传的是NULL。Oracle SQL引擎能根据存储过程定义自动匹配参数类型,但cx_Oracle需要你明确告诉它参数对应的Oracle类型。

下面给你两种可行的解决方法:

方法一:显式创建自定义类型的NULL实例

先获取自定义类型的对象,然后调用其null()方法生成一个符合类型要求的NULL值,再传递给存储过程:

import cx_Oracle

# 替换为你的数据库连接信息
conn = cx_Oracle.connect("your_username/your_password@your_host:your_port/your_service")
cursor = conn.cursor()

# 获取自定义类型TEST_TYPE的对象
test_type = conn.gettype("TEST_TYPE")

# 调用存储过程,第二个参数传入该类型的NULL实例
cursor.callproc("python_test", [1, test_type.null()])

# 若存储过程有写操作需提交,示例无写操作可省略
conn.commit()

# 关闭资源
cursor.close()
conn.close()

方法二:用setinputsizes指定参数类型

通过cursor.setinputsizes()方法提前声明每个参数的类型,这样即使传None,cx_Oracle也能正确识别参数对应的Oracle类型:

import cx_Oracle

conn = cx_Oracle.connect("your_username/your_password@your_host:your_port/your_service")
cursor = conn.cursor()

test_type = conn.gettype("TEST_TYPE")
# 第一个参数为数字类型,传None让cx_Oracle自动推断;第二个参数指定为TEST_TYPE
cursor.setinputsizes(None, test_type)

# 现在可以直接传None作为第二个参数
cursor.callproc("python_test", [1, None])

conn.commit()
cursor.close()
conn.close()

两种方法本质都是让cx_Oracle明确知道第二个参数对应的是TEST_TYPE类型,而非让它自行猜测。你可以根据代码习惯选择其中一种。

内容的提问来源于stack exchange,提问作者user3124206

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:38:48