2012-05-23 4 views
1

Я разрабатываю SQL-скрипт в SQL Developer, который будет запутывать личные данные в схеме с использованием Oracle SQL. Скрипт просматривает таблицу под названием «OBFUS_TABLE», которая содержит список тех таблиц и столбцов, которые необходимо запутать и как это сделать. Затем он перемещается по таблице, изменяя данные по мере их поступления.Создание и чтение из таблицы в том же скрипте SQL

Я проверил фактический цикл и обфускацию процесса, и он отлично работает, я также успешно протестировал начало скрипта до самого цикла, который создает 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; 

NB: На самом деле существует примерно 30 операторов вставки в том же формате, что и выше. Я удалил их, так как они слишком много выкладывали эту запись, но я вручную проверил каждую инструкцию insert, и все они верны.

Я предполагаю, что проблема заключается в том, что SQL Developer выполняет «проверку работоспособности» кода перед запуском, и смотрит вперед в цикл и реализует, что OBFUS_TABLE не существует, но не понимает, что к тому моменту, когда часть кода , OBFUS_TABLE определенно будет существовать.

Есть ли способ обойти это? Я думал, может быть, заявление GOTO может помочь, но не повезло. Я предпочел бы сохранить решение как один скрипт, а не два отдельных, но если единственный способ сделать это, я мог бы сделать это, я полагаю. Любая помощь приветствуется.

ответ

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; 
+0

Ах! Спасибо за ответ. Я до сих пор довольно новичок в SQL, поэтому я даже не слышал о динамическом SQL раньше, но я сделаю немного исследований. Это сводило меня с ума, потому что код в цикле выполняет то же самое, что я пытаюсь сделать здесь: ищет таблицу, создает ее, если необходимо, а затем читает и записывает на нее, и это никогда не вызывало у меня никаких проблем , Это должен быть способ структурирования кода в цикле. Неважно! – Neoptolemus

+0

Хорошо, у меня была хорошая трещина, но я не могу заставить код работать, и сайты, на которых я смотрел онлайн, похоже, ориентированы на кого-то более опытного, и их код выглядит совсем по-другому. Сможете ли вы показать мне, что цикл должен выглядеть в полном объеме? Я понимаю, что делает первая часть вашего кода, но мне трудно передать данные в rc в цикле. – Neoptolemus

+0

@Neoptolemus: сделано –

Смежные вопросы