2016-03-22 5 views
0

Я пытаюсь продвигать последовательность отрицательного числом, но я получаю следующее сообщение об ошибке:Alter последовательность .nextval в Oracle SQL 11 с подготовленным заявлением

ORA-02286: no options specified for ALTER SEQUENCE

До сих пор никакого количества Googling не помогло. Заявление, которое я использую, является

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(); 

Идея заключается в том, чтобы установить последовательность .nextval для данной таблицы обратно на произвольное число (но всегда больше, чем minval). Комментарий

+0

'alter sequence' - это DDL. Вы не можете использовать переменные связывания в DDL. Вам нужно будет динамически построить инструкцию DDL, которую вы хотите, и выполнить ее, и не имеет смысла использовать 'PreparedStatement' для этого. –

ответ

1

JustinCave «S был наиболее освещающей:

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 

, который работает Как колдовство. Да, число для продвижения по жестко запрограммировано в каждом запросе. Не лучшее решение, но я не могу создавать хранимые процедуры на этом этапе, так что это нужно будет сделать.

Спасибо, Джастин.