【问题标题】:Accessing to OUT parameter (t_cursor type) from stored procedure using go and InstantClient使用 go 和 InstantClient 从存储过程访问 OUT 参数(t_cursor 类型)
【发布时间】:2020-09-15 09:54:23
【问题描述】:

我正在处理一个 Oracle DB,通过 InstantClient(版本 11)(https://github.com/mattn/go-oci8)从 go 连接。我需要能够加载这个对象并浏览结果... t_cursor 输出参数。

我尝试了很多策略,我知道如何将函数参数映射到 go 结构,但我不知道如何使用 t_cursor 类型,因为它似乎没有在 InstantClient 中实现

存储过程示例

create or replace procedure EXAMPLE(a IN NUMBER, b IN NUMBER, c OUT T_CURSOR) AS BEGIN

[编辑] 我们还尝试从代码中执行 SQL 块来尝试处理第三个参数。

如果你添加类似的东西

declare
  c t_cursor;
begin
  EXAMPLE(:1, :2, c)
end

那我不知道怎么让block返回一个包含游标的结果集。

declare
  c t_cursor;
begin
  EXAMPLE(:1, :2, c)
  select 1, c from dual
end

返回该选择结果的整个块是理想的,但 oracle 块不返回结果集 afaik。

有谁可以解决这个问题?

非常感谢

【问题讨论】:

  • 貌似支持is there。你挖到了吗?
  • 谢谢@kostix,但该补丁仅适用于 aresultset 中返回的游标,但此问题的存储过程不返回任何行...它只有一个 OUT 参数,此补丁似乎没有能够处理它
  • 那么是否可以围绕调用此 SP 编写 SQL 脚本?我的意思是把它变成一个声明一个变量的查询,执行 SP 然后在返回的游标上运行SELECT
  • 这是另一种可能的策略,但已经尝试过,而且似乎几乎不可能得到结果。我只是用那个扩展了原来的问题。非常感谢。
  • FWIW,godror 驱动有一个例子TestCallWithObject()github.com/godror/godror/blob/v0.20.0/…

标签: database oracle go cursor


【解决方案1】:

可以用驱动https://github.com/rana/ora代替。

当使用接受 OUT SYS_REFCURSOR 的存储过程进行准备时,*Rset 可以传递给 Stmt.Exe

README.me 甚至有那个确切的例子。

注意事项:

  1. 不清楚是否可以使用 database/sql 接口,或者您仅限于 lib 特定的 API。
  2. Instant Client 仅限于从 12.1.0.1.0 开始的版本。

【讨论】:

  • rana 驱动程序已死 - 它的最终维护者继续创建和维护godror driver
猜你喜欢
  • 2019-06-09
  • 2018-09-19
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多