jdb c ads emtpy backets "()" при вызове процедуры - PullRequest
0 голосов
/ 07 августа 2020

Я использую хранимую процедуру из моего приложения 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);

Ответы [ 2 ]

1 голос
/ 08 августа 2020

Хотя внешние фигурные скобки требуются для некоторых хранимых процедур JDB C, я подозреваю, что в этом случае они не нужны. Было бы неплохо, если бы скобы снял водитель молча. К сожалению, стандартный синтаксис не всегда приемлем. Я полагаю, что стандарты в этом и хороши: их так много. :)

0 голосов
/ 07 августа 2020

Вы должны попробовать с nomosBirths.execute () и q не должно иметь точки с запятой. Если ваша процедура является select, используйте логическое значение, возвращаемое методом execute, и используйте следующее, чтобы получить свой набор результатов ResultSet resultSet = statement.getResultSet ();

...