Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JDBC PreparedStation在Oracle中创建序列_Java_Database_Jdbc_Oracle11g - Fatal编程技术网

Java 使用JDBC PreparedStation在Oracle中创建序列

Java 使用JDBC PreparedStation在Oracle中创建序列,java,database,jdbc,oracle11g,Java,Database,Jdbc,Oracle11g,这给了我“java.sql.SQLSyntaxErrorException:ORA-01722:无效数字” 我做错了什么。您只能参数化运行时值,而不能参数化必须在解析时已知并修复的语句元素。对于数据定义(DDL)语句,这实际上意味着您根本无法使用参数 绑定占位符?在解析时被视为一个文本字符-没有进行绑定替换-并且错误表明问号不是有效数字,无法隐式转换为一。您尚未显示错误堆栈,但它应该来自prepareStatement()调用,而不是executeUpdate()调用 虽然建议通常(非常正确)使

这给了我“java.sql.SQLSyntaxErrorException:ORA-01722:无效数字”
我做错了什么。

您只能参数化运行时值,而不能参数化必须在解析时已知并修复的语句元素。对于数据定义(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感谢您的详细解释,正如您所提到的,我的需求连接可能是一种方法。