【问题标题】:Passing in Oracle custom user types from Python/Django从 Python/Django 传入 Oracle 自定义用户类型
【发布时间】:2015-04-13 21:39:24
【问题描述】:

假设我在 oracle 中有以下 my_type 和 my_type_tab 作为自定义用户类型 -

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_tab 并将其传递给 my_procedure?在我的场景中,我可能有一个或数百个 my_type 行,这将是迄今为止处理这种场景的最简单方法。

【问题讨论】:

    标签: python django cx-oracle


    【解决方案1】:

    声明一个代表my_type的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],
        )
    

    如果您有兴趣,我可以将其推广到任何类型,而不仅仅是 my_type。

    【讨论】:

    猜你喜欢
    • 2014-10-06
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多