Sql FORALL Bulk COLLET-需要在不使用循环的情况下向insert语句添加序列吗?

Sql 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

因此,我有一个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;


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);