Java에서 저장 프로 시저를 실행하여 간단한 RPGLE 프로그램을 호출 할 때 오류가 발생했습니다 DB2 (System I 탐색기)에서 SP를 실행하면 성공합니다 또는 만약 내가 rpgle 프로그램을 실행하면 as400 return ok이지만 SP가 Java에서 실행될 때 첫 번째 실행은 ok입니다. 두 번째 실행은 오류를 반환합니다 (CEE9901 - 응용 프로그램 오류. * N 명령문에서 * N에 의해 모니터되지 않음). '4000) 그리고 나는 이유를 모른다. 누군가 나를 도울 수 있습니까?Java에서 외부 저장 프로 시저 (RPGLE/AS400) 호출 오류 CEE9001
이 SP
CREATE PROCEDURE WOOLB3.SP806012 (
IN TRAMA CHAR(62) ,
INOUT RPTA CHAR(1) ,
INOUT VALOR CHAR(15))
LANGUAGE RPGLE
SPECIFIC WOOLB3.SP806012
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME 'WOOLB3/IR806012'
PARAMETER STYLE GENERAL ;
GRANT ALTER , EXECUTE
ON SPECIFIC PROCEDURE WOOLB3.SP806012
TO GRPAYP ;
GRANT ALTER , EXECUTE
ON SPECIFIC PROCEDURE WOOLB3.SP806012
TO GRPCAL ;
GRANT ALTER , EXECUTE
ON SPECIFIC PROCEDURE WOOLB3.SP806012
TO PUBLIC ;
GRANT ALTER , EXECUTE
ON SPECIFIC PROCEDURE WOOLB3.SP806012
TO QPGMR ;
JAVA
Connection conn = null;
CallableStatement cs = null;
StringBuffer sbSQL = new StringBuffer();
String valor = "";
try {
log.info("Inicio-->SP806012");
conn = ResourceManager.getConnection(JNDIContext.JNDI_DATASOURCE_MCD);
String esquema = FrameworkParameters.getValue(MCDConstant.ESQUEMA_RPG);
sbSQL.append("{CALL ").append(esquema);
sbSQL.append(".").append(MCDConstant.SP_OBTIENE_VALOR_CUOTA).append("(?,?,?)}");
cs = conn.prepareCall(sbSQL.toString());
System.out.println(trama);
cs.setString(1, trama);
cs.setString(2, MCDConstant.VACIO);
cs.setString(3, MCDConstant.VACIO);
cs.registerOutParameter(2, java.sql.Types.VARCHAR);
cs.registerOutParameter(3, java.sql.Types.VARCHAR);
cs.execute();
if (cs.getString(2).equals(MCDConstant.STRING_UNO)){
valor = (String)cs.getString(3).trim();
}
log.info("Fin-->SP806012");
} catch (SQLException e) {
e.printStackTrace();
throw new DAOException(e.getMessage(), e);
} catch (Exception e) {
e.printStackTrace();
throw new DAOException(e);
} finally{
ResourceManager.callableStatementClose(cs);
cs = null;
ResourceManager.connectionClose(conn);
conn = null;
}
return valor;
RPGLE 내 코드입니다
z-add *zeros v_cuota 11 2
z-add *zeros v_mdiferi 1 0
move '0' v_mdiferi 1
move *blanks p_fecvcto 8
eval ds_tarjeta = %trim(p_tarjeta)
k_cs01p chain cs01pr 70
70 eval socic = ''
EXSR sr_ObtRelDif
eval p_fecvcto = fePROXVENC1(ds_tarjeta:v_mdiferi)
eval v_cuota = fegetcuota(p_ncuota:p_fcompra:
p_fecvcto:p_capital:p_tea:socic)
v_cuota ifgt *zeros
movel '1' p_rpta
endif
move v_cuota p_valor
작업 기록부에 대한 Jairo의 요청이 처음부터 좋습니다. CEE9001 예외는 오류 (최소한 하나 이상)가 발생했음을 나타내며 더 깊은 소스에서 자세한 오류 메시지를 찾으려면 로그를 검토해야합니다. DB2 사용자에 대해 WRKOBJLCK를 실행하여 해당 사용자에 대한 서버 작업 인스턴스를 찾을 수 있습니다 (오류가 발생한 후에도 여전히 남아있는 경우). – user2338816