Enquanto trabalhava com alguns scripts grandes, encontrei erros relacionados ao limite de 4000 caracteres que o VARCHAR2 possui no SQL, mas não no PL/SQL.
Conforme explicado aqui, o tipo de dados VARCHAR2 tem um limite de 4000 caracteres, enquanto o PL/SQL tem um limite muito maior de 32.767.
Por que essa diferença existe? Não teria sido melhor ter os dois VARCHAR2 com o mesmo limite? Parece uma decisão bastante confusa e propensa a erros.
Atualizar
Atualizei minha pergunta para adicionar o comentário do ansible. O limite Oracle VARCHAR2 e PL/SQL VARCHAR2 está em bytes, não em caracteres. Isso pode ter um impacto significativo no sistema de caracteres multibyte.
É apenas um fato da vida. História diferente, crenças diferentes, objetivos diferentes.
Você pode achar esta postagem sobre PL/SQL e seus objetivos úteis para ver algumas das diferenças: http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/03_types.htm
Ele começa divertidamente com:
Existem tipos de dados padrão ANSI, mas acredito que
VARCHAR2
seja um padrão Oracle, não faz parte do ANSI. Parece pela história que o OracleVARCHAR2
foi projetado para superar as limitações de suaVARCHAR
implementação anterior.Dito isto, praticamente todo dialeto SQL possui algum tipo de dados exclusivo que não é aceito por todos os outros dialetos SQL. (Trabalho principalmente com MS SQL Server, mas às vezes preciso absorver dados de outros sistemas.)
Felizmente, há vários recursos on-line para ajudá-lo a mapear um tipo de dados para outro enquanto você se move entre os produtos de vários fornecedores. Normalmente não é muito difícil. Observação: não são apenas strings (como
CHAR,VARCHAR
) que podem ter definições conflitantes.