Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Que tipo de dados devo associar como parâmetro de consulta para usar com a coluna NUMBER(15) no Oracle ODBC?


Minha preferência pessoal é fazer as strings de caracteres das variáveis ​​de ligação (VARCHAR2) e deixar o Oracle fazer a conversão do caractere para seu próprio formato de armazenamento interno. É bastante fácil (em C) obter valores de dados representados como strings terminadas em nulo, em um formato aceitável.

Então, em vez de escrever SQL assim:
SET MY_NUMBER_COL = :b1
  , MY_DATE_COL = :b2

Eu escrevo o SQL assim:
SET MY_NUMBER_COL = TO_NUMBER( :b1 )
  , MY_DATE_COL   = TO_DATE( :b2 , 'YYYY-MM-DD HH24:MI:SS')

e forneça cadeias de caracteres como variáveis ​​de ligação.

Existem algumas vantagens nessa abordagem.

Uma é que contorna os problemas e bugs encontrados ao vincular outros tipos de dados.

Outra vantagem é que os valores de ligação são mais fáceis de decifrar em um rastreamento de evento 10046 do Oracle.

Além disso, um EXPLAIN PLAN (eu acredito) espera que todas as variáveis ​​de ligação sejam VARCHAR2, então isso significa que a instrução que está sendo explicada é um pouco diferente da instrução real que está sendo executada (devido às conversões de dados implícitas quando os tipos de dados dos argumentos de ligação no instrução não são VARCHAR2.)

E (menos importante) quando estou testando a instrução no TOAD, é mais fácil apenas poder digitar strings nas caixas de entrada e não precisar alterar o tipo de dados em uma caixa de listagem suspensa.

Também deixo as funções buitin TO_NUMBER e TO_DATE validarem os dados. (Pelo menos em versões anteriores do Oracle, encontrei problemas ao vincular um valor DATE diretamente e ele ignorou (pelo menos parte) a verificação de validade e permitiu que valores de data inválidos fossem armazenados no banco de dados.

Esta é apenas uma preferência pessoal, baseada em experiências anteriores. Eu uso essa mesma abordagem com Perl DBD.

Gostaria de saber o que Tom Kyte (asktom.oracle.com) tem a dizer sobre esse assunto?