一、連接外部數據庫
- 連接配置
- 使用事務碼:dbco新建連接信息條目
【參數介紹】
連接名:連接池的名字;
DBMS:選擇要連接的數據庫類型(這里以oracel為例);
用戶名稱:輸入要連接的數據的用戶名;
數據庫口令:輸入要連接的數據的用戶口令;
連接信息:不同的數據庫寫法不一樣,連接名.WORLD
Permanent:連接方式(是否是永久連接);
- 上傳連接串信息
(1)一般先使用AL11將系統內tnsnames.ora文件下載到本地
本系統中的路徑如上圖,找到tnsnames.ora文件點開進去,然后點擊菜單list→save→file,選擇未轉換的格式保存到本地。
(2)在保存后的本地tns文件中添加要連接的數據庫拼接串信息
(3)最后使用CG3Z將修改后的tns文件上傳到sap上,注意上傳地址完整不要錯。
- 使用DB02:測試連接情況
DB02進入后點擊DB CONNECTION,然后選中要測試的數據庫點擊執行,若連接不成功可根據錯誤號排查。
-
連接代碼
系統中已經配置好連接信息后,在程序中連接該數據庫并操作。
TRY.
CALL FUNCTION 'ZFM_DBLINK' "FM代碼見下
EXPORTING
dbcname = gs_con
IMPORTING
return = ls_return.
IF ls_return-type = 'E'.
gs_flag = 'X'.
ls_msg = ls_return-message.
RAISE EXCEPTION TYPE cx_sy_native_sql_error.
ENDIF.
"數據增刪改查等操作語句
"捕獲異常
CATCH cx_sy_native_sql_error INTO lc_exc_ref.
ls_msg = lc_exc_ref->get_text( ).
gs_flag = 'X' .
ENDTRY.
操作Oracle數據庫時,異常處理:
IF NOT ls_msg IS INITIAL.
"如果捕獲到異常,記錄日志,回滾
CLEAR ls_msg.
EXEC SQL.
rollback
ENDEXEC.
ELSE.
"如果無異常,提交插入數據
EXEC SQL.
commit
ENDEXEC.
ENDIF.
斷開數據庫連接:
EXEC SQL.
DISCONNECT :gs_con
ENDEXEC.
自定義的FUNCTION:ZFM_DBLINK代碼如下:
FUNCTION zfm_dblink.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(DBCNAME) TYPE DBCON_NAME
*" EXPORTING
*" VALUE(RETURN) LIKE BAPIRET2 STRUCTURE BAPIRET2
*"----------------------------------------------------------------------
DATA lv_check TYPE dbcon_name.
DATA: lc_exc_ref TYPE REF TO cx_sy_native_sql_error.
TRY.
*判斷是否已經連接
EXEC SQL.
get connection :lv_check
ENDEXEC.
IF dbcname NE lv_check .
EXEC SQL.
connect to :dbcname
ENDEXEC.
IF sy-subrc <> 0.
return-type = 'E' .
return-message = '連接外部數據錯誤' .
RETURN.
ENDIF.
ENDIF.
EXEC SQL.
set connection :dbcname
ENDEXEC.
CATCH cx_sy_native_sql_error INTO lc_exc_ref.
return-message = lc_exc_ref->get_text( ).
return-type = 'E'.
ENDTRY.
RETURN .
ENDFUNCTION.
二、操作語句:native sql && open sql
在數據庫訪問方面,ABAP可以使用native SQL和open SQL兩種方式。
- 使用native SQL(標準SQL語句),開發環境會把SQL語句直接發送給底層的數據庫,可以獲得較快的執行速度,但是由于沒有經過開發環境的校驗,出現錯誤的時候很難跟蹤。
語法格式:
EXEC SQL [PERFORMING <form>].
<statements>
ENDEXEC.
- ** open SQL**是集成在ABAP開發環境中的SQL語言,可以和ABAP代碼寫在一起,結合使用。在ABAP字典中實現了透明表對底層數據庫表的映射,我們在ABAP中使用open SQL進行操作的時候是與具體數據庫類型無關的。open SQL通過讀取透明表,實現對數據庫表的操作。
OPEN SQL 語句包含有:
SELECT, INSERT, UPDATE, MODIFY, DELETE,
OPEN CURSOR, FETCH, CLOSECURSOR, COMMIT WORK, ROLLBACK WORK等。
(1) DATABASE CURSOR是一個數據庫暫存區, 將經SELECT指令讀取的記錄存放至此暫存區, 再由此暫存區放至Work Area中,可減少數據庫讀取的次數。
開啟 Database Cursor:
OPEN cursor <c> for select… WHERE <condition>
讀取Database Cursor的資料存入 Work Area:
FETCH NEXT CURSOR <c> INTO <wa>
關閉 Database Cursor:
CLOSE CURSOR <c>
例子:
TABLES spfli.
DATA: wa LIKE spfli,
c1 TYPE cursor.
OPEN CURSOR c1 FOR SELECT * FROM spfli WHERE area ='TAIWAN'.
TABLES spfli.
FETCH NEXT CURSOR c1 INTO wa.
CLOSE CURSOR c1.
(2) 要確定資料成功寫入數據庫,可使用COMMIT WORK指令。相反如果反悔要復原, 可使用ROLLBACK WORK, 可復原在上個COMMIT WORK指令之后的數據
- 注意:
使用 sql語句時,ABAP定義的變量前要加‘:’,日期、物料號、單號等格式需要轉換。
LOOP AT it_emp.
it_emp-load_date = pnpbegda.
MODIFY it_emp.
EXEC SQL .
INSERT INTO EMPLOYEE(ADMIN_CLIENT_ID,
ID_TP_CD,
REF_NUM,
EMPLOYEE_ST_TP_CD,
LOAD_DATE )
VALUES(:it_emp-pernr,
:it_emp-ictyp,
:it_emp-icnum,
:it_emp-stat2,
to_date(:it_emp-load_date,'yyyy/mm/dd')
)
ENDEXEC.
ENDLOOP.