Ir para conteúdo
Fórum Script Brasil
  • 0

dados de um JSON no postgre


STI

Pergunta

Boa tarde.

Utilizando o postgreSQL 9.5, é possível criar uma function que receba como parâmetro um JSON e percorra este JSON salvando os dados em uma tabela:

CREATE OR REPLACE FUNCTION salvar(js data) RETURNS void AS $$
        BEGIN
                aqui gostaria de percorrer o json e salvar os dados em uma table
        END;
$$ LANGUAGE plpgsql;
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Sim, você pode fazer assim:

CREATE OR REPLACE FUNCTION salvar(data json)
  RETURNS void AS
'INSERT INTO "Tabela" SELECT * FROM json_populate_record(null::"Tabela", $1);'
  LANGUAGE sql;

E usá-la assim:

SELECT salvar('{"Campo1":"valor1","Campo2":"valor2"}');

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0

show de bola Graymalkin, agora abusando de sua bondade como fazer um insert de um json como este '[{"id":"2","nome":"rafael","prof":"escriturario"},{"id":"3","nome":"mary","prof":"estagiaria"}]', vou tentar com  json_each  mas não sei se seria o correto.

Link para o comentário
Compartilhar em outros sites

  • 0
14 minutos atrás, STI disse:

questão resolvida, usei json_populate_recordset (), valeu  Graymalkin apartir de sua dica cheguei la, caso resolvido obrigado

Exatamente o que eu ia te recomendar, já que o json_populate_record() é só para um registro e o json_populate_recordset() é para um conjunto de registros.

Abraços!

Link para o comentário
Compartilhar em outros sites

  • 0
2 horas atrás, STI disse:

sera que tem como usar upsert ?

Acho que não de uma maneira prática, já que para fazer o UPSERT no PostgreSQL você precisa deixar o UPDATE explícito com todos os campos e valores, por exemplo:

INSERT INTO "Tabela" (chaveprimaria, campo1, campo2) VALUES ('pk', 'valor1', 'valor2') ON CONFLICT (chaveprimaria) DO UPDATE SET campo1='valor1', campo2='valor2' WHERE "Tabela".chaveprimaria=chaveprimaria;

Ou seja, além de especificar a chave-primária você ainda precisa especificar o UPDATE completo. Pode haver um meio, mas não vi uma maneira prática de se fazer isso usando JSON.

Um jeito de fazer isso seria criar a função abaixo...

CREATE OR REPLACE FUNCTION "Executar"(query character varying)
  RETURNS integer AS
$BODY$begin
    execute $1;
    return 1;
end;$BODY$
  LANGUAGE plpgsql VOLATILE;

... montar a instrução SQL em uma string (a partir da linguagem que estiver usando) e executar com ela.

Neste caso, perde um pouco o sentido de se usar JSON (a não ser que a linguagem usada suporte e seja prático para montar a instrução SQL desejada).

Abraços!

 

Link para o comentário
Compartilhar em outros sites

  • 0

Graymalkin, se você puder dar ula luz eu agradeço, o que eu quero é o seguinte , vou ter uma quantidade grande de linhas a inserir em uma tabela cronogramas, então eu não queria fazer um acesso por vez no banco para salvar , queria enviar o json e o banco insere, esta function usando json_populate_recordset() funciona legal porem eu tenho de evitar a duplicidade e ao mesmo tempo atualizar a quantidade informada por iten, então por exemplo em um json como este   '[{"id":"2","nome":"rafael","prof":"escriturario"},{"id":"3","nome":"mary","prof":"estagiaria"}]', eu queria percorrer este json e fazer um upsert para cada linha de registro.

tipo pegar os valores por linha  data->>'id',data->>'nome', data->>'prof' e jogar isso no upsert

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...