SAP NATIVE SQL

news2024/12/23 17:05:39

【应用场景】

1. 往对方中间库表中直接新增数据库表记录

2. 通过数据库中间件直接读取对方系统数据库表

【知识点】1. 连接数据库  2.读取数据  3.关闭数据库连接   4. 游标的使用

【前置条件】DB2配置对应对方系统的数据库连接是通的。有时因为密码过期或改了会导致数据库连接不上,需要检查。

【应用实例代码1】-带游标

DATA g_conexion   TYPE dbcon-con_name VALUE 'ECCBI_DEV'.
DATA lr_error     TYPE REF TO cx_sy_native_sql_error.
DATA lv_mess      TYPE string.
DATA ev_msg TYPE char255.
"--  1. 连接SQL SERVER
TRY.
    EXEC SQL.
      connect to :g_conexion
    endexec.
    exec sql.
      set connection :g_conexion
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO lr_error.
    CALL METHOD lr_error->if_message~get_text
      RECEIVING
        result = lv_mess.
    CONCATENATE lv_mess ',无法连接至SQL数据库   连接名:' g_conexion INTO ev_msg.
ENDTRY.

TRY.
    "付款单
    "--  读取游标
    EXEC SQL.
      open dbcur1 for
       select
         a.factualpayamount,
         a.fpayeraccountbankid,
         b.fbankaccountnumber,
         a.fpayeename,
         a.fpayeebank,
         a.fpayeeaccountbank,
         a.ffeetypeid,
         c.fname_l2 as zyname,
         a.fnumber,
         a.fbizdate,
         a.fcompanyid,
         d.FName_l2 as fcompanyname,
         a.fcreatetime
       from SLT_EAS.T_CAS_PAYMENTBILL a
        left join SLT_EAS.T_BD_AccountBanks b
        on a.fpayeraccountbankid=b.fid
        left join SLT_EAS.T_CAS_FeeType c
        on a.ffeetypeid=c.fid
        left join SLT_EAS.T_ORG_Company d
        on a.fcompanyid=d.fid
       where a.FBankPayState = '6'
         and a.fcreatetime >= :f_fcreatetime
         and a.fcreatetime <= :e_fcreatetime
         and c.fname_l2 = '退房款'
         and a.FisCommittoBe = '1'
    ENDEXEC.

    DO.
      EXEC SQL.
        fetch next dbcur1 INTO :gs_fkd.
      ENDEXEC.
      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        APPEND gs_fkd TO gt_fkd.
      ENDIF.
    ENDDO.
    "--  关闭游标
    EXEC SQL.
      CLOSE dbcur1
    ENDEXEC.
  CATCH cx_sy_native_sql_error INTO lr_error.
    CALL METHOD lr_error->if_message~get_text
      RECEIVING
        result = lv_mess.

    "gv_errorstr = lr_error->get_text( ).
    CONCATENATE '读取数据出错,'  lv_mess ': EAS视图' INTO ev_msg.
ENDTRY.
"-- 断开连接
EXEC SQL.
  disconnect :g_conexion
ENDEXEC.

【应用实例代码2】



 DATA LS_ZSFI0343 TYPE ZSFI0343.
  DATA:LV_ERRO_TEXT    TYPE C LENGTH 200,
       LV_ERRO_TEXT1   TYPE C LENGTH 200,
       LC_ERRO_OBJECT  TYPE REF TO CX_SY_NATIVE_SQL_ERROR,
       LC_ERRO_OBJECT1 TYPE REF TO CX_SY_NATIVE_SQL_ERROR.

  CONSTANTS: C_DATABASE TYPE CHAR11 VALUE 'SAP2HFM_MID'.
  CONSTANTS C_DATABASE1 TYPE CHAR11 VALUE 'SAP2HFM_RES'.
  DATA:LV_DATABASE TYPE CHAR30.
* 按系统来源,确定更新那个数据库
  CASE I_TARGET_SYS.
    WHEN 'PVKHB01'.
      LV_DATABASE = C_DATABASE.
    WHEN 'PVKHB02'.
      LV_DATABASE = C_DATABASE1.
    WHEN OTHERS.
      LV_DATABASE = C_DATABASE.
  ENDCASE.
*---data define




*---get data
  PERFORM FRM_GET_DATA_0060 TABLES ET_ZSFI0343
                       USING I_BUKRS
                             I_GJAHR
                             i_monat
                             I_BATCH_ID
                             I_FREQUESTNO
                       CHANGING E_ERR
                                E_MSG.


*---get data
  IF ET_ZSFI0343[] IS INITIAL.
    E_ERR = 'S'.
    EXIT.
  ENDIF.
  E_ERR = 'S'.

* 获取函数文本
  PERFORM FRM_GET_FUNC_NAME USING 'ZFII_0060'
                         CHANGING E_MSG.


*---update database
*使用标准方法捕获异常、异常处理(如果有异常,输出记录异常日志回滚数据;如果无异常,执行后续程序)
  TRY .
      EXEC SQL.
        CONNECT TO :LV_DATABASE
      ENDEXEC.
    CATCH CX_SY_NATIVE_SQL_ERROR INTO LC_ERRO_OBJECT.
      LV_ERRO_TEXT = LC_ERRO_OBJECT->GET_TEXT( ).

  ENDTRY.

  IF LV_ERRO_TEXT IS NOT INITIAL.
    E_ERR = 'F'.
    E_MSG = E_MSG && ':' && LV_ERRO_TEXT.
    EXIT.
  ENDIF.

  LOOP AT ET_ZSFI0343 INTO LS_ZSFI0343.
    TRY.
        " SAP_STAGE.
        EXEC SQL.
          INSERT INTO CT_GL_MIDCFCHECK
            ( FID,
              FREQUESTNO,
              FSOURCESYSTEM,
              FCOMPANYNUMBER,
              FCOMPANYNAME,
              FYEAR,
              FMONTH,
              FPERIODNUMBER,
              FACCOUNTNUMBER,
              FACCOUNTNAME,
              FCURRENCY,
              FORIGINALAMOUNT,
              FLOCALAMOUNT,
              FCREATORID,
              FCREATETIME,
              FLASTUPDATEUSERID,
              FLASTUPDATETIME,
              F_BATCH_ID,
              SCENARIO,
              RBUSA,
              GTEXT
          )
          VALUES(:LS_ZSFI0343-FID,
                :LS_ZSFI0343-FREQUESTNO,
                :LS_ZSFI0343-FSOURCESYSTEM,
                :LS_ZSFI0343-FCOMPANYNUMBER,
                :LS_ZSFI0343-FCOMPANYNAME,
                :LS_ZSFI0343-FYEAR,
                :LS_ZSFI0343-FMONTH,
                :LS_ZSFI0343-FPERIODNUMBER,
                :LS_ZSFI0343-FACCOUNTNUMBER,
                :LS_ZSFI0343-FACCOUNTNAME,
                :LS_ZSFI0343-FCURRENCY,
                :LS_ZSFI0343-FORIGINALAMOUNT,
                :LS_ZSFI0343-FLOCALAMOUNT,
                :LS_ZSFI0343-FCREATORID,
                :LV_TIME,
                :LS_ZSFI0343-FLASTUPDATEUSERID,
                :LV_TIME,
                :LS_ZSFI0343-F_BATCH_ID,
                :LS_ZSFI0343-SCENARIO,
                :LS_ZSFI0343-RBUSA,
                :LS_ZSFI0343-GTEXT
         )

        ENDEXEC.
*****捕获异常
      CATCH CX_SY_NATIVE_SQL_ERROR INTO LC_ERRO_OBJECT.
        LV_ERRO_TEXT = LC_ERRO_OBJECT->GET_TEXT( ).
    ENDTRY.



    IF LV_ERRO_TEXT IS INITIAL.
*    如果无异常,提交插入数据
      PERFORM FRM_NATIVE_COMMIT.

    ELSE.
*    如果捕获到异常,记录日志,回滚
      PERFORM FRM_NATIVE_ROLLBACK.
      E_ERR = 'F'.
      E_MSG = E_MSG && ':' && LV_ERRO_TEXT .
      EXIT.
    ENDIF.

    CLEAR LV_ERRO_TEXT.
  ENDLOOP.

  "关闭连接
  TRY .
      EXEC SQL.
        DISCONNECT :LV_DATABASE
      ENDEXEC.
    CATCH CX_SY_NATIVE_SQL_ERROR INTO LC_ERRO_OBJECT1.
      LV_ERRO_TEXT1 = LC_ERRO_OBJECT1->GET_TEXT( ).
      E_MSG = E_MSG && ':' && LV_ERRO_TEXT1 .
      E_ERR = 'F'.
  ENDTRY.


  IF E_ERR = 'S'.
    E_ERR = 'S'.
    E_MSG = TEXT-002 && ':' && E_MSG.
  ELSE.
    E_ERR = 'F'.
    E_MSG = TEXT-003 && ':' && E_MSG.
  ENDIF.

