segunda-feira, 26 de outubro de 2015

Insert com a recuperação do ID

Buenas pessoal, já faz muito tempo que não posto nada, não por não ter o que postar, mas sim, por estar fazendo a graduação na área e o tempo faltando aos montes.

Hoje resolvi postar algo simples, mas que dá muito trabalho aos programadores em iniciantes quando sem fala em "inserts" em tabelas relacionas.

Um exemplo do que estou falando, é a simples ação de incluir o cabeçalho de um pedido e obter o ID do mesmo para incluir seus itens. Há programadores que utilizam uma tabela para estas duas ações, mas no meu caso, sempre uso duas, das quais chamo de mestre x detalhe.

Para dar um exemplo, é preciso criar um tabela simples. Segue o comando:

Create table "Pedido"(ID_Pedido serial primary key, Total Numeric);

Quando todo o processo é feito via banco de dados, ou seja, através de funções, podemos utilizar pelo menos duas opções para retornar este ID:


1º Através de comando "nextval"

create or replace function inserir_pedido1() returns integer as
$$
declare
  --Cria-se uma variável para receber o valor "nextval"
  xID_Pedido Integer default 0;
begin
    --Recuperando o ID via comando "nextval"

    xID_Pedido = nextval('"Pedido_id_pedido_seq"');


    --Insert utilizando a variável para gravar o ID na tabela mestre e retornar a   
    --função para depois utilizar na inclusão dos itens.

    Insert Into "Pedido" (ID_Pedido, Total) Values( XID_Pedido, 1.5);

    --Retornando o valor do ID
    Return XID_Pedido;
end;
$$
language plpgsql;


--Chamada da função que inclui o mestre do pedido
Select inserir_pedido1();


2º Através do comando "returning"

create or replace function inserir_pedido2() returns integer as
$$
declare
  --Cria-se uma variável para receber o valor "into"
  XID Integer;
begin
 --Recuperando o ID via comando "returning"

 Insert Into "Pedido" (Total) Values(1.5) returning ID_Pedido into XID;

 return XID;

end;
$$
language plpgsql;

--Chamada da função que inclui o mestre do pedido
Select inserir_pedido2();

A segunda opção, é a mais ideal a ser usada, levando em conta, que ao mesmo tempo que se envia os dados via comando "insert", se recebe o valor "id" gravado pela "sequence" do banco, sem a necessidade de executar dois comandos, ou seja, abrir duas sessões em vez de uma.

O comando "returning" retorna o valor gerado pela "sequence" e gravado na tabela no campo primário.




Nenhum comentário:

Postar um comentário

Comente sempre por favor.