- This topic has 1 reply, 2 voices, and was last updated 5 years, 2 months ago by José Laurindo Chiappa.
-
AuthorPosts
-
22 de agosto de 2019 at 6:27 pm #143845airoospParticipant
Boa tarde pessoal,
Há uma tabela com campo tipo long, e preciso fazer a pesquisa neste campo procurando um texto. Se fosse tipo varchar ou varchar2 usaria instr sem problema.
Fiz alguns testes usando ” sys.dbms_metadata_util.long2varchar ” e funcionou, o detalhe é que este processo só funciona se o conteúdo do campo tiver no máximo 4000 caracteres.
Consegui fazer um length e descobri que o texto maior tem 6035 caracteres.
Pesquisei mais na internet sobre o assunto, vi que tem a ” sys.dbms_metadata_util.long2clob” para campos com mais de 4000 caracteres, só que não consegui fazer funcionar.
Alguém tem alguma ideia de como fazer a consulta?
Ambiente Windows com banco 11g R2.
Obrigado.
Airton
23 de agosto de 2019 at 9:13 am #143868José Laurindo ChiappaModeratorBlz ? Então, antes de te responder uma obs : o datatype LONG foi *** DEPRECIADO *** há muuuuuuito tempo atrás (lá no Oracle 8i, há quase VINTE ANOS !!! Vide https://docs.oracle.com/cd/A87860_01/doc/server.817/a76965/c10datyp.htm#3057), vc ABSOLUTAMENTE NÃO DEVERIA ESTAR USANDO ESSE CACARECO!!!! Entre outros N fortes motivos para parar de usar esse cara E passar a usar o Correto e RECOMENDADOpela Oracle (o LOB), além do fato de LONGs não poderem ser pesquisados via funções , eles Não Podem fazer parte de WHERE ou ORDER BY num SELECT, Não pode haver mais de um LONG por tabela, eles Não Podem ser armazenados em tablespaces separadas dos outros dados, e MUITAS outras restrições…
==> O procedimento CORRETO seria vc CONVERTER a coluna para o “novo” datatype LOB (vide a doc, as notas metalink/My Oracle Support “How to Convert LONG to a CLOB” (Doc ID 282464.1) e “How to Convert LONG Column to CLOB Using DBMS_REDEFINITION Package” (Doc ID 251417.1) e https://www.orafaq.com/wiki/LONG para exemplos) – e INCLUSIVE, é ESSE o procedimento adequado, usar o front-end disponibilizado na package DBMS_LOB, e ** não ** usar as não-documentadas alternativas internas tipo sys.dbms_metadata_util.long2clob!!!
Porém, se por qquer motivo (digamos, a tua tool de programação TAMBÉM é caquética de velha e Não Aceita LOBs), as tuas alternativas vão ser :- criar uma tabela (temporária, que seja, ou mesmo tabela real) com a coluna LOB, trazer os dados da tabela real e usar as funcionalidades de pesquisa normais do LOB
OU
- ** gambiarrar ** com PL/SQL, na linguagem SQL simplesmente Não tem Como se fazer isso : exemplos vc acha em http://www.oracle-developer.net/display.php?id=430 , e nessa página mesmo o AUtor dá um exemplo de cada técnica / ‘gambi’ possível, desde converter TEMPORARIAMENTE o LONG para LOB ’em memória’, sem criar tabela temporária, até vc criar uma função PL/SQL ou chamar funções built-in como as de XML)….. E sim, respondendo aos seus comentários, na linguagem SQL uma string pode ter no máximo 4000 bytes, E em PL/SQL a string é no máximo 32767 bytes…
Para gambiarrar LONGs com mais de 32767 , além da opção de conversão, a técnica principal é vc usar SQL DINÂMICO para recuperar pedaço por pedaço o LONG… okdoc ??
[]s
Chiappa
OBS : nem preciso dizer, a PERFORMANCE dessas gambiarras todas PODE e VAI variar pracas : o RDBMS é ** programado ** para Otimizar SQLs, e NÂO PL/SQLs, vc ficar chamando PL/SQL de dentro do SQL pode implicar em CONTEXT SWITCH, SQL dinâmico pode implicar em PARSE contínuo e/ou mais gasto de CPU, etc….
mas se vc TEM que continuar usando o lixento do LONG, não tem jeito, vc VAI ter que assumir os overheads…
-
AuthorPosts
- You must be logged in to reply to this topic.