我正在尝试创建一个 PL/SQL 脚本,该脚本从 oracle 生产数据库中提取根“对象”以及所有子对象和其他相关信息。目的是创建一组测试数据来重现生产中遇到的问题。由于数据保护法,数据在提取时需要匿名 - 对象名称、某些类型的 id 和货币金额需要替换。
我试图创建一个或多个临时翻译表,其中包含原始值和匿名版本。然后我会将真实数据与翻译表连接起来,并在需要的地方输出匿名值。
DECLARE
rootId integer := 123456;
TYPE anonTableRow IS RECORD
(
id NUMBER,
fieldC NUMBER,
anonymizedFieldC NUMBER
);
TYPE anonTable IS TABLE OF anonTableRow;
anonObject anonTable;
BEGIN
FOR cursor_row IN
(
select
id,
fieldC,
1234 -- Here I would create anonymized values based on rowNum or something similar
from
prodTable
where id = rootId
)
LOOP
i := i + 1;
anonObject(i) := cursor_row;
END LOOP;
FOR cursor_row IN
(
select
prod_table.id,
prod_table.fieldB,
temp_table.anonymizedFieldC fieldC,
prod_table.fieldD
from
prod_table
inner join table(temp_table) on prod_table.id = temp_table.id
where prod_table.id = 123456789
)
LOOP
dbms_output.put_line('INSERT INTO prod_table VALUES (' || cursor_row.id || ', ' || cursor_row.fieldB || ', ' || cursor_row.fieldC || ', , ' || cursor_row.fieldD);
END LOOP;
END;
/
然而,我在使用这种方法时遇到了几个问题——似乎几乎不可能将 oracle PL/SQL 表与真正的数据库表连接起来。我对生产数据库的访问受到严格限制,因此我无法创建全局临时表、声明 PL/SQL 之外的类型或任何类似的东西。
我尝试声明自己的 PL/SQL 类型失败,出现了这个问题中提到的问题- 由于权限有限,该解决方案对我不起作用。
是否有一种纯 PL/SQL 方式不需要花哨的权限来实现上述目标?
请注意:上面的代码示例被简化了很多,实际上不需要单独的翻译表——实际上我需要在几个不同的查询中访问原始值和翻译值,所以我不想到处“重新计算”翻译。