0

一部のテーブルの一部のフィールド値をスクランブルする必要がありますが、一部のフィールド間に論理リンクがあります。

たとえば、テーブルが table t(name varchar2(30), email varchar2(60)) の場合、email の値は名前の完全な値で始まる必要があります。

Name        Email
----        ----
Smith       Smitha@any.com

スクランブルの後、

Name        Email
----        ----
xubal       xubaly@any.com

dbms_random.string 関数を使用するため、呼び出しごとに個別の値が返されます。

1回の実行で更新を行い、フィールド間の論理リンクを維持することは可能ですか? (db トリガーは使用できません)

私が試した次の 2 つのオプションでは、Oracle は名前フィールドの新しい値ではなく古い値を返します。

update t
set name=dbms_random.string('l',length(name)),
    email=name || dbms_random.string('l',2) || '@any.com';

update t t1
set name=dbms_random.string('l',length(name)),
    email=(select t1.name || dbms_random.string('l',2) || '@any.com'
           from t t2
           where t2.rowid = t1.rowid)
4

2 に答える 2

2

MERGEプロシージャではなくクエリでこれを行うことができます。

tテーブルの行識別子 (Oracle 疑似列を使用) とランダムな名前のリストを取得し、ROWIDそれらをテーブルに戻して照合し、tそれらを使用して名前と電子メールの両方を更新します。クエリ(私がテストしたもの)は次のとおりです。

MERGE INTO t
USING (
  SELECT ROWID AS ID, DBMS_Random.String('l', LENGTH(name)) AS RandName
  FROM t) newNames
ON (t.ROWID = newNames.ID)
WHEN MATCHED THEN
  UPDATE SET
    name = newNames.RandName,
    email = newNames.RandName || SUBSTR(email, INSTR(email, '@'))
于 2013-04-14T23:24:02.000 に答える
0

パッケージを作成し、パッケージで変数を使用できます。
このようなもの:

create package pck as

v t.name%TYPE;
function rnd_next(in_name t.name%TYPE) return t.name%TYPE;
function rnd_cur return t.name%TYPE;
end;
/

create package body pck as

function rnd_next(in_name t.name%TYPE) return t.name%TYPE is

begin
v := dbms_random.string('l',length(in_name));
return v;
end;

function rnd_cur return t.name%TYPE is

begin
return v;
end;
end;
/

次に、次のように更新できます。

update t
set name = pck.rnd_next(name),
email = pck.rnd_cur || '@aaa.com';

ここにsqlfiddleのデモがあります

于 2013-04-14T09:42:58.207 に答える