jrcardozo 4 Denunciar post Postado Março 16, 2009 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
Jarold 0 Denunciar post Postado Março 17, 2009 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
jrcardozo 4 Denunciar post Postado Março 18, 2009 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
Jarold 0 Denunciar post Postado Março 18, 2009 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
jrcardozo 4 Denunciar post Postado Março 18, 2009 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