XML resultado em linhas

30/01/2011

0

Olá, preciso fazer com que um xml armazenado em um campo da tabela retorne o nome da tag e seu valor em colunas, porém o comando que consegui está repetindo o nome da primeira tag para todas as linhas, abaixo a minha estrutura, se alguem puder me ajudar.

Create table AUDITORIA_ANTERIOR
(
    SEQUENCIA Serial NOT NULL,
    SEQUENCIA_AUDITORIA Integer NOT NULL,
    REGISTRO Text NOT NULL,
primary key (SEQUENCIA,SEQUENCIA_AUDITORIA)
);
 
insert into auditoria_anterior (sequencia_auditoria, registro)
values (1, '<?xml version="1.0" encoding="iso-8859-1"?><ROOT> <CLIENTES><CGC_CPF_CLIENTE>12345678901</CGC_CPF_CLIENTE><TIPO>1</TIPO><CODIGO_CONVENIO></CODIGO_CONVENIO><PESSOA>F</PESSOA><NOME>JOAO DA SILVA</NOME></CLIENTES> </ROOT>')
 
SELECT * FROM
xpath_table('sequencia',
            'registro',
            'auditoria_anterior',
            'name(/ROOT/CLIENTES/*)|/ROOT/CLIENTES/*',
            'sequencia = 1')
AS t(sequencia integer, coluna text, valor text)
WHERE valor <> ''

O resultado que preciso seria assim (porém está repetindo CGC_CPF_CLIENTE para as demais linhas da coluna):
sequencia   coluna    valor
integer        text        text
--------------------------------------------------
1                 CGC_CPF_CLIENTE      12345678901
1                 TIPO                             1
1                 PESSOA                        F
1                 NOME                           JOAO DA SILVA
Alexandre

Alexandre

Responder

Posts

21/04/2011

Alexandre

Consegui a resolver meu problema, estou salvando no campo como exemplo abaixo:

<?xml version="1.0" encoding="iso-8859-1"?><PESSOAS><col nome="ID_PESSOA">1</col><col nome="TITULO_ELEITOR"><![CDATA[123456789012]]></col><col nome="AVISAR_PROMOCOES"><![CDATA[N]]></col><col nome="AVISAR_ANIVERSARIO"><![CDATA[N]]></col></PESSOAS>

E para recuperar criei a função abaixo:

CREATE OR REPLACE FUNCTION auditoria_leitura_xml_ant(_Nome_Tabela      VarChar(40),
                                                     _Sequencia_Ant    Integer,
                                                     OUT _Sequencia    Integer,
                                                     OUT _Nome         Text,
                                                     OUT _Valor        Text)
  RETURNS SETOF RECORD AS
$BODY$
  DECLARE
    eSql    TEXT;
BEGIN
  eSql := 'SELECT *
           FROM xpath_table(''sequencia'',
                            ''registro'',
                            ''auditoria_anterior'',
                            ''/' || _Nome_Tabela || '/col/@nome|*'', ''sequencia = ' || _Sequencia_Ant ||''')
           AS t(sequencia Integer, Nome Text, Valor Text)';

  RETURN QUERY EXECUTE eSql;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100;

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar