python - 在 python 中使用 callproc 调用包含记录集合的存储过程
问题描述
我在 sql 中有一个存储过程:
PROCEDURE sp_add_object_tags(
pi_account_id IN user_files.account_id%TYPE,
pi_object_id IN object_metadata.object_id%TYPE,
pi_all_tags_identified IN VARCHAR2,
pi_object_tag_tbl IN object_tag_tbl,
po_error_code OUT NUMBER,
po_error_message OUT VARCHAR2 )
其中 object_tag_tbl 是 object_tag_rec 的集合
object_tag_rec 是具有以下字段(元素)的记录:
tag_type VARCHAR2(1),
tag_category VARCHAR2(100),
tag_key VARCHAR2(250),
tag_value VARCHAR2(250),
created_by VARCHAR2(50)
当我使用 callproc 调用上述存储过程时
object_tag_rec = collections.namedtuple('object_tag_rec',['tag_type','tag_category','tag_key', 'tag_value', 'created_by'])
rec_params1=object_tag_rec("S","person","person","1","abc")
params = [rec_params1]
cur_var = cur.callproc('tejfilusr.pg_object_tagging.sp_add_object_tags', [1234, 5678, 'N', params, po_error_code, po_error_message])
它给了我一个错误“不支持元素 0 值”。有没有办法在 Python 中做到这一点?
解决方案
您可能不直接collections.namedtuple
用作 Oracle 对象类型。
我在Oracle Database 12c Enterprise Edition Release 12.2.0.1.0和Python 3.6.4上尝试了以下操作Cx-Oracle-7.0.0
,它对我有用。
创建类型
CREATE OR REPLACE TYPE object_tag_rec AS OBJECT (
tag_type VARCHAR2(1),
tag_category VARCHAR2(100),
tag_key VARCHAR2(250),
tag_value VARCHAR2(250),
created_by VARCHAR2(50)
);
/
创建集合
CREATE OR REPLACE TYPE object_tag_tbl is TABLE OF object_tag_rec;
/
创建程序
CREATE OR REPLACE procedure sp_add_object_tags(
pi_account_id IN INT,
pi_object_id IN INT,
pi_all_tags_identified IN VARCHAR2,
pi_object_tag_tbl IN object_tag_tbl,
po_error_code OUT NUMBER,
po_error_message OUT VARCHAR2 )
AS
BEGIN
po_error_code := 0;
po_error_message := 'NO ERRORS';
END;
/
代码
import cx_Oracle
conn = cx_Oracle.connect('user/pwd@//localhost:1521/dbname')
cur = conn.cursor()
recordTypeObj = conn.gettype("HR.OBJECT_TAG_REC") #mind the cases
tableTypeObj = conn.gettype("HR.OBJECT_TAG_TBL")
params = tableTypeObj.newobject()
rec = recordTypeObj.newobject()
(rec.TAG_TYPE,rec.TAG_CATEGORY,rec.TAG_KEY,rec.TAG_VALUE,rec.CREATED_BY) = ("S","person","person","1","abc")
#mind the cases for attributes.
po_error_code = cur.var(cx_Oracle.NUMBER)
po_error_message = cur.var(cx_Oracle.STRING)
params.append(rec)
cur.callproc('dbms_output.enable')
cur.callproc('hr.sp_add_object_tags', [1234, 5678, 'N', params, po_error_code, po_error_message])
print (po_error_code.getvalue(),po_error_message.getvalue())
执行
$python pass_obj.py
0.0 NO ERRORS
推荐阅读
- mysql - 如何在sql中使用密码()?
- r - gganimate 中的 shadow_mark() 问题
- java - 尽管有 NoArgsConstructor,为什么“JsonMappingException:无法实例化类型的值”?
- python - 某些节点上的 Python mpi4py 脚本分段错误
- c++ - 二维数组中相等相邻元素的计数
- html - HTML 元素样式在作用域样式中不起作用
- android - Glide 占位符缓存
- javascript - 为什么每次渲染都会调用 `useEffect` 的清理功能?
- asp.net-core - 如何在cshtml文件中使用引导程序4将3个下拉选择表单连续放置
- javascript - jQuery:分离表行然后追加回相同的位置