Renato, sério cara, não faça top-posting, veja as regras da lista:

http://www.postgresql.org.br/RegrasLista

É simples, basta editar a mensagem antes de responder, e ir respondendo
embaixo da mensagem anterior, como vou fazer a seguir:


2014-02-20 11:24 GMT-03:00 Renato Poleti <[email protected]>:

> Matheus, eu verifiquei estas funções, mas não conseguir chegar a uma
> solução de looping no XML.
> Imagina que tenha uma function que recebe como parâmetro o seguinte XML
>
> <?xml version="1.0? encoding="UTF-8??>
> <items>
>     <item>
>         <name color="brown">Chair</name>
>         <price>$53</price>
>     </item>
>     <item>
>         <name color="red">Table Lamp</name>
>         <price>$10</price>
>     </item>
> </items>
>
> Preciso saber:
> a) Quantos itens eu tem.
> b) Pegar cada item e fazer um insert em determina tabela (o problema está
> no looping)
>
> Lembrando que pode vir 1 item, como varios itens.
>
>
Agora sim, posso ajudar melhor... Vamos assumir que tenhas uma função assim:

    CREATE FUNCTION process_item(data xml)
    RETURNS TABLE(name text, color text, price text)
    ...

E ela pega o dado passado via parâmetro e retorna uma linha para cada item,
retornando name, color e price.

O corpo dessa função é bem simples nesse caso. Na verdade nem precisava de
uma função, bastava a seguinte query (que seria também o corpo da função em
linguagem SQL):

    SELECT
        (xpath('/item/name[1]/text()', item))[1]::text AS name,
        (xpath('/item/name[1]/@color', item))[1]::text AS color,
        (xpath('/item/price[1]/text()', item))[1]::text AS price
    FROM unnest(xpath('/items/item', data)) t(item);

Com isso em mãos, você tem as suas respostas:

a) SELECT count(*) FROM process_item('seu xml');
b) SELECT count(*) FROM process_item('seu xml');

Claro que para (a) tem formas mais performáticas.

Resumindo, estude queries XPath, é a forma mágica de processar XML.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a