MERGE com DBLINK e coluna do tipo SYS.XMLTYPE

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
alesmart
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 06 Mai 2010 7:48 am
Localização: Manaus - AM
Alessandro Martins

Estou tentando atualizar uma tabela no banco remoto com o comando MERGE utilizando o DBLINK, esta tabela contém uma coluna do tipo XMLTYPE, quando executo retorna o erro "ORA-22804: operações remotas não permitidas em tabelas de objeto ou em colunas de tipo definido pelo usuário" segue o codigo:

BEGIN
merge INTO pmz_xml001@bd28 bd28
USING (SELECT *
FROM pmz_xml001
WHERE pmz_xml001.recnum = rec_rep.id_registro) nfe
ON (bd28.recnum = rec_rep.id_registro)
WHEN matched THEN
UPDATE SET bd28.x001_arq = nfe.x001_arq,
bd28.x001_chave = nfe.x001_chave,
bd28.x001_xml = nfe.x001_xml
bd28.x001_fin = nfe.x001_fin
WHEN NOT matched THEN
INSERT (bd28.recnum,
bd28.x001_arq,
bd28.x001_chave,
bd28.x001_xml, -- (SYS.XMLTYPE)
bd28.x001_fin)
VALUES (nfe.recnum,
nfe.x001_arq,
nfe.x001_chave,
nfe.x001_xml);
COMMIT;

EXCEPTION
WHEN OTHERS THEN
PR_LOG_EXCECAO(v_id_log, SQLERRM);

END;

Gostaria de saber se existe uma maneira de contornar este erro.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Via DBLink não sei se será possível hein, talvezzzzz se for um create table as na tabela remota funcione, aí você faria uma tabela intermediaria,/temporaria pra depois fazer o merge na mesma base,

faz um teste aí
alesmart
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 06 Mai 2010 7:48 am
Localização: Manaus - AM
Alessandro Martins

Eu já tentei isso, o problema é que preciso executar este procedimento no banco local utilizando o dblink, desta forma quando vou transferir da tabela temporária para a tabela definitiva (no banco remoto) ocorre o mesmo erro.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

No banco local, você fizer
create table x as select * from x@dblink;

esta trazendo a tabela remota para local, e aí depois você faz localmente o merge,

não dá?

Eu pensei depois, acho que a única saída é fazendo via PLSQL, pois tem mais recursos que o SQL para este tipo de operação, a idéia seria fazer o select remoto numa variavel deste type (XMLTYPE) no banco local, e aí para todos os outros dados você faz o merge, e via PLSQL num cursor tenta atualizar os XML´s.

Acho que via PLSQL dá cara, DBMS_LOB, esse pacote ajuda.
alesmart
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 06 Mai 2010 7:48 am
Localização: Manaus - AM
Alessandro Martins

O problema é que os dados estão na tabela local e eu preciso atualizar uma tabela remota. Vou tentar resumir o procedimento:
Código PL/SQL (várias procedures e functions dentro de um package)
eu busco os arquivos XML´s numa pasta FTP e insiro numa tabela na coluna XMLTYPE, depois deste XML inserido no banco local então começo os extrair os dados que necessito pra montar um vizualizador, até aí está tudo perfeito, o problema é que a cada dia aumenta muito o numero de acessos a este vizualizador, por isso queria transferir as tabelas envolvidas para outro banco e direcionar o vizualizador pra lá. Para isso preciso manter as tabelas do banco remoto atualizadas. Eu comecei tentando o MERGE com DBLINK, todas as tabelas envolvidas foram atualizados da forma que eu queria exceto a tabela que possui a coluna XMLTYPE.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Uhmmmmmmm,

Será que o DBMS_DATAPUMP não te ajudaria? ¬¬

o grande lance é:

você tem somente inserts nessa tabela do XML ou teria também update/delete, pois tem um esquema no datapump que você poderia levar apenas as linhas inseridas, ou seja um modo APPEND,

Dbms_Datapump.Set_Parameter(Jobhandle,
'TABLE_EXISTS_ACTION',
'REPLACE'); --

ou usar o replace pra substituir a tabela, também funcionaria, caso seu processo poderia rodar de madrugada, não sei qual a frequencia da atualização, de uma olhada cara,
alesmart
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 06 Mai 2010 7:48 am
Localização: Manaus - AM
Alessandro Martins

vou pesquisar... pode ser a solução !!!
Muito obrigado e até a proxima.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 4 visitantes