2017-01-31 5 views
2

도미노 서버에서 as400 시스템에 대한 ODBC 연결이 있습니다. 나는 AS400에 프로그램을 실행하여 입력 매개 변수를 보낼 수 있습니다as400에 대한 callablestatement가 작동하지 않습니다.

var sql:string ="CALL QSYS.QCMDEXC('SBMJOB CMD(CALL PGM(DEMO/TESTDEMO) PARM(ABCDEF)) ',0000000048.00000)"; 
ps = con.prepareCall(sql); 
ps.execute(); 

니스, 작동하지만 지금은 다시 몇 가지 데이터를 얻을 싶습니다. 나는 내가 CallableStatement로이 작업을 수행 할 수 있다고 생각, 그래서 시도 :

연결 설정/SQL 세트/CS 세트/SQL 오류 =

var con:Connection = null; 
var cs:CallableStatement = null; 
try { 
    java.lang.Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    var con:java.sql.Connection=java.sql.DriverManager.getConnection(url,usr,pwd); 
    sessionScope.error = sessionScope.error +"connection set /"; 
    var sql:string ="CALL QSYS.QCMDEXC('CALL PGM(DEMO/TESTDEMO) (?,?))"; 
    sessionScope.error = sessionScope.error +"sql set /"; 
    cs = con.prepareCall (sql); 
    sessionScope.error = sessionScope.error +"cs set /"; 
    cs.setString (1,'test'); 
    sessionScope.error = sessionScope.error +"input param set /"; 
    cs.registerOutParameter (2, Types.VARCHAR); 
    sessionScope.error = sessionScope.error +"output param set /"; 
    cs.execute(); 
    sessionScope.error = sessionScope.error +"executed /"; 
    var retour = cs.getInt (2); 
    sessionScope.error = sessionScope.error +"output /"+retour; 
    if (cs != null) {cs.close();sessionScope.error = sessionScope.error + "/ cs closed"} 
    if (con != null) {con.close();sessionScope.error = sessionScope.error + "/ con closed"} 
    } 
catch (e){ 
    sessionScope.error = sessionScope.error+"Sql error ="+e.toString(); 
    if (cs != null) {cs.close();sessionScope.error = sessionScope.error + "/ cs closed"} 
    if (con != null) {con.close();sessionScope.error = sessionScope.error + "/ con closed"} 
    return; 
} 

이 실행

내가 오류로 얻을 java.lang.NullPointerException/cs 닫힘/닫힘

입력 매개 변수를 설정하는 데 문제가 있습니다.

답변

3

QCMDEXC를 사용하여 값을 리턴 할 수 없지만 IBM i의 모든 프로그램은 결과 세트 또는 매개 변수에서 값을 리턴 할 수있는 저장 프로시 듀어로 변환 될 수 있습니다.

CREATE PROCEDURE ASSEMBLY_PARTS (IN ASSEMBLY_NUM DEC(7,0), 
           OUT NUM_PARTS  DEC(7,0), 
           OUT COST   DEC(9,2)) 
     LANGUAGE RPG 
     PARAMETER STYLE GENERAL 
     FENCED 
     EXTERNAL NAME ASSEMBLY 

이것은 하나 개의 입력 매개 변수로 ASSEMBLY이라는 RPG 프로그램 저장 방법을 정의하고 두 개의 출력 파라미터. 다음은 SQL 참조에서 수정 된 예제입니다. https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/db2/rbafzcrtpef.htm

그런 다음 QSYS.QCMDEXC 저장 프로 시저를 호출하는 것과 비슷하게 호출합니다. 하지만 전화는 CALL ASSEMBLY_PARTS(ID, PARTS, COST)과 비슷합니다. 지금 당장 시험 할 도미노의 인스턴스가 없기 때문에 바로 지금 당장 당신에게 알려줄 수 있습니다.

+0

이 절차는 IBM i에서 수행해야합니까? 주어진 예제에서 ssjs에서 데이터를 입/출력하는 방법은 무엇입니까? –

+0

@MarcJonkers 저장된 proc는 서버의 DB2에 정의됩니다. 바라건대,이 서버는 수년 전에 AS/400을 대체 한 시스템 중 하나입니다. 실제 "AS/400"이 될만큼 오래 되었으면 SP 작성에 도움이 필요할 수 있습니다. – user2338816

+0

StackOverflow에 Nazis라는 이름이있는 것 같습니다. 'IBM i'는 AS/400에서 실행되는 운영 체제의 새 이름입니다. 이것은 OS/400과 동일하며 (개선 된) OS/400입니다. 파워 시스템 (Power Systems) 또는 퓨어 시스템 (Pure Systems)은 'AS/400'이라고 불리는 하드웨어의 새로운 이름이다. 공동체에는 명명을 둘러싼 몇 몇 사람들이 있습니다. 그러나 'OS/400'은 IBM i v7.3이 'Windows 10'에 대한 'Windows 2.0'이다. 그러나 우리는 여전히 그것을 '윈도우'라고 부릅니다. 그리고 많은 사람들은 아직도 그것을 'AS/400'라고 부릅니다. 참고 :'AS/400'은'OS/400'과 묶일 수없는 패키지 거래였습니다. 더 이상 그렇지 않습니다. – jmarkmurphy