データを移行していますが、前にロールバックスクリプトを生成します。表中のx個の行数のOracle listaggグループ
重要な列は次のようになります。
id code
----- -------
1234 121212
1345 434343
2345 121212
...
を私は252525
にすべてのコード121212
と151515
を変えていますが、何かがどこかうまくいかない場合、私は戻ってそれらを変更できるようにする必要があります。
私は、listagg
を使用して、更新ステートメントのwhere節で使用できるIDのコンマ区切りリストを作成しました。これらの線に沿って何か:これは私のDEV-環境にいるかのように、小さなセットのために完璧に動作しますが、本番では、私は、文字列の長さ(ORA-01489)の限界に達し
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;
。
だから私は何をできるようにしたいことは、X = 5のためのための結果はであろうように、コードに加えて、IDSのx数でグループにある:
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.
(Iが使用します実際にはるかに大きいx、idsの長さに合わせて)
私はfloor(id/5)
でグルーピングを試みましたが、文字列の長さの問題が修正されましたが、idsが連続していないか、わずかなIDで多くの結果が得られますが、理想的ではありません。
'ROLLBACK'コマンドで何が問題になっていますか?なぜあなたはここで何かする必要がありますか? – mathguy
@mathguy - OPは "バックアウト"スクリプトを意味すると思う。 – GurV
@GurV:そうだね。私がそれをロールバックと呼ぶ理由は、データベースだけでなく大規模な変更をロールバックするプロシージャの一部になるためです。 – Superole