DEV Community

Cover image for Algo entre o VARCHAR2 e o CLOB: VARCHAR2 com esteróides [MAX_STRING_SIZE]
Valter Zanchetti Filho
Valter Zanchetti Filho

Posted on

Algo entre o VARCHAR2 e o CLOB: VARCHAR2 com esteróides [MAX_STRING_SIZE]

Há aproximadamente 5 anos, quando estava desenvolvendo um módulo de CRM, precisei implementar um campo em que o vendedor pudesse descrever toda a conversa que teve com o cliente.

Inicialmente, fui no caminho óbvio e criei uma coluna VARCHAR2(4000). Depois de algum tempo utilizando, por incrível que pareça, uma das vendedoras começou a reclamar que este limite era muito pequeno para o nível de detalhe que ela queria colocar dessa conversa. Pediu para aumentar o limite.

No Oracle, temos a limitação de 4000 caracteres no VARCHAR2 e normalmente teríamos como upgrade o caminho mais óbvio, mudar para CLOB. Isso envolveria mexer na tela já criada e alterar algumas coisas a nível de sessão e integração. Mudar para CLOB implica na forma em que o banco de dados armazena os esses registros e também na forma em que várias aplicações acessam essas colunas. Decidi pesquisar um pouco e logo me deparei com uma solução que já existe desde o Oracle 12C. Um simples parâmetro chamado MAX_STRING_SIZE;

Se este parâmetro for alterado de STANDARD para EXTENDED você conseguirá trabalhar com um VARCHAR2(32000), para ser mais preciso, VARCHAR2(32767), o que não te dá a mesma capacidade que um CLOB, mas já é um ótimo upgrade do VARCHAR2(4000). É perfeito para os casos em que precisamos de um meio termo.

Antes de qualquer coisa, recomendo ler esse conteúdo da Oracle para saber se essa será uma boa escolha.

Para saber se seu banco já está com o esse parâmetro basta rodar o comando abaixo se tiver permissão na v$parameter:

SELECT name, value 
FROM v$parameter 
WHERE name = 'max_string_size';
Enter fullscreen mode Exit fullscreen mode

Aqui vou explicar apenas como alterar na Autonomous Database para exemplificar, mas no link acima você consegue ver como rodar em CDB Padrão, PDB, etc.

Logado com ADMIN, execute:

 BEGIN
     DBMS_MAX_STRING_SIZE.MODIFY_MAX_STRING_SIZE('EXTENDED');
   END;
Enter fullscreen mode Exit fullscreen mode

Pronto, resolvido. Daqui pra frente é só alegria.

Vale a pena alertar que:

  • A alteração é irreversível (uma vez EXTENDED, não volta para STANDARD sem recriar o banco).

  • Pode afetar compatibilidade com clientes antigos (SQL Developer, drivers JDBC etc.).

  • Pode afetar backups ou replicações se houver sistemas legados.

Nunca tinha pensado em fazer um post sobre isso antes porque pensava que esse parâmetro já era algo bem difundido, mas vi que várias pessoas com quem tenho conversado neste último ano, inclusive DBAs ainda não conheciam, então achei relevante publicar.

Comente aqui. Você já tinha ouvido falar? Já tinha usado? Achou útil?

Referências:

https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/MAX_STRING_SIZE.html

https://docs.oracle.com/en-us/iaas/autonomous-database-serverless/doc/dbms-max-string-size.html

Top comments (0)