Variante 1 (Typdefinition)
* Paket
- SDB_ADBC
* Demoprogramme
- ADBC_DEMO
- ADBC_DEMO_LOBS_ORA
- ADBC_DEMO_METADATA
- ADBC_DEMO_PROC_CALLS_HDB
- ADBC_QUERY
- ADBC_TEST_CONNECTION
TYPES: BEGIN OF ty_s_result_line,
col1 TYPE c LENGTH 16, " VARCHAR2 (16 Char)
col2 TYPE c LENGTH 16, " VARCHAR2 (16 Char)
col3 TYPE p LENGTH 10 DECIMALS 0, " NUMBER(10)
END OF ty_s_result_line .
TYPES: ty_it_result_data TYPE STANDARD TABLE OF ty_s_result_line WITH DEFAULT KEY.
PARAMETERS: p_con TYPE dbcon-con_name DEFAULT 'MYCON'.
PARAMETERS: p_var1 TYPE string DEFAULT 'ABCDEF'.
START-OF-SELECTION.
TRY.
* Berechtigungsprüfung
AUTHORITY-CHECK OBJECT 'S_DBCON' ID 'DBA_DBHOST' FIELD space
ID 'DBA_DBSID' FIELD p_con
ID 'DBA_DBUSER' FIELD space
ID 'ACTVT' FIELD '03'.
IF sy-subrc = 0.
* DB Connection erzeugen
DATA(o_con) = cl_sql_connection=>get_connection( p_con ).
* SQL-Statement (Syntax ist abh. vom Zielsystem, hier ORACLE)
DATA(lv_stmt) = |SELECT tab1.col1,| &&
| tab2.col2,| &&
| tab3.col3,| &&
| FROM table1 tab1| &&
| INNER JOIN table2 tab2 ON tab1.id = tab2.id| &&
| INNER JOIN table3 tab3 ON tab1.id = tab3.id| &&
| WHERE col4 = ?|.
* Statement erzeugen
DATA(o_stmt) = o_con->create_statement( ).
* ggf. Parameter (?) setzen
o_stmt->set_param( REF #( p_var1 ) ).
* SQL-Statement ausführen (mit Rückgabemenge)
DATA(o_result) = o_stmt->execute_query( lv_stmt ).
* interne Tabelle für Rückgabedaten setzen
DATA(it_result) = VALUE ty_it_result_data( ).
o_result->set_param_table( REF #( it_result ) ).
* Daten in interne Tabelle schreiben
* Parameter upto gibt an, wieviele Datensätze gelesen werden sollen, default = 0 (alle)
DATA(lv_rows) = o_result->next_package( upto = 0 ).
* Sind Daten vorhanden?
IF lv_rows > 0.
* Datenausgabe
cl_demo_output=>display( it_result ).
ELSE.
WRITE: / 'Keine Rückgabedaten vorhanden.'.
ENDIF.
* Resultset schließen
o_result->close( ).
* DB-Connection schließen
o_con->close( ).
ELSE.
WRITE : / 'Keine Berechtigungen.'.
ENDIF.
CATCH cx_root INTO DATA(e_txt).
WRITE: / e_txt->get_text( ).
ENDTRY.
Variante 2 (generische Typdefinition)
PARAMETERS: p_con TYPE dbcon-con_name DEFAULT 'MYCON'.
PARAMETERS: p_var1 TYPE string DEFAULT 'ABCDEF'.
START-OF-SELECTION.
TRY.
* Berechtigungsprüfung
AUTHORITY-CHECK OBJECT 'S_DBCON' ID 'DBA_DBHOST' FIELD space
ID 'DBA_DBSID' FIELD p_con
ID 'DBA_DBUSER' FIELD space
ID 'ACTVT' FIELD '03'.
IF sy-subrc = 0.
* DB Connection erzeugen
DATA(o_con) = cl_sql_connection=>get_connection( p_con ).
* SQL-Statement (Syntax ist abh. vom Zielsystem, hier ORACLE)
DATA(lv_stmt) = |SELECT tab1.col1,| &&
| tab2.col2,| &&
| tab3.col3,| &&
| FROM table1 tab1| &&
| INNER JOIN table2 tab2 ON tab1.id = tab2.id| &&
| INNER JOIN table3 tab3 ON tab1.id = tab3.id| &&
| WHERE col4 = ?|.
* Statement erzeugen
DATA(o_stmt) = o_con->create_statement( ).
* ggf. Parameter setzen
o_stmt->set_param( REF #( p_var1 ) ).
* SQL-Statement ausführen (mit Rückgabemenge)
DATA(o_result) = o_stmt->execute_query( lv_stmt ).
* Metadaten
DATA(o_meta) = o_result->get_metadata( ).
* Strukturdescriptor
DATA(o_struct) = o_result->get_struct_ref( o_meta ).
DATA(o_struct_descr) = CAST cl_abap_datadescr( cl_abap_structdescr=>describe_by_data_ref( o_struct ) ).
* Tabellendescriptor erzeugen
DATA(o_table_descr) = cl_abap_tabledescr=>create( p_line_type = o_struct_descr ).
* Tabellenobjekt anhand des Tabellendeskriptors erstellen
DATA: o_table TYPE REF TO data.
CREATE DATA o_table TYPE HANDLE o_table_descr.
* interne Tabelle für Rückgabedaten setzen
o_result->set_param_table( o_table ).
* Daten in interne Tabelle schreiben
* Parameter upto gibt an, wieviele Datensätze gelesen werden sollen, default = 0 (alle)
DATA(lv_rows) = o_result->next_package( upto = 0 ).
* Sind Daten vorhanden?
IF lv_rows > 0.
* Feldsymbol auf das Tabellenobjekt
FIELD-SYMBOLS <table> TYPE ANY TABLE.
ASSIGN o_table->* TO <table>.
* Datenausgabe
cl_demo_output=>display( <table> ).
ELSE.
WRITE: / 'Keine Rückgabedaten vorhanden.'.
ENDIF.
* Resultset schließen
o_result->close( ).
* DB-Connection schließen
o_con->close( ).
ELSE.
WRITE : / 'Keine Berechtigungen.'.
ENDIF.
CATCH cx_root INTO DATA(e_txt).
WRITE: / e_txt->get_text( ).
ENDTRY.
Links