使用 cx_Oracle 从引用游标检索列名

2023-12-31

在使用 cx_Oracle 调用一个简单的存储过程时,我可以轻松地从该过程中获取数据,如下所示:

db = db_class() #Sets up stuff, etc.
conn = db.connect() #Returns a connection to the database

cursor = conn.cursor()
l_results = cursor.var(cx_Oracle.CURSOR)

res = cursor.callproc("PROG.DATA.GET_EVENTS", [1,2,l_results]) 
#params = siteID, userID, ref cursor

res[2]最终成为某种可枚举的,我可以像这样轻松地迭代:

data = [row for row in res[2]]

我最终得到了一个列表/元组列表,它为我提供了值,但我还需要列名。我尝试过以下方法:

cols = cursor.description if cursor.description is not None else [] #Returns None
cols = res[2].description if res[2].description is not None else [] 
#Returns an error. Same if l_results is used instead

如何从 l_results 中获取列名?我已经确定 l_results 是一个 Variable 对象而不是游标,所以它不起作用。与 res[2] 相同。但我就是无法从 curs 中获取列。

后面的 curs.description 似乎是 None 值,而它应该是 7 项元组的列表

我到底错过了什么?


编辑1:我尝试将其更改为callproc到以下。同样的问题。

res = cursor.execute("BEGIN PROG.DATA.GET_EVENTS(:1,:2,:3); END;", {"1": 1,"2": 2,"3":, l_results})
cols = cursor.description #Returns None, again.

该调用确实返回数据,所以我不确定为什么description没有被设置。


参考光标的列可以从参考光标本身确定。给定如下的过程:

create or replace procedure so50399550 (
    a_Input1            number,
    a_Input2            number,
    a_Output            out sys_refcursor
) is
begin
    open a_Output for
    select a_Input1 as num, a_Input1 * a_Input1 as square from dual
    union all
    select a_Input2, a_Input2 * a_Input2 from dual;
end;
/

Python代码可以如下:

refCursorVar = cursor.var(cx_Oracle.CURSOR)
cursor.callproc("so50399550", [1, 2, refCursorVar])
refCursor = refCursorVar.getvalue()
print("Rows:")
for row in refCursor:
    print(row)
print()
print("Column Info:")
for column in refCursor.description:
    print(column)
print()

但是,您可以使用以下代码更简单地完成此操作。您不必实际创建变量。您可以直接绑定光标。

refCursor = conn.cursor()
cursor.callproc("so50399550", [1, 2, refCursor])
print("Rows:")
for row in refCursor:
    print(row)
print()
print("Column Info:")
for column in refCursor.description:
    print(column)
print()

可以找到样本here https://github.com/oracle/python-cx_Oracle/blob/main/samples/ref_cursor.py.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 cx_Oracle 从引用游标检索列名 的相关文章

