【问题标题】:how to call stored function of IN and OUT parameter in Oracle Database using Java如何使用Java调用Oracle数据库中IN和OUT参数的存储函数
【发布时间】:2013-09-21 10:26:34
【问题描述】:
public String getObjectDetails(String buffer) {
        dbcon con = new dbcon();        
        ResultSet rs = null;
        String name_msg=null;
        String type_msg=null;
        int type_code=0;
        int name_code=0;
        try {
            rs = con.dbstate().createStatement().executeQuery("SELECT pkg_test1.get_object_type('"+buffer+"',"+type_code+",'"+type_msg+"'),pkg_test1.get_object_name('"+buffer+"',"+name_code+",'"+name_msg+"') from dual");
            if (rs.next()) {
                return rs.getString(1) + "," + rs.getString(2);
            }
        } catch (SQLException ex) {
            Logger.getLogger(username.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }

而且,我正在尝试从 PKG_TEST1 包中声明的这两个函数获取信息

FUNCTION get_object_type(i_buffer IN VARCHAR2, o_errcode OUT NUMBER,
                           o_errmsg OUT VARCHAR2) RETURN VARCHAR2;

  FUNCTION get_object_name(i_buffer IN VARCHAR2, o_errcode OUT NUMBER,
                           o_errmsg OUT VARCHAR2) RETURN VARCHAR2;

但是,我遇到了错误

java.sql.SQLException: ORA-06572: Function GET_OBJECT_NAME has out arguments

请帮我解决这个问题。

【问题讨论】:

  • 调用存储过程和执行SQL不同,请看docs.oracle.com/javase/tutorial/jdbc/basics/…必须注册出params。
  • @home 但这不是程序,这是功能,据我所知,它们是不同的。
  • 为什么要在函数中输出参数,我认为那是不好的风格。您应该使用存储过程。当你拥有所有 IN 参数时,函数通常是有意义的,然后函数对 IN 参数和返回值进行一些计算。

标签: java sql oracle function package


【解决方案1】:

试试这个

    CallableStatement c = conn.prepareCall("{? = call get_object_type(?, ?)}");
    c.registerOutParameter(1, Types.VARCHAR);
    c.registerOutParameter(3, Types.VARCHAR);
    c.setString(2, buffer);
    c.execute();
    String res = c.getString(1);
    String err = c.getString(3);

【讨论】:

    【解决方案2】:

    这对我有用,感谢@home 向我推荐了好的链接。

    String call = "{ ? = call pkg_test1.get_object_type(?,?,?)}";
    CallableStatement cstmt = con.dbstate().prepareCall(call);
     cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.VARCHAR);
    cstmt.setString(2, buffer);
    cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
    cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
    cstmt.executeQuery();
    String type = cstmt.getString(1);
    

    这里解释得很好:How to Call Strored Procedure and Function

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 2021-11-19
      • 1970-01-01
      • 2020-09-22
      • 2021-05-18
      • 2013-04-24
      • 2019-04-26
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多