Pular para o conteúdo
  • Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 7 anos, 2 meses atrás por Avatar photoJosé Laurindo Chiappa.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #108869
    Avatar de airoospairoosp
    Participante

      Boa tarde,

      Através do banco 10g preciso fazer insert e update em uma tabela que esta no banco 11g, só que o campo é do tipo Blob.

      Para fazer a conexão entre os 2 bancos, é utilizado dblink, só que o dblink não aceita o uso de campo blob.

      No caso de um select, consegui resolver utilizando a função long2varchar2, por exemplo:

      select sys.dbms_metadata_util.long2varchar(4000,’compra.tabprod@bco11′,’descricao’,rowid) texto
      from compra.tabprod@bco11

      Se alguém tiver alguma dica, agradeço.

      Obrigado

      Airton

      #108870
      Avatar photoJosé Laurindo Chiappa
      Moderador

        Sim, é isso mesmo : até antes do 12c os LOBs (tanto CLOB quanto BLOB) eram processados como se fossem
        arquivos, ie, vc os abre, recebe um file handle por parte do sistema operacional, esse file handle é manipulado num buffer, e no final de tudo vc os fecha… No caso, da mesma forma que vc não pode abrir um arquivo-remoto sem alguma config extra (ie, um serviço NFS, uma pasta compartilhada Windows, enfim, alguma coisa que ‘ligue’ o file handle remoto com o filesystem local) vc não podia manipular diretamente os LOBs remotos… No banco Oracle isso pode ser feito criando lá no banco-remoto onde está o LOB uma VIEW, ou uma procedure que manipula o LOB lá no local remoto, OU criando uma tabela do tipo Global Temporary Table que mantém os dados a se transferir, ou algo do tipo : veja https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:3371664382996, https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:52297289480186 e https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:696224943687 para exemplos/refs…

        []s

        Chiappa

        OBS : Isso mudou um pouco no banco 12c, mas como não é essa a sua versão ignore por enquanto….

        #108871
        Avatar de airoospairoosp
        Participante

          Chiappa,

          Na mensagem anterior esqueci de mencionar o erro que aparece, o código do erro é:

          ORA-22992: cannot use LOB locators selected from remote tables

          Só que hoje fiz o mesmo select usando o dblink e funcionou, e não fiz nenhuma alteração no ambiente.

          Já tinha pesquisado anteriormente e em vários sites vi comentários sobre a instabilidade do dblink.

          Você sabe alguma coisa sobre isso?

          Obrigado.

          Airton

          #108872
          Avatar photoJosé Laurindo Chiappa
          Moderador

            Bom, não sei exatamente que “comentários sobre a instabilidade do dblink” vc viu, até por que a questão ** NÃO TEM ABSOLUTAMENTE NADA A VER ** com estabilidade do dblink em si, muito menos com limitação da tecnologia de dblink : o fato é mesmo que ao tentar acessar um LOB remotamente vc VAI TER ERRO pela fato do “file handle” ter sido criado em outra máquina…. A solução é *** CLARA *** também, é fazer o “file handle” do LOB ser criado na mesma máquina onde os dados residem : releia os links que te passei que vc encontra VÁRIAS opções para “forçar” o ‘file handle’ do LOB ser criado na mesma máquina que está processando os dados, entre elas criação de uma view, criação de um stored PL/SQL que processe os dados via pipe e/ou insira os dados do LOB numa Global temporary Table, várias mesmo…

            Respondendo a sua pergunta : afora BUGs e comportamentos inesperados, a única situação em que acho que esse comportamento de às vezes dar msg e às vezes não é se o RDBMS algumas vezes optar por processar a query lá no banco-remoto onde o LOB reside e às vezes optar por processar locamente, na mesma sessão onde vc conectou….
            Entenda, quando vc faz um SELECT * FROM tabela@dblinkdebancoremotoX, o RDBMS é LIVRE para OU enviar o texto completo do SELECT lá pro banco X e “compilar”/processar a query completamente lá e depois o banco remoto X envia os dados pra minha sessão local no meu banco local OU então tentar ‘compilar’/processar o SQL completamente aqui e ir Solicitando os dados remotos cfrme for necessitando…. Aí sim faz sentido o que vc descreve, pois talvez nalguma das vezes o RDBMS optou por enviar o SELECT completo pro banco remoto e o processar lá (caso em que NÃO vai dar warning nenhum, o SQL em processo tá no mesmo local que o file handle do LOB) mas outras vezes o RDBMS optou por abrir cursores (E lob handles, também) aqui mesmo localmente e aí vai tentando pedir os dados pro banco-remoto , aí vai dar msg de “erro”…

            []s

            Chiappa
            

            OBS :

            1. não é esse o procedimento correto, mas apenas para conhecimento, saiba que existe a opção de vc “forçar” o RDBMS a ‘compilar’/abrir cursor/processar o SQL sempre numa ou noutra ponta que vc indicar da conexão sendo feita pelo database link, com o uso da HINT de DRIVING_SITE, veja https://asktom.oracle.com/pls/apex/f?p=100:11:106015383409127::NO::P11_QUESTION_ID:456820211101 para um exemplo…

            2. o work-around de converter o LOB para VARCHAR2 (seja com a função CAST, seja com a built-in dbms_metadata_util.long2varchar( como vc usou, seja com as mais apropriadas funcionalidades a package DBMS_LOB, como a DBMS_LOB.SUBSTR por exemplo) sim, absolutamente funcionam (óbvio, ao converter um CLOB para VARCHAR2 vc pedeu a necessidade de ter um ‘FILE HANDLE’ para o LOB), sim, mas FIQUE CIENTE que possui uma limitação Incontornável ref. tamanho : pra inserir numa tabela usando a linguagem SQL diretamente o limite é 4000 bytes e para usar dentro dum programa PL/SQL o limite é 32 Kbytes…

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress