如何传递数组对象?
这里我使用Oracledb库通过Python连接了Oracle DB
#数据库连接
connection = oracledb.connect(user="hr", password=userpwd,dsn="dbhost.example.com/orclpdb")
#cursor object
cursor = connection.cursor()
#声明一个输出变量
out_values = cursor.var(int)
这里我需要将值传递给oracle存储过程
array_values = ['u','U','G']
cursor.callproc('schema.pkg.get_prc',[array_values ,9713979, '2', '2', 'N'])
上面的array_values我需要传递数组对象。如何传递数组对象?
“errorMessage”:“ORA-06550:l:调用“get_prc”时参数数量或类型错误
下面是存储过程
**schema.pkg.get_prc**(pt_enrol_data IN tb_enrol_matching,
p_enrol_log_id IN NUMBER,
p_columns IN VARCHAR2,
p_dynamic_columns IN VARCHAR2)
CREATE OR REPLACE TYPE schema.tb_enrol_matching
IS OBJECT
Email VARCHAR2(4000),
Forename VARCHAR2(4000),
Lastname VARCHAR2(4000),);
如何传递数组对象并调用存储过程我不知道问题是什么,我相信。预先感谢。`
数据库中列的数据类型是不是数组;它是一个物体。因此,你不想从 python 传递数组;你想传递一个对象。 请参阅
“7.12.使用输入类型处理程序更改绑定数据类型”文档# A standard Python object
class Building:
def __init__(self, build_id, description, num_floors, date_built):
self.building_id = build_id
self.description = description
self.num_floors = num_floors
self.date_built = date_built
building = Building(1, "Skyscraper 1", 5, datetime.date(2001, 5, 24))
# Get Python representation of the Oracle user defined type UDT_BUILDING obj_type = con.gettype("UDT_BUILDING")
# convert a Python Building object to the Oracle user defined type
# UDT_BUILDING def building_in_converter(value):
obj = obj_type.newobject()
obj.BUILDINGID = value.building_id
obj.DESCRIPTION = value.description
obj.NUMFLOORS = value.num_floors
obj.DATEBUILT = value.date_built
return obj
def input_type_handler(cursor, value, num_elements):
if isinstance(value, Building):
return cursor.var(obj_type, arraysize=num_elements,
inconverter=building_in_converter)
# With the input type handler, the bound Python object is converted
# to the required Oracle object before being inserted cur.inputtypehandler = input_type_handler cur.execute("insert into
myTable values (:1, :2)", (1, building))
更改
Building
以匹配
TB_ENROL_MATCHING
的结构:class EnrolMatching:
def __init__(self, email, forename, lastname):
self.email = email
self.forename = forename
self.lastname = lastname
obj_type = con.gettype("TB_ENROL_MATCHING")
def enrol_matching_in_converter(value):
obj = obj_type.newobject()
obj.EMAIL = value.email
obj.FORENAME = value.forename
obj.LASTNAME = value.lastname
return obj
def input_type_handler(cursor, value, num_elements):
if isinstance(value, EnrolMatching):
return cursor.var(obj_type, arraysize=num_elements,
inconverter=enrol_matching_in_converter)
cursor.inputtypehandler = input_type_handler
cursor.callproc(
"schema.pkg.get_prc",
(EnrolMatching("u", "U", "G"), 9713979, "2", "2", "N"),
)
注意:这未经测试,因为我没有您的表格或程序来测试,但您应该了解如何实现它的一般概念。