我需要使用JTOPEN(JDBC)连接通过SQL调用AS400存储过程,该连接接受1 INOUT和4 IN参数。我使用以下SQL
执行此操作CALL MYLIB.MYSP( ? ,'AJAJA1', '11111111', 'ą, ę, ć, ł, ń, ś, ż, ź', '0')
但它会抛出错误
[SQL0313]无效的主机变量数。
如果我使用''而不是问号,那么我得到
[SQL0469] IN,OUT或INOUT对MYLIB中MYSP过程中的参数1无效。
这可能吗?
答案 0 :(得分:1)
由于存储过程的第一个参数是INOUT参数,因此需要使用CallableStatement对象,将第一个参数注册为输出参数,并设置第一个参数的值。
JTOpen有一个JDBC客户端,它使用反射来调用Java方法。以下是调用存储过程的示例,其中第一个参数是inout参数。 (注意:程序会产生很多噪音,因为它试图猜测要调用哪个方法。如果一个方法失败,它会尝试另一个。另外,registerOutParameter调用中的12实际上是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