Я использую хранимую процедуру из моего приложения Java, используя jdb c вот так
String q="{call test.proc(?,?)}";
CallableStatement cal=conn.prepareCall(q);
cal.setInt(1, val1);
cal.setInt(2, val2);
ResultSet rs=cal.executeQuery();
по какой-то причине это возвращает ошибку
Exception в потоке "main" com. mysql .jdb c .exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии MySQL сервера, чтобы найти правильный синтаксис для использования рядом с '()' в строке 1
при отладке Я заметил, что по какой-то причине к вызов
System.out.println(cal);
производит
com.mysql.jdbc.JDBC42CallableStatement@223191a6: CALL test.proc(1079,1);()
На всякий случай, если соединение jdb c имеет какое-то отношение к этому, это
Connection conn = DriverManager.getConnection("jdbc:mysql://"+host+"/"+DB+"?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useSSL=false&noAccessToProcedureBodies=true"
, user,password);
РЕДАКТИРОВАТЬ Хорошо, это просто странно. Я не понимаю. Ι изменил вызов и вместо этого использовал значения непосредственно в строке.
String q="{call test.proc(val1,val2)}";
CallableStatement cal=conn.prepareCall(q);
System.out.println(cal);
ResultSet rs=cal.executeQuery();
Это почему-то печатает как ожидалось
com. mysql .cj.jdb c .CallableStatement: CALL test.pro c (1079,0)
Но я все равно получаю ту же ошибку
Исключение в потоке «main» java. sql .SQLSyntaxErrorException: у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии MySQL сервера, чтобы найти правильный синтаксис для использования рядом с '()' в строке 1
Я действительно не могу этого понять. Это не первая процедура MySql, которую я использую под jdb c. Я даже безуспешно пробовал разные драйверы jdb c.
Редактировать - Решение Не знаю, как это произошло, но решение было таким же безумным, как и проблема. проблема заключалась в фигурных скобках. По какой-то причине (по крайней мере, в jdb c 8.0.18), когда я удалил фигурные скобки из CallableStatement, работал нормально. Опять же, для меня это не имеет смысла, но, поскольку он работает, я не буду сильно сомневаться в этом
, поэтому строки
String q="{call test.proc(?,?)}";
CallableStatement cal=conn.prepareCall(q);
неверны, а правильные утверждения -
String q="call test.proc(?,?)";
CallableStatement cal=conn.prepareCall(q);