Oracle - Mais do que 30 caracteres nos identificadores. Eh possivel?

Pessoal,

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?

Marcio Kuchma

eu acho que tu tem que ser mais preguiçoso …
ond ja se viu, ter que escrever uma missa pra referenciar alguma coisa :stuck_out_tongue:

mas mesmo assim, concordo que não deveria haver este limite …

Esse é um infeliz legado que as bases de dados Oracle levam…

Até hoje existe essa neura: “escreva um nome pequeno pois é mais rápido”. Lá pra época do Oracle7 era assim, hoje não é mais.

Realmente é uma limitação esquisita, já que internamente o Oracle trabalha com o OBJECT_ID e não com o OBJECT_NAME.

Pois eh… sobre usar menos caracteres - o problema eh a palavra “migracao”. :slight_smile:

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. :slight_smile:

Marcio Kuchma

CLOB?

O teu problema parece se o legado mesmo. Que versao do Oracle é isso ai?

]['s

[quote=fabgp2001]CLOB?

O teu problema parece se o legado mesmo. Que versao do Oracle é isso ai?[/quote]

Oi - a versao eh 10g, ou seja, a mais atual. Fiquei assustado ao perceber a limitacao de 30 caracteres. Mas ja passou. :slight_smile:

Sobre o CLOB: obrigado pela dica, vou investigar.

Marcio Kuchma

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

[quote=boaglio] não há problemas de trabalhar com triggers com CLOB
[/quote]

Passei por esse problema hoje. Fiz um POG pra resolver o problema. :smiley:

]['s

Mas não há nenhuma macumba mesmo para colocar identificadores com mais de 30 caracteres?

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 :))

Marcio Kuchma

Acredito que sim, mas nunca fiz isso com Java, só com PL/SQL.

Pelo FAQ funciona.

Em PL/SQL aqui tem bons exemplos.

Olá pessoal

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?

Abraços

[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. :slight_smile:

Apenas adicionando outra informacao: Hibernate trabalhou legal com o CLOB, como um String “normal”. Nao tive oportunidade de testar com JDBC ainda.

Marcio Kuchma

E como vc fez? Poderia me passar?
Estou com graves problemas em converter os dados na coluna para varchar2.
Abraços

Olá,

Com JDBC nao da pra usar getString direto. Se for BLOB tu usa getBlog e se for CLOB tem que usar getBinaryStream.

]['s

[quote=shyde]E como vc fez? Poderia me passar?
Estou com graves problemas em converter os dados na coluna para varchar2.[/quote]

Creio que VARCHAR2 suporte no maximo 4.000 caracteres. Para valores maiores use o CLOB.

Supondo que voce tenha a tabela “foo” com a coluna “bar” que voce deseja alterar para CLOB, o comando seria:

ALTER TABLE foo MODIFY bar CLOB;

Marcio Kuchma

Valeu! :slight_smile: