Spring DB2存储过程没有返回结果集
我有一个DB2存储过程,它在数据库中插入一行。存储过程如下所示:Spring DB2存储过程没有返回结果集,spring,stored-procedures,jdbc,db2,Spring,Stored Procedures,Jdbc,Db2,我有一个DB2存储过程,它在数据库中插入一行。存储过程如下所示: CREATE PROCEDURE ZSPPQINSERTUSERIDBA ( IN P_USERID CHAR(10), IN P_BUSINESSAREA CHAR(10), IN P_SELECTEDIND CHAR(1), IN P_DEFAULTIND CHAR(1), IN
CREATE PROCEDURE ZSPPQINSERTUSERIDBA (
IN P_USERID CHAR(10),
IN P_BUSINESSAREA CHAR(10),
IN P_SELECTEDIND CHAR(1),
IN P_DEFAULTIND CHAR(1),
IN P_LEGACYSYSTEM CHAR(10),
IN P_LEGACYLOGIN CHAR(16),
IN P_LEGACYPASSWORD CHAR(16),
IN P_OTHERLOGIN CHAR(10),
IN P_OTHERPASSWORD CHAR(10),
IN P_ADDSECURLOGIN CHAR(10),
IN P_ADDSECURPASSWORD CHAR(10),
IN P_LASTUPDATEUSERID CHAR(10),
IN P_LASTUPDATE TIMESTAMP)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
SPECIFIC ZSPPQINSERTUSERIDBA
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *CS ,
CLOSQLCSR = *ENDMOD ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
RDBCNNMTH = *RUW ,
SRTSEQ = *HEX
P1 : BEGIN
DECLARE TOTALCNT INTEGER DEFAULT 0 ;
DECLARE C1 CURSOR WITH RETURN FOR
SELECT Count (*) FROM USERBUSINESSAREA
WHERE USERID = P_USERID
AND BUSINESSAREA = P_BUSINESSAREA;
OPEN C1;
FETCH C1 INTO TOTALCNT;
CLOSE C1;
IF ( TOTALCNT = 0) THEN
INSERT
INTO USERBUSINESSAREA
(
USERID,
BUSINESSAREA,
SELECTEDIND,
DEFAULTIND,
LEGACYSYSTEM,
LEGACYLOGIN,
LEGACYPASSWORD,
OTHERLOGIN,
OTHERPASSWORD,
ADDSECURLOGIN,
ADDSECURPASSWORD,
LASTUPDATEUSERID,
LASTUPDATE
)
VALUES (P_USERID,
P_BUSINESSAREA,
P_SELECTEDIND,
P_DEFAULTIND,
P_LEGACYSYSTEM,
P_LEGACYLOGIN,
P_LEGACYPASSWORD,
P_OTHERLOGIN,
P_OTHERPASSWORD,
P_ADDSECURLOGIN,
P_ADDSECURPASSWORD,
P_LASTUPDATEUSERID,
P_LASTUPDATE);
END IF;
END P1;
当我尝试从Java/Spring集成层执行上述存储过程时,没有返回任何结果集。要使上述存储过程返回结果集,需要做哪些更改 您到底想要返回什么 有一个光标,您可以在其中选择元素的数量,并将其指定给变量。之后,光标关闭。 根据检索到的数量,您可以执行插入。 我不知道你期望什么: 是否要返回结果集?那么你应该有一个打开的光标。e、 g.从USERBUSINESSAREA中选择* 是否要在光标中返回检索到的值?然后,正如@mustaccio所说,您可以添加一个OUT参数,然后只分配值。
以下适用于我的修改后的存储过程刚刚使用RETURN for更改为RETURN to CALLER for:
结果集是一个打开的光标。当过程返回时,没有任何打开的游标。如果只需要返回一个值,则不需要结果集,而是使用OUT参数。是否只想知道是否在数据库中插入了行?我的意思是,相对于已经有一个。您在Java层中需要哪些实际信息?您正在尝试执行的更大的任务是什么?因为您的光标只需要有一行,并且您在过程中进行了提取,返回给调用者的结果集将位于末尾,换句话说,调用者将不再从中提取任何内容。@mustaccio yes..您是正确的。它不会包含任何内容。唯一的区别是结果集对象不会为null。我要求结果在Java端不为null。所以它解决了我的问题…这是一个评论,不是一个真正的答案。
CREATE PROCEDURE ZSPPQINSERTUSERIDBA (
IN P_USERID CHAR(10),
IN P_BUSINESSAREA CHAR(10),
IN P_SELECTEDIND CHAR(1),
IN P_DEFAULTIND CHAR(1),
IN P_LEGACYSYSTEM CHAR(10),
IN P_LEGACYLOGIN CHAR(16),
IN P_LEGACYPASSWORD CHAR(16),
IN P_OTHERLOGIN CHAR(10),
IN P_OTHERPASSWORD CHAR(10),
IN P_ADDSECURLOGIN CHAR(10),
IN P_ADDSECURPASSWORD CHAR(10),
IN P_LASTUPDATEUSERID CHAR(10),
IN P_LASTUPDATE TIMESTAMP)
DYNAMIC RESULT SETS 1
LANGUAGE SQL
SPECIFIC ZSPPQINSERTUSERIDBA
NOT DETERMINISTIC
MODIFIES SQL DATA
CALLED ON NULL INPUT
SET OPTION ALWBLK = *ALLREAD ,
ALWCPYDTA = *OPTIMIZE ,
COMMIT = *CS ,
CLOSQLCSR = *ENDMOD ,
DECRESULT = (31, 31, 00) ,
DFTRDBCOL = *NONE ,
DYNDFTCOL = *NO ,
DYNUSRPRF = *USER ,
RDBCNNMTH = *RUW ,
SRTSEQ = *HEX
P1 : BEGIN
DECLARE TOTALCNT INTEGER DEFAULT 0 ;
DECLARE C1 CURSOR WITH RETURN TO CALLER FOR
SELECT Count (*) FROM USERBUSINESSAREA
WHERE USERID = P_USERID
AND BUSINESSAREA = P_BUSINESSAREA;
OPEN C1;
FETCH C1 INTO TOTALCNT;
IF ( TOTALCNT = 0) THEN
INSERT
INTO USERBUSINESSAREA
(
USERID,
BUSINESSAREA,
SELECTEDIND,
DEFAULTIND,
LEGACYSYSTEM,
LEGACYLOGIN,
LEGACYPASSWORD,
OTHERLOGIN,
OTHERPASSWORD,
ADDSECURLOGIN,
ADDSECURPASSWORD,
LASTUPDATEUSERID,
LASTUPDATE
)
VALUES (P_USERID,
P_BUSINESSAREA,
P_SELECTEDIND,
P_DEFAULTIND,
P_LEGACYSYSTEM,
P_LEGACYLOGIN,
P_LEGACYPASSWORD,
P_OTHERLOGIN,
P_OTHERPASSWORD,
P_ADDSECURLOGIN,
P_ADDSECURPASSWORD,
P_LASTUPDATEUSERID,
P_LASTUPDATE);
END IF;
END P1;