Я разрабатываю 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 может помочь, но не повезло. Я предпочел бы сохранить решение как один скрипт, а не два отдельных, но если единственный способ сделать это, я мог бы сделать это, я полагаю. Любая помощь приветствуется.
Ах! Спасибо за ответ. Я до сих пор довольно новичок в SQL, поэтому я даже не слышал о динамическом SQL раньше, но я сделаю немного исследований. Это сводило меня с ума, потому что код в цикле выполняет то же самое, что я пытаюсь сделать здесь: ищет таблицу, создает ее, если необходимо, а затем читает и записывает на нее, и это никогда не вызывало у меня никаких проблем , Это должен быть способ структурирования кода в цикле. Неважно! – Neoptolemus
Хорошо, у меня была хорошая трещина, но я не могу заставить код работать, и сайты, на которых я смотрел онлайн, похоже, ориентированы на кого-то более опытного, и их код выглядит совсем по-другому. Сможете ли вы показать мне, что цикл должен выглядеть в полном объеме? Я понимаю, что делает первая часть вашего кода, но мне трудно передать данные в rc в цикле. – Neoptolemus
@Neoptolemus: сделано –