使用JDBC PreparedStatment在Oracle中创建序列

时间:2016-05-27 10:51:24

标签: java database jdbc oracle11g

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:无效的数字” 我做错了什么。

1 个答案:

答案 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也隐式提交,因此设置自动提交然后手动提交都是没有意义的。