カーソルを使用してCamp.Users
テーブルをループし、その列にアクセスします。あなたのコードは次のようになります(テストされていません):
create or replace
PROCEDURE PR_USERPASS AS
BEGIN
UPDATE CAMP.USERS
SET USERNAME = (DBMS_RANDOM.string('u',15)), PASS = DBMS_RANDOM.string('x',12);
FOR userRow IN (SELECT Username, Pass FROM Camp.Users) LOOP
EXECUTE IMMEDIATE 'CREATE USER ' || userRow.Username || ' IDENTIFIED BY ' || userRow.Pass;
EXECUTE IMMEDIATE 'GRANT CONNECT TO ' || userRow.Username;
END LOOP;
END PR_USERPASS;
補遺:USERNAME
として生成された元の回答DBMS_Random.String('x', 15)
では、ユーザー名とパスワードに数字と数字を使用できます。これにより、ユーザー名が数字で始まる場合に問題が発生しました。回答はDBMS_Random.String('u', 15)
、Oracle が許容できるユーザー名の値のみを生成するために使用するように変更されました。パスワードは先頭の数字でOKのようでした。
数字で始まるユーザー名が必要な場合は、ユーザー名を二重引用符で囲みます。
EXECUTE IMMEDIATE 'CREATE USER "' || userRow.Username || '" IDENTIFIED BY ' || userRow.Pass;
EXECUTE IMMEDIATE 'GRANT CONNECT TO "' || userRow.Username || '"';
とはいえ、非標準のユーザー名を使用することがそれほど良い考えかどうかはわかりません。
のドキュメントは、ここDBMS_Random.String
にあります。