Последовательности Oracle: CURRVAL здесь не разрешен? - PullRequest
2 голосов
/ 17 сентября 2009

Следующий код 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;

Ответы [ 5 ]

8 голосов
/ 17 сентября 2009

Вы опубликовали пример кода, поэтому неясно, чего вы пытаетесь достичь. Если вы хотите узнать назначенное значение, скажем, для перехода к какой-либо другой процедуре вы можете сделать что-то вроде этого:

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 для получения значений любого столбца, включая те, которые были установлены со значениями по умолчанию или с помощью кода триггера.

5 голосов
/ 17 сентября 2009

Вы не говорите, какую версию Oracle вы используете. В прошлом существовали ограничения на то, где последовательности могут использоваться в PL / SQL - в основном, если не все в 11G. Кроме того, в SQL есть ограничения - см. этот список .

В этом случае вам может понадобиться написать:

SELECT Customer_Seq.currval INTO v_id FROM DUAL; 
SELECT * FROM Customer where CustomerID=v_id;

(отредактировано после комментариев).

4 голосов
/ 17 сентября 2009

Это на самом деле не дает прямого ответа на ваш вопрос, но, возможно, то, что вы хотите сделать, может быть решено с помощью предложения 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;
/
3 голосов
/ 17 сентября 2009

Вы не можете использовать последовательность в предложении 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;
0 голосов
/ 06 апреля 2013

Вы не создали ни одного

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 сказал

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...