【问题标题】:Calling a stored function from oracle DB with cx_Oracle in Python在 Python 中使用 cx_Oracle 从 oracle DB 调用存储函数
【发布时间】:2021-12-22 14:41:40
【问题描述】:

我不熟悉 PL/SQL,只是无法将有效的原始查询转换为 Python 代码。

这是原始查询:

DECLARE
  returntype MY_PKG_1.MY_DATA_TYPE;
BEGIN
  SELECT *
   BULK COLLECT INTO returntype
  FROM TABLE(MY_PKG_2.MY_FUNC(
    param_1 => 'some data',
    param_2 => 'some more data'
  ));
END;

这是一个运行良好的有效查询,我可以使用 cursor.execute() 运行它而不会出错。但是如何获取返回的行呢? 我尝试了以下方法:

returntype = connection.gettype('MY_PKG_1.MY_DATA_TYPE')
cursor = connection.cursor()
results = cursor.callfunc('MY_PKG_2.MY_FUNC', returntype, ['some data', 'some more data'])
cursor.commit()

但我收到错误“ORA-04043:对象 MY_PKG_1.MY_DATA_TYPE 不存在”。

【问题讨论】:

  • 您的 PL/SQL 块不会向调用者返回任何内容,因此没有要返回的行。是否有一些理由让您不只从 Python 代码中运行 select 语句,而不是 bulk collect?我看不到集合类型、局部变量和 PL/SQL 块正在完成什么。

标签: python oracle cx-oracle


【解决方案1】:

如果 PL/SQL 块只执行单个查询,则直接执行该查询而不使用 PL/SQL:

with connection.cursor() as cursor:
    try:
        for r in cursor.execute('SELECT * FROM TABLE(MY_PKG_2.MY_FUNC(param_1 => :p1, param_2 => :p2))', p1='some more data', p2='some data')
            print(r)
    except cx_Oracle.Error as e:
        error, = e.args
        print(error.message)
        print(sql)
        if (error.offset):
            print('^'.rjust(error.offset+1, ' '))

否则,您将不得不绑定 REF CURSOR,或使用隐式结果。请参阅 cx_Oracle 示例 ref_cursor.pyimplicit_results.py

如果您要返回集合等,那么this 会提供一些关于一般遍历它们的见解。但请查看文档以获取更简单的示例。

另请参阅tuning fetch performance 上的 cx_Oracle 文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 2021-07-30
    相关资源
    最近更新 更多