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
>


Responder a