Domanda

Il seguente codice Oracle SQL genera l'errore " ORA-02287: numero di sequenza non consentito qui " ;:

INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT * FROM Customer where CustomerID=Customer_Seq.currval;

L'errore si verifica sulla seconda riga (istruzione SELECT). Non capisco davvero il problema, perché funziona:

INSERT INTO Customer (CustomerID,Name) VALUES (Customer_Seq.nextval,'AAA');
SELECT Customer_Seq.currval from dual;
È stato utile?

Soluzione

Hai inserito del codice di esempio, quindi non è chiaro cosa stai cercando di ottenere. Se vuoi conoscere il valore assegnato, supponi che per passare ad un'altra procedura potresti fare qualcosa del genere:

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>

Modifica

Possiamo usare la clausola RETURNING per ottenere i valori di qualsiasi colonna, compresi quelli che sono stati impostati con valori predefiniti o tramite codice trigger.

Altri suggerimenti

Non dici quale versione di Oracle stai utilizzando. In passato ci sono state delle limitazioni su dove le sequenze possono essere usate in PL / SQL, soprattutto se non tutte in 11G. Inoltre, ci sono restrizioni in SQL: consultare questo elenco .

In questo caso potrebbe essere necessario scrivere:

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

(Modificato dopo i commenti).

Questo in realtà non risponde direttamente alla tua domanda, ma forse quello che vuoi fare può essere risolto usando una clausola RETURNING INSERT?

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;
/

Non è possibile utilizzare una sequenza in una clausola WHERE: sembra naturale nel proprio contesto, ma Oracle non consente il riferimento in un'espressione di confronto.

[Modifica]

Questa sarebbe un'implementazione 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;

Non ne hai creato nessuno

sequence 

Per prima cosa crea una sequenza qualsiasi il suo ciclo e cache. Questo è un esempio di base

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

Non è possibile eseguire la clausola Where su Sequence in SQL perché non è possibile filtrare una sequenza. Usa procedure come diceva @APC

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top