【问题标题】:from java how to call a stored procedure passing an oracle cursor as an argument从java如何调用存储过程,将oracle游标作为参数传递
【发布时间】:2011-06-28 14:47:26
【问题描述】:

我正在使用 Java + iBatis,并且需要调用一个将游标作为参数的 Oracle 存储过程。谷歌在查找如何调用接受游标作为来自 java 的参数的存储过程的代码示例方面并没有帮助我太多。

如何做到这一点?

分步场景:

 1. Java calls a Stored Proc passing primitives (varchar, char, etc) as
    parameters 
 2. Java retrieves the cursor returned from Step 1 
 3. Java calls a Stored Proc passing cursor from Step 2 as an argument  //how? 

【问题讨论】:

    标签: java oracle ibatis jdbc-odbc


    【解决方案1】:

    如果这些真的是唯一的步骤——即你在两次调用之间没有在 Java 中做任何重要的事情——那么对我来说完全避免返回 Java 更有意义。

    如果第一个过程实际上是一个函数,您可以简单地进行一次嵌套调用:

    BEGIN proc2(proc1(...)); END;
    

    游标在 Oracle 内部传递,根本不需要由 Java 处理。

    如果您的第一个过程是一个将光标作为 OUT 参数返回的过程,您可以为它编写一个包装函数并执行相同的操作:

    CREATE OR REPLACE FUNCTION func1(...)
      RETURN SYS_REFCURSOR
      AS
        foo SYS_REFCURSOR;
      BEGIN
        proc1(..., foo);
        RETURN foo;
      END func1;
    /
    

    那么BEGIN proc2(func1(...)); END; 应该可以工作了。

    现在,如果您确实需要在两次调用之间使用 Java,那么我会尝试在从第一个过程检索输出值时使用 OracleTypes.CURSOR,然后将该对象简单地传递给第二个过程。我不知道这是否可行;如果没有,那么可能没有直接的方法。

    【讨论】:

    • 还有更多的步骤。基本原因是步骤 1 中的 SP 驻留在一个 DB 上,而步骤 3 中的 SP 驻留在另一个 DB 上。现在我们通过 DBLink 处理这个问题,但我们正在寻找避免 DB 链接的方法。这就是为什么我们需要在框 1 上调用 SP,获取结果,然后将这些结果传递给框 2 上的 SP
    • @Omnipresent:啊,这让事情变得不同了:) 绝对没有办法将打开的游标从一个实例传递到另一个实例——游标本质上是实例内存中的一个结构。
    • 更多 我研究并发现没有任何东西让我相信这是一条糟糕的道路。谢谢
    • @omnipresent:我严重怀疑 dblink 的本土解决方法是否会比仅使用 dblink 更好。它并不完美,但在使用 dblink(事务、读取一致性、支持等)方面付出了很多努力和思考,这是您付出的一部分。同样,不是所有分布式的解决方案,但你为什么要如此努力地避免 dblinks?
    【解决方案2】:

    你不能这样做。

    传递到 Oracle 存储过程的游标表示具有只有 Oracle 才能提供的 API 的对象。您的 Java 程序对游标的了解不够,无法创建某种对象来代理它并将调用转发回 Oracle。

    您将不得不重新设计您的应用程序,以便仅从另一个存储过程调用接受输入光标的存储过程。

    【讨论】:

    • 您可以做的一件事是读取游标的数据,并将该数据作为嵌套表传递给新的存储过程,该存储过程将使用游标通过游标输入参数调用存储过程传入的数据。但这比光标从不移动到 Java 端的效率要低得多。
    • 很有趣...我会尝试说服人们改变底层架构而不是偷工减料。这就是这个解决方案的意思。
    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 2018-01-07
    • 2012-11-23
    • 1970-01-01
    • 2011-11-16
    • 2012-02-29
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多