DB Link 的方式访问外部数据库数据库直连 DBCO

DB Link也是我们会在企业内部经常会用到的一个取数的方法,简单快捷。但是首先需要在( DBCO )中创建。

1、使用事务码:dbco新建连接信息条目

【参数介绍】
连接名:连接池的名字;
DBMS:选择要连接的数据库类型(这里以oracel为例);
用户名称:输入要连接的数据的用户名;
数据库口令:输入要连接的数据的用户口令;
连接信息:不同的数据库写法不一样,连接名.WORLD
Permanent:连接方式(是否是永久连接);

连接信息:不同的数据库类型的连接信息不一致。

a)、SQL Server

 MSSSQL_SERVER = 服务器名  MSSSQL_DBNAME=数据库名 OBJECT_SOURCE= 数据库名

b)、 Oracel

oracel的链接信息比较隐晦,必须在 SAP 应用服务器上安装 Oracel client  ,然后设置链接,再在这里的链接信息进行指定。

先在SAP底层ORACLE数据库编辑TNS文件,一般由BASIS配置完成,配置路径:DIR_ORAHOME->network->admin->tnsnames.ora;配置完成后我们可以用事务码:AL11查看配置是否正确,AL11查看连接【HR9DEV.WORLD】具体配置

一般先使用AL11将系统内tnsnames.ora文件下载到本地,

本系统中的路径如上图,找到tnsnames.ora文件点开进去,然后点击菜单list→save→file,选择未转换的格式保存到本地。
(2)在保存后的本地tns文件中添加要连接的数据库拼接串信息
(3)最后使用CG3Z将修改后的tns文件上传到sap上,注意上传地址完整不要错。

DB02进入后点击DB CONNECTION,然后选中要测试的数据库点击执行,若连接不成功可根据错误号排查。

c)、链接DB2数据库
执行事务码DBCO,点新条目按钮,填写如下图所示信息

连接信息看上去比较直接,分别是数据库名、端口号、主机IP地址。

2、

DATA:

      lo_sql TYPE REF TO cl_sql_statement,
      ltm_open TYPE REF TO cl_sql_connection,
      lo_result TYPE REF TO cl_sql_result_set,
*-Exception Class for SQL Error
      zci_sql_exception
                    TYPE REF TO cx_sql_exception.
DATA: l_sqlstmt       TYPE        string                   ,
        l_dref          TYPE REF TO data .      
DATA: g_subrc       LIKE sy-subrc              ,
      g_dbcln       LIKE dbcon-con_name       , " Connection Name
      g_ifdtn       TYPE string                , " Interface Table Name
      g_rtmsg       TYPE balmsgtxtp           .

      if g_dbcln is initial.
        create object ltm_open.
      else.
        ltm_open = cl_sql_connection=>get_connection( g_dbcln ).

        create object lo_sql
          exporting
            con_ref = ltm_open.
      endif.

  l_sqlstmt = 'select customer_order_no, bl_status_name, pppicking_time_d, delivery_status_name, delivery_who, dest_customer_namec, dest_customerno, sold_to,'
              && ' dest_customer_address, dest_customer_contact, dest_customer_tel1, followerup2, followerup, carrierid, carrierid_c,'
              && ' convert(varchar,delivery_time,23) as delivery_time, udf19, productname, sales_org, tax_code, offering_type_c, trservice_type_c,'
              && ' doc_return_time_d1, order_type, left(edittime_d,10) as edittime_d1, bl_status from vman_doc_bl_order_header'.

  concatenate l_sqlstmt ' where left(edittime_d,10 ) between ' into l_sqlstmt separated by space.
*  concatenate l_sqlstmt ''''lv_begin_date_c'''' into l_sqlstmt separated by space.
  l_sqlstmt = l_sqlstmt && | | && '''' && lv_begin_date_c && '''' .
  concatenate l_sqlstmt ' and ' into l_sqlstmt separated by space.
  l_sqlstmt = l_sqlstmt && | | && '''' && lv_end_date_c && '''' .
  concatenate l_sqlstmt  ' and bl_status > 70 and bl_status <> 90 ' into l_sqlstmt separated by space.

  lo_result = lo_sql->execute_query( l_sqlstmt ).

  get reference of lt_detail[] into l_dref.
  lo_result->set_param_table( l_dref ).

  lo_result->next_package( ).
  lo_result->close( ).

*-Local Data Declaration
  data: l_dbcln  like dbcon-con_name  value space.
*-Disconnect DB
  l_dbcln = ltm_open->get_con_name( ).
  check l_dbcln ne cl_sql_connection=>c_default_connection.
  ltm_open->close( ).
DATA: exc_ref    TYPE REF TO cx_sy_native_sql_error,
      error_text TYPE string.
t_dbname = 'PLMDB'.
EXEC SQL.

CONNECT TO :t_dbname

ENDEXEC.
EXEC SQL.

SET CONNECTION :t_dbname

ENDEXEC.

TRY.

EXEC SQL.

SELECT max(to_number(OBID)) INTO :t_OBID from Z_HRDATA

ENDEXEC.


LOOP AT t_YUSER_QUIT.
  t_OBID = t_OBID + 1.

  EXEC SQL.

  INSERT INTO Z_HRDATA
    ( OBID, DTYUERCATEGORY, DTYUSERRECORDDATE, EMAILADDR, DTNTDOMAIN, PDMUSRNTACCOUNT, PDMUSREMPLOYID,
      DTORIGINALDEPTCODE, DTORIGINALDEPTNAME, DTNEWDEPTCODE, DTNEWDEPTNAME, DTYUSERLOCATIONNAME,
      DTYUSERQUITAPPLYDATE, DTYUSERQUITACTIVEDATE, DTYUSERUPLOADDATE, DTYUSERUPLOADTIME )
  VALUES
    ( :t_OBID, :t_YUSER_QUIT-CATEGORY, to_char(to_date(:t_YUSER_QUIT-RECORDDATE,'YYYYMMDD'),'YYYY/MM/DD'), :t_YUSER_QUIT-YMAIL,
      :t_YUSER_QUIT-YNTDOMAIN, :t_YUSER_QUIT-YNTACCOUNT, :t_YUSER_QUIT-ID,
      :t_YUSER_QUIT-ORGDEPTNO, :t_YUSER_QUIT-ORGDEPTNAME, :t_YUSER_QUIT-NEWDEPTNO, :t_YUSER_QUIT-NEWDEPTNAME, :t_YUSER_QUIT-LOCATION,
      to_char(to_date(:t_YUSER_QUIT-APPLYDATE,'YYYYMMDD'),'YYYY/MM/DD'), to_char(to_date(:t_YUSER_QUIT-ACTIVEDATE,'YYYYMMDD'),'YYYY/MM/DD'),
      to_char(to_date(:t_YUSER_QUIT-UPLOADDATE,'YYYYMMDD'),'YYYY/MM/DD'), to_char(to_date(:t_YUSER_QUIT-UPLOADTIME,'hh24miss'),'hh24:mi:ss') )

  ENDEXEC.


  EXEC SQL.
    commit
  ENDEXEC.

ENDLOOP.

EXEC SQL.
  DISCONNECT :t_dbname
ENDEXEC.

  CATCH cx_sy_native_sql_error INTO exc_ref.
  error_text = exc_ref->get_text( ).
  WRITE: / 'Error:', error_text.
ENDTRY.

DEMO程序:ADBC_DEMO,

新浪博客

测试连接性:

1、DB02

2、SE38执行

ADBC_TEST_CONNECTION

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值