sap接口开发:连接外部数据库,NATIVE SQL &OPEN SQL

一、连接外部数据库

  • 连接配置
  1. 使用事务码:dbco新建连接信息条目
sap接口开发:连接外部数据库,NATIVE SQL &OPEN SQL_第1张图片
新建连接条目.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上,注意上传地址完整不要错。
sap接口开发:连接外部数据库,NATIVE SQL &OPEN SQL_第2张图片
cg3z上传tns文件.jpg

  1. 使用DB02:测试连接情况
sap接口开发:连接外部数据库,NATIVE SQL &OPEN SQL_第3张图片
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

].

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 for select… WHERE
读取Database Cursor的资料存入 Work Area:
FETCH NEXT CURSOR INTO
关闭 Database Cursor:
CLOSE CURSOR

例子:
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.

你可能感兴趣的:(sap接口开发:连接外部数据库,NATIVE SQL &OPEN SQL)