Para quase todos os meus bancos de dados, quando executo uma SELECT
instrução, o comprimento da coluna exibida é dimensionado para a largura dos dados que estão sendo consultados. No entanto, tenho dois bancos de dados (Dev e Prod para o mesmo aplicativo) que parecem padronizar todos os tamanhos de coluna para 32 caracteres de largura. Se os dados tiverem mais de 32 caracteres ou um alias de coluna for usado, o padrão da coluna será de 128 caracteres.
Aqui estão alguns exemplos de um dos muitos bons sistemas:
>select '1234567890' XX_Identifier from dual;
XX_IDENTIF
----------
1234567890
>select '12345678901234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------
12345678901234567890
Aqui estão alguns exemplos de um dos sistemas ruins:
>select '1234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------------------
1234567890
>select '12345678901234567890' XX_Identifier from dual;
XX_IDENTIFIER
--------------------------------
12345678901234567890
Já verifiquei as configurações do sqlplus e estão todas iguais. Não vi nenhum parâmetro de banco de dados que parecesse fora do comum e ambos têm parâmetros NLS idênticos. Ambos os bancos de dados usam o mesmo conjunto de caracteres.
Sei que poderia definir um formato para cada coluna consultada, mas isso não deveria ser necessário, pois não está em nenhum outro banco de dados.
O banco de dados com esse problema é 11.2.0.1, enquanto todos os nossos outros são 11.2.0.4, então talvez haja um bug que não consegui encontrar. O cliente sqlplus que estou usando é 12.1.0.1 em ambos os casos.
Atualização: Os sintomas não correspondem exatamente, mas o Doc ID 330717.1 fala sobre larguras de coluna no sqlplus e basicamente diz que você não pode garantir nada sem definir o formato. Posso aceitar isso, mas como o comportamento é consistente, parece que uma causa pode ser determinada.
Eu encontrei o problema. Está documentado uma nota do oráculo (Doc ID 1086519.1). Usei a primeira solução alternativa listada, que é definir CURSOR_SHARING como exato.