【发布时间】:2019-09-10 01:44:30
【问题描述】:
我正在尝试使用 Python 和 cx_Oracle 从旧版 Oracle 函数中读取数据。该函数有这样的声明:
在 ITEM_PACKAGE 中:
FUNCTION get_item (p_itemName IN item.item_name%TYPE)
RETURN item%ROWTYPE;
该函数从 ITEM 表中返回一行,如下所示:
TABLE ITEM_SCHEMA.ITEM {
ITEM_ID NUMBER(*,0) NOT NULL,
CREATON_DATE DATE NOT NULL,
DESCRIPTION VARCHAR2(4000),
…
}
我正在尝试使用 cx_Oracle 来调用函数如下:
return_type = connection.gettype('ITEM_SCHEMA.ITEM%ROWTYPE')
params = ['my_item_name']
cursor = connection.cursor()
result = cursor.callfunc('ASCHEMA.ITEM_PACKAGE.get_item', return_type, params)
导致:
Exception: Varaible_TypeByPythonType(): unhandled_data_type
我还尝试为 ROWTYPE 调用 cursor.var():
return_type = cursor.var(connection.gettype('ITEM_SCHEMA.ITEM%ROWTYPE'))
导致:
cx_Oracle.NotSupportedError: Varaible_TypeByPythonType(): unhandled_data_type
有没有人举例说明如何使用 cx_Oracle 调用返回 %ROWTYPE 的函数?
我是 cx_Oracle 的新手,并且成功地调用了返回简单类型(如 cx_Oracle.STRING,甚至 cx_Oracle.CURSOR)的存储过程,但我不知道如何处理 %ROWTYPE。
编辑:看到帖子:cx_Oracle: Using PL/SQL RECORD types as arguments to stored procedures
尝试在“cx_type”上调用 newobject(),不高兴。
编辑:在原始帖子中,我调用 cursor.callproc() 而不是 cursor.callfunc()
编辑:我看到了How to get custom object from callfunc in cx_Oracle?
它说“绑定 Oracle 对象的能力仅在 cx_Oracle 的未发布(开发)版本中可用”。我现在使用的是最新的 cx_oracle 版本 7.2.2。 7.2.2版应该支持这个吧?
【问题讨论】:
-
你试过用 callfunc 代替 callproc 吗?看起来你正在调用一个函数,所以它返回了一些东西。
-
天啊,脸!我已经使用存储过程很长时间了,以至于我没有注意到在这种情况下我正在调用一个函数!感谢您注意到这一点。