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

如何在Python中向PL/SQL存储过程传递CLOB参数并处理Blob空值

Python调用PL/SQL存储过程的参数类型错误解决

问题背景

要调用的PL/SQL存储过程定义:

test_proc (parameter1 int, parameter2 clob, parameter3 blob)

执行Python代码时触发错误:

PLS-00306: 调用'test_proc'时参数数量或类型错误

原代码示例:

import cx_Oracle

dbPool = cx_Oracle.SessionPool(db_user, db_password, db_name)

dbConnection = dbPool.acquire()

Cursor = dbConnection.cursor()

lv_xml_clob = 'my clob data'

Cursor.callproc("test_pkg.test_proc",[1,lv_xml_clob,''])

dbPool.release(dbConnection)

核心问题:Python字符串会被识别为Oracle VARCHAR2类型,与存储过程要求的CLOB类型不匹配;同时BLOB参数不能接收None、''这类值,必须传递合法的BLOB类型空对象。

解决方案

1. 正确传递CLOB参数

不能直接传Python字符串,需明确创建Oracle CLOB类型对象:

  • 用连接对象的createclob()方法生成CLOB实例,再写入字符串数据
  • 或直接用cx_Oracle.CLOB()包装目标字符串

2. 传递空BLOB参数

必须创建Oracle BLOB类型的空对象,不能用字符串空值或None替代:

  • 用连接对象的createblob()方法生成空BLOB实例
  • 或直接用cx_Oracle.BLOB()构造空BLOB

修正后的代码

import cx_Oracle

dbPool = cx_Oracle.SessionPool(db_user, db_password, db_name)
dbConnection = dbPool.acquire()
cursor = dbConnection.cursor()

# 创建CLOB对象并写入数据
lv_xml_clob = dbConnection.createclob()
lv_xml_clob.write('my clob data')

# 创建空BLOB对象
empty_blob = dbConnection.createblob()

# 调用存储过程
cursor.callproc("test_pkg.test_proc", [1, lv_xml_clob, empty_blob])

dbPool.release(dbConnection)

简化写法

直接使用cx_Oracle类型构造器:

import cx_Oracle

dbPool = cx_Oracle.SessionPool(db_user, db_password, db_name)
dbConnection = dbPool.acquire()
cursor = dbConnection.cursor()

cursor.callproc("test_pkg.test_proc", [
    1,
    cx_Oracle.CLOB('my clob data'),
    cx_Oracle.BLOB()  # 空BLOB
])

dbPool.release(dbConnection)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:07