Zugriff auf eine MSSQL Datenbank von Oracle über ODBC

Steve6

Aktiver Benutzer
Beiträge
26
Hallo Profis,

ich habe ein Problem mit einem Datenbankzugriff über ODBC. Ich habe eine Oracle 11 Datenbank, zudem eine MSSQL-Datenbank(2017). Beide Datenbanken laufen jeweils auf einem 64bit Windows-Server. Die Oracle-Datenbank habe ich im Vollzugriff. Auf die MSSQL-Datenbank nur lesend Zugriff. Ich kann dort also auch keine VIEWS schreiben.
Ich möchte nun von der Oracle-Datenbank auf die MSSQL Daten zugreifen. Das habe ich über ODBC gelöst.

Das funktioniert auch alles gut. Bis auf die unsäglichen varchar(max)/nvarchar(max) Werte. Diese kommen nicht rüber. Ich habe einige ODBC-Treiber getestet. Immer wieder kommt die Meldung "ORA-28500: Verbindung von Oracle zu Fremdsystem gab diese Nachricht zurück: [Microsoft][ODBC Driver 13 for SQL Server]Die Zeichenfolgedaten wurden rechts abgeschnitten {01004}"

Ich weiß, dass Oracle bzw. die ODBC-Verbindung das varchar(max)/nvarchar(max)-Feldern nicht verstehen/übersetzen kann. Ich finde aber keine Lösung zu dem Problem. Google habe ich schon mehrfach versucht. Ohne Erfolg.

Hat hier jemand noch eine Idee?
 
Werbung:
Hier noch weitere Infos:

inisqlora.ora
HS_FDS_CONNECT_INFO = sqltoora
HS_FDS_TRACE_LEVEL = OFF

tnsnames.ora
sqltoora =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST= Server)(PORT=1521))
(CONNECT_DATA= (SID=sqltoora))
(HS=OK)
)

listener.ora
(SID_DESC=
(SID_NAME = sqltoora)
(ORACLE_HOME = D:\app\oracle\product\11.2.0\dbhome_1)
(PROGRAM = dg4odbc)
)



 
Auch selten: eine Fehlermeldung ohne auslösende Aktion.

Welche Operationen führst Du aus, die diesen Fehler liefern? Reines Select, Insert into select.,.. ? Anhand der Beschreibung jedenfalls ausschließlich lesend von MSSQL? Bitte ein konkretes Beispiel, exakte Tabellendefinitionen dazu als DDL.

Wieso Oralce 11 wenn Du es selbst in der Hand hast? Das ist so alt, das es vielleicht nicht mal so einfach auf seine eigene aktuelle Schwester zugreifen kann.

Notfalls versuchen, eine andere DB dazwischen zu schalten Oracle< Postgres < MSSQL.
 
Hallo!
Ja, da ist was dran. ;)
Also es ist ein einfacher Select-Befehl:

SELECT

"FELD4" AS FELD4

FROM dbo.VIEW1@MSSQLLINK;

Feld4 ist so ein nvarchar(max)-Feld. Alle anderen Felder kann ich problemlos auslesen.
 
Die Fehlermeldung deutet auf einProblem bei der Verarbeitung von Multibyte Zeichenketten hin. Eine nvarchar(max) ist mit mehr Daten befüllt, als Oracle es erwartet und es wird abgeschnitten.
Am nettesten wäre vermutlich, seitens MSSQL ein View zu erstellen, der die Spalten entsprechend beschneidet und mit Klarzahl liefert.
Ansonsten selbiges seitens Oracle versuchen, also Abfrage der Spalte nicht direkt, sondern mit Funktionen, die geieignete Parameter bieten. Einfach mal Substr probieren oder substrb oder substc mit größt möglichen Längen.
Außerdem ist darauf zu achten, dass Oracle bei eigenen Spalten-Definitionen und bei Funktionen in den Größenangaben ziwschen byte und char unterscheidet, z.B. SUBSTRB, das verarbeitet alle Größenangaben in Byte, unabhängig von Anzahl bzw. BYtebedarf einzelner Zeichen, umgekehrt SUBSTRC. Spannend ist dann bei Char, welcher Auffassung Oracle über seinen Standardzeichensatz ist und die Bytes pro Char.
Herausfinden: Tritt der Fehler immer beim Spaltentyp auf oder nur, wenn auch eine bestimmte Mindestlänge Content drin ist.
Experiment: ein Oracle DB mit einem "fetten" Multibyte Zeichensatz anlegen und ausprobieren.
Oder halt mal aktuelles Oracle probieren.
 
Hallo,
leider brachte SUBSTR in keiner der Möglichkeiten eine Besserung. Der Fehler wird immer noch ausgegeben. Sobald ich, wie in diesem Fall das Feld "FELD4" abfrage, wird mir der Fehler um die Ohren gehauen. Eine View in der MSSQL wäre sicher einfacher. Aber da komme ich so nicht ran.

In einigen Beträgen habe ich gelesen, dass der ODBC-Treiber das Problem ist. Ich habe aber schon einige getestet.
SQL Server, ODBC Driver 13 for SQL Server, SQL Server Native Client 11.0, ODBC Driver 11 for SQL Server.
 
Mit ODBC Treibern kenne ich mich nicht aus und meine Lust, Freizeitexperimente für kommerzielle Systeme zu machen, hält sich in Grenzen.
Versuch es mit Postgres wie akretschmer meinte. Da bekommst Du eine heterogene Datenbankschnittstelle geschenkt.
Die Verträglichkeit zwischen Oracle und PG könnte ich mir dann deutlich höher vorstellen, als Oracle gegen MSSQL. Also erstmal prüfen, kann PG fdw nvarchar(max) von MSSQL.
 
Werbung:
Zurück
Oben