Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mitaco

Extrair Xml e Alterar uma Tabela

Recommended Posts

Pessoal boa tarde,
Eu gostaria de extrair dados XML e atualizar uma Tabela. Montei uma proc e ela está dando: Invalid e eu não sei o motivo, alguém poderia analizar minha proc?
Outra questão, a forma como estou pegando os dados do XML e colocando em um cursor esta certo?
CREATE OR REPLACE Procedure SP_ATUALIZA_DADOS (
  PI_xmlDocument IN xmlType) is

    COD_REG   INT;
    COD_OCORR INT;
    DESC_ERRO VARCHAR2;

    WITH xmlDocument AS
    (
         SELECT
            PI_xmlDocument xmlColunas
         FROM dual
    ) 

    CURSOR CR_ATUALIZAR
    IS
    SELECT
         extractvalue(value(col), '/DADOS/IDREG') CODREG,
         extractvalue(value(col), '/DADOS/IDOCORR') CODOCORR,
         extractvalue(value(col), '/DADOS/DESCERRO') DESCERRO
    FROM xmlDocument, TABLE(XMLSequence(extract(xmlDocument.xmlColunas,'/ROOT/DADOS'))) col;

  BEGIN
      OPEN CR_ATUALIZAR;
      LOOP
         FETCH CR_ATUALIZAR INTO COD_REG, COD_OCORR, DESC_ERRO;
         EXIT WHEN CR_ATUALIZAR%NOTFOUND;

         UPDATE ORAMAG.TB_REQU_RETO_CLIE TB SET
           TB.txt_rspa_requ = DESC_ERRO
         WHERE TB.cod_ocor = COD_OCORR;

         COMMIT;

      END LOOP;
      CLOSE CR_ATUALIZAR;
  END;

 

Eu sei que executando apenas esse comando como teste a query retorna os dados do XML em colunas.

Se quiser testar para ver:


    WITH xmlDocument AS
    (
         SELECT
            xmlType('<ROOT><DADOS><IDREG>123</IDREG><IDOCORR>12345</IDOCORR><DESCERRO>TESTE DESC</DESCERRO></DADOS><DADOS><IDREG>456</IDREG><IDOCORR>6789</IDOCORR><DESCERRO>TESTE DESC 2</DESCERRO></DADOS></ROOT>') xmlColunas
         FROM dual
    ) 

    SELECT
         extractvalue(value(col), '/DADOS/IDREG') CODREG,
         extractvalue(value(col), '/DADOS/IDOCORR') CODOCORR,
         extractvalue(value(col), '/DADOS/DESCERRO') DESCERRO
    FROM xmlDocument, TABLE(XMLSequence(extract(xmlDocument.xmlColunas,'/ROOT/DADOS'))) col;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de mais nada tente ver os erros da Procedure, use uma ferramenta de gerenciamento (tipo Sql Developer) ou

 

rode a query abaixo se não tiver nenhuma

 

SELECT SEQUENCE , LINE , POSITION , TEXT
FROM USER_ERRORS
WHERE NAME = 'SP_ATUALIZA_DADOS'

 

 

se a procedure está invalida e tem erros de compilação vão aparecer aqui.

 

-------

 

Sem ao menos saber os erros fica difícil saber.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta vlw pelo comando, na segunda vou testar pq isso é coisa do trampo.

 

Eu na vdd utilizo o Developer, porém ele não diz o erro que esta acontecendo, apenas cria a proc com "X" e nas propriedades dela vem o Invalid. Se este comando falar de fato qual o erro vc pode ter certeza que serei o cara mais feliz do mundo.

 

Boa pascoa e um ótimo fds.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O sqldeveloper indica o erro sim, talvez a opção de exibir esteja desabilitada, mas na realidade o que ele faz e ler a tabela de erros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta vlw mesmo por essa query que passou. O erro que esta ocorrendo é: PLS-00103: Encoutrered the symbol "with" when expecting one of the following:

 

Começar function pragma procedimento subtype tipo <um identificador>

<um identificador delimitado por aspas duplas> atual cursor deletar existe prior.

Line 8 Position 5.

 

Tou procurando no google aqui.

 

Vlw.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia pessoal, consegui resolver o problema que estava ocorrendo. O problema era que o meu cursor estava em cima do meu comando SELECT quando ele deveria estar em cima do meu comando WITH, segue a baixo o exemplo correto:

 

CREATE OR REPLACE Procedure SP_ATUALIZA_DADOS (

PI_xmlDocument IN xmlType) is

 

COD_REG INT;

COD_OCORR INT;

DESC_ERRO VARCHAR2;

 

CURSOR CR_ATUALIZAR

IS

WITH xmlDocument AS

(

SELECT

PI_xmlDocument xmlColunas

FROM dual

)

 

SELECT

extractvalue(value(col), '/DADOS/IDREG') CODREG,

extractvalue(value(col), '/DADOS/IDOCORR') CODOCORR,

extractvalue(value(col), '/DADOS/DESCERRO') DESCERRO

FROM xmlDocument, TABLE(XMLSequence(extract(xmlDocument.xmlColunas,'/ROOT/DADOS'))) col;

 

BEGIN

OPEN CR_ATUALIZAR;

LOOP

FETCH CR_ATUALIZAR INTO COD_REG, COD_OCORR, DESC_ERRO;

EXIT WHEN CR_ATUALIZAR%NOTFOUND;

 

UPDATE ORAMAG.TB_REQU_RETO_CLIE TB SET

TB.txt_rspa_requ = DESC_ERRO

WHERE TB.cod_ocor = COD_OCORR;

 

COMMIT;

 

END LOOP;

CLOSE CR_ATUALIZAR;

END;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.