SAP连接外部数据库后批量写入数据
原本的添加数据方式:
LOOP AT lt_mat INTO ls_mat. EXEC SQL. INSERT INTO SAPTEST (mtart,matnr) VALUES (:ls_mat-mtart, :ls_mat-matnr) ENDEXEC. ENDLOOP.
利用SQL Server的变量后,改为批量方式:
注意DECLARE定义变量字符串上限8000,根据自己的语句长度来确定多少条数据进行一次性添加
*&---------------------------------------------------------------------* *& Report ZPPRTEST *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZPPRTEST. TYPES: BEGIN OF ty_mat, mtart TYPE mtart, matnr TYPE matnr, END OF ty_mat, BEGIN OF ty_msg, text TYPE string, END OF ty_msg. DATA: p_connr TYPE dbcon-con_name VALUE 'PLMTEST', exc_ref TYPE REF TO cx_sy_native_sql_error, l_text TYPE string. DATA: lt_mat TYPE TABLE OF ty_mat, lt_mat2 TYPE TABLE OF ty_mat, ls_mat TYPE ty_mat, lt_msg TYPE TABLE OF ty_msg, ls_msg TYPE ty_msg, l_count TYPE i, l_line TYPE p DECIMALS 1, l_tabix_from TYPE sy-tabix, l_tabix_to TYPE sy-tabix, l_sql TYPE string. *-->SAP取数 SELECT mtart matnr INTO TABLE lt_mat FROM mara UP TO 100 ROWS WHERE mtart = 'FERT'. *-->计算内表行数 l_count = lines( lt_mat ). *-->向上取整内表行数除以50(每50笔处理一次) l_line = CEIL( l_count / 50 ). EXEC SQL. CONNECT TO :p_connr ENDEXEC. EXEC SQL. SET CONNECTION :p_connr ENDEXEC. IF sy-subrc = 0. DO l_line TIMES. "开始行 l_tabix_from = l_tabix_to + 1. "结束行 l_tabix_to = l_tabix_to + 50. APPEND LINES OF lt_mat FROM l_tabix_from TO l_tabix_to TO lt_mat2. l_sql = 'INSERT INTO SAPTEST (mtart,matnr) VALUES '. LOOP AT lt_mat2 INTO ls_mat. l_sql = l_sql && '(' && ''''. l_sql = l_sql && ls_mat-mtart && ''',''' && ls_mat-matnr. l_sql = l_sql && '''' && '),'. ENDLOOP. "去掉末尾 , 号 DATA(len) = STRLEN( l_sql ). DATA(len2) = len - 1. l_sql = l_sql+0(len2). TRY. EXEC SQL. DECLARE @sql varchar(8000) SET @sql = :l_sql EXEC (@sql) ENDEXEC. "捕获异常 CATCH cx_sy_native_sql_error INTO exc_ref. l_text = exc_ref->get_text( ). ENDTRY. IF NOT l_text IS INITIAL. "如果捕获到异常,记录日志,回滚 EXEC SQL. rollback ENDEXEC. ls_msg-text = l_text. APPEND ls_msg TO lt_msg. ELSE. "如果无异常,提交插入数据 EXEC SQL. commit ENDEXEC. ls_msg-text = '写入成功'. APPEND ls_msg TO lt_msg. ENDIF. "清除数据 CLEAR: lt_mat2,l_sql,l_text. ENDDO. ENDIF. EXEC SQL. DISCONNECT :p_connr ENDEXEC. cl_demo_output=>write( lt_msg ). cl_demo_output=>display( ).
落霞与孤鹜齐飞,秋水共长天一色
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