PreparedStatement updateSeq = null;
String createQuery ="CREATE SEQUENCE AVIA START WITH ? INCREMENT BY 1";
try {
con.setAutoCommit(false);
updateSeq = con.prepareStatement(createQuery);
updateSeq.setLong(1, 1000000000000000l);
updateSeq.executeUpdate();
con.commit();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
updateSeq.close();
con.setAutoCommit(true);
} catch (SQLException e) {
e.printStackTrace();
}
}
这给了我“ java.sql.SQLSyntaxErrorException:ORA-01722:无效的数字”我在做什么错。
您只能参数化运行时值,不能参数化必须在解析时知道并固定的语句元素。对于数据定义(DDL)语句,这实际上意味着您根本无法使用参数。
绑定占位符?
在解析时被视为文字字符-没有进行绑定替换-并且由于错误表明问号不是有效数字,因此不能隐式转换为1。您没有显示错误堆栈,但是错误堆栈应该来自prepareStatement()
调用而不是executeUpdate()
调用。
尽管建议(通常是正确的)可以使用参数,但有时是不可能的,因此您必须将起始值连接起来:
createQuery ="CREATE SEQUENCE AVIA START WITH " + startVal + " INCREMENT BY 1";
在这种情况下,由于您使用的值似乎是固定的,因此您最好将其包括在字符串中:
createQuery ="CREATE SEQUENCE AVIA START WITH 1000000000000000 INCREMENT BY 1";
然后,您最好使用一个普通语句而不是一个准备好的语句,然后执行它。
顺便说一下,DDL也会隐式提交,因此将auto-commit设置为off,然后手动提交都是没有意义的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句