【发布时间】:2021-08-30 02:13:20
【问题描述】:
我有一个要求,我需要根据表中已经存在的值在表中插入行号。例如,当前表中的 max row_nbr 记录是这样的:
+----------+----------+------------+---------+
| FST_NAME | LST_NAME | STATE_CODE | ROW_NBR |
+----------+----------+------------+---------+
| John | Doe | 13 | 123 |
+----------+----------+------------+---------+
现在,我需要使用给定的 FST_NAME 和 LST_NAME 值插入更多记录。将数据插入到表中时需要生成 ROW_NBR,其值从 123 开始自动递增。
我不能使用序列,因为我的加载过程不是将数据插入此表的唯一过程。而且我也不能使用游标,因为由于数据量很大,TEMP 空间很快就会被填满。我正在插入数据,如下所示:
insert into final_table
( fst_name,lst_name,state_code)
(select * from staging_table
where state_code=13);
有什么想法可以实现吗?
【问题讨论】:
-
你为什么有这个要求,标准的自动增量列和时间戳列会有什么问题?
-
为什么不能只使用序列?您提到有多个进程插入,但这正是序列优化的目的。
-
我不能使用序列,因为所有其他处理都已经使用游标将数据插入到此表中。重写大量代码不是我想做的事情,我也无权更改现有代码。而且我也无法更改现有的表结构。
-
恐怕没有免费的午餐。 +1 sequence 选项。
-
使用游标的其他进程的意义是什么 - 是那些找到当前最大值然后在执行单行插入的循环内递增;你也可以这样做,但你想(正确地)这样一个
insert...select?如果是这样,您仍然可以在语句中设置值,但这并不理想。你现在如何避免冲突?无论如何...如果您无法阻止其他进程尝试手动设置row_nbr,您仍然可以拥有一个忽略它们使用的数字并用序列值覆盖它的触发器。
标签: oracle plsql plsqldeveloper