2017-01-31 94 views
2

在多米諾骨牌服務器上,我有一個到as400系統的odbc連接。我可以運行在AS400的程序,並通過發送輸入參數:callablestatement to as400 not working

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

尼斯,工作,但現在我想獲得一些數據備份。 我想我有一個CallableStatement要做到這一點,所以我嘗試:

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; 
} 

運行此我得到的錯誤:

連接設置/ SQL SET/CS組/ SQL錯誤 = java.lang.NullPointerException/cs closed/con closed

所以問題在於設置輸入參數。

回答

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)。這是我現在最接近你的時間,因爲我目前還沒有Domino的實例要測試。

+0

此過程必須在IBM i上進行?如何在給定示例的ssjs中獲取數據? –

+0

@MarcJonkers存儲過程將在服務器上的DB2中定義。希望服務器是多年前取代AS/400的系統之一。如果它已經足夠成爲一個真正的「AS/400」,你可能需要幫助創建SP。 – user2338816

+0

似乎名字納粹在StackOverflow上存在。 'IBM i'是在AS/400上運行的操作系統的新名稱。它取代並相當於(有改進)'OS/400'。 「Power Systems」或「Pure Systems」是過去被稱爲「AS/400」的硬件的新名稱。社區中有些人對命名提出質疑。但是,「OS/400」是「Windows 2.0」,因爲「IBM i v7.3」是「Windows 10」。但我們仍然稱它爲「Windows」。許多人仍然稱它爲「AS/400」。注意:'AS/400'是一個捆綁到'OS/400'的捆綁交易。這已不再是這種情況。 – jmarkmurphy