Oracle - Datentyp NUMBER(m,n) wird in Access als DECIMAL(m,n) mit Problemen in den Nachkommastallen eingebunden.

Problem:
Um in Microsoft Access Tabellen von „echten“ Datenbanken einzubinden wird i.d.R der datenbankeigene ODBC-Treiber verwendet, um u.a. Datentypen in die jeweils bekannten Formate umzusetzen.
Dieses ist bei Oracle nicht optimal gelöst. Seit ein paar Versionen wird der Oracle Datentyp NUMBER(m,n) in Microsoft Access als Decimal umgesetzt (vorher DOUBLE). Hierbei gehen die Nachkommstellen verloren.

Lösung:
Dem ODBC Treiber etwas vorgaukeln. Der ODBC Treiber liest seine Informationen aus der Systemtabelle sys.all_tab_columns, spricht diese View allerdings über den PUBLIC SYNONYM all_tab_columns an. Gleichnamige eigene Objekte werden aber vor den PUBLIC SYNONYM gelesen.

Diese View im Schema des USERS der die Einbíndung ausführt erstellen:
CREATE VIEW all_tab_columns AS
SELECT owner, table_name, column_name, data_type, data_type_mod, data_type_owner,
       data_length,
       CASE WHEN data_type = 'NUMBER' AND data_scale > 0 THEN NULL ELSE data_precision END  data_precision,
       CASE WHEN data_type = 'NUMBER' AND data_scale > 0 THEN NULL ELSE data_scale END  data_scale,
       nullable, column_id, default_length,
       data_default, num_distinct, low_value, high_value, density, num_nulls,
       num_buckets, last_analyzed, sample_size, character_set_name, char_col_decl_length,
       global_stats, user_stats, avg_col_len, char_length, char_used, v80_fmt_image,
       data_upgraded
FROM sys.all_tab_columns

Mit dieser Änderung werden nur die NUMBER(m,0) als Decimal eingebunden, alle NUMBER(m,n) mit n > 0 werden als Double eingebunden.

Dieses ist getestet mit Oracle Sever 9.2.0.7.0 und 11.2.0.3.0.jeweils mit den ODBC Client 11.01.00.07. Die Struktur dieser „lokalen Systemtabelle“ muss der sys.all_tab_columns entsprechen (versionsabhängig)
Nicht die View im SYS-Schema anpassen !!


“Die Organisationen stecken Millionen von Dollars in Firewalls und Sicherheitssysteme und verschwenden ihr Geld, da keine dieser Maßnahmen das schwächste Glied der Sicherheitskette berücksichtigt: Die Anwender und Systemadministratoren.”
Kevin Mitnick