Sql FORALL Bulk COLLET-需要在不使用循环的情况下向insert语句添加序列吗?
因此,我有一个FORALL批量集合,用于将值插入表中 通常我会对必须填充的序列字段使用循环。示例如下 序号=序号+1 ..…然后我将循环遍历每个记录,当它们插入时,它将增加1Sql FORALL Bulk COLLET-需要在不使用循环的情况下向insert语句添加序列吗?,sql,oracle,plsql,bulk-collect,Sql,Oracle,Plsql,Bulk Collect,因此,我有一个FORALL批量集合,用于将值插入表中 通常我会对必须填充的序列字段使用循环。示例如下 序号=序号+1 ..…然后我将循环遍历每个记录,当它们插入时,它将增加1 SELECT bis_part, bis_part_org, bis_store, bis_bin, bis_lot, bis_qty BULK COLLECT INTO V_STTK_CLTN FROM table1 WHERE bis_bin = 'DIRECT' AND bis_store = p_org; F
SELECT bis_part, bis_part_org, bis_store, bis_bin, bis_lot, bis_qty
BULK COLLECT INTO V_STTK_CLTN
FROM table1
WHERE bis_bin = 'DIRECT'
AND bis_store = p_org;
FORALL INDX IN 1 .. V_STTK_CLTN.COUNT
INSERT INTO table2
(stl_part,
stl_part_org,
stl_trans,
stl_store,
stl_bin,
stl_lot,
stl_expqty,
stl_phyqty,
stl_rtype,
stl_type,
stl_line )
VALUES
(V_STTK_CLTN(INDX).bis_part,
V_STTK_CLTN(INDX).bis_part_org,
ctrans,
V_STTK_CLTN(INDX).bis_store,
V_STTK_CLTN(INDX).bis_bin,
V_STTK_CLTN(INDX).bis_lot,
V_STTK_CLTN(INDX).bis_qty,
'',
'STTK',
'STTK',
seqno);
既然我在使用FORALL而不使用循环,那么如何使用集合实现这一点呢
seqno值是我需要序列的地方。每次运行时,它都会将这些记录插入同一个表中,但每次序列必须以一个开始,因为它是集合的序列,而不是整个表的序列……有意义吗 这很简单
创建一个序列
CREATE SEQUENCE seq;
假设您想要插入到表t中
此块将在FORALL块中插入一些虚拟行,并将使用序列。不是循环,而是从SELECT查询或光标批量收集到集合中
演示所以我只需在收藏记录中添加一个数字列
TYPE STTK_RECORD IS RECORD(
BIS_部件T1.BIS_部件%类型
,BIS_PART_ORG T1.BIS_PART_ORG%类型
,BIS_STORE T1。BIS_STORE%类型
,BIS_BIN T1.BIS_BIN%类型
,BIS_标段T1。BIS_标段%类型
,BIS_数量T1.BIS_数量%类型
,注册号码
;
然后,我将row_number函数添加到批量收集的select语句中:
SELECT bis_part, bis_part_org, bis_store, bis_bin, bis_lot, bis_qty, ROW_NUMBER() OVER (PARTITION BY bis_store ORDER BY bis_bin desc) RN
散装收集到V_STTK_CLTN中
最后,我插入了新列:
FORALL INDX IN V_STTK_CLTN.FIRST .. V_STTK_CLTN.LAST
INSERT INTO T2
(stl_part,
stl_part_org,
stl_trans,
stl_store,
stl_bin,
stl_lot,
stl_expqty,
stl_phyqty,
stl_rtype,
stl_type,
stl_line )
VALUES
(V_STTK_CLTN(INDX).bis_part,
V_STTK_CLTN(INDX).bis_part_org,
ctrans,
V_STTK_CLTN(INDX).bis_store,
V_STTK_CLTN(INDX).bis_bin,
V_STTK_CLTN(INDX).bis_lot,
V_STTK_CLTN(INDX).bis_qty,
'',
'STTK',
'STTK',
V_STTK_CLTN(INDX).rn);
正如其他人提到的,序列可能是满足用例需求的最佳方法 但要严格回答您关于如何使用FORALL语句复制递增计数器变量的问题,您可以执行以下操作:
L_OFFSET := 0;
FORALL INDX IN 1 .. V_STTK_CLTN.COUNT
INSERT INTO table2
(stl_part,
stl_part_org,
stl_trans,
stl_store,
stl_bin,
stl_lot,
stl_expqty,
stl_phyqty,
stl_rtype,
stl_type,
stl_line )
VALUES
(V_STTK_CLTN(INDX).bis_part,
V_STTK_CLTN(INDX).bis_part_org,
ctrans,
V_STTK_CLTN(INDX).bis_store,
V_STTK_CLTN(INDX).bis_bin,
V_STTK_CLTN(INDX).bis_lot,
V_STTK_CLTN(INDX).bis_qty,
'',
'STTK',
'STTK',
L_OFFSET+INDX);
通过这种方式,您可以将L_偏移量设置为初始偏移量,并让INDX为集合中的每个记录增加一次该偏移量。创建一个序列并使用它。顺序X.nexval?seqno列是从中驱动FORALL语句的集合的属性吗?更多的实际代码会让我们更清楚地了解您的场景。在要插入的表上使用序列,或者在12c以后的表中使用标识列?因此,接收表负责创建/管理您的顺序值。您好,感谢大家在这里提供的帮助……我添加了一些代码来向您展示我正在使用的功能。我使用了一个循环,只是在记录中循环,但我现在必须使用所有插入…不允许循环。这可能吗?我想用ROWNUM代替变量seqno,但我得到了这个错误…..ORA-00976:此处不允许指定伪列或运算符。请检查我的答案并接受它所帮助的答案。请同时阅读:stackoverflow.com/help/someone-answers
TYPE STTK_RECORD IS RECORD(
L_OFFSET := 0;
FORALL INDX IN 1 .. V_STTK_CLTN.COUNT
INSERT INTO table2
(stl_part,
stl_part_org,
stl_trans,
stl_store,
stl_bin,
stl_lot,
stl_expqty,
stl_phyqty,
stl_rtype,
stl_type,
stl_line )
VALUES
(V_STTK_CLTN(INDX).bis_part,
V_STTK_CLTN(INDX).bis_part_org,
ctrans,
V_STTK_CLTN(INDX).bis_store,
V_STTK_CLTN(INDX).bis_bin,
V_STTK_CLTN(INDX).bis_lot,
V_STTK_CLTN(INDX).bis_qty,
'',
'STTK',
'STTK',
L_OFFSET+INDX);