【问题标题】:How to read user defined types from Oracle using cx_Oracle in Python如何在 Python 中使用 cx_Oracle 从 Oracle 读取用户定义的类型
【发布时间】:2021-11-04 07:47:45
【问题描述】:

此代码有效... 它调用 oracle 函数 dbms_comparison.compare 使用输入/输出/返回参数等...

DBMS_COMPARISON.COMPARE(
  comparison_name  IN   VARCHAR2,
  scan_info        OUT  COMPARISON_TYPE,
  min_value        IN   VARCHAR2   DEFAULT NULL,
  max_value        IN   VARCHAR2   DEFAULT NULL,
RETURN BOOLEAN

调用成功

  try:
      with cx_Oracle.connect(
              config.username,
              config.password,
              config.dsn,
              encoding=config.encoding) as connection:
          with connection.cursor() as cursor:
              comparison_type = connection.gettype( "DBMS_COMPARISON.COMPARISON_TYPE")
              scan_info = cursor.var(comparison_type)

              result = cursor.callfunc("dbms_comparison.compare", bool, [comparison_name, scan_info, None, None, True])
  except cx_Oracle.Error as error:
      print(error)

我在下面这样做是为了告诉 cx_oracle 关于 out 参数 scan_info 的形状

          comparison_type = connection.gettype( "DBMS_COMPARISON.COMPARISON_TYPE")
          scan_info = cursor.var(comparison_type)

scan_info 有一个值,一切看起来都不错,见下图。

但是,我如何从 scan_info 返回值形状中检索单个值...

          TYPE COMPARISON_TYPE IS RECORD(
            scan_id            NUMBER,
            loc_rows_merged    NUMBER,
            rmt_rows_merged    NUMBER,
            loc_rows_deleted   NUMBER,
           rmt_rows_deleted   NUMBER)

我搜索了太久,找不到答案。 很奇怪,这是使用数据库函数获取/返回用户定义类型的普通操作?!

你希望结果被访问为:

scan_info.scan_id
scan_info.loc_rows_merged

但显然它没有那么简单,Oracle 文档没有提到如何做到这一点。 所以,如果你我的朋友以前做过类似的事情,请赐教。

【问题讨论】:

标签: cx-oracle


【解决方案1】:

为了访问你需要这样做的属性:

scan_info_inst = scan_info.getvalue()
print("Scan ID:", scan_info_inst.SCAN_ID)

正如克里斯所说,案件很重要!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 2014-02-15
    • 2015-04-13
    • 2012-01-08
    • 2017-03-21
    • 2021-11-25
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多