Bom, antes de mais nada : há MUUUUUUITOS ANOS o datatype LONG é de-suportado, E 
ele tem muitas e várias limitações (por exemplo, não pode participar de 
cláusula WHERE, não pode ser operador para funções string e/ou de filtro como 
LIKE, só pode ter um LONG por tabela, não pode ser chave para JOINs, etc, etc, 
etc) : se teu Sistema não foi desenvolvido há mais de 10 anos atrás (que é mais 
ou menos quando o LONG foi de-suportado) , tá mais que Documentado que vc não 
deveria estar usando LONGs....
  Sendo assim, minha Primeira Sugestão é que vc CONVERTA esses LONGs para LOBs 
, provavelmente usando a função TO_LOB : com isso aí sim vc pode usar a 
informação string longa em comandos SQL.... 
  
  CASO por qquer motivo isso seja Proibido, aí NECESSARIAMENTE entre outras 
penalidades (performance, principalmente) vc vai ter a INCONVENIÊNCIA de não 
poder trabalhar diretamente em SQL : provavelmente vc vai ter que escrever uma 
rotina PL/SQL que manipule teus LONGs com SQL dinâmico via DBMS_SQL, 
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:665224430110
 é um exemplo....
   Outra opção para LONGs (SE vc tem certeza que eles são SEMPRE menores que 32 
KB) é vc se aproveitar da conversão automática (que apareceu no banco 9i, iirc) 
de LONGs para VARCHAR2(32767) que o PL/SQL faz, 
https://stackoverflow.com/questions/769787/what-is-the-best-way-to-search-the-long-datatype-within-an-oracle-database
 tem um exemplo que é mais ou menos :
   
DECLARE

  l_var VARCHAR2(32767); -- max length

BEGIN

FOR rec IN (SELECT ID, LONG_COLUMN FROM TABLE_WITH_LONG_COLUMN) LOOP
  l_var := rec.LONG_COLUMN;
  IF l_var LIKE '%350%' THEN -- is there '350' string?
    dbms_output.put_line('ID:' || rec.ID || ' COLUMN:' || rec.LONG_COLUMN);
  END IF;
END LOOP;

END;   
   
  ==>> OBVIAMENTE, é por tua conta total adaptar as lógicas demonstradas para o 
seu caso...  E NEM PRECISO FALAR, isso é algo manual que VOCÊ vai fazer 
sozinho, é inconveniente portanto, o inconveniente é COMPLEXO, portanto é 
DEMORADO de fazer, E PORTANTO É MAIS CARO, tua Empresa vai gastar umas boas 
horas-homem fazendo isso, mas se não tem jeito, não tem, é um IMPOSTO a mais 
que vcs estão pagando por usar alguma coisa NÃO SUPORTADA.... 
  
  Uma outra opção, MAS que também depende de criação/manipulação de objetos no 
database (o que nem sempre como desenvolvedor de código vc estará Autorizado a 
fazer) seria vc pedir pra ser criada uma OUTRA tabela, que vai estar sempre 
vazia e que só seu report vai usar (pode até ser cruiada como Global Temporary 
Table, que só consome espaço temp e não espaço real de dados), e nessa tabela 
vc tem a coluna que guarda tua informação criada como CLOB, aí teu programa lê 
a informação LONG da tabela original e grava no CLOB dessa tabela de trabalho, 
aí vc pode usar SQL pra consultar os dados dela no seu report de boas : 
https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:510622111991
 tem um exemplo mas é algo relativamente simples, é abrir cursor e pra cada 
registro pedir um insert into tabeladetrabalho select colunas, 
to_lob(colunalong) from tabelaorigem; 
  
  []s
  
    Chiappa

Responder a