まず、ここで PL/SQL を使用する理由はないようです。単純に単一の SQL ステートメントを発行してすべての行を更新する方が効率的です。
UPDATE user_char
SET id = USER_CHAR__ID_SEQ.nextval
WHERE id IS NULL;
状況によっては、新しいテーブルを作成し、古いテーブルから新しいテーブルにデータを移動して、行の移行を回避する方が効率的な場合もあります。
ALTER TABLE user_char
RENAME TO user_char_old;
CREATE TABLE user_char
AS
SELECT USER_CHAR__ID_SEQ.nextval, <<list of other columns>>
FROM user_char;
<<Build indexes on user_char>>
<<Drop and recreate any foreign key constraints involving user_char>>
これが大きなテーブルである場合は、CREATE TABLEステートメントで並列処理を使用できます。小さな 200 万行のテーブルで並列処理から多くの利点が得られるかどうかは明らかではありませんが、操作が数秒短縮される可能性があります。
第 2 に、わずか 200 万行を更新するのに 1 日かかる場合は、何か他のことが起こっているに違いありません。最近では、200 万行のテーブルは非常に小さくなっています。ラップトップで 200 万行のテーブルにデータを入力して更新するには、数秒から数分かかります。このテーブルにトリガーはありますか? 外部キーはありますか? 行を更新している他のセッションはありますか? クエリは何を待っていますか?