Проблема с последовательностью в оракуле - PullRequest
1 голос
/ 07 апреля 2011

Сначала я создал последовательность в oracle в скрипте perl. Я получаю ошибку, заявляющую последовательность, уже созданную ошибку. Есть ли какие-либо средства для сброса последовательности (Создать или заменить не работает)

create or replace sequence test_seq start with 1900 increment by 1 nomaxvalue

sprintf("INSERT INTO Custodian_New (Loginid,Type, Id, User, TimeCreated, RcNumber) values ('%s',1, %d, '%s', %d, '%s')", seq_name.nextVal,$dd, $Name, time(), $rc_num); 

Вышеупомянутое утверждение в сценарии perl печатает: 'test_seqnextVal' для последовательности.Так что ошибка

DBD::Oracle::db do failed: ORA-01722: invalid number (DBD ERROR: error possibly near <*>seq_name )occurs.

Подскажите пожалуйста, в чем проблема? Спасибо.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Для ORA-01722 ваш sprintf имеет одинарные кавычки вокруг %s, поэтому он попытается вставить строку "seq_name.nextVal" в числовое поле вместо значения из последовательности;эта строка не может быть преобразована в число, следовательно, ошибка.Вы можете удалить одинарные кавычки:

sprintf("INSERT INTO Custodian_New (Loginid, Type, Id, User, TimeCreated, RcNumber) values (%s, 1, %d, '%s', %d, '%s')", "seq_name.nextVal", $dd, $Name, time(), $rc_num);

Или просто встроить последовательность напрямую, так как кажется, что нет никакого смысла в ее динамическом построении:

sprintf("INSERT INTO Custodian_New (Loginid, Type, Id, User, TimeCreated, RcNumber) values (seq_name.nextVal, 1, %d, '%s', %d, '%s')", $dd, $Name, time(), $rc_num);

Или даже лучше, используйтесвязывать переменные и устанавливать их на $dd и т. д. Я бы также использовал sysdate вместо передачи time(), но не знаю, действительно ли это имеет какое-то значение.

2 голосов
/ 07 апреля 2011

Для сброса последовательности см. Как мне сбросить последовательность в Oracle?

...