0

我需要使用接受 1 个 INOUT 和 4 个 IN 参数的 JTOPEN (JDBC) 连接通过 SQL 调用 AS400 存储过程。我正在使用以下 SQL 执行此操作

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

但它会引发错误

[SQL0313] 主机变量数无效。

如果我使用 '' 而不是问号,那么我会得到

[SQL0469] IN、OUT 或 INOUT 对于 MYLIB 中的过程 MYSP 中的参数 1 无效。

这可能吗?

4

1 回答 1

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
于 2014-07-25T21:36:15.843 回答