Таблица, созданная в процедуре, отбрасывается, появляется ошибка компиляции для процедуры

Первым шагом созданной процедуры является проверка существования таблицы XYZ. Если это так, продолжайте дальнейшие вычисления в таблице XYZ, но если она не существует, создайте таблицу, а затем продолжите вычисление (вставка новых записей в таблицу).

Поэтому для тестирования я уронил стол. В тот момент, когда я отбросил таблицу, я получаю ошибку компиляции из процедуры, говорящей, что таблица не существует.

Как мне решить этот вопрос. Не могу изменить логику.


person SYMA    schedule 09.03.2017    source источник
comment
Пожалуйста, опубликуйте (соответствующую часть) свой код.   -  person Aleksej    schedule 09.03.2017
comment
Разместите свой код. Также вы должны использовать execute immediate в каждой ссылке на table, который может или не может выйти. В противном случае вы получите ошибки компиляции.   -  person Plirkee    schedule 09.03.2017
comment
Привет, Plirkee, да, я пробовал использовать немедленное выполнение, взяв запрос в строке. Но запрос очень большой, поэтому я получаю сообщение об ошибке, поскольку строковый литерал слишком длинный.   -  person SYMA    schedule 09.03.2017
comment
См. этот вопрос.   -  person Alex Poole    schedule 09.03.2017
comment
Если ваша строка запроса слишком длинная (более 32 КБ ??), вам придется создать ее как CLOB кусками короче. Но вы не об этом спрашивали ...   -  person Alex Poole    schedule 09.03.2017
comment
Готов поспорить, что код основан на самой таблице, в которой вы производите вычисления на столе. Этот код имеет прямую ссылку на таблицу, также называемую зависимостью. Когда вы отбрасываете таблицу, вы нарушаете зависимость, делая вашу процедуру недействительной. Он не будет компилироваться, пока таблица не будет на месте. Или, как упоминалось выше, вы заключаете зависимости в блоки EXECUTE IMMEDIATE, что удаляет прямую зависимость.   -  person unleashed    schedule 10.03.2017


Ответы (1)


Код, который должен проверять, существует ли таблица, указывает на плохую программную архитектуру. Не должно быть необходимости создавать таблицы на лету. Это антипаттерн (по крайней мере, в Oracle). Однако мы достаточно часто видим вариации этой проблемы, поэтому очевидно, что этот антипаттерн процветает в дикой природе.

Если вам действительно нужно реализовать такое решение (по какой-либо причине), правильный подход - отделить код построения таблицы от таблицы с помощью кода. Имейте отдельные пакеты для них.

begin
    pkg_ddl.build_table_xyz;
    pkg_calc.run_xyz_job;
end;

Если таблица XYZ не существует, pkg_calc.run_xyz_job() недействителен. Однако его недействительность не помешает выполнению pkg_ddl.build_table_xyz(). Затем, когда внешняя программа вызывает pkg_calc.run_xyz_job(), она скомпилирует процедуру.

person APC    schedule 09.03.2017