从 Python/Django 传入 Oracle 自定义用户类型
Passing in Oracle custom user types from Python/Django
假设我有以下 my_type 和 my_type_tab 作为 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_tab并将其传递给my_procedure?在我的场景中,我可以有一个或数百个 my_type 行,这是迄今为止处理这种场景的最简单方法。
如何声明一个 python class 代表 my_type
:
# 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
。
假设我有以下 my_type 和 my_type_tab 作为 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_tab并将其传递给my_procedure?在我的场景中,我可以有一个或数百个 my_type 行,这是迄今为止处理这种场景的最简单方法。
如何声明一个 python class 代表 my_type
:
# 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
。