如何将数组对象传递给oracle存储过程?

问题描述 投票:0回答:1

如何传递数组对象?

这里我使用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 oracle plsql python-oracledb
1个回答
0
投票

数据库中列的数据类型是不是数组;它是一个物体。因此,你不想从 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"),
)

注意:这未经测试,因为我没有您的表格或程序来测试,但您应该了解如何实现它的一般概念。

© www.soinside.com 2019 - 2024. All rights reserved.