一、连接外部数据库
- 连接配置
- 使用事务码: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.