Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;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.
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.
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.
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;
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.