Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jrcardozo

[Resolvido] Último Registro Inserido

Recommended Posts

Opa pessoas

Estou iniciando com oracle e estou com uma dificultade. Como fazer para retornar o Id do registro inserido?

No sql server seria @@IDENTITY, no Mysql last_insert_id, mas e no oracle?

procurei na web e vi uns lances que teria que criar uma trigger, tentei mas não rolou. Alguem poderia colocar um exemplo e, se possivel, dar umas explicadas no script pra aprender?

 

Posto abaixo o qu achei na web:

set feedback off

set serveroutput on -------------------------------------------------------------
--Criamos uma tabela que tera a chave auto-incrementada.
-------------------------------------------------------------
create table auto_increment (
 id                number not null constraint pk_ai primary key,
 something         number
); 
-------------------------------------------------------------
--Criamos uma sequence que vai alimentar a chave.
-------------------------------------------------------------
create sequence seq_auto_increment start with 1 increment by 1;
-------------------------------------------------------------
--Criamos a trigger que vai colocar a seq na chave.
-------------------------------------------------------------
create or replace trigger ai 
 before insert on auto_increment
 for each row
 begin if :new.id is null then
     select seq_auto_increment.nextval into :new.id from dual;
   end if;
 end;
/
declare
 i number;
begin -------------------------------------------------------------
 --aqui vai a manha... Ele retorna o código gerado da sequence!!!
 -------------------------------------------------------------
 insert into auto_increment (something) values (9) returning id into i; dbms_output.put_line('id was: '||i);
 insert into auto_increment (something) values (8) returning id into i; dbms_output.put_line('id was: '||i);
 insert into auto_increment (something) values (4) returning id into i; dbms_output.put_line('id was: '||i);
 insert into auto_increment (something) values (5) returning id into i; dbms_output.put_line('id was: '||i);
end;
/
--drop table auto_increment; 
--drop sequence seq_auto_increment;

 

Ahh...preciso que isso funcione com Asp pois ele que vai controlar o ID inserido, já tentei usando ADO mas li que o Ado no oracle funciona diferente de forma a restringir determinados comandos.

 

Estou tentando fugir do errado 'select max ...' que poderia ocasionar erros

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá jonathandj, a coisa é bem simples.

 

No oracle voce tem a opção em utilizar sequences para gerar numeros sequenciais unicos que são muito uteis para as primary keys. Como voce poderá utilizar esse cara:

- Primeiro: Crie uma sequence (vou utilizar o codigo que voce postou):

 

create sequence seq_auto_increment start with 1 increment by 1

 

Para voce utilizar esse numero unico ao inserir na sua tabela voce pode fazer de varias maneiras, porém voce disse que pretende utilizar o ASP para isso, então, o processo mais simples seria, obter o numero unico a partir da sequence e em seguida inseri-lo.

 

- Segundo: Como obter o numero ? Abra um RecordSet ou Dataset e Execute o seguinte comando:

 

select seq_auto_increment.nextval Id from dual

 

Obs: Aqui ele vai retornar um RecordSet ou Dataset com um campo chamado Id com o numero unico.

 

- Terceiro: Basta inserir os dados na tabela, como voce já deve ter jogado em uma variavel o valor que retornou do id unico, é só executar um insert:

 

insert into auto_increment (something) values (Id);

 

Acredito que essa seria a forma mais simples de voce fazer o insert, é claro que existe a opção de voce utilizar uma procedure com parametros de entrada e saida, que poderia fazer o insert e te retornar o id unico que fora gerado, já é um procedimento um pouco mais complexo.

 

Espero ter ajudado.

 

 

 

Opa pessoas

Estou iniciando com oracle e estou com uma dificultade. Como fazer para retornar o Id do registro inserido?

No sql server seria @@IDENTITY, no Mysql last_insert_id, mas e no oracle?

procurei na web e vi uns lances que teria que criar uma trigger, tentei mas não rolou. Alguem poderia colocar um exemplo e, se possivel, dar umas explicadas no script pra aprender?

 

Posto abaixo o qu achei na web:

set feedback off

set serveroutput on -------------------------------------------------------------
--Criamos uma tabela que tera a chave auto-incrementada.
-------------------------------------------------------------
create table auto_increment (
 id                number not null constraint pk_ai primary key,
 something         number
); 
-------------------------------------------------------------
--Criamos uma sequence que vai alimentar a chave.
-------------------------------------------------------------
create sequence seq_auto_increment start with 1 increment by 1;
-------------------------------------------------------------
--Criamos a trigger que vai colocar a seq na chave.
-------------------------------------------------------------
create or replace trigger ai 
 before insert on auto_increment
 for each row
 begin if :new.id is null then
     select seq_auto_increment.nextval into :new.id from dual;
   end if;
 end;
/
declare
 i number;
begin -------------------------------------------------------------
 --aqui vai a manha... Ele retorna o código gerado da sequence!!!
 -------------------------------------------------------------
 insert into auto_increment (something) values (9) returning id into i; dbms_output.put_line('id was: '||i);
 insert into auto_increment (something) values (8) returning id into i; dbms_output.put_line('id was: '||i);
 insert into auto_increment (something) values (4) returning id into i; dbms_output.put_line('id was: '||i);
 insert into auto_increment (something) values (5) returning id into i; dbms_output.put_line('id was: '||i);
end;
/
--drop table auto_increment; 
--drop sequence seq_auto_increment;

 

Ahh...preciso que isso funcione com Asp pois ele que vai controlar o ID inserido, já tentei usando ADO mas li que o Ado no oracle funciona diferente de forma a restringir determinados comandos.

 

Estou tentando fugir do errado 'select max ...' que poderia ocasionar erros

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Jarold, obrigado pela explicação

 

Agora fica uma duvida....

se eu tiver 200 usuarios conectados ao mesmo tempo fazendo inserções na mesma tabela, desta forma que você passou há possibilidade de um usuario pegar o nextvalue que outro vai acabar usando?

 

Minha duvida toda surge pois no sqserver o @@IDENTITY pega o último ID inserido pela conexao, ou seja, é único e pelo que compreendi o Oracle não tem nada semelhante a resgatar após inserido (de acordo com o ID da conexao que será diferente pra cada usuário) e não antes de inserir.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem,

 

Na questão de mais de um usuário pegar o id unico pode ficar tranquilo, o oracle gerencia isso, mesmo que 2.000.000 de usuários tentem pegar isso ao mesmo tempo, não se repetirá para nenhum.Quando um usuário solicitar um numero o oracle "Locka a sequence" pega o numero e depois "Desalocka ela".

 

Existe uma forma de voce fazer o insert e já pegar o retorno, o exemplo que voce mesmo postou faz isso, porém não sei se no ASP voce conseguirá utiliza-lo.

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa...valeu mesmo pela explicação jarold...fiz um teste e funcionou certinho a reserva da sequence

 

obrigado

 

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.