2017-01-31 19 views
2

На сервере domino у меня есть соединение odbc с системой as400. Я могу запустить программу на AS400, и отправить параметр входного сигнала:callablestatement as400 не работает

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 набора/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 

Это определяет хранимую процедуру для программы RPG с именем ASSEMBLY с одним входным параметром и двумя выходными параметрами. Это модифицированный пример из ссылки 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/400s много лет назад. Если он достаточно взрослый, чтобы быть фактическим «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