首页 > 解决方案 > MYSQL存储的proc不返回java中的结果集

问题描述

我有一个 mysql 存储过程(SP),它在表上进行选择,然后使用连接字符串(html 代码)包装结果。通过工作台运行时,我得到了数据,但 java 结果集似乎是空的。它几乎返回一大行连接的字符串数据(超过 1000 行从中创建 html 表)。

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_html`(
INOUT BugList varchar(30000))

Block1: BEGIN
DECLARE done INT DEFAULT 0;
DECLARE LongDesc Varchar(10000) DEFAULT "";
DECLARE BugShortList Varchar(10000) DEFAULT "";
DECLARE sd varchar(1000) DEFAULT "";
declare cname char(20) default "";
DECLARE bid int DEFAULT 0;
DECLARE cid int DEFAULT 0;
declare prevbid int default 0;
declare rpl varchar (64) default "";
declare os varchar (64) default "";
declare bs varchar (64) default "";
declare dts date;

DECLARE c_1 CURSOR FOR select   b.bug_id,b.short_desc,l.thetext,b.component_id,b.rep_platform,b.op_sys,b.bug_severity
from bugs b 
INNER JOIN longdescs l ON b.bug_id=l.bug_id 
where component_id in (4,5,6,7,15,16,19,25,26,28,29,32,33,35) and 
b.bug_id > 100 and
version='1.0' and 
resolution='fixed' 
order by b.bug_id desc;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

set BugList= CONCAT('<table style="2", border="1"><tr><td   width=420>','<b>=================================== EXPANDED LIST ==================================</b>');

OPEN c_1;

repeat

FETCH c_1 INTO bid,sd,LongDesc,cid,rpl,os,bs;

   if bid = prevbid then
       if LongDesc <> "" then 
             set BugList=CONCAT(BugList,'<br/>',LongDesc,'<br/>');
                               end if;
   else
       select name from components where cid=id into cname;
       set BugShortList=CONCAT(BugShortList,'<br/>','&#160;','&#160;','<a href=#',bid,'>',bid,'</a>',' - ',sd);
      -- set LongDesc = replace(LongDesc,'\n', '<br/>');
       set BugList=CONCAT(BugList,'<br/>','<tr bgcolor=lightgrey><td width=420>','&#160;','************************************************************************************************','<br/>');
       set BugList=CONCAT(BugList,
       '&#160;','* ','<a id=','#',bid,'>','<font color=red>',bid,'</font>','</a>',' - ','<b>',sd,'</b>','<br/>',
       '&#160;','* Version: 2.3.0 | Component: ',cname,' | Platform: ',rpl,' | OS: ',os,' | Severity: ',bs,'<br/>',
       '&#160;','************************************************************************************************','</td></tr><tr><td width=420>','<br/>',LongDesc,'<br/>');
       set prevbid=bid;
   end if;
   
 until done end repeat;
CLOSE c_1;
set BugList=CONCAT('<tr><td>','<br/>','<b>==================================== CONDENSED LIST ======================================</b>','<br/>',
              BugShortList,'</td></tr>',BugList);
  set BugList=CONCAT(BugList,'</td></tr></table>');
set BugList = replace(BugList,'\n', '<br/>');
END Block1

MySql Workbench 在我拨打电话时返回字符串数据

set @list="";
call get_fixed_web_bugs_html(@list);
select @list 

但不太确定 java 是否接受大字符串数据作为结果集。有小费吗?我的java调用:

 StringBuilder out = new StringBuilder("");
CallableStatement cs = conn.prepareCall("{ CALL get_html(?)}");
cs.registerOutParameter(1, Types.LONGVARBINARY);
cs.setString(1, out.toString());

ResultSet rs = cs.executeQuery();
while (rs.next()) {

System.out.println(String.format("%s - %s", rs.getString("out")));
}

rs 似乎是空的。

标签: javamysqlstored-proceduresmariadb

解决方案


您的存储过程不应返回结果集,因为您没有生成结果集,而是在 INOUT 变量中返回结果。

你应该做类似下面的事情

cs.registerOutParameter(1, Types.LONGVARBINARY);
..
cs.executeUpdate();
System.out.println(cs.getString(1));

正如 Akina 在评论中提到的那样,不弄乱输出参数可能更容易,并且只是SELECT BugList在 SP 的末尾,并且有一个返回字符串作为结果集的过程。


推荐阅读