SapJdbc Treiber

Einleitung

Der SAP JDBC Treiber ermöglicht das Lesen von Daten aus SAP-Systemen über RFC-Funktionsbausteine. Die Funktionalität entspricht dem lesenden Teil von DsModSAP.

Metadaten (Tabellenliste, Spalten) werden aus den SAP-Data-Dictionary-Tabellen DD02L und DD03L gelesen. Die COLUMNS-Klausel ist daher optional.

Es gelten folgende Konventionen:

  • als Datenbank wird die Verbindung jdbc:sap: verwendet
  • die URL enthält die SAP-Verbindungsparameter: host:systemNr:client:language
  • als Schema wird der Funktionsbaustein angegeben (z.B. RFC_READ_TABLE, ZRFC_READ_TABLE)
  • als Tabelle wird der SAP-Tabellenname angegeben (z.B. MARA, KNA1)
  • COLUMNS-Klausel ist optional – fehlt sie, werden Spalten aus DD03L gelesen
  • die FILTER-Klausel enthält native SAP/ABAP-Syntax und wird als OPTIONS an den RFC übergeben

Unterstützte Funktionsbausteine

  • RFC_READ_TABLE
  • ZRFC_READ_TABLE
  • ZRFC_READ_TABLE_TEXT
  • ZRFC_READ_TABLE_BSAD (OPTIONS_BKPF für Filter)
  • ZRFC_READ_TABLE_BSEG (OPTIONS_BKPF für Filter)

Verbindung

Die URL wird bei der Verbindungsherstellung angegeben.

URL-Format: jdbc:sap:host:systemNr:client:language

Beispiel: jdbc:sap:sapserver.example.com:00:800:de

Properties:

  • user – SAP-Benutzername
  • password – SAP-Passwort
  • destFile – Pfad zu einer JCo-Destination-Datei (Format wie .jcoDestination); überschreibt URL und user/password wenn gesetzt
  • sapVerifyRfc – bei true: RFC_PING direkt nach dem Connect (optional)
  • sapColumnSource – Spaltenquelle: DD03L (Default) = DD03L wie DsModSAP, vollständig inkl. .INCLU--AP; RFC = RFC_READ_TABLE NO_DATA (vereinfachte Struktur)

Verbindung mit user/password:

connect 'jdbc:sap:sapserver.example.com:00:800:de|user=myuser,password=secret'

Verbindung mit destFile:

Statt user/password kann eine JCo-Destination-Datei verwendet werden. Die Datei enthält die Verbindungsparameter im JCo-Format:

jco.client.ashost=<host>
jco.client.sysnr=<systemNr>
jco.client.client=<client>
jco.client.user=<user>
jco.client.passwd=<password>
jco.client.lang=<sprache>

Beispiel:

connect 'jdbc:sap:localhost:00:003:DE|destFile=DEV_SAP.jcoDestination'

Die Datei wird gesucht: zuerst als Datei (relativ zum Arbeitsverzeichnis oder absolut), dann im Classpath. Typischerweise liegt sie im Arbeitsverzeichnis des Programms.

Beispiel-Abfrage

Zuerst die Verbindung öffnen, dann die Abfrage ausführen. In der FROM-Klausel stehen Schema (Funktionsbaustein) und Tabelle (SAP-Tabellenname).

Ohne COLUMNS (Spalten aus DD03L):

SELECT MATNR, MTART, MEINS
FROM "RFC_READ_TABLE"."MARA"
FILTER rownumber <= 10
;

Mit COLUMNS (Rückwärtskompatibilität):

SELECT MATNR, MTART, MEINS
FROM "RFC_READ_TABLE"."MARA"
COLUMNS(MATNR, MTART, MEINS)
FILTER rownumber <= 10
;

System-Tabellen

Über das Schema system stehen folgende virtuelle Tabellen zur Verfügung:

Tabelle Quelle Spalten
table_list DD02L + DD02T table_cat, table_schem, table_name, table_type, remarks, type_cat, type_schem, type_name, self_referencing_col_name, ref_generation
column_list DD03L / NO_DATA table_cat, table_schem, table_name, column_name, data_type, type_name, column_size, buffer_length, decimal_digits, num_prec_radix, nullable, remarks, column_def, sql_data_type, sql_datetime_sub, char_octet_length, ordinal_position, is_nullable, scope_catalog, scope_schema, scope_table, source_data_type, is_autoincrement, …
primary_key_list DD03L KEYFLAG table_cat, table_schem, table_name, column_name, key_seq, pk_name

