Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jdbc广告emtpy backets“;()";程序调用_Java_Mysql_Jdbc - Fatal编程技术网

Java jdbc广告emtpy backets“;()";程序调用

Java jdbc广告emtpy backets“;()";程序调用,java,mysql,jdbc,Java,Mysql,Jdbc,我正在使用Java应用程序中的一个存储过程,像这样使用jdbc String q="{call test.proc(?,?)}"; CallableStatement cal=conn.prepareCall(q); cal.setInt(1, val1); cal.setInt(2, val2); ResultSet rs=cal.executeQuery(); 由于某种原因,这将返回一个错误 线程“main”中出现异常 com.mysql.jdbc.excep

我正在使用Java应用程序中的一个存储过程,像这样使用jdbc

String q="{call test.proc(?,?)}";
CallableStatement cal=conn.prepareCall(q);
cal.setInt(1, val1);
cal.setInt(2, val2);
ResultSet rs=cal.executeQuery();
    
由于某种原因,这将返回一个错误

线程“main”中出现异常 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;检查与您的产品相对应的手册 第1行“()”附近使用正确语法的MySQL服务器版本

在调试时,我注意到由于某种原因,调用中添加了一个空括号集

System.out.println(cal);
产生

com.mysql.jdbc.JDBC42CallableStatement@223191a6: CALL test.proc(1079,1);()
为了防止jdbc连接与它有关,它是

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);
编辑 好的,这只是简单的wierd。我不明白。Ⅷ更改了调用并直接在字符串上使用值

String q="{call test.proc(val1,val2)}";
CallableStatement cal=conn.prepareCall(q);
System.out.println(cal);
ResultSet rs=cal.executeQuery();
由于某些原因,这会按预期打印

CallableStatement:CALL test.proc(1079,0)

但我还是犯了同样的错误

线程“main”java.sql.SQLSyntaxErrorException中的异常:您有 SQL语法中的错误;检查与您的产品相对应的手册 第1行“()”附近使用正确语法的MySQL服务器版本

我真的搞不懂。这不是我在jdbc下使用的第一个MySql过程。我甚至尝试了不同的jdbc驱动程序,但都没有成功


编辑-解决方案
我不知道这是怎么发生的,但解决方案和问题一样疯狂。问题在于花括号。出于某种原因(至少在JDBC8.0.18下),当我从CallableStatement中删除花括号时,效果很好。 再说一次,这对我来说毫无意义,但既然它起作用了,我就不会太怀疑它了

那么台词呢

String q="{call test.proc(?,?)}";
CallableStatement cal=conn.prepareCall(q);
是错误的,正确的陈述是错误的

String q="call test.proc(?,?)";
CallableStatement cal=conn.prepareCall(q);
你应该试试看 nomosbirtions.execute()和q不应使用分号
如果您的过程是select,请使用execute方法返回的布尔值,并使用以下命令获取结果集ResultSet ResultSet=statement.getResultSet()

虽然一些JDBC存储过程需要外部大括号,但我怀疑在这种情况下不需要外部大括号。如果司机悄悄地拆下支架,那就太好了。不幸的是,标准语法并不总是被接受的。我想这就是标准的好处:标准太多了

我建议尝试删除分号:它不属于调用,也不属于它。没有帮助,我将删除字符串中的外括号。也许您的数据库与我使用的数据库不同,但我使用的sql连接中没有一个具有这些花括号。@MarkrotVeel我不知道为什么或如何,但您是对的。这对我来说毫无意义。我确信在jdbc下,使用存储过程时需要花括号,这里就是这种情况。但出于某种原因,移除它们可以修复它。如果你想添加一个答案,接受是正确的,是NomadMaker给出了这个建议,而不是我。不需要花括号。它们是所谓的JDBC转义,旨在使存储过程的执行独立于数据库。JDBC驱动程序应该将其转换为数据库的正确语法(这里显然不能正常工作),但是您可以直接使用该语法。但是,该过程是一个select语句,应该由结果集读取。如果我将其更改为
execute()
,它会给我一个错误,它不会返回结果set@skaros最新答案