使用预准备语句

时间:2016-03-22 13:29:52

标签: sql oracle11g prepared-statement java-6

我正在尝试用负数推进序列,但我不断收到以下错误:

  

ORA-02286:没有为ALTER SEQUENCE指定选项

到目前为止,谷歌搜索量没有任何帮助。我使用的陈述是

ALTER SEQUENCE %s.nextval INCREMENT BY ?

序列名称通常为schema.table_name_seq。包含模式名称是不可避免的,因为连接不一定是同一个。

附加一个无关紧要的选项,如minvalue 1也没有做任何事情来满足它。

我的第二次尝试是从查询中删除.nextval并直接在序列上运行ALTER(只是在墙上扔东西以查看此时的内容),即:

ALTER SEQUENCE %s INCREMENT BY ?

导致

  

ORA-01722:无效号码

接下来,我提供了一个正整数,并在查询(INCREMENT BY -?)中将其否定,产生了相同的错误。查询是这样准备的:

num = -1 * Math.abs(num);

stmt = conn.prepareStatement(sql);
stmt.setLong(1, num); //also tried setInt()
stmt.execute();

我们的想法是将给定表的.nextval序列设置为任意数字(但总是超过minval)。

1 个答案:

答案 0 :(得分:1)

JustinCave的评论最具启发性:

  

alter sequence是DDL。您不能在DDL中使用绑定变量。您需要动态构建所需的DDL语句并执行它,使用PreparedStatement这样做是没有意义的。

认识到有更好的方法,但承认时间限制,我构造了以下SQL语句:

ALTER SEQUENCE %s INCREMENT BY %d

就像魅力一样。是的,在每个请求中硬编码要前进的数字。不是最好的解决方案,但我现在无法创建存储过程,所以它必须这样做。

谢谢Justin。