在同一SQL脚本中创建和读取表

时间:2012-05-23 16:41:27

标签: sql oracle

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

1 个答案:

答案 0 :(得分: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;