使用JDBC PreparedStatment在Oracle中创建序列

用户名
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章