IINSERT上的SQL错误

2020-08-14 08:33发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)专家您好, 我尝试从具有36...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家您好,


我尝试从具有3600万行的表中复制所有行。 因此,我使用DB游标和PACKAGE SIZE。 到目前为止,它工作正常,但是当我尝试进行INSERT操作时,我会转储。 它发生在插入的100万行中。 有人可以帮我吗? 谢谢。

数据选项卡名称类型objname值'A911'。

 数据:lv_n_prozent TYPE numc3,
       lv_prozent TYPE i。

 DATA:db_cursor TYPE游标。
 数据:dfies_tab dfies类型表,
        dfies TYPE dfies,
        struc_size TYPE i VALUE 0,
        package_size TYPE i。
 FIELD-SYMBOLS:键入任何表。
 DATA:数据类型引用数据。

 创建数据数据类型表(选项卡名)。
 ASSIGN数据-> * TO 。

 通话功能" DDIF_NAMETAB_GET"
   出口
     tabname =标签名
   桌子
     dfies_tab = dfies_tab
   例外情况
     not_found = 1
     其他= 2。
 如果sy-subrc <> 0。
   出口。
 万一。


 环回dfies_tab INTO dfies。
   struc_size = struc_size + dfies-leng。
 结局。

 package_size = 2147483648/struc_size。


 DATA current_record TYPE i。
 数据(总计记录)= 36000000。

 尝试。
     按住db_cursor FOR打开游标
     选择* FROM(标签名)
     绕过缓冲区。

     做。
 ***提取2gb的数据
       获取下一个光标db_cursor
       进入表
       包装尺寸:package_size。

       IF sy-subrc NE 0。
         关闭光标db_cursor。
         出口。
       万一。

       从表插入za911接受重复的键。

       current_record = current_record + package_size。

       cl_progress_indicator => progress_indicate(
           i_text = |正在处理:{current_record}/{total_records} |
           i_output_immediately = abap_true)。
     ENDDO。

   捕获cx_sy_open_sql_db INTO DATA(cx)。
     消息cx-> get_text()类型'E'。
 ENDTRY。
 

(49.2 kB)
3条回答
hongfeng1314
2020-08-14 09:17 .采纳回答

您好,

我自己解决了这个问题。 我在插入后添加了...呼叫功能'DB_COMIT'

从表中插入za911。
  调用功能" DB_COMMIT"。  

重要一点!

命令COMMIT WORK重置数据库游标,因此下一次获取不再"知道"最后一个中断的位置。 这就是为什么您应该使用CALL FUNCTION'DB_COMMIT'。

完整的代码看起来像这样。

数据选项卡名称类型objname值'A911'。

 DATA:db_cursor TYPE游标。
 数据:dfies_tab dfies类型表,
        dfies TYPE dfies,
        struc_size TYPE i VALUE 0,
        package_size TYPE i。
 FIELD-SYMBOLS:键入任何表。
 DATA:数据类型引用数据。

 创建数据数据类型表(选项卡名)。
 ASSIGN数据-> * TO 。

 通话功能" DDIF_NAMETAB_GET"
   出口
     tabname =标签名
   桌子
     dfies_tab = dfies_tab
   例外情况
     not_found = 1
     其他= 2。
 如果sy-subrc <> 0。
   出口。
 万一。

 环回dfies_tab INTO dfies。
   struc_size = struc_size + dfies-leng。
 结局。

 package_size = 2147483648/struc_size。
 package_size = 200000。

 DATA current_record TYPE i。
 数据(总计记录)= 36000000。
 尝试。
     按住db_cursor FOR打开游标
     选择* FROM(标签名)
     绕过缓冲区。

     做。
       获取下一个光标db_cursor
       进入表
       包装尺寸:package_size。

       IF sy-subrc NE 0。
         关闭光标db_cursor。
         出口。
       万一。

       从表中插入za911。
       调用功能" DB_COMMIT"。

       current_record = current_record + package_size。

       cl_progress_indicator => progress_indicate(
           i_text = |正在处理:{current_record}/{total_records} |
           i_output_immediately = abap_true)。
     ENDDO。

   捕获cx_sy_open_sql_db INTO DATA(cx)。
     消息cx-> get_text()类型'E'。
 ENDTRY。

一周热门 更多>