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

将变量从java传递到oracle过程时发生java.sql.SQLException,java,oracle,jdbc,plsql,ebean,Java,Oracle,Jdbc,Plsql,Ebean,当我尝试将变量传递到此过程中时: 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,

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

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;
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);
此错误出现在:

play.api.Application$$anon$1: Execution exception[[PersistenceException: java.sql.SQLException: Invalid column index
此代码调用以下过程:

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;
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);
我做错了什么?

使用绑定变量:

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);
它工作:

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;

您正在选择查询中第三列的值,该查询每行仅返回两列数据您的查询中没有任何参数占位符,因此,使用
寄存器out
将不起作用。如何添加参数占位符?不要使用字符串连接将值放入语句中,而是使用
字符来添加参数占位符(请参阅我答案的第一行)。然后可以使用
setParameter
方法指定输入值,并使用
registerOut
指定输出参数。请参阅。这就是我所做的,但错误发生您的代码没有改变任何内容,而是添加了属性[5]dt[4]data[0][java.lang.Integer]的错误。这与没有索引3和4的
setParameter
调用不同。