Oracle удалить строку, используя порядковый номер - PullRequest
0 голосов
/ 11 мая 2011

Мои знания БД довольно ограничены, и я пытаюсь удалить строку со следующим запросом:

УДАЛИТЬ ИЗ стол ГДЕ столбец в (выберите последовательность . КРИВАЯ ИЗ ДВОЙНОГО);

Используется в .sql для очистки базы данных после запуска интеграционных тестов в Maven. Я гуглил его, но до сих пор не нашел ответа для оператора delete. Любая помощь приветствуется!

Ответы [ 2 ]

4 голосов
/ 11 мая 2011

Вы не можете использовать CURRVAL в операторе DELETE, как вы можете прочитать здесь: http://www.orafaq.com/wiki/ORA-02287

Но поскольку вы используете сценарии SQL, вы можете сделать это следующим образом в SQL * Plus:

SQL> create table t( id number);

Table created.

SQL> create sequence seq;

Sequence created.

SQL> insert into t (id) values (seq.nextval);

1 row created.

SQL> column i new_value curseqval
SQL> select seq.currval i from dual;

         I
----------
         1

1 row selected.

SQL> delete from t where id = &curseqval;
old   1: delete from t where id = &curseqval
new   1: delete from t where id =          1

1 row deleted.

С уважением,
Роб.

2 голосов
/ 11 мая 2011

1) sequence.CURRVAL из DUAL - это одно дискретное значение;использование IN неуместно

2), поскольку вы ссылаетесь на sequence .CURRVAL, вам не нужно использовать подзапрос, вы можете получить доступ к этому значению напрямую.

try:

DELETE FROM table WHERE column = sequence.CURRVAL;

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

упс ... Я сделал достаточно запросов на удаление, чтобы не проверять свою работу.Хотя я никогда не думал использовать значения последовательности в удалении, мне никогда не приходило в голову, что вы не можете сделать это.

это, однако, будет работать:

declare del_key number;
begin
select  seq_so_test.currval into del_key from dual;
delete from t_so_test where id = del_key;
 end;
...