- Este tópico contém 11 respostas, 5 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por
Ishii.
-
AutorPosts
-
27 de novembro de 2009 às 3:20 pm #91185
Shiono
ParticipantePessoal bom dia que comando eu executo no oracle para saber se uma tabela tem uma coluna de auto incremento?
Desde já eu agradeço
27 de novembro de 2009 às 3:48 pm #91186Ishii
ParticipanteOlá,
Diferente do SQL Server, no Oracle a coluna auto-incremento deve ser construída com uma sequence que pode ser inserida via comando insert direto (inserto into table values sequence.nextval etc…) ou via trigger mas sempre usando uma sequence.
[]s Ishii
27 de novembro de 2009 às 3:58 pm #91187Shiono
ParticipanteOla Ishii
Mas tem como eu sabe se uma tabela tem alguma sequence relacionada?
27 de novembro de 2009 às 4:09 pm #91188rwarstat
ParticipanteOs meus parcos conhecimentos de Oracle dizem que tu cria a sequence e pode usá-la em qualquer lugar. Ela não fica ligada diretamente à nenhuma coluna ou outra estrutura do banco.
Ou seja, se tu criar uma sequence sq_nr_produto, tanto vai poder usar ela numa trigger para fazer o insert em uma tabela como em um código PL/SQL.[]´s
Roberto27 de novembro de 2009 às 5:26 pm #91189MauroLacerda
ParticipanteCaso voce não queira usar sequence voce pode fazer assim:
Exemplo :
Tabela1
Codigo Number,
Nome Varchar2(10).insert into tabela1 (codigo,nome) values ((select nvl(max(codigo),0)+1 from tabela1),);
Abs.
27 de novembro de 2009 às 8:22 pm #91195Shiono
ParticipanteEstava lendo umas postagem, esta escrito que eu posso usar uma unica sequence para varias tabelas, se eu entendi corretamente.
Minha duvida é a seguinte
se eu tenho uma tabela X com 10 registros e um tabela Y com 200
como que o oracle sabe que o proximo X será 11 e o proximo Y 201
Nao entendi isto
27 de novembro de 2009 às 8:40 pm #91197MauroLacerda
ParticipanteA sequence pode servir para as duas tabelas so que não haveria numero iguais para as duas.
Exemplo : Sequence em 1.
Insert na primeira tabela – 1
Insert na segunda tabela – 2 (.Nextval)Como voce pode ver não haver o “1” nas duas tabelas.
Abs.
27 de novembro de 2009 às 8:41 pm #91198burga
ParticipanteOi Shiono,
No caso o Oracle não sabe,
O objeto sequence grava o ultimo número solicitado a ela. Assim quando você pede outro número pra ela, ela te passa o ultimo + 1.
Se o ultimo número foi 200, o próximo será 201, independente da tabela que você vá utilizar.
27 de novembro de 2009 às 8:45 pm #91200Shiono
ParticipanteValeu pessoal pela ajuda agora entendi o esquema, muito obrigado
27 de novembro de 2009 às 10:02 pm #91202Shiono
ParticipantePessoal tem como eu dar um reseset no last_number da dba_sequences ou
user_sequences.Para um valor que eu precise no momento???
27 de novembro de 2009 às 10:34 pm #91206burga
ParticipanteUm jeito conhecido, sem ser o de dropar e recriar a sequence é o seguinte (parece gambiarra). Exemplo:
Digamos que a sua sequence está no número 10 e você deseja que passe a 200, então você altera o increment by pra 189 e faz um select na sequence:
alter sequence sequencia
increment by 189;select sequencia.nextval from dual;
feito isto você altera novamente o valor do increment by pro valor que estava antes:
alter sequence sequencia
increment by 1;Note que se quiser diminuir o número você pode setar o increment by pra um valor negativo…
27 de novembro de 2009 às 10:36 pm #91207Ishii
ParticipanteOlá,
Eu uso o código:
alter sequence increment by nocache;
select .nextval from dual;
alter sequence increment by 1 nocache;
declare
LastValue integer;
begin
loop
select .currval into LastValue from dual;
exit when LastValue >= - 1;
select .nextval into LastValue from dual;
end loop;
end;
/
alter sequence increment by 1 nocache;
[]s Ishii
-
AutorPosts
- Você deve fazer login para responder a este tópico.