2013-07-23 60 views
0

我需要通过SQL使用JTOPEN(JDBC)连接来调用AS400存储过程,该连接接受1个INOUT和4个IN参数。我用下面的SQL使用JTOPEN调用存储过程

CALL MYLIB.MYSP(? ,'AJAJA1', '11111111', 'ą, ę, ć, ł, ń, ś, ż, ź', '0') 

这样做,但它抛出一个错误

[SQL0313]主机变量数无效。

如果我使用',而不是一个问号然后我得到

[SQL0469] IN,OUT,或者INOUT不适用于在MYLIB程序MYSP参数1。

这可能吗?

+1

您是否可以包含存储过程声明和用于执行它的Java代码? – jamesallman

+0

我目前没有程序声明。另外,不要通过Java调用它,而是使用Aqua Data Studio和DB Visualiser –

回答

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