在python中使用callproc调用包含记录集合的存储过程 [英] Call stored procedure containing collection of records using callproc in python

查看:52
本文介绍了在python中使用callproc调用包含记录集合的存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在sql中有一个存储过程:

I am having a stored procedure in 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是OF_object_tag_rec的集合

where object_tag_tbl is collection OF object_tag_rec

object_tag_rec是RECORD,具有以下字段(元素):

object_tag_rec is RECORD with below fields(elements):

tag_type            VARCHAR2(1),
tag_category        VARCHAR2(100),
tag_key             VARCHAR2(250),
tag_value           VARCHAR2(250),
created_by          VARCHAR2(50)

当我使用callproc调用上述存储过程时

When I am calling the above stored procedure using 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中做到这一点吗?

it gives me an error "element 0 value is unsupported". Is there any way to do this in Python?

推荐答案

您不能直接将 collections.namedtuple 用作Oracle对象类型.

You may not directly use collections.namedtuple as Oracle object type.

我在 Oracle Database 12c企业版12.2.0.1.0 中使用 Cx-Oracle-7.0.0 Python 3.6.4 ,它对我有用.

I tried the below on Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 with Cx-Oracle-7.0.0 and Python 3.6.4 and it works for me.

创建类型

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

这篇关于在python中使用callproc调用包含记录集合的存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