【问题标题】:Python cx_Oracle call function that returns %ROWTYPE返回 %ROWTYPE 的 Python cx_Oracle 调用函数
【发布时间】: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 吗?看起来你正在调用一个函数,所以它返回了一些东西。
  • 天啊,脸!我已经使用存储过程很长时间了,以至于我没有注意到在这种情况下我正在调用一个函数!感谢您注意到这一点。

标签: python cx-oracle


【解决方案1】:

这个sample 应该可以帮助你弄清楚如何去做。 table%rowtype 是 PL/SQL 记录,因此必须作为对象处理。如果这没有帮助,请提供您用于调用存储过程的完整代码以及存储过程的定义。

【讨论】:

  • 感谢 Anthony 的回复,但我认为我正确调用了 cursor.callfunc(),但它一直在抛出异常 Variable_TypeByPythonType(): unhandled data type。我还需要为 ROWTYPE 做些什么吗?
  • 您使用的是什么版本的 cx_Oracle?版本 7.1.2 引入了调用函数的能力,就像您在上面的代码中一样。在此之前,您必须改为创建一个变量,或者使用匿名 PL/SQL 块并自己直接执行绑定。
  • 我有cx_oracle 6.0.2版本,我会努力更新的,谢谢。
  • 我使用 cx_oracle 7.2.2、python 3.6 和 CentOS 7 重新构建了 docker 映像。不幸的是,我仍然遇到同样的错误。有没有使用 cx_oracle 调用带有 rowtype 对象的函数的例子?
  • 我提供的样本应该会有所帮助,但没有您要求的直接样本。请在 cx_Oracle 上发布请求此问题的问题(并链接回此处),我会在几周后从会议回来时考虑添加这样的示例。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2022-07-21
  • 2014-11-23
相关资源
最近更新 更多