Java 使用JDBC PreparedStation在Oracle中创建序列
这给了我“java.sql.SQLSyntaxErrorException:ORA-01722:无效数字”Java 使用JDBC PreparedStation在Oracle中创建序列,java,database,jdbc,oracle11g,Java,Database,Jdbc,Oracle11g,这给了我“java.sql.SQLSyntaxErrorException:ORA-01722:无效数字” 我做错了什么。您只能参数化运行时值,而不能参数化必须在解析时已知并修复的语句元素。对于数据定义(DDL)语句,这实际上意味着您根本无法使用参数 绑定占位符?在解析时被视为一个文本字符-没有进行绑定替换-并且错误表明问号不是有效数字,无法隐式转换为一。您尚未显示错误堆栈,但它应该来自prepareStatement()调用,而不是executeUpdate()调用 虽然建议通常(非常正确)使
我做错了什么。您只能参数化运行时值,而不能参数化必须在解析时已知并修复的语句元素。对于数据定义(DDL)语句,这实际上意味着您根本无法使用参数 绑定占位符
?
在解析时被视为一个文本字符-没有进行绑定替换-并且错误表明问号不是有效数字,无法隐式转换为一。您尚未显示错误堆栈,但它应该来自prepareStatement()
调用,而不是executeUpdate()
调用
虽然建议通常(非常正确)使用参数,但有时这是不可能的,因此您必须连接起始值:
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();
}
}
在这种情况下,由于您使用的值似乎是固定的,因此您不妨将其包含在字符串中:
createQuery ="CREATE SEQUENCE AVIA START WITH " + startVal + " INCREMENT BY 1";
然后,您还可以使用一个普通语句而不是一个准备好的语句,然后执行它
顺便说一句,DDL也隐式提交,因此关闭自动提交和手动提交都是毫无意义的。您只能参数化运行时值,而不能参数化必须在解析时已知和修复的语句元素。对于数据定义(DDL)语句,这实际上意味着您根本无法使用参数 绑定占位符
?
在解析时被视为一个文本字符-没有进行绑定替换-并且错误表明问号不是有效数字,无法隐式转换为一。您尚未显示错误堆栈,但它应该来自prepareStatement()
调用,而不是executeUpdate()
调用
虽然建议通常(非常正确)使用参数,但有时这是不可能的,因此您必须连接起始值:
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();
}
}
在这种情况下,由于您使用的值似乎是固定的,因此您不妨将其包含在字符串中:
createQuery ="CREATE SEQUENCE AVIA START WITH " + startVal + " INCREMENT BY 1";
然后,您还可以使用一个普通语句而不是一个准备好的语句,然后执行它
顺便说一句,DDL也隐式提交,因此关闭自动提交和手动提交都是毫无意义的。您真的需要为此使用参数化查询吗?无论如何,您都在硬编码参数的值,因此您不妨将其硬编码到字符串中。您是否尝试删除“l”?@JonK是的,我必须基于架构创建新语句,对于每个架构,我必须更改索引值,所有内容都保持不变。正如您所提到的,我将创建字符串。您真的需要为此使用参数化查询吗?无论如何,您都在硬编码参数的值,因此您不妨将其硬编码到字符串中。您是否尝试删除“l”?@JonK是的,我必须基于架构创建新语句,对于每个架构,我必须更改索引值,所有内容都保持不变。正如您所提到的,我将创建字符串。@Alex Poole感谢您的详细解释,正如您所提到的,我的需求连接可能是一种方法。@Alex Poole感谢您的详细解释,正如您所提到的,我的需求连接可能是一种方法。