Bom ano a nós todos... Bom, para o ponto em questão realmente, o manual de LOBs ("Oracle® Database Application Developer's Guide - Large Objects" nas versões mais recentes) nos ** AVISA ** que há sim restrições de utilização de LOBs em bancos remotos. Antes de falar sobre as opções, antes de tudo noto que só pra variar um pouco vc não nos dá dados IMPORTANTES, tal como : versões EXATAS dos bancos envolvidos, descrição do ambiente (ie, se os dois bancos estão no mesmo servidor ou não, se essa replicação é unidirecional (ie, dados do banco origem vão pro banco destino e NUNCA o inverso), se a tal replicação ocorrerá uma vez só ou é algo frequente, qual a frequência, o quanto de atraso no banco-destino é permitido, se será refresh manual ou tem que ser automático.... Eu pergunto essas coisas porque escrever uma rotina de replicação de dados no banco Oracle só faz sentido SE e APENAS SE vc ** realmente ** caiu numa situação com características que IMPEDEM as opções de replicação nativas, tais como VIEW MATERIALIZADA, CDC e/ou replicação via Streams, Standby, Transportable tablespaces, Data Pump.... Essas opções nativas TODAS em sua maioria trabalham ==>> TRANSPARENTEMENTE com LOBs, ok ??? Assim, além do fato de performance (já que esses caras todos são INTERNOS ao banco, via de regra batem FÁCIL uma rotina externa sua), de lambuja vc ainda ganha compatibilidade com LOBs os usando, yes ??? Apenas caso REALMENTE vc não possa utiliar as built-ins por qquer motivo (o que é totalmente NÃO-ÓTIMO, mas pode acontecer em algumas circunstâncias, devido à alguma exigência do ambiente, o que for), as suas opções basicamente seriam :
a) "converter" o LOB em character (via view no bd remoto que faz selects com dbms_lob.substr ou assemelhados), isso pode ser aceitável se o seu LOB é menor do que os limites do SQL e/ou do PL/SQL (respectivamente 4000 bytes e 32767 pro PL/SQL) b) criar no banco destino uma tabela (pode ser uma GTT) que recebe os dados via INSERT into tabela (select from dblink) e depois sim vc apõe esses dados da GTT na tabela definitiva c) gera um arquivo-texto com os dados no bd origem e o lê (pode ser via external table ou pode se fazer carga via sql*loader) no bd destino, CLOBs são suportados nessa situação, e a performance com sql*loader ou com external table via de regra é excelente, em especial se vc estiver usando adequadamente o modo append, paralelismo, etc, etc d) envia pedaço por pedaço via PL/SQL : por exemplo, tenha no bd destino uma rotina PL/SQL chamada GRAVA_PEDACO que recebe uma chave do regitro atual, a posição aonde gravar e um parâmetro CHAR de 4000 bytes , aí no bd origem pra cada registro vc faz um loop de 1 até o length do clob, removendo 4000 caracteres a cada vez via dbms_lob.instr ou similar, e chamando a rotina GRAVA_PEDACO passando o identificador, a posição e os 4000 bytes de dados, e GRAVA_PEDAÇO vai apendando via DBMS_LOB.WRITEAPPEND e) usa uma linguagem que tenha limites de manipulação e strings maiores que PL/SQL, e que permita vc abrir várias conexões simultâneas, tais como por exemplo java ou C - aí simplesmente é vc ter uma conexão A aberta no banco-origem, uma conexão B no destino, um cursor loop lendo os dados do origem E os mantendo num buffer local do programa, e esse buffer é descarregado no destino. http://asktom.oracle.com/pls/asktom/f?p=100:11:1189515865574467::::P11_QUESTION_ID:238014476571 tem um exemplinho pífio em java, mas PRO*C ou OCI poderia funcionar também, creio ==> basicamente essas seriam as suas opções principais, creio eu, mas TORNO A REPETIR que se houver a melhor chance, vc terá muito MAIS performance e MENOS trabalho usando alguma opção não-programada, se minimamente viável... []s Chiappa --- Em oracle_br@yahoogrupos.com.br, [EMAIL PROTECTED] escreveu > > Prezados da Lista, > > Bom Ano Novo a todos. E vamos ao que interessa!!! rsss > > Estamos desenvolvendo um sistema de replicação de bases Oracle, via > DBLink. > > A princípio, está indo tudo bem, porém, estamos com algumas > implicações com campos CLOB. > > Preciso efetuar um INSERT através de uma PROCEDURE, passando como > parâmetro um CLOB, mas o banco retorna a seguinte mensagem: > -- > Error(62,57): PLS-00564: argumentos lob não são permitidos em chamadas a > servidor remoto > -- > Percebemos então que esse tipo de operação não é permitida via DBLINK, > se estiver errado, favor alguém me corrigir, pois ainda não entendo > tanto disso. > > Agora a questão: -- Existe alguma forma de contornar essa situação ? > > Abraços a todos, > Braga >