Как и решение CASE, возможно сделать это, используя динамический PL / SQL.
PROCEDURE MAIN( p_obj_type VARCHAR2
, errbuf VARCHAR2
, retcode VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE 'begin upload_pkg.'||p_obj_type|| '; end;';
END MAIN;
Простые параметры (Date, Varhar2, Number) могут быть переданы IN OUT с помощью команды USING.
Ключевой вопрос: желательно .
Как и в любом динамическом языке, он оставляет область для ошибок, которые будут обнаружены только во время выполнения, а не во время компиляции - то есть, передается значение для p_obj_type, который не существует. Вы можете смягчить это с помощью констант или абстрактных типов данных.
Также каждая динамическая команда sql или pl / sql влечет за собой небольшие накладные расходы на анализ по сравнению с фактическим скомпилированным кодом. Эти издержки невелики, но становятся заметными, если они выполняются внутри цикла.
Наконец, вызываемый код должен иметь одинаковую сигнатуру параметра.