Oracle 10 e JDBC: como fazer CHAR ignorar espaços à direita em comparação?

StackOverflow https://stackoverflow.com/questions/603245

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho uma consulta que tem

... ONDE PRT_STATUS = 'ONT' ...

O campo prt_status é definido como CHAR (5) que. Por isso é sempre preenchido com espaços. A consulta corresponde a nada como resultado. Para fazer este trabalho de consulta que tenho que fazer

... ONDE rtrim (PRT_STATUS) = 'ONT'

que não funciona.

Isso é irritante.

Ao mesmo tempo, um par de puro-java DBMS clientes (Oracle sqldeveloper e AquaStudio) eu NÃO tenho um problema com a primeira consulta, eles retornam o resultado correto. SAPO não tem problema.

I presumir que simplesmente colocar a conexão em algum modo de compatibilidade (por exemplo, ANSI), de modo a que a Oracle sabe CHAR (5) prevista para ser comparado com nenhum respeito a fuga caracteres.

Como posso fazê-lo com objetos de conexão eu recebo no meu aplicativo?

Atualizar Eu não posso mudar o esquema de banco de dados.

Solução É verdade que foi a forma como a Oracle compara campos com aprovada em parâmetros.

Quando ligam for feito, a string é passada via PreparedStatement.setString (), que define o tipo de VARCHAR, e, portanto, a Oracle usa comparação unpadded -. E falha

Eu tentei usar setObject (n, str, Types.CHAR). Falha. mostra DESCOMPILAÇÃO que a Oracle ignora CHAR e passa-o como um VARCHAR novamente.

A variante que finalmente funciona é

setObject(n,str,OracleTypes.FIXED_CHAR);

Isso torna o código não embora portátil.

Os clientes de UI ter sucesso por um motivo diferente - eles usam caracteres literais, não vinculativa. Quando eu digito PRT_STATUS = 'ONT', 'ONT' é um literal e, como tal comparação usando maneira acolchoada.

Foi útil?

Solução

Note que a Oracle compara valores CHAR usando em branco acolchoado semântica de comparação.

A partir regras de comparação de tipo de dados ,

A Oracle usa comparação com brancos semântica apenas quando ambos os valores na comparação são ou expressões de tipo de dados CHAR, NCHAR, literais de texto, ou valores devolvidos pelo UTILIZADOR função.

No seu exemplo, é 'ONT' passado como um parâmetro bind, ou é construído na consulta textualmente, como ilustrado? Se um parâmetro bind, então certifique-se de que ele está ligado como tipo CHAR. Caso contrário, verificar a versão da biblioteca cliente usado, como versões muito antigas do Oracle (por exemplo v6) terão diferentes semântica de comparação para CHAR.

Outras dicas

Se você não pode mudar sua tabela de banco de dados, você pode modificar sua consulta.

Algumas alternativas para RTRIM:

.. ONDE PRT_STATUS como 'ONT%' ...

.. ONDE PRT_STATUS = 'ONT' ... - 2 espaços em branco para trás T

.. ONDE PRT_STATUS = rpad ( 'ONT', 5' ') ...

I mudaria CHAR (5) em coluna VARCHAR2 (5), em dB.

Você pode usar o elenco para a operação caractere em sua consulta:

... WHERE PRT_STATUS=cast('ONT' as char(5))

Ou em forma JDBC mais genérico:

... WHERE PRT_STATUS=cast(? as char(5))

E, em seguida, em seu código JDBC fazer uso statement.setString(1, "ONT");

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top