Mostrando postagens com marcador sequence. Mostrar todas as postagens
Mostrando postagens com marcador sequence. Mostrar todas as postagens

sábado, março 30, 2013

Trabalhando com uma tabela de Contadores no MySQL

HI,

Essa dica é fresquinha, acabei de implementar agora.

Estou fazendo um sistema de suporte usando o banco MySQL e para criar o código do protocolo minha intenção é que em cada ano o contador comece do 1.

Exemplo: 201300001, 201300002,  201300...
Quando for 2014 que comece tudo de novo, 201400001, 201400002, ...

Crie uma tabela com dois campo, Ano e Valor.

Incrementar o valor com +1 é tranquilo, mas como garantir que dois usuários não peguem o mesmo valor?

Pensei em bloquear o registro para dar um update e pegar o valor atual. Pesquisando como fazer isso, achei dessa maneira que pensei em fazer e uma muito melhor.

Achei a dica aqui

MySQL How To Select and Update in Single Statement - Increment Counter avoiding Race Condition
http://www.sqlines.com/mysql/how-to/select-update-single-statement-race-condition

Usei essa solução


UPDATE counters
SET value = LAST_INSERT_ID(value) + 1
WHERE id = 1;

SELECT LAST_INSERT_ID();


Mas eu não quis usar pegando o valor atual, e sim ele +1

Ficou assim meu update

DECLARE novo_valor INT;


UPDATE seq_protoco
SET valor = LAST_INSERT_ID(valor + 1)
WHERE ano = 2013;

SELECT LAST_INSERT_ID() INTO novo_valor;




Fiquem na Paz!!!

segunda-feira, fevereiro 27, 2012

Obter o valor da sequence gerada ao inserir um registro no oracle.

HI,

Acabei de aprender isso e já estou disponibilizando aqui.

Situação:

Criei uma procedure para chamar duas outras procedures. Uma cria o registro Pai e a outra o registro Filho.

Eu tinha que passar o código do registro Pai para a procedure dois.

Antes tinha resolvido isso armazenando o valor da sequence em uma variável e depois passava para as duas procedures, ficando assim:


create or replace procedure INSERIR_MSG_USUARIO(pusr_id    number,
                            ptitulo   varchar2, pmensagem   varchar2, pcod_sistema     number)
is
        seq number := 0;
begin
        select cam_nrid.nextval into seq from dual;
   
        inserir_campanha('MENSAGEM AUTOMÁTICA AO USUÁRIO',
                         ptitulo, pmensagem, pcod_sistema, seq);
                            
        inserir_registro_envio(seq, pusr_id, sysdate);    
end;

Essa procedure é só para exemplificar.

Pesquisando no google achei como obter o código da sequence na clausula INSERT, e retornar o seu valor através de um parâmetro do tipo OUT.

Obtendo o valor da Sequence

Retornado um valor através da procedure


Usando o returning não precisei mais dessa linha: select cam_nrid.nextval into seq from dual;

Espero que possa ser útil.

Fiquem na Paz!!!