java.sql.SQLException同时将变量从java传递到oracle过程

Posted

技术标签:

【中文标题】java.sql.SQLException同时将变量从java传递到oracle过程【英文标题】:java.sql.SQLException while pass variable into oracle procedure from java 【发布时间】:2017-01-11 10:41:53 【问题描述】:

当我尝试将变量传递到此过程中时:

PROCEDURE REMOVAL_ATR_PR340_FR73_S1_T1(
  p_POE_STEAM_TURBINES_VID NUMBER,
  p_PERIOD_ID              NUMBER,
  p_STOP_ID                in out number,
  p_REMOVAL_LAST_YEAR      in out NUMBER
)
IS
BEGIN       
    SELECT pr.STOP_ID,
           pr.REMOVAL_LAST_YEAR
    INTO   p_STOP_ID,
           p_REMOVAL_LAST_YEAR
    FROM   FORMS fr
           LEFT JOIN PR340_FR73_S1_T1 pr
           ON pr.FORMS_ID = fr.ID
    WHERE  PERIOD_ID = p_PERIOD_ID - 1
    AND    pr.POE_STEAM_TURBINES_VID = p_POE_STEAM_TURBINES_VID;
END REMOVAL_ATR_PR340_FR73_S1_T1;

出现此错误:

play.api.Application$$anon$1: Execution exception[[PersistenceException: java.sql.SQLException: Invalid column index

这段代码调用过程:

String sql = "call REA.FILL_EVENT.REMOVAL_ATR_PR340_FR73_S1_T1("  + doc.poeSteamTurbine.vid + "," + doc.form.periodId +"," + 0 +  "," + 0 +")  ";
    CallableSql cs = Ebean.createCallableSql(sql);
    cs.registerOut(3, Types.INTEGER);
    cs.registerOut(4, Types.INTEGER);
    Ebean.execute(cs);
    Integer retValue = (Integer) cs.getObject(3);

我做错了什么?

【问题讨论】:

您在查询中选择第三列的值,每行只返回两列数据 您的查询中没有任何参数占位符,因此使用registerOut 将不起作用。 如何添加参数占位符? 不要使用字符串连接将值放入语句中,而是使用? 字符来添加参数占位符(请参阅我的答案的第一行)。然后您可以使用setParameter 方法指定输入值并使用registerOut 指定输出参数。请参阅documentation。 我就是这样做的,但是出现了错误 【参考方案1】:

使用绑定变量:

String sql = "call REA.FILL_EVENT.REMOVAL_ATR_PR340_FR73_S1_T1(?,?,?,?)  ";
CallableSql cs = Ebean.createCallableSql(sql);
cs.setParameter(1,doc.poeSteamTurbine.vid);
cs.setParameter(2,doc.form.periodId);
cs.setParameter(3,0);
cs.registerOut(3, Types.INTEGER);
cs.setParameter(4,0);
cs.registerOut(4, Types.INTEGER);
Ebean.execute(cs);
Integer retValue = (Integer) cs.getObject(3);

【讨论】:

您的代码没有改变任何东西,但添加了错误 Error with property [5] dt [4] data [0] [java.lang.Integer]【参考方案2】:

它工作:

String sql = "call REA.FILL_EVENT.REMOVAL_ATR_PR340_FR73_S1_T1(?,?,?,?)  ";
        CallableSql cs = Ebean.createCallableSql(sql);
        cs.setParameter(1,doc.poeSteamTurbine.vid);
        cs.setParameter(2,doc.form.periodId);
        cs.registerOut(3, Types.INTEGER);
        cs.registerOut(4, Types.INTEGER);
        Ebean.execute(cs);
        doc.prevStopId = (Integer) cs.getObject(3);
        doc.prevRemovalLastYear = (Integer) cs.getObject(4);
        return doc;

【讨论】:

这与answer by MT0 没有什么不同,除了没有那些setParameter 对索引3 和4 的调用。

以上是关于java.sql.SQLException同时将变量从java传递到oracle过程的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid parameter binding(s)

java.sql.SQLException:getShort() 的值无效 - ''

java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭

Oracle DB:java.sql.SQLException:关闭连接

连接mysql客户端报错: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password

SPRING BATCH:嵌套异常是java.sql.SQLException:ORA-08177:无法序列化此事务的访问权限