如何在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
相关产品推荐
相关产品推荐

