Session Level Sequences
No Oracle Database 12c, foi introduzida uma nova funcionalidade, as Session level sequences.
Session level sequences são utilizadas para produzir valores únicos dentro de uma sessão. Assim que a sessão termina, a sequence é reinicializada.
Elas são muito utilizadas para gerar valores de Primary Keys em Global Temporary Tables.
SQL> CREATE SEQUENCE sequence_teste
START WITH 1
INCREMENT BY 1
SESSION
Sequence created.</span>
CREATE GLOBAL TEMPORARY TABLE tabela_teste (
id NUMBER DEFAULT sequence_teste.nextval NOT NULL
,first_name VARCHAR2(20)
,last_name VARCHAR2(25)
)
ON COMMIT PRESERVE ROWS
/
Table created.
INSERT INTO tabela_teste (first_name, last_name)
SELECT first_name, last_name
FROM hr.employees
WHERE rownum < 6
/
5 rows created.
SELECT *
FROM tabela_teste
/
EMPLOYEE_ID FIRST_NAME LAST_NAME</span>
----------- -------------------- -------------------------
1 Joao Silva
2 Andre Silva
3 Pedro Silva
4 Mario Silva
5 Fulano Silva
Em outra sessão:
INSERT INTO tabela_teste (first_name, last_name)
SELECT first_name, last_name
FROM hr.employees
WHERE rownum < 10
/
9 rows created.
SELECT *
FROM tabela_teste
/
EMPLOYEE_ID FIRST_NAME LAST_NAME
----------- -------------------- -------------------------
1 Joao Silva
2 Andre Silva
3 Pedro Silva
4 Mario Silva
5 Fulano Silva
6 Ciclano Silva
7 Beltrano Silva
8 Jose Silva
9 Alex Silva
Os parâmetros CACHE, NOCACHE, ORDER ou NOORDER são ignorados pelas SESSION level sequences.
Pode-se alterar sequences existentes:
SQL> ALTER SEQUENCE … GLOBAL;
SQL> ALTER SEQUENCE … SESSION;
Session level sequences devem ser criadas em um banco read/write e, podem ser acessadas em um banco read/write ou read/only (mesmo em um banco regular, aberto temporariamente como read/only).
Referências
- http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_6016.htm#SQLRF54343
- http://docs.oracle.com/cd/E16655_01/server.121/e17640/manage_ps.htm#SBYDB5169
Abraço