【问题标题】:Creating Sequence in Oracle using JDBC PreparedStatment使用 JDBC PreparedStatement 在 Oracle 中创建序列
【发布时间】:2016-09-25 16:19:49
【问题描述】:
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: invalid number” 我做错了什么。

【问题讨论】:

  • 您真的需要为此使用参数化查询吗?无论如何,您都在硬编码参数的值,因此您不妨将其硬编码到字符串中。
  • 你试过去掉“l”吗?
  • @ JonK 是的,我必须基于模式创建新语句,对于每个模式我必须更改索引值,一切都保持不变。正如你所提到的,我将创建字符串。

标签: java database jdbc oracle11g


【解决方案1】:

您只能参数化运行时值,而不是必须在解析时知道和固定的语句元素。对于数据定义 (DDL) 语句,这实际上意味着您根本不能使用参数。

绑定占位符? 在解析时被视为文字字符 - 没有进行绑定替换 - 并且错误表示问号不是有效数字,不能隐式转换为一个。您没有显示错误堆栈,但它应该来自prepareStatement() 调用,而不是executeUpdate() 调用。

虽然建议通常(非常正确)使用参数,但有时这是不可能的,因此您必须连接起始值:

createQuery ="CREATE SEQUENCE AVIA START WITH " + startVal + " INCREMENT BY 1";

在这种情况下,由于您使用的值似乎是固定的,您不妨将其包含在字符串中:

createQuery ="CREATE SEQUENCE AVIA START WITH 1000000000000000 INCREMENT BY 1";

然后你还不如使用普通语句而不是准备好的语句,然后执行它。

顺便说一句,DDL 也隐式提交,所以设置自动提交关闭然后手动提交都是没有意义的。

【讨论】:

  • @Alex Poole 谢谢你的详细解释,正如你提到的我的要求连接可能是要走的路。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多