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:
jdbc:sap: verwendethost:systemNr:client:languageDie 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-Benutzernamepassword – SAP-PasswortdestFile – Pfad zu einer JCo-Destination-Datei (Format wie .jcoDestination); überschreibt URL und user/password wenn gesetztsapVerifyRfc – 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.
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
;
Ü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'
;
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:
Sonderfall rownumber:
rownumber <= N bzw. rownumber < N wird aus dem FILTER entfernt und als ROWCOUNT an den RFC übergebenBeispiele:
-- 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
;
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:
libsapjco3.sosapjco3.dlllibsapjco3.jnilib oder libsapjco3.dylibUnter 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).