java.sql2 DynamicMultiOperation with interlaced exceptions
Lukas Eder
lukas.eder at gmail.com
Wed Oct 4 09:22:49 UTC 2017
Hello,
The java.sql2 API contains a DynamicMultiOperation type which seems
intended for use with statement batches or procedure calls that produce an
unknown set of:
- Update counts
- Result sets
- Exceptions
Unfortunately, I'm missing the part where interlaced exceptions can be
received. This may be SQL Server (and perhaps MySQL) specific, as I haven't
really encountered this in any other databases. But in SQL Server, when
running the following statement batch:
DECLARE @t TABLE(i INT);
INSERT INTO @t VALUES (1),(2),(3);
RAISERROR('message 1', 16, 2, 3);
RAISERROR('message 2', 16, 2, 3);
SELECT * FROM @t
RAISERROR('message 3', 16, 2, 3);
We can run the following, complete program (taken from a blog post I've
written recently [1]):
String sql = "DECLARE @t TABLE(i INT);\r\n" +
"INSERT INTO @t VALUES (1),(2),(3);\r\n" +
"RAISERROR('message 1', 16, 2, 3);\r\n" +
"RAISERROR('message 2', 16, 2, 3);\r\n" +
"SELECT * FROM @t\r\n" +
"RAISERROR('message 3', 16, 2, 3);";
try (Connection c = new
com.microsoft.sqlserver.jdbc.SQLServerDriver().connect(url, properties);
Statement s = c.createStatement()) {
fetchLoop:
for (int i = 0, updateCount = 0; i < 256; i++) {
try {
boolean result = (i == 0)
? s.execute(sql)
: s.getMoreResults();
SQLWarning w = s.getWarnings();
for (int j = 0; j < 255 && w != null; j++) {
System.out.println("Warning : " + w.getMessage());
w = w.getNextWarning();
}
s.clearWarnings();
if (result)
try (ResultSet rs = s.getResultSet()) {
System.out.println("Result :");
ResultSetMetaData m = rs.getMetaData();
while (rs.next())
for (int col = 1; col <= m.getColumnCount();
col++)
System.out.println(
" " + m.getColumnName(col) +
": " + rs.getInt(col));
}
else if ((updateCount = s.getUpdateCount()) != -1)
System.out.println("Update Count: " + updateCount);
else
break fetchLoop;
}
catch (SQLException e) {
System.out.println("Exception : " + e.getMessage());
}
}
}
And get this result:
Update Count: 3
Exception : message 1
Exception : message 2
Result :
i: 1
i: 2
i: 3
Exception : message 3
I currently don't see a way how the exception messages "message 1" /
"message 2" / "message 3" can be fetched through the DynamicMultiOperation.
Could you perhaps show an example?
Thanks,
Lukas
[1]:
https://blog.jooq.org/2017/07/13/how-i-incorrectly-fetched-jdbc-resultsets-again/
More information about the jdbc-spec-discuss
mailing list