SAP NATIVE SQL

embedded/2025/1/15 0:01:58/

【应用场景】

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_conexionendexec.exec sql.set connection :g_conexionENDEXEC.CATCH cx_sy_native_sql_error INTO lr_error.CALL METHOD lr_error->if_message~get_textRECEIVINGresult = lv_mess.CONCATENATE lv_mess ',无法连接至SQL数据库   连接名:' g_conexion INTO ev_msg.
ENDTRY.TRY."付款单"--  读取游标EXEC SQL.open dbcur1 forselecta.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.fcreatetimefrom SLT_EAS.T_CAS_PAYMENTBILL aleft join SLT_EAS.T_BD_AccountBanks bon a.fpayeraccountbankid=b.fidleft join SLT_EAS.T_CAS_FeeType con a.ffeetypeid=c.fidleft join SLT_EAS.T_ORG_Company don a.fcompanyid=d.fidwhere a.FBankPayState = '6'and a.fcreatetime >= :f_fcreatetimeand a.fcreatetime <= :e_fcreatetimeand 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 dbcur1ENDEXEC.CATCH cx_sy_native_sql_error INTO lr_error.CALL METHOD lr_error->if_message~get_textRECEIVINGresult = 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 dataPERFORM FRM_GET_DATA_0060 TABLES ET_ZSFI0343USING I_BUKRSI_GJAHRi_monatI_BATCH_IDI_FREQUESTNOCHANGING E_ERRE_MSG.*---get dataIF 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_DATABASEENDEXEC.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_DATABASEENDEXEC.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 databaseENDFUNCTION.

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.ppmy.cn/embedded/108439.html

相关文章

3个免费好用的网站,可以转换PDF,提取MP3

今天分享的三个网站&#xff0c;分别用于文件转换PDF&#xff0c;QMC转MP3格式和配色网站。 TOPDF 这个网站是一个在线PDF转换工具&#xff0c;可以快速将文本文件、演示文稿、电子表格和图片转换为PDF格式。它支持多种文件格式&#xff0c;如AZW3、BMP、CHM、CSV、DjVu、DOC、…

Python开发学习之Python和Excel的数据实现互通

今天为大家分享一篇使用Python和Excel的数据实现互通的技巧心得&#xff0c;可以让Python和Excel的数据实现互通&#xff01;具有很好的参考价值&#xff0c;希望对大家有所帮助&#xff08;建议在电脑端阅读&#xff0c;代码案例较多&#xff09;。一起过来看看吧&#xff01;…

【重学 MySQL】十五、过滤数据

【重学 MySQL】十五、过滤数据 基本用法使用AND、OR和NOT使用IN操作符使用BETWEEN操作符使用LIKE操作符使用IS NULL和IS NOT NULL 在MySQL中&#xff0c;过滤数据主要通过WHERE子句来实现。WHERE子句允许你指定条件来过滤从表中检索出来的行。只有当行满足WHERE子句中的条件时&…

在 React 中,Input 失去焦点时获取失去焦点的位置并插入值

实现思路&#xff1a; 监听 Input 失去焦点 (onBlur) 事件&#xff1a;在 onBlur 事件中&#xff0c;我们可以获取光标的当前位置以及 Input 中的值。使用 onClick 或 onMouseDown 事件来获取点击的其他位置&#xff1a;通过全局点击监听&#xff0c;获取点击的目标元素。插入…

《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂》可以在苹果Mac电脑上玩吗?

在宏大的世界观游戏中&#xff0c;《黑暗之魂2:原罪学者》脱颖而出&#xff0c;以其探索性和挑战性征服了全球玩家的心灵。下面我们来看看《黑暗之魂2:原罪学者》是什么类型的游戏&#xff0c;《黑暗之魂2:原罪学者》可以在苹果电脑玩吗的相关内容。 一、《黑暗之魂2:原罪学者》…

【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)

文章目录 PyQt5超详细教程前言第7部分&#xff1a;生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1&#xff1a;嵌入简单的 matplotlib 图表代码详解&#xff1a; 7.3 动态生成图表示例 2&#xff1a;动态更新图表代码详解&…

Spark MLlib模型训练—文本算法 LDA(Latent Dirichlet Allocation)

Spark MLlib模型训练—文本算法 LDA(Latent Dirichlet Allocation) Latent Dirichlet Allocation(LDA)是一种用于主题建模的生成式概率模型,广泛应用于文本分析和自然语言处理。LDA 的目标是从一组文档中发现潜在的主题,并将每个文档表示为这些主题的概率分布。它通过推断…

解决MongoDB创建用户报错command createUser requires authentication

1、执行创建用户报错如下&#xff1a; 2、解决方法 2.1 关闭 MongoDB /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongod.conf --shutdown 2.2 修改配置文件 vim /usr/local/mongodb/mongod.conf 将security.authorization值从enabled改为disabled 2.3 启动MongoD…