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
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
Curtir tópico
+ 0
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;
<?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
Clique aqui para fazer login e interagir na Comunidade :)