*---uadate database


ENDFUNCTION.

FORM frm_connect_db USING p_dbname.

  DATA: l_obj_sqldb  TYPE REF TO cx_sy_native_sql_error.
  DATA: l_error_text TYPE string.


  TRY.
      EXEC SQL.
        CONNECT TO :p_dbname
      ENDEXEC.
*****连接Oracle数据库时,捕获异常,如果连接失败,输出异常信息
    CATCH CX_SY_NATIVE_SQL_ERROR INTO L_OBJ_SQLDB.
      CALL METHOD L_OBJ_SQLDB->GET_TEXT
        RECEIVING
          RESULT = L_ERROR_TEXT.

      GV_MSG = L_ERROR_TEXT.
  ENDTRY.


ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_NATIVE_COMMIT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_NATIVE_COMMIT .
  EXEC SQL.
    commit
  ENDEXEC.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_NATIVE_ROLLBACK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_native_rollback .
  EXEC SQL.
    rollback
  ENDEXEC.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_DISCONNECT_DB
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_disconnect_db USING p_dbname .

*断开数据库连接
  EXEC SQL.
    DISCONNECT :p_dbname
  ENDEXEC.

ENDFORM.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地生活服务平台排名榜揭秘!如何通过搭建本地生活服务系统入局?

当前&#xff0c;本地生活赛道的热度不断攀升&#xff0c;想要通过本地生活服务商这一身份入局分羹的创业者数量更是不计其数。这让本地生活市场的竞争日渐激烈的同时&#xff0c;也让各类本地生活服务平台排行榜成为他们的重点关注对象。 而综合多个本地生活服务平台排行榜来看…

跟李沐学AI:语言模型

语言模型定义 假设在给定长度为T的文本序列中的词元依次为&#xff0c;可被人做文本序列在时间步t处的观测或标签。在给定这样的文本序列是&#xff0c;语言模型的目标是估计序列的联合概率。 一个理想的与语言模型能够在一次抽取一个词元的情况下基于模型本身生成自然文本。…

力扣343-整数拆分(Java详细题解)

题目链接&#xff1a;343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没…

vue项目 / 资产管理

参考&#xff1a; https://blog.csdn.net/A_Common_Man/article/details/124601367 App.vue <template><div id"app"><div class container><h4 style"text-align: center; margin-top: 20px">资产管理</h4> <table …

【C语言进阶】C语言进阶教程:利用结构体、联合体和枚举自定义数据类型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C语言 “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C语言内存管理函数 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C语言自定义类型 &#…

编译 ffmpeg 以支持AVS格式视频解码与解码

前言 当前文章介绍如何在Linux下使用FFmpeg转码其他视频格式到AVS格式的指南&#xff0c;包括编译FFmpeg以支持XAVS编码和如何使用FFmpeg进行转码。 AVS (Audio Video Coding Standard) 格式是一种由中国主导制定的视频编码标准&#xff0c;全称为“中国数字音视频编解码技术…

将星 x17 安装ubuntu 20.04 双系统

准备工作&#xff0c;包含关闭快速启动&#xff0c;关闭Secret Boot 1.进入控制面板选择小图标&#xff0c;找到电源选项 2.点击更改当前不可用的设置&#xff0c;关闭快速启动 3.开机启动时快速按F2&#xff0c;进入BIOS 4.选择Setup Utiltity&#xff0c;选择Security&#…

鲁大师8月新机性能/流畅/AI/久用榜:新机节奏放缓,但不乏小惊喜

虽说8月紧邻开学季&#xff0c;但机圈发布新机的节奏相较7月&#xff0c;明显放缓不少&#xff0c;或许是华为和苹果将在9月10日这天再次正面硬刚&#xff0c;让其他厂商感觉“亚历山大”&#xff0c;不冒险当出头鸟&#xff1b;亦或是各手机厂商正为骁龙8 Gen4和天玑9400新旗舰…

C++入门9——list的使用

