java - 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/>',' ',' ','<a href=#',bid,'>',bid,'</a>',' - ',sd);
-- set LongDesc = replace(LongDesc,'\n', '<br/>');
set BugList=CONCAT(BugList,'<br/>','<tr bgcolor=lightgrey><td width=420>',' ','************************************************************************************************','<br/>');
set BugList=CONCAT(BugList,
' ','* ','<a id=','#',bid,'>','<font color=red>',bid,'</font>','</a>',' - ','<b>',sd,'</b>','<br/>',
' ','* Version: 2.3.0 | Component: ',cname,' | Platform: ',rpl,' | OS: ',os,' | Severity: ',bs,'<br/>',
' ','************************************************************************************************','</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 似乎是空的。
解决方案
您的存储过程不应返回结果集,因为您没有生成结果集,而是在 INOUT 变量中返回结果。
你应该做类似下面的事情
cs.registerOutParameter(1, Types.LONGVARBINARY);
..
cs.executeUpdate();
System.out.println(cs.getString(1));
正如 Akina 在评论中提到的那样,不弄乱输出参数可能更容易,并且只是SELECT BugList
在 SP 的末尾,并且有一个返回字符串作为结果集的过程。
推荐阅读
- api - API | 硬币 | 用户/退出 | 无效参数 (POST)
- python - 函数内的 Python 入口小部件
- deployment - 如何在 bitbucket 管道中用部署变量替换 .env 文件占位符
- java - 如何将@Generated 注释添加到delombok 代码?
- python - 在 Pandas 中加载带有管道分隔字段的 .txt 文件时,如何用撇号 (') 替换双引号 (")?
- javascript - 无法将 mini-css-extract 插件安装到我的项目中
- java - B树的深度优先搜索
- flutter - Flutter (2.5) - 为 Flutter 提供了启动画面,但已弃用
- c++ - 在自定义容器中实现迭代器和反向迭代器以支持 STL 的 API 是什么?
- python - 在网页 HTML 中加入日期时间 - Python、Jinja