当存储过程的输出参数包含超过4000个字符时,我遇到了问题。响应似乎被JDBC驱动程序截断了?我怎样才能得到完整的结果?
存储过程以完整的响应(> 4000个字符)回答,但我无法从Java打开它。我试过了jTDS和微软的JDBC驱动程序6.0。这是我的代码:
CallableStatement pstmt = con.prepareCall("{call sp_horus_get_consultorios_stv(?)}");
pstmt.registerOutParameter(1, -1);
pstmt.setString(1, "");
pstmt.execute();
String sp_horus_get_consultorios_stv = pstmt.getString(1);
这适用于sybase中的存储过程。
答案 0 :(得分:2)
我能够使用Microsoft JDBC Driver 6.x重新创建您的问题。我发现通过评论setString
电话可以避免这个问题:
try (CallableStatement pstmt = conn.prepareCall("{call usp_horus_get_consultorios_stv(?)}")) {
pstmt.registerOutParameter(1, Types.LONGNVARCHAR);
//pstmt.setString(1, ""); // disabled
pstmt.execute();
String sp_horus_get_consultorios_stv = pstmt.getString(1);
System.out.println(sp_horus_get_consultorios_stv.length()); // > 4000 characters
}
不幸的是,该修复程序无法解决jTDS 1.3.1下的问题。似乎jTDS仍然受到here描述的限制。因此,对于jTDS,似乎我们必须做这样的事情:
String sql =
"DECLARE @out NVARCHAR(MAX);" +
"EXEC usp_horus_get_consultorios_stv @out OUTPUT;" +
"SELECT @out;";
try (
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql)) {
rs.next();
String sp_horus_get_consultorios_stv = rs.getString(1);
System.out.println(sp_horus_get_consultorios_stv.length()); // > 4000 characters
}
答案 1 :(得分:0)
据我所知,您的输出参数是NVARCHAR(8000)类型,它是允许的最大显式数,并输出4000个字符的Unicode字符串长度(每个字符2个字节)。
然而,幸运的是,还有另一种可能性:NVARCHAR(MAX),它基本上允许无限长度的字符串(嗯,不是无限的,但几乎: What is the maximum number of characters that nvarchar(MAX) will hold?
您应该将输出参数类型更改为NVARCHAR(MAX)。
快乐的编码;)