SAP連接外部ORACLE數據庫
1.先在SAP底層ORACLE數據庫編輯TNS文件,一般由BASIS配置完成.配置完成后我們可以用事務碼:AL11查看配置是否正確,路徑:DIR_ORAHOME->network->admin->tnsnames.ora查看對應的TNS是否配置正確,如:
ORADB04.world =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = XXX.XXX.XXX.XXX)
(PORT = 1521)
)
)
(CONNECT_DATA =
(SERVICE_NAME = XXXX)
)
)
2.在SAP中用DBCO配置,如下:
3.編寫ABAP程序實現SAP訪問外部ORACLE數據庫,並插入數據。
有兩個例子:
例子1:
REPORT zljc_nativesql2 .
DATA: p_dbname(10) VALUE ‘SIPS’.
DATA: l_sql_error TYPE REF TO cx_sy_native_sql_error,
l_error_text TYPE string.
TYPES: BEGIN OF ty_room,
room_id(30),
room_name(100),
room_people(10),
room_desc(100),
END OF ty_room.
DATA: gt_room TYPE TABLE OF ty_room ,
gs_room TYPE ty_room.
gs_room-room_id = ‘no-201’.
gs_room-room_name = ‘風波亭’.
gs_room-room_people = ‘5’.
gs_room-room_desc = ‘岳武穆遺書’.
APPEND gs_room TO gt_room.
gs_room-room_id = ‘no-202’.
gs_room-room_name = ‘威虎山’.
gs_room-room_people = ‘5’.
gs_room-room_desc = ‘座山雕老巢’.
APPEND gs_room TO gt_room.
gs_room-room_id = ‘no-203’.
gs_room-room_name = ‘白宮’.
gs_room-room_people = ‘29’.
gs_room-room_desc = ‘美國總統府’.
APPEND gs_room TO gt_room.
gs_room-room_id = ‘no-204’.
gs_room-room_name = ‘鳥巢’.
gs_room-room_people = ‘5’.
gs_room-room_desc = ‘奧運會主場館’.
APPEND gs_room TO gt_room.
gs_room-room_id = ‘no-205’.
gs_room-room_name = ‘鳳儀亭’.
gs_room-room_people = ‘5’.
gs_room-room_desc = ‘貂蟬和呂布’.
APPEND gs_room TO gt_room.
gs_room-room_id = ‘no-206’.
gs_room-room_name = ‘偽皇宮’.
gs_room-room_people = ‘5’.
gs_room-room_desc = ‘偽滿皇帝’.
APPEND gs_room TO gt_room.
TRY.
EXEC SQL.
CONNECT TO :p_dbname
ENDEXEC.
CATCH cx_sy_native_sql_error INTO l_sql_error.
CALL METHOD l_sql_error->get_text
RECEIVING
result = l_error_text.
WRITE: AT /1 l_error_text.
ENDTRY.
IF sy-subrc <> 0.
WRITE: /1 ‘連接到數據庫失敗:’, l_error_text ,’,請聯系管理員!’.
STOP.
ENDIF.
TRY.
LOOP AT gt_room INTO gs_room.
EXEC SQL.
insert into ljc_room
( room_id,
room_name,
room_people,
room_desc )
values(:gs_room-room_id,
:gs_room-room_name,
:gs_room-room_people,
:gs_room-room_desc)
ENDEXEC.
ENDLOOP.
"捕獲異常
1
2
3
CATCH cx_sy_native_sql_error INTO l_sql_error.
l_error_text = l_sql_error->get_text( ).
ENDTRY.
“*操作Oracle數據庫時,異常處理
IF NOT l_error_text IS INITIAL. “如果捕獲到異常,記錄日志,回滾
CLEAR l_error_text.
EXEC SQL.
rollback
ENDEXEC.
ELSE. ” 如果無異常,提交插入數據
EXEC SQL.
commit
ENDEXEC.
ENDIF.
EXEC SQL.
DISCONNECT :p_dbname
ENDEXEC.
舉例 2
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.