Spring integration 存储过程出站网关未返回DB2数据库的任何结果集
我们使用的是DB2数据库。我用以下方式配置了Spring integration 存储过程出站网关未返回DB2数据库的任何结果集,spring-integration,Spring Integration,我们使用的是DB2数据库。我用以下方式配置了存储过程出站网关: <int-jdbc:stored-proc-outbound-gateway auto-startup="true" data-source="routingDataSource" stored-procedure-name="ZSPPQCIMGL" skip-undeclared-results="true"
存储过程出站网关
:
<int-jdbc:stored-proc-outbound-gateway
auto-startup="true"
data-source="routingDataSource"
stored-procedure-name="ZSPPQCIMGL"
skip-undeclared-results="true"
ignore-column-meta-data="true"
use-payload-as-parameter-source = "false"
expect-single-result="true" >
<int-jdbc:sql-parameter-definition name="P_CLMN" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ALTC1" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ALTC2" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ALTC3" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_ALTC4" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_STRCRDATTIM" direction="IN" type="VARCHAR" />
<int-jdbc:sql-parameter-definition name="P_PAGESIZE" direction="IN" type="VARCHAR" />
<int-jdbc:parameter name="P_CLMN" expression="#xpath(payload, '//ClaimListResults/checkClaimSources/claimsCopy[1]/ClmNum')" />
<int-jdbc:parameter name="P_ALTC1" expression="#xpath(payload, '//ClaimListResults/checkClaimSources/claimsCopy[1]/AltClaim')" />
<int-jdbc:parameter name="P_ALTC2" expression="#xpath(payload, '//ClaimListResults/checkClaimSources/claimsCopy[1]/AltClaim')" />
<int-jdbc:parameter name="P_ALTC3" expression="#xpath(payload, '//ClaimListResults/checkClaimSources/claimsCopy[1]/AltClaim')" />
<int-jdbc:parameter name="P_ALTC4" expression="#xpath(payload, '//ClaimListResults/checkClaimSources/claimsCopy[1]/AltClaim')" />
<int-jdbc:parameter name="P_STRCRDATTIM" expression="#xpath(headers.originalRequest, '//lastCRDATTIM')" />
<int-jdbc:parameter name="P_PAGESIZE" expression="#xpath(headers.originalRequest, '//pageSize')" />
<int-jdbc:returning-resultset name="rowMapper" row-mapper="com.dsths.cs.awd.utils.ResultSetRowMapper"/>
</int-jdbc:stored-proc-outbound-gateway>
这里会有什么问题
CallableStatement
代码如下:
CREATE PROCEDURE ZSPPQCIMGL (
IN P_CLMN CHAR(75),
IN P_ALTC1 CHAR(75),
IN P_ALTC2 CHAR(75),
IN P_ALTC3 CHAR(75),
IN P_ALTC4 CHAR(75),
IN P_STRCRDATTIM TIMESTAMP,
IN P_PAGESIZE CHAR(10)
)
RESULT SETS 1
LANGUAGE SQL
SET OPTION COMMIT=*CS, DFTRDBCOL=*NONE, DYNDFTCOL=*NO
P1 : BEGIN
DECLARE C1 CURSOR WITH RETURN FOR
SELECT
BE2.CRDATTIM AS CRDATETIME, CONCAT(CHAR(BE2.CRDATTIM), CONCAT(BE2.RECORDCD, BE2.CRNODE)) AS AwdObjectID, CONCAT(CHAR(W67.PCRDATTIM), CONCAT(W67.PRECORDCD, W67.PCRNODE)) AS AWDTransId, W0.UNITCD AS BusinesArea, W0.OBJTYPE AS SourceType, W0.OBJECTID AS PhisyscalFileRef, CRUSERID as CreatedUserID,BE.CLMN AS ClaimNumber, W03.UNITCD as TransBusinessArea,W03.WRKTYPE as TransWorkType,W03.STATCD as TransStatus,W03.QUEUECD as TransQueue
FROM BESCAN BE JOIN W67U999S W67 ON
W67.PCRDATTIM = BE.CRDATTIM
AND W67.PRECORDCD = BE.RECORDCD
AND W67.PCRNODE = BE.CRNODE
AND BE.RECORDCD = 'T'
JOIN W03U999S W03 ON
BE.CRDATTIM = W03.CRDATTIM
AND BE.RECORDCD = W03.RECORDCD
AND BE.CRNODE = W03.CRNODE
AND BE.RECORDCD = 'T'
JOIN W00U999S W0 ON
W0.CRDATTIM = W67.CCRDATTIM
AND W0.RECORDCD = W67.CRECORDCD
AND W0.CRNODE = W67.CCRNODE
JOIN BESCAN BE2 ON
W0.CRDATTIM = BE2.CRDATTIM
AND W0.RECORDCD = BE2.RECORDCD
AND W0.CRNODE = BE2.CRNODE
AND BE2.RECORDCD = 'O'
WHERE (BE.CLMN IN (P_CLMN,P_ALTC1,P_ALTC2,P_ALTC3,P_ALTC4 ))
AND BE2.CRDATTIM < P_STRCRDATTIM
UNION
SELECT BE2.CRDATTIM AS CRDATETIME, CONCAT(CHAR(BE2.CRDATTIM), CONCAT(BE2.RECORDCD, BE2.CRNODE)) AS AwdObjectID, CONCAT(CHAR(W67.PCRDATTIM), CONCAT(W67.PRECORDCD, W67.PCRNODE)) AS AWDTransId, W0.UNITCD AS BusinesArea, W0.OBJTYPE AS SourceType, W0.OBJECTID AS PhisyscalFileRef, CRUSERID as CreatedUserID
,BE.CLMN AS ClaimNumber, W03.UNITCD as TransBusinessArea,W03.WRKTYPE as TransWorkType,W03.STATCD as TransStatus,W03.QUEUECD as TransQueue
FROM BEAG BE JOIN W67U999S W67 ON
W67.PCRDATTIM = BE.CRDATTIM
AND W67.PRECORDCD = BE.RECORDCD
AND W67.PCRNODE = BE.CRNODE
AND BE.RECORDCD = 'T'
JOIN W03U999S W03 ON
BE.CRDATTIM = W03.CRDATTIM
AND BE.RECORDCD = W03.RECORDCD
AND BE.CRNODE = W03.CRNODE
AND BE.RECORDCD = 'T'
JOIN W00U999S W0 ON
W0.CRDATTIM = W67.CCRDATTIM
AND W0.RECORDCD = W67.CRECORDCD
AND W0.CRNODE = W67.CCRNODE
JOIN BEAG BE2 ON
W0.CRDATTIM = BE2.CRDATTIM
AND W0.RECORDCD = BE2.RECORDCD
AND W0.CRNODE = BE2.CRNODE
AND BE2.RECORDCD = 'O'
WHERE (BE.CLMN IN (P_CLMN,P_ALTC1,P_ALTC2,P_ALTC3,P_ALTC4 ))
AND BE2.CRDATTIM < P_STRCRDATTIM
UNION
SELECT BE2.CRDATTIM AS CRDATETIME, CONCAT(CHAR(BE2.CRDATTIM), CONCAT(BE2.RECORDCD, BE2.CRNODE)) AS AwdObjectID, CONCAT(CHAR(W67.PCRDATTIM), CONCAT(W67.PRECORDCD, W67.PCRNODE)) AS AWDTransId, W0.UNITCD AS BusinesArea, W0.OBJTYPE AS SourceType, W0.OBJECTID AS PhisyscalFileRef, CRUSERID as CreatedUserID
,BE.CLMN AS ClaimNumber, W03.UNITCD as TransBusinessArea,W03.WRKTYPE as TransWorkType,W03.STATCD as TransStatus,W03.QUEUECD as TransQueue
FROM BECLAIM BE JOIN W67U999S W67 ON
W67.PCRDATTIM = BE.CRDATTIM
AND W67.PRECORDCD = BE.RECORDCD
AND W67.PCRNODE = BE.CRNODE
AND BE.RECORDCD = 'T'
JOIN W03U999S W03 ON
BE.CRDATTIM = W03.CRDATTIM
AND BE.RECORDCD = W03.RECORDCD
AND BE.CRNODE = W03.CRNODE
AND BE.RECORDCD = 'T'
JOIN W00U999S W0 ON
W0.CRDATTIM = W67.CCRDATTIM
AND W0.RECORDCD = W67.CRECORDCD
AND W0.CRNODE = W67.CCRNODE
JOIN BECLAIM BE2 ON
W0.CRDATTIM = BE2.CRDATTIM
AND W0.RECORDCD = BE2.RECORDCD
AND W0.CRNODE = BE2.CRNODE
AND BE2.RECORDCD = 'O'
WHERE (BE.CLMN = P_CLMN OR BE.ALTC IN (P_ALTC1,P_ALTC2,P_ALTC3,P_ALTC4 ))
AND BE2.CRDATTIM < P_STRCRDATTIM
ORDER BY AwdObjectID desc
FETCH FIRST 10 ROWS ONLY;
OPEN C1 ;
END P1;
package com.test;
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import com.ibm.db2.jcc.DB2Types;
public class FolderRestructure {
private static final String DB_DRIVER = "com.ibm.as400.access.AS400JDBCDriver";
private static final String DB_CONNECTION = "jdbc:as400://XXX.40.103.XXX/ABC";
private static final String DB_USER = "ABC";
private static final String DB_PASSWORD = "DEF";
public static void main(String[] argv) {
try {
callOracleStoredProcCURSORParameter();
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
private static void callOracleStoredProcCURSORParameter()
throws SQLException {
Connection dbConnection = null;
CallableStatement callableStatement = null;
ResultSet rs = null;
String getDBUSERCursorSql = "{call ZSPPQCIMGL(?,?,?,?,?,?,?)}";
// String getDBUSERCursorSql = "{call ZSPQALLIMGLKP(?,?,?,?,?,?,?,?)}";
//call ZSPPQCIMGL('12021000012A','CHAVA-00001','CHAVA-00001','CHAVA-00001','CHAVA-00001','2017-08-04-23.59.59.999999','4');
try {
Timestamp timestamp = null;
try {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSSSSS");
java.util.Date parsedDate = dateFormat.parse("2017-08-08 23:59:59.999999");
timestamp = new java.sql.Timestamp(parsedDate.getTime());
} catch(ParseException e) { //this generic but you can control another types of exception
System.out.println(e.getMessage());
}
dbConnection = getDBConnection();
callableStatement = dbConnection.prepareCall(getDBUSERCursorSql);
callableStatement.setString(1, "12021000012A");
callableStatement.setString(2, "CHAVA-00001");
callableStatement.setString(3, "CHAVA-00001");
callableStatement.setString(4, "CHAVA-00001");
callableStatement.setString(5, "CHAVA-00001");
callableStatement.setTimestamp(6, timestamp);
callableStatement.setString(7, "4");
//callableStatement.registerOutParameter(8, DB2Types.CURSOR);
//P_CLMN=12021000012A, P_STRCRDATTIM=9999-99-99 99:99:99.999999, P_PAGESIZE=4, P_ALTC3=CHAVA-00001, P_ALTC4=CHAVA-00001, P_ALTC1=CHAVA-00001, P_ALTC2=CHAVA-00001
/* callableStatement.setString(1, "DT207030");
callableStatement.setString(2, "KKMTEST2000");
callableStatement.setString(3, "");
callableStatement.setString(4, "2XSRCTYP");
callableStatement.setString(5, "0000-00-00 00:00:00.000000");
callableStatement.setString(6, "9999-99-99 99:99:99.999999");
callableStatement.setString(7, "9999-99-99 99:99:99.999999");*/
// execute getDBUSERCursor store procedure
rs = callableStatement.executeQuery();
// get cursor and cast it to ResultSet
//rs = (ResultSet) callableStatement.getObject(7);
while (rs.next()) {
// CASEID , CASEBA, CASEWK, CASESTA, CASEQUE, ISSUEID , ISSUEBA, ISSUEWK, ISSUESTA, ISSUEQUE, ISSUEASIGNID,
// OBJECTID , OBJECTBA, OBJECTWK, OBJECTPHYFILEID, OBJECTCREATEDUSERID
//W0.OBJTYPE AS SourceType, W0.OBJECTID AS PhisyscalFileRef, CRUSERID as CreatedUserID,BE.CLMN AS ClaimNumber,
//W03.UNITCD as TransBusinessArea,W03.WRKTYPE as TransWorkType,W03.STATCD as TransStatus,W03.QUEUECD as TransQueue
System.out.println("CRDATIM : " + rs.getString("CRDATETIME"));
System.out.print(" AwdObjectID : " + rs.getString("AwdObjectID"));
System.out.print(" AWDTransId : " + rs.getString("AWDTransId"));
System.out.print(" BusinesArea : " + rs.getString("BusinesArea"));
System.out.print(" SourceType : " + rs.getString("SourceType"));
System.out.print(" PhisyscalFileRef : " + rs.getString("PhisyscalFileRef"));
System.out.print(" CreatedUserID : " + rs.getString("CreatedUserID"));
System.out.print(" ClaimNumber : " + rs.getString("ClaimNumber"));
System.out.print(" TransBusinessArea : " + rs.getString("TransBusinessArea"));
System.out.print(" TransWorkType : " + rs.getString("TransWorkType"));
System.out.print(" TransStatus : " + rs.getString("TransStatus"));
System.out.print(" TransQueue : " + rs.getString("TransQueue"));
/* String userid = rs.getString("ISSUEID");
String userName = rs.getString("ISSUEBA");
String createdBy = rs.getString("ISSUEWK");
String createdDate = rs.getString("ISSUESTA");
System.out.print(" ISSUEID : " + userid);
System.out.print(" ISSUEBA : " + userName);
System.out.print(" ISSUEWK : " + createdBy);
System.out.print(" ISSUESTA : " + createdDate);*/
// System.out.println("created : " + rs.getString("CASEQUE"));
/* System.out.println("AwdObjectID : " + userid);
System.out.println("BusinesArea : " + userName);
System.out.println("SourceType : " + createdBy);
System.out.println("PhisyscalFileRef : " + createdDate);
System.out.println("created : " + rs.getString("CASEQUE"));*/
}
} catch (SQLException e) {
System.out.println(e.getMessage());
} finally {
if (rs != null) {
rs.close();
}
if (callableStatement != null) {
callableStatement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
}
private static Connection getDBConnection() {
Connection dbConnection = null;
try {
Class.forName(DB_DRIVER);
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
}
try {
dbConnection = DriverManager.getConnection(
DB_CONNECTION, DB_USER,DB_PASSWORD);
return dbConnection;
} catch (SQLException e) {
System.out.println(e.getMessage());
}
return dbConnection;
}
}
看起来您确实从过程中返回了光标。因此,它是
函数
试试这个:is function=“true”
如果为“true”,则调用SQL函数。那么
“存储过程名称”属性定义
被调用函数的名称。
我在*N中找到了错误[SQL0440]例程ZSPPQCIMGL,但没有找到指定参数。
添加后是function=“true”
。确定。请显示,然后工作callablestatement
进行比较。您是指工作callablestatement
的任何屏幕打印?将代码添加到问题中。请看一看。将网关中的第6个P\u STRCRDATTIM
也声明为时间戳如何?看看您的CallableStatement
示例,我会说它在任何方面都完全是`is function=“true”。您的参数定义不兼容的问题
<xsd:attribute name="is-function" default="false">
<xsd:annotation>
<xsd:documentation>
If "true", a SQL Function is called. In that case
the "stored-procedure-name" attribute defines
the name of the called function.
</xsd:documentation>
</xsd:annotation>
<xsd:simpleType>
<xsd:union memberTypes="xsd:boolean xsd:string" />
</xsd:simpleType>
</xsd:attribute>