.nextval проблема со вставкой JDBC

Я пытаюсь вставить в таблицу последовательность .nextval в качестве первичного ключа, sql в Java

sql = "INSERT INTO USER 
         (USER_PK, ACCOUNTNUMBER, FIRSTNAME, LASTNAME, EMAIL ) 
       VALUES 
         (?,?,?,?,?)";
   ps = conn.prepareStatement(sql);
   ps.setString(1, "User.nextval");
   ps.setString(2, accountNumber);
   ps.setString(3, firstName);
   ps.setString(4, lastName);
   ps.setString(5, email);

Однако ошибка ORA-01722: invalid number

Все остальные поля правильные, я думаю, что это проблема последовательности, это правильно?


person jasonfungsing    schedule 21.12.2010    source источник
comment
Это должно быть индексировано 0? Изменить: нет   -  person Stefan H    schedule 21.12.2010
comment
Является ли имя вашей последовательности User? Это должно быть SequenceName.NextVal. Кроме того, просто используйте подготовленный оператор для всего, кроме имени последовательности.NextVal.   -  person Stefan H    schedule 21.12.2010
comment
Я не работаю с Oracle, но в PostgreSQL они (последовательности, созданные как тип SERIAL PRIMARY KEY) автоматически увеличиваются на каждые INSERT. Обычно вы хотели бы опустить его в операторе INSERT, чтобы БД обработала его сама. Итак, в вашем случае вы, скорее всего, пропустите столбец USER_PK из своего SQL. MySQL, DB2 и SQLServer также имеют аналогичные конструкции.   -  person BalusC    schedule 21.12.2010
comment
@BalusC: SQL Server 2011 будет поддерживать последовательности - теперь просто нужно заставить MySQL сделать это :/. Насколько мне известно, у Oracle нет ничего похожего на serial PostgreSQL.   -  person OMG Ponies    schedule 21.12.2010


Ответы (1)


Проблема в том, что первый столбец является числовым типом данных, но ваш подготовленный запрос отправляет тип данных string/VARCHAR. Оператор выполняется как есть, у Oracle нет возможности преобразовать использование nextval для получения значения последовательности.

Вот альтернатива синтаксиса PreparedStatement Java:

sql = "INSERT INTO USER 
        (USER_PK, ACCOUNTNUMBER, FIRSTNAME, LASTNAME, EMAIL ) 
       VALUES 
        (user.nextval, ?, ?, ?, ?)";
ps = conn.prepareStatement(sql);
ps.setString(1, accountNumber);
ps.setString(2, firstName);
ps.setString(3, lastName);
ps.setString(4, email);

Это предполагает, что user является существующей последовательностью — измените ее в соответствии с требованиями.

person OMG Ponies    schedule 21.12.2010
comment
Хотя лично это была бы функция Oracle, если бы это зависело от меня. Тогда ссылка на последовательность будет в функции, просто укажите те же параметры для вставки. - person OMG Ponies; 21.12.2010
comment
Работал как шарм СПАСИБО! :D - person Skizo-ozᴉʞS; 25.04.2017