Die Sprache für Remarks in table_list stammt aus der Verbindung (URL oder jco.client.lang in destFile).

FILTER bei Systemtabellen: Die Felder table_schem, table_name und column_name (nur bei column_list) werden als Muster an getTables/getColumns/getPrimaryKeys weitergegeben – dadurch werden weniger Metadaten geladen.

Syntax: table_schem = 'X', table_name = 'MARA' oder ABAP-Stil table_name EQ 'MARA'. SQL-Wildcards (%, _) sind in den Werten erlaubt (z.B. table_name = 'MA%').

SELECT table_schem, table_name, table_type, remarks
FROM "system"."table_list"
WHERE rownumber <= 20
;

-- FILTER: nur Tabellen des Schemas RFC_READ_TABLE
SELECT * FROM "system"."table_list"
FILTER table_schem = 'RFC_READ_TABLE'
;

-- FILTER: nur Spalten der Tabelle MARA laden (schneller)
SELECT * FROM "system"."column_list"
FILTER table_name = 'MARA'
;

-- FILTER: table_schem und table_name
SELECT * FROM "system"."column_list"
FILTER table_schem = 'RFC_READ_TABLE' AND table_name = 'MARA'
;

-- FILTER: column_name bei column_list (z.B. nur MATNR)
SELECT * FROM "system"."column_list"
FILTER table_name = 'MARA' AND column_name = 'MATNR'
;

Mit FILTER (native SAP-Syntax)

Die FILTER-Klausel enthält native SAP/ABAP Open-SQL-Syntax – analog zu Salesforce (SOQL) oder Eloqua. Der Inhalt wird unverändert als OPTIONS an den RFC übergeben.

Übergabe an SAP:

  • Der FILTER-Inhalt wird zeilenweise in die OPTIONS-Tabelle des RFC geschrieben (max. 72 Zeichen pro Zeile)
  • Jede Zeile entspricht einem WHERE-Bedingungsfragment in ABAP-Syntax
  • Mehrzeilige OPTIONS sind erlaubt

Sonderfall rownumber:

  • rownumber <= N bzw. rownumber < N wird aus dem FILTER entfernt und als ROWCOUNT an den RFC übergeben
  • Damit wird die Zeilenanzahl serverseitig begrenzt (ohne alle Zeilen zu lesen)

Beispiele:

-- Nur Zeilenlimit (ROWCOUNT)
SELECT BUKRS, BUTXT FROM "RFC_READ_TABLE"."T001"
COLUMNS(BUKRS, BUTXT)
FILTER rownumber <= 5
;

-- Native ABAP-WHERE-Bedingung
SELECT MATNR, MTART, MEINS FROM "RFC_READ_TABLE"."MARA"
COLUMNS(MATNR, MTART, MEINS)
FILTER MTART = 'FERT'
;

-- Kombination
SELECT MATNR, MTART FROM "RFC_READ_TABLE"."MARA"
COLUMNS(MATNR, MTART)
FILTER MTART = 'FERT' AND rownumber <= 100
;

Verwendung in Java-Programmen

Ein eigenes Java-Programm benötigt den Treiber, SAP JCo und die native JCo-Bibliothek. Die native Library (z.B. libsapjco3.so, sapjco3.dll bzw. libsapjco3.jnilib) kommt mit dem SAP JCo-Paket und muss per java.library.path gefunden werden.

Beispiel – Treiber und JCo in einem Verzeichnis lib/ (sapjdbc.jar, sapjco3.jar, native Library):

java -Djava.library.path=lib -cp ".:lib/*" IhreMainKlasse

Beispiel – Im Projekt-Root:

java -Djava.library.path=. -cp ".:sapjdbc.jar:sapjco3.jar" IhreMainKlasse

Die native Library muss im java.library.path liegen (z.B. lib/). Plattformspezifisch:

  • Linux: libsapjco3.so
  • Windows: sapjco3.dll
  • macOS: libsapjco3.jnilib oder libsapjco3.dylib

Unter Windows den Classpath mit ; statt : trennen.

Die gesamte SAP JCo Bibliothek ist über das SAP Software Download Center erhältlich (SAP Connector for Microsoft .NET and Java).