美文网首页
sap接口开发:连接外部数据库,NATIVE SQL &

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

作者: hitammy | 来源:发表于2016-12-05 21:02 被阅读814次

一、连接外部数据库

  • 连接配置
  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.

相关文章

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

    一、连接外部数据库 连接配置 使用事务码:dbco新建连接信息条目 【参数介绍】连接名:连接池的名字;DBMS:选...

  • SAP 接口编程之 RFC系列 (01) : RFC Hello

    SAP 系统与外部环境接口,SAP 统称为 ABAP Connectivity。时至今日,连接方法已经非常复杂了。...

  • 数据库SQL连接问题

    近期在熟悉前后端交互,自己开发服务端接口,连接本地SQL数据库出现报错: Error: getaddrinfo E...

  • App接口开发

    单例模式连接数据库 开发首页接口方式 开发版本升级接口

  • 数据库连接池

    使用数据库连接池优化程序性能 编写数据库连接池 编写连接池需事先java.sql.DataSource接口。Dat...

  • jdbc 03 接口解析

    Connection 接口表示与数据库的连接 与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结...

  • 数据库连接池

    DataSource接口为了获取数据库连接对象(Connection)JDBC提供了javax.sql.DataS...

  • 问题排查经验

    接口超时a. 调用外部系统 确认外部系统是否响应超时b. 查询数据库 确认sql执行计划是否有问...

  • JDBC技术

    Java数据库连接,我们可以用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql...

  • JDBC总结

    Java数据库连接,我们可以用它来操作关系型数据库。JDBC接口及相关类在java.sql包和javax.sql包...

网友评论

      本文标题:sap接口开发:连接外部数据库,NATIVE SQL &

      本文链接:https://www.haomeiwen.com/subject/llnbpttx.html