【发布时间】:2019-10-28 16:37:13
【问题描述】:
我有一个表格,必须像这样插入数据:
SEQ NAME RUN_SL DOC_SL DATE
1 UNIX 1 1 26/10/2019
2 UNIX 1 2 26/10/2019
3 UNIX 1 3 26/10/2019
4 ABCOP 2 1 26/10/2019
5 ABCOP 2 2 26/10/2019
6 TESLA 1 1 27/10/2019
7 LETHA 1 2 27/10/2019
8 TESLA 2 1 27/10/2019
9 NEWBE 2 2 27/10/2019
数据应该按天插入。用户可以一次插入多行。在这种情况下,RUN_SL 将相同,但 DOC_SL 将增加。为了实现这一点,我必须始终这样看待:
SELECT NVL(MAX(A.RUN_SL), 0) + 1, NVL(MAX(A.DOC_SL), 0) + 1
INTO V_RUN_SL, V_DOC_SL
FROM TEST_TBL A
WHERE A.DATE = SYSDATE;
然后不得不使用循环插入数据:
FOR DATA_LIST..COUNT:
INSERT INTO TEST_TBL
VALUES(
TBL_SEQ.NEXTVAL,
DATA_LIST(i).NAME,
V_RUN_SL,
V_DOC_SL,
SYSDATE
);
我知道关于 NVL(MAX(Column_Name), 0) + 1 会有并发问题。为了实现正确插入,如何处理它并寻求替代建议来优化查询? 提前致谢。
【问题讨论】:
-
老式的方法是使用序列。新奇的方法是使用
generated always as identity。 -
@GordonLinoff 到目前为止,我知道 12c 支持它。但我必须使用 11g。
-
你可以使用
+ row_number() over (order by whatever)代替+ 1 -
您的 SELECT 语句与您陈述的要求不符。您能否首先在示例数据中说明哪些行被插入在一起? RUN_SL = 1 是否意味着前 3 行同时插入?