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

Qual tipo de dados .NET é melhor para mapear o tipo de dados NUMBER Oracle no NHibernate?


Eu vi decimal usado em vez de int/long em vários exemplos. Eu só estou tentando entender por que

Provavelmente porque .NET decimal e Oracle NUMBER mapeia um pouco melhor que long e NUMBER e também lhe dá mais flexibilidade. Se você posteriormente adicionar uma escala na coluna Oracle, você não precisaria alterar o tipo de dados se já usasse decimal .

decimal é certamente mais lento que int e long já que os dois últimos são suportados em hardware. Dito isso, você precisa processar uma quantidade séria de dados para que faça alguma diferença. Eu ainda acho que você deveria usar long se é com isso que você está lidando e então você também deve deixar as definições de coluna da tabela representarem isso. NUMBER(18,0) por long e assim por diante.

O motivo decimal mapeia um pouco melhor é que long é de 64 bits e decimal é (mais ou menos) 128 bits.

.NET

Tipo:decimal
Intervalo aproximado:±1,0 × 10^−28 a ±7,9 × 10^28
Precisão:28-29 dígitos significativos

Tipo:longo
Intervalo:-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807
Precisão:18 (19 para ulong) dígitos significativos

Oráculo

NUMBER padrão para 38 dígitos significativos e escala 0 (inteiro).

Tipo:NUMBER
Intervalo:+- 1 x 10^-130 a 9,99...9 x 10^125
Precisão:38 dígitos significativos

A Microsoft está ciente do problema e observa

Esse tipo de dados é um alias para o tipo de dados NUMBER(38) e foi projetado para que o OracleDataReader retorne um System.Decimal ou OracleNumber em vez de um valor inteiro. O uso do tipo de dados .NETFramework pode causar um estouro.

Pensando bem, você realmente precisa de BigInteger ser capaz de representar o mesmo número de dígitos significativos que NUMBER padrão para. Nunca vi ninguém fazer isso e acho que é uma necessidade muito rara. Também BigInteger ainda não cortaria desde NUMBER pode ser de infinito positivo e negativo.