2014-09-08 6 views
2

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       
+1

작업 기록부에 대한 Jairo의 요청이 처음부터 좋습니다. CEE9001 예외는 오류 (최소한 하나 이상)가 발생했음을 나타내며 더 깊은 소스에서 자세한 오류 메시지를 찾으려면 로그를 검토해야합니다. DB2 사용자에 대해 WRKOBJLCK를 실행하여 해당 사용자에 대한 서버 작업 인스턴스를 찾을 수 있습니다 (오류가 발생한 후에도 여전히 남아있는 경우). – user2338816

답변

0


무척 루이 백분율 케 pegaras ACA 엘 작업 로그 completo 델 trabajo. WRKOBJLCK USUARIO_DE_JAVA * USRPRF를 방문한 경우 버스 정류장에서 오류가 발생하여 해당 오류가 발생했습니다. Slds.

+0

답변을 주셔서 감사합니다. jairo.could. Stored procedure 관련 작업을 찾는 방법을 알려주십시오. –

+0

더 빠른 방법은 생성 된 * pgm을 찾은 다음 절차 시작 부분에 서비스 진입 점을 설정하는 것입니다. 녹색 화면에서 STRDBG storeprocedure_lib/storeprocedure_pgm 다음 number_of_first_executable_line_of_code 다음 가 네비게이터와 저장 프로 시저 을 실행하기 위해 이동 sbreak 다음 디버깅 대기, 작업 데이터와 메시지가 있어야한다 녹색 화면으로 돌아갑니다. –