Вызов хранимой процедуры для данных из процедуры Oracle
У меня есть ситуация, когда у меня есть процедура Oracle, которая вызывается как минимум из 3 или 4 разных мест. Мне нужно иметь возможность вызывать пользовательский код в зависимости от некоторых данных. Пользовательский код зависит от клиента, поэтому клиент A может захотеть сделать ABC, где клиент B может захотеть сделать 6-7-8, а клиент C не должен делать ничего лишнего. Когда приходят клиенты D... Z, я не хочу менять свою существующую процедуру.
Я хотел бы иметь возможность ввести специфическую для клиента процедуру в таблицу. В этой существующей процедуре проверьте эту таблицу базы данных, если существует процедура пользовательского кода, и если это так, выполните ее. Каждая из процедур кода клиента будет иметь одинаковые параметры.
Например:
- Мое приложение (3+ места) вызывает эту процедуру "удаления"
- В этой процедуре удаления найдите имя вызываемой дочерней процедуры (если она вообще существует)
- Если он существует, выполните эту процедуру удаления (передав параметры)
Я знаю, что могу сделать это с помощью построения строки, содержащей вызов хранимой процедуры. Но я хотел бы знать, есть ли в Oracle 10g что-то встроенное для таких вещей?
4 ответа
Окончательное решение, с которым мы пошли, состояло в том, чтобы сохранить имя процедуры в таблице базы данных. Затем мы создаем вызов SQL и используем инструкцию EXECUTE.
У каждого из ваших клиентов есть своя база данных? Если это так, лучшим вариантом будет использование условной компиляции. Это имеет преимущество в том, что не требует динамического SQL. Пусть основная программа всегда вызывает пользовательскую процедуру и использует флаги CC для изменения кода, который она содержит.
В противном случае у Oracle есть Rule Engine, но он не предназначен для нашего использования.
Согласитесь с ответом APC и просто остановитесь на нем. В этом документе, если вы ищите "Установка на основе компонентов", описывается аналогичная проблема, решаемая с помощью условной компиляции.
Ваше решение кажется разумным с учетом требований, поэтому я проголосовал за него.
Другой вариант - циклически просмотреть результаты поиска в вашей таблице и поместить вызовы процедур в большой оператор case. Это было бы больше кода, но у него было бы преимущество сделать видимой цепочку зависимостей, чтобы вам было легче ловить отсутствующие разрешения и недопустимые процедуры.