Estou migrando algumas tabelas de MySQL/PostgreSQL para Oracle e me deparei com uma limitacao estranha (IMHO) do Oracle.
Nao eh possivel criar identificadores com mais do que 30 caracteres. Por identificador, entenda-se nome de tabela, coluna, indice, etc.
O erro eh bem simples:
Procurando encontrei varias referencias sobre esse erro… nada sobre como alterar essa configuracao - apenas variacoes de:
[quote]Cause: The name of a schema object exceeds 30 characters. Schema objects are tables, clusters, views, indexes, synonyms, tablespaces, and usernames.
Action: Shorten the name to 30 characters or less.[/quote]
E a pergunta fatidica: realmente nao ha como contornar essa limitacao exceto diminuindo o tamanho dos identificadores? E se essa for a saida, alguem mais acha isso ridiculo tratando-se de um produto como Oracle?
Pois eh… sobre usar menos caracteres - o problema eh a palavra “migracao”.
Depois que descobri que uma string vazia eh tratada como NULL no Oracle e que nao eh possivel ter mais de uma coluna LONG por tabela (porque cargas d’agua nao existe um tipo simples, facil e direto para textos longos no Oracle, como o TEXT do PostgreSQL?), essa dos 30 caracteres virou fichinha.
O CLOB é a maneira viável de armazenar informação de texto no Oracle com mais de 4000 caracteres (menos que isso use Varchar2).
LOB significa Large Objects, existe o CLOB que substitui o LONG, o BLOG (Binary LOB) que substitui o LONG RAW e o NCLOB para textos usando o alfabeto árabe ou japonês.
Ele possui inúmeras vantagens em cima do tipo LONG:
:arrow: long é antigo (do Oracle7), só existe para manter compatibilidade
:arrow: só pode ter uma coluna long por tabela, CLOB pode ter quantas vc quiser
:arrow: long o acesso sempre é sequencial, com CLOB você pode acessar a informação por deslocamento (existe uma package só pra isso: DBMS_LOB)
:arrow: não há problemas de trabalhar com triggers com CLOB
Com CLOB da pra trabalhar normalmente como se a coluna fosse de texto (set/getString no JDBC, tipo String no Hibernate, etc) ou eh necessario alguma precaucao especial? (nao, ainda nao testei isso :))
[quote=shyde]E como eu poderia converter um campo já criado (e com dados do tipo texto) do tipo LONG para o tipo CLOB?
Alguém saberia?[/quote]
Sim - depois que o LONG nao teve mais jeito, eu fiz isso. Mudei para CLOB. Claro, nao vou garantir pra voce que vai funcionar na tua tabela, um backupzinho antes faz bem, soh pra garantir.
Apenas adicionando outra informacao: Hibernate trabalhou legal com o CLOB, como um String “normal”. Nao tive oportunidade de testar com JDBC ainda.