我有一个问题,DBA需要重新创建我的序列(必须创建“NO CACHE”。不幸的是,他在获取当前值之前删除了序列!问题是,据我所知,几乎有使用此序列的25个表。我的计划是尝试找到每个主键“ID”字段的最大值,然后运行序列循环以重新启动序列。
我现在希望做的是清理我的“丑陋”流程以获得更简化的流程,我可以将其放入我的文档中(如果再次发生这种情况!)。
我的原始解决方案是执行以下操作:
SELECT 'TABLE_1','TABLE_1_ID', MAX(TABLE_1_ID) from TABLE_1
UNION ALL
SELECT 'TABLE_2','TABLE_2_ID', MAX(TABLE_2_ID) from TABLE_2
UNION ALL
SELECT 'TABLE_3','TABLE_3_ID', MAX(TABLE_3_ID) from TABLE_3
UNION ALL
...... (continue select statements for other 20+ tables)
SELECT 'TABLE_25','TABLE_25_ID', MAX(TABLE_25_ID) from TABLE_25
ORDER BY 2 DESC;
这显示有效,但将最高“MAX”的表放在顶部;但要清理它我想: 1.如果可能,简化查询(消除UNION ALL) 我真的很想只运行返回单行的查询..
这将是“肉汁”,但我有一个循环将贯穿序列的下一个val;该循环开始于:
declare
COL_MaxVal pls_integer;
SEQ_Currval pls_integer default -1;
BEGIN
SELECT MAX(TABLE_X_ID) INTO COL_MaxVal
FROM TABLE_X
while SEQ_Currval < COL_MaxVal
loop
select My_Sequence_SEQ.nexval into SEQ_Currval
from dual;
end loop;
end
如果可能的话,我真的很想运行循环脚本,它会发现哪个表/列具有最高的最大值,然后在循环中使用该表将序列增加到该最大值。
感谢您的任何帮助。
答案 0 :(得分:0)
以下是返回一行的解决方案:
WITH all_data as
(
SELECT 'TABLE_1','TABLE_1_ID', MAX(TABLE_1_ID) as id from TABLE_1
UNION ALL
SELECT 'TABLE_2','TABLE_2_ID', MAX(TABLE_2_ID) from TABLE_2
UNION ALL
SELECT 'TABLE_3','TABLE_3_ID', MAX(TABLE_3_ID) from TABLE_3
UNION ALL
...... (continue select statements for other 20+ tables)
SELECT 'TABLE_25','TABLE_25_ID', MAX(TABLE_25_ID) from TABLE_25
),
max_id as
(
SELECT max(id) as id FROM all_data
)
SELECT
ad.*
FROM
all_data ad
JOIN max_id mi ON (ad.id = mi.id)
我看不出任何更简单的解决方案......
答案 1 :(得分:0)
如果还不晚,那么dba可能会尝试对字典进行闪回查询。 E.g。
SELECT * FROM dba_sequences AS OF TIMESTAMP systimestamp - 1/24;
您的安全值应为last_number +缓存大小。详见: