sap接口開發:連接外部數據庫,NATIVE SQL &OPEN SQL

一、連接外部數據庫

  • 連接配置
  1. 使用事務碼:dbco新建連接信息條目
新建連接條目.jpg

【參數介紹】
連接名:連接池的名字;
DBMS:選擇要連接的數據庫類型(這里以oracel為例);
用戶名稱:輸入要連接的數據的用戶名;
數據庫口令:輸入要連接的數據的用戶口令;
連接信息:不同的數據庫寫法不一樣,連接名.WORLD
Permanent:連接方式(是否是永久連接);

  1. 上傳連接串信息
    (1)一般先使用AL11將系統內tnsnames.ora文件下載到本地

al11(1).jpg

al11(2).jpg

al11(3).jpg

本系統中的路徑如上圖,找到tnsnames.ora文件點開進去,然后點擊菜單list→save→file,選擇未轉換的格式保存到本地。
(2)在保存后的本地tns文件中添加要連接的數據庫拼接串信息
(3)最后使用CG3Z將修改后的tns文件上傳到sap上,注意上傳地址完整不要錯。
cg3z上傳tns文件.jpg

  1. 使用DB02:測試連接情況
db02測試連接.jpg

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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.簡介 數據存儲有哪些方式?電子表格,紙質文件,數據庫。 那么究竟什么是關系型數據庫? 目前對數據庫的分類主要是...
    喬震閱讀 1,764評論 0 2
  • 什么是SQL數據庫: SQL是Structured Query Language(結構化查詢語言)的縮寫。SQL是...
    西貝巴巴閱讀 1,849評論 0 10
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139