Использование JTOPEN для вызова сохраненного процесса
Мне нужно вызвать хранимый процесс AS400 через SQL, используя соединение JTOPEN (JDBC), которое принимает 1 INOUT и 4 IN параметры. Я делаю это с помощью следующего SQL
CALL MYLIB.MYSP( ? ,'AJAJA1', '11111111', 'ą, ę, ć, ł, ń, ś, ż, ź', '0')
но выдает ошибку
[SQL0313] Число переменных хоста недопустимо.
Если я использую '' вместо знака вопроса, то получаю
[SQL0469] IN, OUT или INOUT недопустимы для параметра 1 в процедуре MYSP в MYLIB.
Это возможно?
1 ответ
Поскольку первый параметр хранимой процедуры является параметром INOUT, вам необходимо использовать объект CallableStatement, зарегистрировать первый параметр в качестве выходного параметра и установить значение первого параметра.
JTOpen имеет клиент JDBC, который использует отражение для вызова методов Java. Вот пример вызова хранимой процедуры, где первый параметр является параметром inout. (Примечание: программа генерирует много шума, потому что она пытается угадать, какой метод вызвать. Если один метод не работает, он пытается другой. Кроме того, 12 в вызове registerOutParameter действительно java.sql.Type.VARCHAR)
~> java -cp jt400.jar com.ibm.as400.access.jdbcClient.Main jdbc:as400:SYSTENAME USERID PASSWORD
>CREATE PROCEDURE MYCONCAT(INOUT P1 VARCHAR(512) , P2 VARCHAR(80), P3 VARCHAR(80), P4 VARCHAR(80)) LANGUAGE SQL BEGIN SET P1 = P1 || P2 || P3 || P4; END
>!SETVAR CSTMT=CON.prepareCall("CALL MYCONCAT(?,'B','C','D')")
CSTMT=STMT0002
...
>!CALLMETHOD CSTMT.registerOutParameter(1,12)
...
>!CALLMETHOD CSTMT.setString(1,'A')
...
>!CALLMETHOD CSTMT.execute()
...
Call returned false
>!CALLMETHOD CSTMT.getString(1)
Call returned ABCD