带有光滑的 Oracle ref 游标

Posted

技术标签:

【中文标题】带有光滑的 Oracle ref 游标【英文标题】:Oracle ref cursor with slick 【发布时间】:2014-01-29 01:16:17 【问题描述】:

全部。

我们有一个返回引用游标的 Oracle 包:

        CREATE OR REPLACE PACKAGE BODY sandbox AS
          FUNCTION my_function (text VARCHAR2) RETURN result_cv IS result result_cv;
            BEGIN
              OPEN result FOR SELECT MLS_SID FROM MLS;
              RETURN result;
            END;
        END sandbox;

我正在使用以下 scala 代码调用该函数:

lazy val database = Database.forDataSource(DB.getDataSource())
database withSession 
  val x = sql"select sandbox.my_function($text) from DUAL".as[(Int)]
  x foreach (x => println(x))
  Ok(String.valueOf(x.first))

代码失败并出现以下错误:

[SQLException:无效的列类型:getInt 没有为类 oracle.jdbc.driver.T4CResultSetAccessor 实现]

当我只使用函数中的 select 语句 (SELECT MLS_SID FROM MLS;) 时,SQL 语句有效,但是当我将它作为引用游标打开并返回引用游标时,它会失败。我查看了 T4CResultSetAccessor,它只有一个方法 getBytes()。

谁能提供有关如何使用 Oracle 函数调用和引用游标来完成这项工作的建议?提前致谢。

-帕特里克

【问题讨论】:

您不能以这种方式使用查询。你必须制作一个 PL/SQL 来调用你的函数。不知道如何在光滑的情况下做到这一点。示例执行? := 调用 yourpackage.function 我建议将此函数转换为带有 OUT 参数的 ref 游标的过程。从 slick 调用这个存储过程,必须有一些方法可以做到这一点。谷歌它! 我试过了? = 调用创建本质上是一个 2 参数语句,巧妙地将第一个参数设置为 $text,然后它错误地显示“IN/OUT 参数 2 未设置” 如果您重复发布,请交叉链接。 groups.google.com/forum/#!topic/scalaquery/7uPwCYENjLA 我删除了我的答案。您的 SQL 字符串是正确的。不过,我不知道如何用 Slick 做到这一点...... 【参考方案1】:

Frome Typesafe:

Slick 目前不支持 OUT 参数(你会 需要正确返回一个引用光标)。如果您只需要光标 要从您的存储过程中返回,我建议使用该方法 在 SO 帖子中推荐:将结果集提升到顶层 桌子()。这对您的用例有用吗?

所以我们的解决方案是这样做:

SELECT * FROM TABLE(my_function('text'))

我们遇到了一个错误,但这是 Lucas 和 Typesafe 的建议

【讨论】:

以上是关于带有光滑的 Oracle ref 游标的主要内容,如果未能解决你的问题,请参考以下文章

如何实现Oracle数据库中的动态游标

Oracle 游标简介

oracle游标的使用

DB2与oracle游标定义的区别

oracle 游标简单示例

用于动态查询的 Oracle 游标