Последовательности оракулов:КАРРВАЛЮ сюда нельзя?
Вопрос
Следующий код Oracle SQL генерирует ошибку "ORA-02287:порядковый номер здесь не разрешен":
INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT * FROM Customer where CustomerID=Customer_Seq.currval;
Ошибка возникает во второй строке (оператор SELECT).Я действительно не понимаю проблему, потому что это действительно работает:
INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT Customer_Seq.currval from dual;
Решение
Вы опубликовали несколько примеров кода, поэтому неясно, чего вы пытаетесь достичь.Если вы хотите узнать присвоенное значение, скажем, для перехода к какой-либо другой процедуре вы могли бы сделать что-то вроде этого:
SQL> var dno number
SQL> insert into dept (deptno, dname, loc)
2 values (deptno_seq.nextval, 'IT', 'LONDON')
3 returning deptno into :dno
4 /
1 row created.
SQL> select * from dept
2 where deptno = :dno
3 /
DEPTNO DNAME LOC
---------- -------------- -------------
55 IT LONDON
SQL>
Редактировать
Мы можем использовать предложение RETURNING для получения значений любого столбца, включая те, которые были установлены со значениями по умолчанию или с помощью кода триггера.
Другие советы
Вы не говорите, какую версию Oracle вы используете. В прошлом существовали ограничения на то, где последовательности могут использоваться в PL / SQL - в основном, если не все в 11G. Кроме того, в SQL есть ограничения - см. этот список .
В этом случае вам может понадобиться написать:
SELECT Customer_Seq.currval INTO v_id FROM DUAL;
SELECT * FROM Customer where CustomerID=v_id;
(отредактировано после комментариев).
На самом деле это не дает прямого ответа на ваш вопрос, но, возможно, то, что вы хотите сделать, может быть решено с помощью предложения INSERT RETURNING?
DECLARE -- ... last_rowid rowid; -- ... BEGIN -- ... INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA') RETURNING rowid INTO last_rowid; SELECT * FROM Customer where rowid = last_rowid; -- ... END; /
Вы не можете использовать последовательность в предложении WHERE - это выглядит естественно в вашем контексте, но Oracle не разрешает ссылку в выражении сравнения.
[Править]
Это была бы реализация на PL / SQL:
declare
v_custID number;
cursor custCur is
select customerid, name from customer
where customerid = v_custID;
begin
select customer_seq.nextval into v_custID from dual;
insert into customer (customerid, name) values (v_custID, 'AAA');
commit;
for custRow in custCur loop
dbms_output.put_line(custRow.customerID||' '|| custRow.name);
end loop;
end;
Вы не создали ни одного
sequence
Сначала создайте любую последовательность, ее цикл и кэш. Это основной пример
Create Sequence seqtest1
Start With 0 -- This Is Hirarchy Starts With 0
Increment by 1 --Increments by 1
Minvalue 0 --With Minimum value 0
Maxvalue 5 --Maximum Value 5. So The Cycle Of Creation Is Between 0-5
Nocycle -- No Cycle Means After 0-5 the Insertion Stopes
Nocache --The cache Option Specifies How Many Sequence Values Will Be Stored In Memory For Faster Access
Вы не можете выполнить предложение «Где» для последовательности в SQL, поскольку вы не можете фильтровать последовательность. Используйте такие процедуры, как @APC сказал