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.

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,712评论 0 2
  • 什么是SQL数据库: SQL是Structured Query Language(结构化查询语言)的缩写。SQL是...
    西贝巴巴阅读 1,805评论 0 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139