4

我将调用一个函数,并按名称设置一些参数,例如:

    Connection c = null;
    ResultSet rs = null;
    String query;
    PreparedStatement ps;
    CallableStatement cs = null;
    try {
        c = DbUtils.getConnection();
        cs = c.prepareCall("{? = call get_proc_name(?, ?) }");
        cs.registerOutParameter(1, OracleTypes.VARCHAR);
        cs.setInt("in_proc_type", ProcTypes.SELECT);
        cs.setLong("in_table_id", tableId);
        // here I should use something like cs.registerOutParameter("result", OracleTypes.VARCHAR);
        cs.execute();

PL/SQL 函数参数为:

CREATE OR REPLACE FUNCTION get_proc_name
(
  in_proc_type IN NUMBER, /*1 - insert, 2 - update, 3 - delete, 4 - select*/
  in_table_name IN VARCHAR2 := NULL,
  in_table_id IN NUMBER := NULL,
  in_table_type_id IN NUMBER := NULL,
  is_new IN NUMBER := 0
) RETURN VARCHAR2

问题是如何将result注册为out参数,然后从oracle获取到java?我可以按名称注册输入/输出参数,因为我从函数中知道它们的名称,但我不知道如何获取函数结果,使用什么变量名。

手册仅描述带有过程的输入/输出参数的使用,而不是功能。

Oracle 版本:11.1.0.6.0 Java 版本:1.6.0_14

4

3 回答 3

3

解决方案是仅对设置参数使用索引。这样的代码按预期工作(混合索引和命名参数不起作用;因此,无法解决使用命名参数作为结果变量的问题,恕我直言):

            c = DbUtils.getConnection();
            cs = c.prepareCall("{? = call get_proc_name(in_proc_type => ?, in_table_id => ?) }");
            cs.registerOutParameter(1, java.sql.Types.VARCHAR);
            cs.setInt(2, ProcTypes.SELECT);
            cs.setLong(3, tableId);
            cs.execute();
            String procName = cs.getString(1);
            cs.close();
于 2010-09-13T12:25:16.337 回答
1

CallableStatement有一堆registerXXX采用索引的方法。

这就是您注册结果的方式。它是参数号 1。

在你的情况下,

cs.registerOutParameter( 1, java.sql.Types.VARCHAR);

<SPECULATION>
顺便说一句,因为您使用的是索引result,您可能需要使用面向索引的setXXX方法并提供完整的参数列表。
</推测>

于 2010-09-13T11:31:45.830 回答
0

您将函数结果注册为第一个参数。显然,这改变了实际参数的编号。

您已经存在的生产线

cs.registerOutParameter(1, OracleTypes.VARCHAR);

就是这样。通话后,得到如下结果:

String result = cs.getString(1);
于 2010-09-13T11:44:27.857 回答