我正在遷移一些數據,但在執行操作之前我想要生成回滾腳本。Oracle listagg組x行數
下表中的重要列可能是這樣的:
id code
----- -------
1234 121212
1345 434343
2345 121212
...
我改變所有代碼121212
和151515
爲252525
,但我需要能夠改變他們回來,如果出現問題的其他地方。
因此,我開始使用listagg
創建逗號分隔的id列表,我可以在更新語句的where-clause中使用它。沿着這些路線的東西:
select '... set code='||code||' where id in ('
|| listagg(id,',') within group (order by id)
|| ');' as RB_STMT
from mytable
where code in (121212,151515)
group by code;
這完全適用於小套,就像在我的開發環境,但在生產中我打的字符串長度(ORA-01489)的限制。
所以我想什麼,能夠做的就是按ID的x個除了代碼,從而爲X = 5會是這個結果:
RB_STMT
------------
...set code=121212 where id in (1234,1235,1236,1237,1238);
...set code=121212 where id in (1239,2111,2112,2123,2124);
...set code=121212 where id in (2125,2126,2136);
...set code=151515 where id in (1456,2345,2468,2469,2470);
etc.
(我會使用一個更大的x在現實當然;適應於ID的長度)
我試着編組floor(id/5)
,並修復了字符串長度問題,但因爲ID不是順序的,或均勻間隔,我最終與很多結果只有幾個ID,這也不是很理想。
「ROLLBACK」命令有什麼問題?你爲什麼需要在這裏做任何事情? – mathguy
@mathguy - 我認爲OP意味着一個「退出」腳本 – GurV
@GurV:是的,我想。我稱之爲回滾的原因是因爲它將成爲程序的一部分,回滾一個大的變化,不僅涉及數據庫。 – Superole