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:
Mit dieser Änderung werden nur die NUMBER(m,0) als Decimal eingebunden, alle NUMBER(m,n) mit n > 0 werden als Double eingebunden.
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 !!
Nicht die View im SYS-Schema anpassen !!