我正在 SQL Developer 中开发一个 SQL 脚本,它将使用 Oracle SQL 混淆模式中的个人数据。该脚本查看名为“OBFUS_TABLE”的表,其中包含需要混淆哪些表和列以及如何进行混淆的列表。然后它循环遍历表,随时更改数据。
我已经测试了实际的循环和混淆过程,它工作正常,我还成功地测试了脚本的开头直到循环之前,它创建 OBFUS_TABLE 并将值插入其中。当它尝试同时执行这两个操作时出现问题,在尝试执行循环时出现“表或视图不存在”错误。下面的代码片段:
alter session set current_schema = SYSTEM;
DECLARE
t_count NUMBER;
t_count2 NUMBER;
p_tname VARCHAR2(100);
p_cname VARCHAR2(100);
l_datatype VARCHAR2(100);
BEGIN
SELECT COUNT(*) INTO t_count FROM all_tables WHERE table_name = 'OBFUS_TABLE';
SELECT COUNT(*) INTO t_count2 FROM all_tables WHERE table_name = 'OBFUS_LOG';
IF (t_count = 0)
THEN
EXECUTE immediate 'create table OBFUS_TABLE( TABLENAME VARCHAR2(200 BYTE), COLUMNNAME VARCHAR2(200 BYTE), DATA_TYPE VARCHAR2(20 BYTE), ACTIVE VARCHAR(1 BYTE) )';
END IF;
IF (t_count2 = 0)
THEN
EXECUTE immediate 'CREATE TABLE OBFUS_LOG (SRC_TABLENAME VARCHAR2(50 BYTE), SRC_TABLE_ROW_COUNT NUMBER, COPY_TABLENAME VARCHAR2(50 BYTE), COPY_TABLE_ROW_COUNT NUMBER, UPDATE_DATE TIMESTAMP(6) )';
END IF;
EXECUTE immediate 'INSERT INTO OBFUS_TABLE VALUES (''OB_MYTABLE1'',''SRNM'',''NAME'',''Y'')';
COMMIT;
FOR x IN (SELECT TABLENAME, COLUMNNAME, DATA_TYPE FROM OBFUS_TABLE WHERE ACTIVE='Y')
LOOP
p_tname := upper(x.TABLENAME); -- Table name
p_cname := upper(x.COLUMNNAME); -- Column name
l_datatype := upper(x.DATA_TYPE);
dbms_output.put_line('Started: '||TO_CHAR(sysdate,'YYYY/MM/DD HH24:MI:SS'));
END LOOP;
END;
注意:实际上有大约 30 个插入语句,格式与上面的完全相同。我删除了它们,因为它们会过多地填充这篇文章,但我已经手动检查了每个插入语句,它们都是正确的。
我假设问题是 SQL Developer 在运行之前对代码进行了“健全性检查”,并向前看循环并意识到 OBFUS_TABLE 不存在,但在执行该段代码时无法理解 OBFUS_TABLE肯定会存在。
有没有办法解决这个问题?我想也许 GOTO 语句可能会有所帮助,但没有运气。我宁愿将解决方案保留为一个单独的脚本,而不是两个单独的脚本,但如果解决此问题的唯一方法是这样做,那么我想我可以这样做。任何帮助将非常感激。