1

我正在 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 语句可能会有所帮助,但没有运气。我宁愿将解决方案保留为一个单独的脚本,而不是两个单独的脚本,但如果解决此问题的唯一方法是这样做,那么我想我可以这样做。任何帮助将非常感激。

4

1 回答 1

5

您将需要使用动态 SQL 进行选择,如下所示:

declare
    ...
    l_tname    varchar2(100);
    l_cname    varchar2(100);
    l_datatype varchar2(100);
    rc         sys_refcursor;
begin
    ...
    open rc for 'SELECT TABLENAME, COLUMNNAME, DATA_TYPE  
                 FROM OBFUS_TABLE WHERE ACTIVE=''Y''';
    loop
        fetch rc into l_tname, l_cname, l_datatype;
        exit when rc%notfound;
        dbms_output.put_line('Started: '||TO_CHAR(sysdate,'YYYY/MM/DD HH24:MI:SS'));
    end loop;
    close rc;
end;
于 2012-05-23T16:46:09.100 回答