繁体   English   中英

如何使用JDBC / Spring调用Oracle存储过程,其中一些参数类型是用户定义的?

[英]How can I call an Oracle stored procedure with JDBC/Spring where some of the parameter types are user defined?

我正在尝试从我的Java程序中调用Oracle存储过程。 我正在使用JDBC和Spring的StoredProcedure。 一些参数是用户定义的类型,我需要知道如何传递它们。

特别是我应该在参数映射中指定什么类型(即java.sql.Types.*哪一个)? 我应该使用什么Java类型? 问题类型定义如下:

type MyDoubles as varray(50000) of double precision
type MyStrings as varray(50000) of varchar2(2000)

谷歌的首次亮相似乎展示了如何绑定VARRAY类型的参数: http//www.devx.com/tips/Tip/22034 本文档中的示例使用预准备语句,但对于存储过程,它应该工作相同。

这是一个显示基本概念的摘录:

String arrayElements[] = { "Test3", "Test4" };
PreparedStatement ps =
    conn.prepareStatement ("insert into sample_varray_table values (?)");

ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRING_VARRAY", conn);
ARRAY newArray = new ARRAY(desc, conn, arrayElements);
((OraclePreparedStatement)ps).setARRAY (1, newArray);

ps.execute ();

这里要澄清一些FQDN:

  • oracle.sql.ArrayDescriptor
  • oracle.sql.ARRAY
  • oracle.jdbc.OraclePreparedStatement

为什么用户传递 50,000个双精度和字符串实例 - 所以Oracle可以执行计算?

这似乎是我的倒退。 如果用户已经拥有那一天,也许Java可以执行该计算。 如果您真的希望Oracle这样做,我会说数据应该已经驻留在数据库中而不是传入。

这两个都不是java.sql.Type.ARRAY吗?

您确实可以使用Philipp建议的Oracle JDBC驱动程序中的对象。 大多数用户最终创建实用程序方法来包装该逻辑。 或者他们使用Spring映射器类。 不过,还有很多手工工作要做。

另一种方法是使用即将发布的jOOQ版本1.5.4 - 我正在开发的开源库 - 其中数组得到统一支持。 所以当你有你的类型时:

type MyDoubles as varray(50000) of double precision
type MyStrings as varray(50000) of varchar2(2000)

然后jOOQ会生成诸如的类

public class MyDoubles extends ArrayRecordImpl<Double> { /* ... */ }
public class MyStrings extends ArrayRecordImpl<String> { /* ... */ }

您的存储过程可能如下所示:

PROCEDURE MY_PROC1 (d IN  MyDoubles, s IN  MyStrings);
PROCEDURE MY_PROC2 (d IN  MyDoubles, s OUT MyStrings);
PROCEDURE MY_PROC3 (d OUT MyDoubles, s OUT MyStrings);

并且jOOQ会生成另一个Java类,例如

public class Procedures {

    // Invoke procedure MY_PROC on JDBC Connection c with VARRAY arguments
    public static void myProc1(Connection c, MyDoubles d, MyStrings s);

    // The OUT parameter is mapped to a method return value
    public static MyStrings myProc2(Connection c, MyDoubles d);

    // MyProc3 is a wrapper for both OUT parameters
    public static MyProc3 myProc3(Connection c);
}

使用生成的代码工件,使用UDT调用存储过程,VARRAY参数就像它可以一样简单。 通过生成源代码,您可以在数据库模式中更改对象(例如,您的类型或过程),并且您的Java类将立即反映该更改。

有关详细信息,请查看http://www.jooq.org/manual/META/PROCEDURE/上的手册

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM