【问题标题】:cx_Oracle: Using PL/SQL RECORD types as arguments to stored procedurescx_Oracle:使用 PL/SQL RECORD 类型作为存储过程的参数
【发布时间】:2017-07-29 03:29:14
【问题描述】:

我正在尝试从 cx_Oracle 调用 AP_VENDOR_PUB_PKG.CREATE_VENDOR(这是一个 Oracle R12 存储过程)它需要一个预定义的 PL/SQL RECORD 类型的参数。 (AP_VENDOR_PUB_PKG.R_VENDOR_REC_TYPE)

这是我的python代码:

connection = cx_Oracle.connect(...)
cursor = connection.cursor()
obj = cursor.var(cx_Oracle.Object,                              
                              typename='AP_VENDOR_PUB_PKG.R_VENDOR_REC_TYPE')
result = cursor.callproc('AP_VENDOR_PUB_PKG.CREATE_VENDOR',
                         parameters=["1.0", "T", "T", 
                                     "fnd_api.g_valid_level_full", obj])

这会导致以下异常:

cx_Oracle.InterfaceError: object type not associated with bind variable

我做错了什么?如何调用需要记录类型的存储过程?

【问题讨论】:

  • 听起来参数不像是一个对象。您是否尝试过 cx_Oracle.STRING 作为数据类型?此外,这可能是因为我使用的是 Oracle 11g 或因为 cx_Oracle 5.2.1,但我收到一条错误消息,指出 Object 不是 Cx_Oracle 的属性。也许你打算输入 OBJECT 但没有写。如果是这种情况,请修正您的示例。
  • 谢谢你,@TylerChristian。我在下面回答了我自己的问题。不幸的是,我现在收到PLS-00306: wrong number or types of arguments in call to 'CREATE_VENDOR',但这是另一个问题的问题:)

标签: python oracle cx-oracle


【解决方案1】:

我已经能够通过使用解决这个问题

type_obj = connection.gettype('AP_VENDOR_PUB_PKG_R_VENDOR_RE')
obj = type_obj.newobject()

请注意,名称限制为 29 个字符,句点 (.) 已替换为下划线 (_)

【讨论】:

  • 来自 Oracle 12.2 文档的仅供参考:“对于大多数标识符,标识符的最大长度增加到 128 字节,而之前版本中的长度为 30 字节。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 2017-02-18
相关资源
最近更新 更多