【问题标题】:Java named parameter's name (for Oracle JDBC function result)Java 命名参数的名称(用于 Oracle JDBC 函数结果)
【发布时间】:2011-04-11 14:57:32
【问题描述】:

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

    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

【问题讨论】:

    标签: java jdbc named-parameters


    【解决方案1】:

    CallableStatement 有一堆 registerXXX 获取索引的方法。

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

    在你的情况下,

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


    顺便说一句,由于您使用的是result 的索引,您可能需要使用面向索引的setXXX 方法并提供完整的参数列表。

    【讨论】:

    • 我在 cs.registerOutParameter(0, java.sql.Types.VARCHAR);
    【解决方案2】:

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

    您已经存在的线路

    cs.registerOutParameter(1, OracleTypes.VARCHAR);
    

    就是这样。调用后,得到如下结果:

    String result = cs.getString(1);
    

    【讨论】:

    • 我在 "cs.execute();" 上遇到异常 "The number of parameter names does not match the number of registered praremeters" on line with "cs.execute();" ....附:我只是在发布代码时忘记删除此行。
    • IIRC 你不能混合位置参数和命名参数,你似乎必须为整个语句使用位置参数,即 cs.setInt(2, ProcTypes.SELECT); cs.setLong(3, tableId);
    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2021-10-31
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多