長くなりますが、案をいただけるとすごく助かります。
[背景]
テーブルのレコードを削除する前に、別テーブルに削除対象のレコードのバックアップ残しておくようにしたいと考えています。
ただ、バックアップを取っておく対象テーブルが複数あり、すべてのバックアップを1つのテーブルで取る必要が出ていました。
現在下記のようにイメージしています。
●バックアップ対象テーブル
hoge1 | hoge2 | hoge3 |
---|---|---|
aaa | あああ | 日時 |
●バックアップ用テーブル
データ作成日時 | バックアップデータ1 | バックアップデータ2 |
---|---|---|
2021/11/04 | aaa,あああ,日時 |
※バックアップデータ1に収まらなかった文字列を、バックアップデータ2に格納する。
[本題]
環境としては現在Javaで作業しているのですが、バックアップ対象テーブルのデータを
登録したい状態でString型の変数に詰めるところまではできたのですが、
バックアップデータ1で収まらない文字列を、どのようにバックアップデータ2に持たせればいいかわかりません。
案としては下記を提示しましたが、文字数が多いとかなりループを回さないといけないから却下と上司から言われました。
/** * 1.文字を1文字切り出す * 2.その文字のバイト数を数える * 3.「3.」で指定バイト数(4000)より多ければ、hoge2に詰める * 4.「1.」に戻る。 * 5.「2.」のバイト数と既に検査した文字の総バイト数を足して * 指定バイト数(4000)より小さければ文字をhoge1に追加。 */ String hoge = "aaa,あああ,日時"; StringBuffer hoge1 = new StringBuffer(); StringBuffer hoge2 = new StringBuffer(); int cnt = 0; for (int i = 0; i < hoge.length(); i++) { String tmpStr = hoge.substring(i, i + 1); byte[] b = tmpStr.getBytes("UTF-8"); if (cnt + b.length > 4000) { hoge2.append(tmpStr); } else { hoge1.append(tmpStr); cnt += b.length; } }
自分ではこれくらいしか思いつかないため、ほかにも案をいただきたいと思っています。
もちろんJavaでの実装でなくても、バックアップテーブルへのINSERT時に切り分けができるのであれば
DMLでの案でも大丈夫です。
環境はOracleを使用しています。
お手数ですが、どなたか力を貸してください。。。
説明に不足等あれば、別途説明いたします。
回答4件
あなたの回答
tips
プレビュー