ABAP中,用Ranges定义的内表,由于数据量大导致运行错误 100

我用Ranges定义了一个内表RANGESS_MARCFORMARC-MATNR.然后向这个内表中插入了一些数据,大概有五万多条,然后根据这个表里的数据去删除自建表中的资... 我用Ranges定义了一个内表
RANGES S_MARC FOR MARC-MATNR.
然后向这个内表中插入了一些数据,大概有五万多条,然后根据这个表里的数据去删除自建表中的资料
DELETE ZTEST WHERE MATNR IN S_MARC. (ZTEST是自建表,不是内表)
ZTEST是个自建表,不是内表,测试发现删除内表资料不会出错. 删除自建表资料时,好像S_MARC这个内表中的资料条目数有限制,测试9000多条的时候可以正常运行,超过1万就会运行错误,请问这种情况该如何解决?用ranges定义的内表是否有条目数限制?谢谢
展开
 我来答
ronachen2007
2012-08-03 · 超过10用户采纳过TA的回答
知道答主
回答量:38
采纳率:0%
帮助的人:34.8万
展开全部
我建议你用内表删除.
以下是参考:
要通过 DELETE 语句用内表 从数据库表 中删除多行 ,请使用下 列语法:
语法
DELETE <dbtab> [CLIENT SPECIFIED] FROM TABLE <itab>.
如果需要在 运行时间指 定数据库表 的名称,请 使用下列语 法:
DELETE (<dbtabname>) [CLIENT SPECIFIED] FROM TABLE <itab>.
这些语句从 数据库表中 删除主码与 内表 <itab> 中的某行相 同的行。
内表的长度 至少与数据 库表的主码 的长度相同 。
如果因为数 据库表中没 有哪一行的 主码与指定 的相同,从 而系统没有 删除任何行 ,那么,系 统不会终止 整个操作, 而是继续处 理内表的下 一行。
如果已经处 理了内表中 所有的行, SY-SUBRC 将设置为 0。否则, 设置为 4。在稍后 的时候,从 内表的总行 数中减去 SY-DBCNT 中给出的实 际已删除的 行数,就可 计算系统尚 未删除的行 数。如果内 表是空的, 那么 SY-SUBRC 和 SY-DBCNT 都将设置为 0。
相对而言, 操作多行的 集合比操作 单行更有效 。
TABLES SPFLI.
DATA ITAB LIKE SPFLI OCCURS 10 WITH HEADER LINE.
ITAB-CARRID = 'UA'. ITAB-CONNID = '0011'.
APPEND ITAB.
ITAB-CARRID = 'LH'. ITAB-CONNID = '1245'.
APPEND ITAB.
ITAB-CARRID = 'AA'. ITAB-CONNID = '4574'.
APPEND ITAB.
................
DELETE SPFLI FROM TABLE ITAB.
在该示例中 ,用与数据 库表 SPFLI 相同的结构 定义了内表 ITAB。 填写 ITAB之 后,SPFLI 中主码(CARRID 和 CONNID) 与内表的某 行相同的行 都将被删除 。
晓泪ALEX的ABAP铺子
2012-08-02 · TA获得超过437个赞
知道小有建树答主
回答量:235
采纳率:100%
帮助的人:169万
展开全部
ranges 是有数量限制的,但是现在我也不确定是多少条,可能跟内存也有关系
追问
我也尝试定义一个和range一样的内表,如
DATA: BEGIN OF S_MARC OCCURS 0,
SIGN TYPE C,
OPTION TYPE C LENGTH 2,
LOW LIKE MARA-MATNR,
HIGH LIKE MARA-MATNR,
END OF S_MARC.
然后再向这个内表中插入数据,这样也不行,也是有条数限制
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ZeroLi1986XX
2012-08-02 · TA获得超过284个赞
知道小有建树答主
回答量:125
采纳率:0%
帮助的人:49.7万
展开全部
Ranges table 是有限制条数的, 具体是多少条我就不清楚
方法1
定义多个ranges table, 把五万多条分开了装

方法2
data: lt_ztest type standard table of ztest.
然后向这个内表中插入了一些数据,大概有五万多条,然后根据这个表里的数据去删除自建表中的资料
select *
from ztest
into corresponding fields of table lt_ztest
for all entries in lt_ztest
where matnr = lt_ztest-matnr.

delete ztest from table lt_ztest.
追问
非常感谢,目前我用的是第二种方法,但感觉速度上有点慢,效率比较差,不知道还有没有其他更好的方法呢
追答
delete后面可以接的条件好像不多, 所以我还没想到什么好方法
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
x297305255
2012-08-13 · TA获得超过174个赞
知道小有建树答主
回答量:129
采纳率:0%
帮助的人:102万
展开全部
我3千条就错误
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Mida米达看评论
2020-11-06 · TA获得超过519个赞
知道小有建树答主
回答量:164
采纳率:89%
帮助的人:25.1万
展开全部

综合原因影响,事实上就是sql长度影响:

  1. 首先衡量select后面字段数,会不会超出

  2. 然后计算 range,预估长度有多少,实际是in(range[1],range[2]....)

  3. 考虑是否还有for all这类调用内表的衍生的长度,实际也是in('','',......)

  4. where条件还有哪些长度,最后累加1/2/3,不超过sql最长长度即可

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式