【发布时间】:2016-02-24 08:35:06
【问题描述】:
我必须通过传递值从 java 类执行存储过程。但是当我尝试这样做时,我得到了错误
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:995)
at com.coolminds.action.OperatorBillCorrection.main(OperatorBillCorrection.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
这是我的代码。
public class OperatorBillCorrection {
public static void main(String args[]) throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection(
"jdbc:mysql://localhost:3306/webill_operator_2016","root","root123");
String opCode="KL04C019" ;
for(int i=0;i<=12;i++) {
String dt= "2015-"+i+"-1" ;
PreparedStatement stmts=con.prepareStatement("call sp_getOperatorCollection(?,?)") ;
stmts.setString(1,opCode);
stmts.setString(2,dt);
stmts.execute();
}
for(int i=0;i<=2;i++) {
String dt= "2016-"+i+"-1" ;
PreparedStatement stmts=con.prepareStatement("call sp_getOperatorCollection(?,?)") ;
stmts.setString(1,opCode);
stmts.setString(2,dt);
stmts.execute();
}
System.out.println("Completed") ;
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
当我使用 Statement stmt=con.createStatement(); stmt.execute("call sp_getOperatorCollection('KL04C019','2015-09-01')"); 而不是 PreparedStatement 时它正在工作
【问题讨论】:
-
尝试发布过程:sp_getOperatorCollection
-
您是否尝试从任何 SQL 客户端调用具有相同参数的相同存储过程?
-
是的。当我使用 Statement stmt=con.createStatement(); 时它正在工作stmt.execute("调用 sp_getOperatorCollection('KL04C019','2015-09-01')");而不是 PreparedStatement
-
看起来错误出在您的程序中
-
如果其他一切都很好,然后尝试
CallableStatement,javadoc 说 - 用于执行 SQL 存储过程的接口 CallableStatement。
标签: java mysql stored-procedures prepared-statement