- Este tópico contém 9 respostas, 3 vozes e foi atualizado pela última vez 14 anos, 7 meses atrás por
diegolenhardt.
-
AutorPosts
-
2 de agosto de 2011 às 4:39 pm #100196
eversonpiza
ParticipantePessoal,
Criei uma sequence iniciando em 1, e faço um insert pegando o nextval dela, mas tá inserindo dois na tabela, se eu faço um select seq.nextval from dual trás 1.
Segue um caso de teste
SQL> CREATE TABLE tabela_tst (ID NUMBER(10) NOT NULL);Table created
SQL> CREATE SEQUENCE SEQ_tabela_tst INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE CACHE 20 ;Sequence created
SQL> INSERT INTO tabela_tst (id) VALUES (SEQ_tabela_tst.nextval) ;1 row inserted
SQL> select t.id from tabela_tst t;ID
-----------
2
SQL> CREATE SEQUENCE SEQ_tabela_tst INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE CACHE 20 ;Sequence created
SQL> select SEQ_tabela_tst.nextval from dual;
NEXTVAL
----------
1
O mesmo teste em uma instância 10g tem o comportamento ‘correto’ esperado.
2 de agosto de 2011 às 5:14 pm #100197eversonpiza
ParticipanteUma nova informação.
Se eu conectar como “/ as sysdba” ele funciona direitinho, qualquer usuário ‘mortal’ retorna 2.
2 de agosto de 2011 às 5:53 pm #100198rman
ParticipanteExecutando aqui com um usuario com grant de dba, o retorno é 1.
Estou utilizando o Oracle Database 10g Release 10.2.0.4.0 – 64bit Production
Em casa posso testar no Oracle 11g R2…
2 de agosto de 2011 às 6:15 pm #100199eversonpiza
ParticipanteOlá “rman”
Estou desconfiado de algum bug no Oracle 11g, o comportamento é realmente estranho, no 10g nunca vi isso acontecer.
Se eu conectado como sysdba crio a sequence no SYS e a tabela em um novo owner, ele tb retorna 2.
Olha o teste que fiz:
SQL> show user;
USER is "SYS"
SQL> create user tst_seq identified by tst_sql default tablespace users;User created.
SQL> alter user tst_seq quota unlimited on users;
User altered.
SQL> CREATE TABLE tst_seq.tabela_tst (ID NUMBER(10) NOT NULL);
Table created.
SQL> CREATE SEQUENCE SEQ_tabela_tst INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE CACHE 20 ;
Sequence created.
SQL> INSERT INTO tst_seq.tabela_tst (id) VALUES (SEQ_tabela_tst.nextval) ;
1 row created.
SQL> select id from tst_seq.tabela_tst t;
ID
22 de agosto de 2011 às 9:19 pm #100200diegolenhardt
Participantetenta criar a sequence com NOCACHE…
2 de agosto de 2011 às 9:30 pm #100201eversonpiza
ParticipanteOi Diego,
Já tentei isso 🙁
2 de agosto de 2011 às 11:03 pm #100202diegolenhardt
Participantehttp://www.stefanocislaghi.eu/2010/06/s … -of-11gr2/
o cara diz que tem um parametro no banco pra um recurso novo:
SQL> show parameter def
NAME TYPE VALUE
deferred_segment_creation boolean FALSE
veja se é isso mesmo
3 de agosto de 2011 às 4:42 am #100204rman
ParticipanteAcho que o diegolenhardt matou a questão.
Realmente o parâmetro deferred_segment_creation mudou o comportamento, mas um detalhe, nada mudou em relação a sequence, o que mudou foi em relação as tabelas não particionadas e objetos dependentes da tabela como lob e índices, a tabela só é criada de fato, após a primeira inserção de registro.
Retirado da documentação oficial:
DEFERRED_SEGMENT_CREATIONProperty Description
Parameter type Boolean
Default value true
Modifiable ALTER SESSION, ALTER SYSTEM
Range of values true | false
Basic No
DEFERRED_SEGMENT_CREATION specifies the semantics of deferred segment creation. If set to true, then segments for non-partitioned tables and their dependent objects (LOBs, indexes) will not be created until the first row is inserted into the table.Before creating a set of tables, if it is known that a significant number of them will not be populated, then consider setting this parameter to true. This saves disk space and minimizes install time.
Fiz alguns testes para entender melhor como funciona o parâmetro, por padrão ele é verdadeiro.
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as sakamotoSQL> CREATE TABLE TABELA_TST (ID NUMBER(10) NOT NULL);
Table created
SQL> CREATE SEQUENCE SEQ_TABELA_TST INCREMENT BY 1 START WITH 1 MAXVALUE 9999999999 NOCYCLE CACHE 20;
Sequence created
SQL> INSERT INTO TABELA_TST (ID) VALUES (100);
1 row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT T.ID FROM TABELA_TST T;
ID
100SQL> INSERT INTO TABELA_TST (ID) VALUES (SEQ_TABELA_TST.NEXTVAL) ;
1 row inserted
SQL> COMMIT;
Commit complete
SQL> SELECT T.ID FROM TABELA_TST T;
ID
100 1Repare que eu inseri o primeiro registro com valor 100 para sabermos que foi gerado na mão, e não pela sequence. Neste momento a tabela foi criada de fato, em seguida inseri utilizando a sequence, veja que foi inserido o valor 1.
O que acontece quando tentamos inserir direto o primeiro registro vindo da sequence ? Provavelmente a sequence gera o valor 1 e tenta inserir na tabela, por algum motivo a inserção falha, é quando a tabela é criada de verdade, então é tentado inserir novamente, é gerado o valor 2, então é inserido com sucesso.
Pelos testes foi isso que eu conclui, posso estar falando besteira… ^^
3 de agosto de 2011 às 5:52 pm #100210eversonpiza
ParticipanteDiego,
Obrigado.Interessante este parâmetro, e ele realmente resolveu o meu problema.
Mas na minha opinião isto continua sendo um BUG, independente do ‘atraso’ na criação da tabela a sequence deveria ter sua ordem respeitada.
3 de agosto de 2011 às 7:28 pm #100212diegolenhardt
Participanterman,
parece que é isso mesmo,
porque se voce fizer o select com o nextval ele retorna 1, e o insert da zica, portanto o problema ta na tabela mesmo..
😀
a vantagem pelo que vi é em ambientes de desenvolvimento, pra nao alocar os primeiros segmentos com a criacao dos objetos. mas sei lá
-
AutorPosts
- Você deve fazer login para responder a este tópico.