Последовательности оракулов:КАРРВАЛЮ сюда нельзя?

StackOverflow https://stackoverflow.com/questions/1438454

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top