目录 1.什么是list&#xff1f; 2.list的构造 3.list迭代器的使用&#xff08;list iterator&#xff09; 4.list capacity 5.list modifiers 6.list的其他操作 1.什么是list&#xff1f; 在官网中&#xff0c;对list有这样的介绍&#xff1a; Lists are sequence co…

如何在VSCODE中查看西门子PLC的SCL程序?

如何在VSCODE中查看西门子PLC的SCL程序? 首先,下载并安装VSCODE, 安装完成后,默认为英文界面,点击左侧扩展栏,搜索中文语言包,并点击安装,安装完成后会提示重启,重启之后就会显示中文, 同样,在扩展中搜索SCL插件包,并点击安装, 安装完成之后,可以新建一个文本文件…

在 Elastic 8.15 中使用最少的代码快速构建 RAG

作者&#xff1a;来自 Elastic Han Xiang Choong Elastic 8.15 已经发布&#xff0c;语义搜索比以往任何时候都更容易实现。 我们将介绍如何在 15 分钟内完成所有这些任务&#xff1a; 将你的文档存储在某些数据存储服务中&#xff0c;例如 AWS S3 Bucket设置 Elastic Search…

java项目docker部署时进行热部署

本文需要pontwiner进行配合操作 1.上传文件到对应服务器&#xff0c;可以通过xftp等文件上传工具进行文件上传 2.获取docker imagId XX为项目部署名称 例如&#xff1a;test-server docker ps -a |grep XX 3.复制文件到docker容器的/tmp目录下 docker cp XXXX.class im…

做seo要注意的各种细节,你都注意到了吗

在实施seo时&#xff0c;关注各种细节是至关重要的。 这些细节始于网站的初始设计&#xff0c;包括选择合适的主机、规划网站结构、优化网站内容&#xff0c;以及建立内部和外部链接的策略等。此外&#xff0c;确保网站对搜索引擎友好&#xff0c;涵盖从URL的设计到内容的优化…

kafka的安装和启动

一、kafka介绍 1&#xff0c;kafka简单介绍 kafka是一款分布式、支持分区的、多副本&#xff0c;基于zookeeper协调的分布式消息系统。最大的特性就是可以实时处理大量数据来满足需求。 2&#xff0c;kafka使用场景 1&#xff0c;日志收集&#xff1a;可以用kafka收集各种服务…

使用 Docker 部署和运行 RabbitMQ

使用 Docker 部署和运行 RabbitMQ 在本篇博客中&#xff0c;我将介绍如何通过 Docker 来运行 RabbitMQ 并使用其管理界面。还会讨论我在操作过程中遇到的常见问题及其解决方案。RabbitMQ 是一个开源的消息代理&#xff0c;用于跨应用程序发送、接收消息。在容器化环境中运行 R…

使用sysbench 简单测试io

sysbench最新版本地址 GitHub - akopytov/sysbench: Scriptable database and system performance benchmark centos在线安装 curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench 查看sysben…

vue3+ts封装类似于微信消息的组件

组件代码如下&#xff1a; <!--聊天页面-播放语言组件--> <template><div:class"[voice-message, { sent: isSent, received: !isSent }]":style"{ backgroundColor: backgroundColor }"click"togglePlayback"><!-- isSen…

解析查看elf文件的构成

x86下用clang编译一段c代码&#xff0c;编译成elf文件&#xff0c;读elf文件&#xff0c;dump出里面的所有段&#xff0c;并打印出段中的数据和含义以及汇编的内容 编写C代码 首先&#xff0c;编写一个简单的C程序&#xff0c;例如命名为example.c&#xff1a; 使用Clang编…

【YOLOv5模型部署】——TensorRT推理引擎安装与使用基于Flask的项目部署

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 温馨提示&#xff1a;对于我的电脑没有Nvidia的独显&#xff0c;只有Intel的集显&#xff0c;最后导出时无法识别Nvidia显卡设备&#xff01;&#xff01;就没成功&#xf…

Java小白一文讲清Java中集合相关的知识点(四)

LinkedList底层结构 LinkedList底层实现了双向链表和双向队列特点可以添加任意元素&#xff0c;包括null,元素可以重复线程不安全&#xff0c;没有实现同步 LinkedList底层操作机制 LinkedList底层维护了一个双向链表LinkedList中维护了两个属性first和last分别指向首结点和…