随机推荐

  • 在 tmux 下使用 $TERM='screen-256color' 时,HOME 和 END 键不起作用。为什么?

    我已经设置了 tmux TERM被设置为screen 256color正确 这工作正常 并且颜色设置正确 但是它阻止我发送HOME and END终端的密钥 而是打印为F n and H n 我应该补充一点 home 似乎可以在 irssi
  • 支持 IE11 的 vue cli3 lib

    根据文档 https cli vuejs org guide build targets html library https cli vuejs org guide build targets html library 我不清楚如何集成
  • 在 Node WebKit 中启用触摸事件

    我使用自定义触摸屏 我想默认激活触摸事件节点 webkit https github com rogerwang node webkit 那可能吗 This one https github com rogerwang node webki
  • 如何在不看到控制台的情况下检测unity c#运行时是否有错误? [复制]

    这个问题在这里已经有答案了 是否可以在不读取控制台日志的情况下检测在 Unity 中运行的 C 脚本中的错误 当我必须构建游戏并在手机中测试它时 我需要这个 如果运行时出现错误 它将显示一个消息框来显示错误 据我了解 我们可以使用Unity
  • 如何在 .NET Core 的主布局视图中渲染特定控制器的操作?

    我正在打电话 TopNav 部分来自内部Layout主视图 I want TopNav要强类型化的视图和要在其中创建的模型TopNavController 有什么方法可以从主视图中渲染特定控制器的操作吗 所以在这种情况下我需要渲染TopNa
  • 覆盖后退按钮以充当主页按钮

    按下后退按钮后 我希望我的应用程序进入停止状态 而不是销毁状态 在安卓中docs http developer android com intl fr guide practices ui guidelines activity task
  • @WithUserDetails 似乎不起作用

    我有一个应用程序 其中使用 Spring Social Security 进行身份验证和授权 不幸的是 我在模拟 Spring Security 时遇到了一些问题 似乎根本不起作用 我有一个 REST 控制器 如果它应该返回的实体的标识符不
  • 如何使用MessageUI框架在iPhone上发送iMessage消息

    是否可以使用 iPhone 上的 MessageUI 框架从应用程序内部发送消息 或者 有 iMessage 的 URL 方案吗 使用 iOS 4 您可以从应用程序内部发送电子邮件和短信 使用 MessagUI 视图控制器 由于 iOS 5
  • 用于 Java 的 ANTLR4。如何显示词法分析中的错误

    如何在词法分析过程中显示错误列表 如果有 我尝试了以下方法 但我的输出是 org antlr v4 runtime ConsoleErrorListener 1026c84c 我写的代码 private static String erro
  • 开源 php docx 到 pdf 转换?

    是否有任何开源 PHP 工具可以用来将 doc docx 转换为 pdf 如果您有任何好的教程或工具 将不胜感激 我正在研究 phpLiveDocx 但看起来他们按月收费 或者也许是 php 或 linux 中的 odt 到 pdf 尝试
  • Oracle 10g 上的独占表(读)锁?

    有没有办法在 Oracle 10g 中独占锁定表以进行读取 我对Oracle不是很熟悉 所以我问了DBA 他说在Oracle中不可能锁定一个表来读取 我实际上正在寻找类似 SQL Server TABLOCKX HOLDLOCK 提示的内容
  • 单击标签不会单击 React 中的复选框?

    我创建了一个表单 用户可以在提交表单之前选择选项 我隐藏复选框display none我正在设计
  • Pandas:填充缺失日期的数据

    假设我有下表 ProdID Date Val1 Val2 Val3 Prod1 4 1 2019 1 3 4 Prod1 4 3 2019 2 3 54 Prod1 4 4 2019 3 4 54 Prod2 4 1 2019 1 3 3
  • 调用其他线程调用的函数时,线程未启动

    我正在使用线程来显示进度窗口 同时执行耗时的操作 for 循环 在该操作之后 我想停止线程 但是该方法 显示进度对话框 没有被调用 我在其他事件中使用相同的方法 效果很好 下面是代码 Private Sub TSBRSToLoc Click
  • sort/2、keysort/2 与 samsort/3、predsort/3

    ISO Prolog 提供sort 2 and keysort 2它依赖于术语顺序 7 2 通常称为 标准术语顺序 以不同顺序对列表进行排序的常见方法是映射每个元素El以某种方式将该列表转换为成对列表XKey El然后对该列表进行排序 最后
  • 用于多级查询的动态 Linq 表达式

    我想动态构建以下 Linq 表达式 我遇到的问题是我无法构建表达式树来容纳复杂的 Select Any 语句 我读过 为了使用方法 您实际上必须调用该方法 如下所示 Invoke Any 我需要动态构建的表达式 Expression
  • SVN:如何使用 subversion 使文件只读?

    我正在开发一个在 SVN 存储库中管理的大型 Web 项目 每次团队成员签出项目 或者我们在新的生产服务器上签出项目时 我们都必须修改该服务器的自定义配置文件 我有一个受修订控制的 config ini base 文件 我们不断更新最新的设
  • 如何在调整窗口大小时自动调整 BorderPane 上按钮的大小?

    我的 Java 水平为中级 对 JavaFX 还很陌生 我正在开发一个在 JavaFX 8 中使用 BorderPane 的应用程序 BorderPane 的底部有两个按钮 我想将按钮放置 对齐 BorderPane 底部的中心 但不知道执
  • jqGrid 树形网格与寻呼机

    我们如何使用 jqGrid 与寻呼机制作树形网格 我已经检查并尝试了演示 但它没有显示任何寻呼机 即使代码中有一个寻呼机 div 如何创建寻呼机 树形网格有一些局限性 有记录的 http www trirand com jqgridwiki
  • 使用 cx_Oracle 从引用游标检索列名

    在使用 cx Oracle 调用一个简单的存储过程时 我可以轻松地从该过程中获取数据 如下所示 db db class Sets up stuff etc conn db connect Returns a connection to th