Capturar uma valor especifico dentro da string - JSON

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Senhores, boa noite.

Por favor, preciso pegar de dentro de uma string um valor especifico de um "label". Exemplo, para o label "Documento", teria que pegar o respectivo valor do mesmo.

Para isso criei o seguinte bloco anonimo para testes:

Selecionar tudo

declare 
  v_string varchar2(255) := '"Estado" : "São Paulo", "Nome" : "MARIO", "Documento" : "27439076818", "Pais" : "Brasil"'; 
  v_label  varchar2(50);
  v_texto  varchar2(11);
  v_cpf    number;
  v_digito number;
begin
  v_label := '"Documento" : "';
  
  select trim(substr(  replace(substr(v_string,instr(v_string,v_label) + instr( substr(v_string,instr(v_string,v_label)),'"',1,3)),'"','')
                      ,1,instr(replace(substr(v_string,instr(v_string,v_label) + instr( substr(v_string,instr(v_string,v_label)),'"',1,3)),'"',''),',',1,1)-1))
    into  v_texto
    from dual;
    
  select  substr(v_texto,1,9) as cpf
         ,decode(length(v_texto),11,substr(v_texto,-2,length(v_texto))) as digito
    into v_cpf, v_digito
    from dual;

  -- tenho que separar o digito porque serão inseridos em colunas separadas
  dbms_output.put_line(v_cpf || v_digito);

  -- insert...
end;
Neste caso deu certo, mas a solução ficou muito "engessada", ou seja, caso queira pegar o valor de outro label teria fazer um outro tipo de tratamento. E também acredito que dei muita volta para fazer isso, sendo que acredito que deva existir outro jeito mais enxuto ou "elegante".

Obs.: Apenas para citar o valor desta string é um retorno JSON. Não sei se existe alguma função especifica para tratar strings neste formato.

Grato.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Existe esse projeto OPEN SOURCE
http://sourceforge.net/projects/pljson/
Eu nunca usei, mas parece que facilita muito o uso de JSON.

Tem esse post tb:
http://ora-00001.blogspot.com.br/2010/0 ... -json.html

Pelo que eu vi, existe uma package chamada JSON_UTIL_PKG (na internet).
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Obrigado pelas informações dr_gori.

De fato aqui na empresa é utilizado esta package da biblioteca independente “Librairie-JSON” e facilitou muito a minha vida.

A quem possa interessar ficou da seguinte maneira:

Selecionar tudo

declare 
  p_envio_ws VARCHAR2(2000);  
  obj_json   PKG_FIN_JSON.JSONStructObj;
  v_label    varchar2(500);
  --
  v_cd_cpf varchar2(11);
  v_cpf    varchar2(9);
  v_digito varchar2(2);  
  --
  v_lj_ibi varchar2(10);  
begin
  p_envio_ws := '{ "tipoDocumento" : "1", "valorDocumento" : "27439576841", "tipoConsulta" : "2", "nome" : "JOAO", "dataNascimento" : "1990-01-01", "naturezaOcupacao" : "01", "tipoConta" : "05", "filial" : "1001" }';

  obj_json := PKG_FIN_JSON.String2JSON(p_envio_ws, '"');

  v_label  := 'valorDocumento';
  v_cd_cpf := PKG_FIN_JSON.getAttrValue(obj_json,v_label);
  
  select  substr(v_cd_cpf,1,9) as cpf
         ,decode(length(v_cd_cpf),11,substr(v_cd_cpf,-2,length(v_cd_cpf))) as digito
    into v_cpf, v_digito
    from dual;  
         
  v_label := 'filial';
  v_lj_ibi := PKG_FIN_JSON.getAttrValue(obj_json,v_label);


end;

Grato.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes