使用准备好的语句在 Oracle SQL 11 中更改序列 .nextval

Alter sequence .nextval in Oracle SQL 11 with prepared statement

我试图将一个序列推进一个负数,但我不断收到以下错误:

ORA-02286: no options specified for ALTER SEQUENCE

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

ALTER SEQUENCE %s.nextval INCREMENT BY ?

序列名一般为schema.table_name_seq。包含架构名称是不可避免的,因为连接不一定是同一个连接。

附加一个无关紧要的选项,如 minvalue 1 也无法满足它。

我的第二次尝试是从查询中删除 .nextval 并直接在序列上删除 运行 ALTER(只是把东西扔到墙上看看此时有什么粘住),即:

ALTER SEQUENCE %s INCREMENT BY ?

这导致

ORA-01722: invalid number

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

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

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

想法是将给定 table 的 .nextval 序列设置回任意数字(但总是大于 minval)。

JustinCave 的评论最有启发性:

alter sequence is DDL. You cannot use bind variables in DDL. You would need to dynamically build the DDL statement you want and execute that and it wouldn't make sense to use a PreparedStatement to do so.

认识到有更好的方法来做到这一点,但承认时间有限,我构建了以下 SQL 语句:

ALTER SEQUENCE %s INCREMENT BY %d

这很有魅力。是的,要前进的数字在每个请求中都是硬编码的。这不是最好的解决方案,但此时我无法创建存储过程,因此必须这样做。

谢谢贾斯汀。