Variante 1 (Typdefinition)
* http://zevolving.com/2013/05/abap-database-connectivity-adbc/ * 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.