我有以下代码:
CREATE OR REPLACE FUNCTION repeatable_rand_text(ftype IN VARCHAR2
, in_val IN VARCHAR2)
RETURN VARCHAR2 IS
workval VARCHAR2(64);
insert_needed BOOLEAN := FALSE;
BEGIN
BEGIN
SELECT new_name
INTO workval
FROM ps_dt_mixnames_preserve
WHERE name_type = ftype AND old_name = in_val;
EXCEPTION
WHEN NO_DATA_FOUND THEN
workval := rand_text(ftype);
insert_needed := TRUE;
END;
IF insert_needed THEN
INSERT INTO ps_dt_mixnames_preserve(name_type, old_name, new_name)
VALUES (ftype, in_val, workval);
END IF;
RETURN workval;
END repeatable_rand_text;
此例程的目的是在数据库中屏蔽名称,作为从生产环境创建开发数据库的准备工作的一部分。
我们想要屏蔽名称,但我们希望它们是可重复的,以便我们的结果类似于:(左侧输入;右侧输出)
JOHN JONES -> STEEL POTATO
SAM JONES -> LARGE POTATO
MARY JONES -> WHITE POTATO
SUE SMITH -> LARGE CARROT
FRED JONES -> RED POTATO
JOHN SMITH -> GREEN CARROT
您可能明白了:姓氏更改为随机值,但再次遇到时会重复。给定的名称只是随机的。这里关心的是姓氏。
数组和其他非永久性解决方案对我们来说效果不佳,因为这实际上将作为一大系列 UPDATE 语句在同一个会话中执行。GTT 似乎非常适合这种类型的东西。
最终,我们将要执行类似于以下内容的更新:
UPDATE MY_TABLE
SET ORIG_NAME = repeatable_rand_text('last', ORIG_NAME)
但为了“证明这个例程的结果,我们执行以下 SQL:
SELECT ORIG_NAME, repeatable_rand_text('last',ORIG_NAME)
FROM MY_TABLE
现在,显然该函数中的 INSERT 将作为 SELECT 的结果执行,这是一个禁忌。(如果无法做到这一点,我们不愿意尝试自然跟随的更新。据我们所知,它可能会失败并显示类似的消息。)问题是,有没有合理的方法来解决这种情况?