首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL : 17041,缺少索引处的输入或输出参数::3

SQL : 17041,缺少索引处的输入或输出参数::3
EN

Stack Overflow用户
提问于 2017-12-14 18:59:26
回答 1查看 187关注 0票数 0

嗨,我的java代码与oracle服务器通信时遇到了一个特定的问题。

我正在oracle中执行一个调用,以便使用存储过程检索数据。这是我的决定。

代码语言:javascript
复制
String procedure = "{call " + instnace+ "." + package+ "." + "GetRequestData(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)" + "}";

这个存储的Proecudre接收两个值,COD_AREA和TELEFONO,然后返回18个值。

代码语言:javascript
复制
try{            
    pstmt.setString(1, RQ.getCOD_AREA());
    pstmt.setString(2, RQ.getTELEFONO());//TELEFONO()               
    pstmt.executeQuery();               
        int o_requestid= (pstmt.getInt(3));
        RP.setO_requestid(String.valueOf(o_requestid));
        RP.setO_requestdate(pstmt.getString(4));
        RP.setO_requesterid(pstmt.getString(5));
        RP.setO_requesterfirstname(pstmt.getString(6));
        RP.setO_requesterlastname(pstmt.getString(7));
        RP.setO_requestercompanyname(pstmt.getString(8));
        RP.setO_requesterclassname(pstmt.getString(9));
        RP.setO_requesteremail(pstmt.getString(10));
        RP.setO_address1(pstmt.getString(11));
        RP.setO_address2(pstmt.getString(12));
        RP.setO_city(pstmt.getString(13));
        RP.setO_state(pstmt.getString(14));
        int o_autoinstall= (pstmt.getInt(15));
        RP.setO_autoinstall(String.valueOf(o_autoinstall));
        RP.setO_plandesired(pstmt.getString(16));
        RP.setO_riskanalisis(pstmt.getString(17));
        RP.setO_status(pstmt.getString(18));
        int n_error= (pstmt.getInt(19));
        RP.setN_error(String.valueOf(n_error));     
        RP.setStr_error(pstmt.getString(20));           
    CerrarConexion(conn);
}   

我所犯的错误是:SQL Exception executeQuery: 17041, Missing IN or OUT parameter at index:: 3,为什么我要这样做?我在堆栈溢出和其他站点上搜索,但它与插入和更新有关,但与存储过程无关。如果有人能帮我解决这个问题我很感激。

这是我的beginConnection方法:

代码语言:javascript
复制
private OracleCallableStatement beginConnection(String firmaSP) throws SystemException, Exception {

    OracleCallableStatement pstmt = null;
    // Se obtiene la conexion a la BD
    conn = Conexion.getConnection(infoGenerico, 0);
    pstmt = (OracleCallableStatement) conn.prepareCall(firmaSP);
    return pstmt;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-14 19:07:54

看上去你的参数是IN的,至少是IN的。对于需要调用的存储过程,您应该使用CallableStatement,而不是PreparedStatement,我假设您使用的是基于变量名称pstmt的存储过程。CallableStatement允许您返回值。

然后,对于期望返回值的每一个参数( it ),在使用 method执行OUT参数之前,必须先用execute()注册out参数。

将序号位置parameterIndex中的OUT参数注册到JDBC。必须在执行存储过程之前注册所有OUT参数。

例如:

代码语言:javascript
复制
cstmt.registerOutParameter(3, Types.Integer);

在Java 8中,类型参数需要一个SQLType而不是一个int

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47820371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档