从Python/Django传入Oracle自定义用户类型

从Python/Django传入Oracle自定义用户类型,python,django,cx-oracle,Python,Django,Cx Oracle,假设我在oracle中有以下“我的类型”和“我的类型”选项卡作为自定义用户类型- CREATE type my_type as object( name varchar2(30) ,key varchar2(100) ,value varchar2(4000)) / CREATE type my_type_tab as table of my_type / 然后是使用这些类型的程序,如下所示: PROCEDURE my_procedure (param in my_type_

假设我在oracle中有以下“我的类型”和“我的类型”选项卡作为自定义用户类型-

CREATE type my_type as object(
name   varchar2(30)
,key    varchar2(100)
,value   varchar2(4000))
/
CREATE type my_type_tab as table of my_type
/
然后是使用这些类型的程序,如下所示:

PROCEDURE my_procedure (param  in  my_type_tab);

有没有办法在Python/Django中构造my_type_选项卡并将其传递到my_过程中?在我的场景中,我可以有一个或数百个my_类型行,这是目前为止处理此场景最简单的方法。

声明一个表示my_类型的python类怎么样

# python representation of my_type
class my_type(object):
    def __init__(self, name, value, key):
        self.name = name
        self.value = value
        self.key = key
创建以下内容的列表:

# Create my_type python objects
my_list = [my_type('a', '1', 'x'),
           my_type('b', '2', 'y'),
           my_type('c', '3', 'z'),
           ]
并生成查询以如下方式运行它们:

# Run my_package.my_procedure() over my_list
cursor.execute("""
    declare
        l_params my_type_tab;
        type varchar_list is table of varchar2(4000) index by binary_integer;
        l_names varchar_list := :p_names;
        l_keys varchar_list := :p_keys;
        l_values varchar_list := :p_values;
    begin
        l_params.extend(l_names.count);
        for i in 1..l_names.count loop
            l_params(i) := my_type(l_names(i), l_keys(i), l_values(i));
        end loop;

        my_package.my_procedure(l_params);
    end;""",
    p_names=[item.name for item in my_list],
    p_values=[item.value for item in my_list],
    p_keys=[item.key for item in my_list],
    )

如果你感兴趣的话,我可以把它推广到任何类型,不仅仅是
我的类型

我昨天就知道了,而且比你的更脏。我基本上是这样做的-谢谢,这是一个更干净的方法。