繁体   English   中英

Java命名参数的名称(用于Oracle JDBC函数结果)

[英]Java named parameter's name (for Oracle JDBC function result)

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

    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

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

手册仅描述了程序中的使用输入/输出参数,而不是函数。

Oracle版本:11.1.0.6.0 Java版本:1.6.0_14

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

            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();

CallableStatement有一堆带索引的registerXXX方法。

这就是你注册结果的方式。 参数编号为1。

在你的情况下,

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

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

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

您现有的生产线

cs.registerOutParameter(1, OracleTypes.VARCHAR);

只需要一切。 通话结束后,得到如下结果:

String result = cs.getString(1);

暂无
暂无

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

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