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:无效的数字” 我做错了什么。
答案 0 :(得分:3)
您只能参数化运行时值,而不是必须知道并在分析时修复的语句元素。对于数据定义(DDL)语句,实际上意味着您根本无法使用参数。
绑定占位符?
在解析时被视为文字字符 - 没有进行绑定替换 - 并且错误表示问号不是有效数字,并且不能隐式转换为一个。您尚未显示错误堆栈,但应该来自prepareStatement()
来电,而不是executeUpdate()
来电。
虽然建议通常(非常正确)使用参数,但有时它是不可能的,所以你必须连接起始值:
createQuery ="CREATE SEQUENCE AVIA START WITH " + startVal + " INCREMENT BY 1";
在这种情况下,由于您正在使用的值似乎已修复,您可以将其包含在字符串中:
createQuery ="CREATE SEQUENCE AVIA START WITH 1000000000000000 INCREMENT BY 1";
然后你也可以使用普通语句而不是预备语句,然后执行它。
顺便提一下,DDL也隐式提交,因此设置自动提交然后手动提交都是没有意义的。