ABAP使用ODBC的方式進行ORACLE資料庫的連線
阿新 • • 發佈:2018-11-14
SAP本身支援直接對外部多種資料庫的直接訪問,資料庫型別通過搜尋幫助可知:
這裡主要介紹如何進行ORA也就是oracle資料庫的連線以及給出例項。
ORA的配置分成二部分,一部分是SAP伺服器需要有oracle的資料庫驅動,比較直接的方式就是在伺服器上安裝相應版本的oracle,然後配置tnsnames.ora檔案資料庫的地址資訊。
根據其他同事的經驗,如果SAP版本是使用oracle作為底層資料庫的話只需要配置tnsnames.ora資料夾即可。
第二部分在SAP客戶端前段進行,使用事務程式碼DBCO或者DB02進入,按照要求填寫資訊:
配置完成後可以使用頁面中的測試進行連線測試,也可以使用程式ADBC_TEST_CONNECTION進行連線測試。
例項:
①如何使用SELECT獲取表資訊
②如何使用INSERT/UPDATE
DATA: gw_dbs TYPE dbcon-con_name VALUE 'Z_ORACLE'. TRY. EXEC SQL. connect to :gw_dbs ENDEXEC. CATCH cx_sy_native_sql_error INTO g_obj_sqldb. CALL METHOD g_obj_sqldb->get_text RECEIVING result = g_error_text.ENDTRY. IF g_error_text is INITIAL. EXEC SQL. SET CONNECTION 'Z_ORACLE' ENDEXEC. TRY . EXEC SQL PERFORMING loop_output. SELECT * FROM hfm_sap_gl_balances INTO :wa ENDEXEC. CATCH cx_sy_native_sql_error INTO g_obj_sqldb.CALL METHOD g_obj_sqldb->get_text RECEIVING result = g_error_text. ENDTRY. ELSE. MESSAGE s000 WITH g_error_text DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. FORM loop_output. APPEND gs_balances TO gt_balances. ENDFORM.
EXEC SQL.
DISCONNECT :gw_dbs
ENDEXEC.
前面這一段程式碼詳細介紹使用了FORM的方式獲取表的內容,自然如果是單條資訊的話就不需要新增PERFORMING loop_output這一段程式碼了,
至於INSERT與UPDATE的使用方法相對簡單,直接貼核心程式碼
EXEC SQL. UPDATE hfm_sap_gl_balances SET begin_balance_end = :i_passin-begin_balance_end, period_net_dr = :i_passin-period_net_dr, period_net_cr = :i_passin-period_net_cr, period_net_end = :i_passin-period_net_end, begin_balance_end_rmb = :i_passin-begin_balance_end_rmb, period_net_dr_rmb = :i_passin-period_net_dr_rmb, period_net_cr_rmb = :i_passin-period_net_cr_rmb, period_net_end_rmb = :i_passin-period_net_end_rmb, last_update_date = to_date(:sy-datum,'YYYYMMDD HH24:MI:SS') WHERE period_year = :i_passin-period_year AND period_num = :i_passin-period_num AND company_code = :i_passin-company_code AND account_code = :i_passin-account_code AND customer_code = :i_passin-customer_code AND type_code = :i_passin-type_code ENDEXEC.
EXEC SQL. INSERT INTO hfm_sap_gl_balances (period_year, period_num, currency_code, company_code, department_code, account_code, customer_code, type_code, begin_balance_end, period_net_dr, period_net_cr, period_net_end, begin_balance_end_rmb, period_net_dr_rmb, period_net_cr_rmb, period_net_end_rmb, account_type, last_update_date ) VALUES (:i_passin-period_year, :i_passin-period_num, :i_passin-currency_code, :i_passin-company_code, '', :i_passin-account_code, :i_passin-customer_code, :i_passin-type_code, :i_passin-begin_balance_end, :i_passin-period_net_dr, :i_passin-period_net_cr, :i_passin-period_net_end, :i_passin-begin_balance_end_rmb, :i_passin-period_net_dr_rmb, :i_passin-period_net_cr_rmb, :i_passin-period_net_end_rmb, :i_passin-account_type, to_date(:sy-datum,'YYYYMMDD HH24:MI:SS')) ENDEXEC.
當然最後別忘了提交
EXEC SQL. COMMIT ENDEXEC.