Где хранить константы PL/SQL?
Где вы обычно сохраняете свои константы PL/SQL? На уровне корпуса упаковки? В спецификации? Я также видел, как некоторые люди держали константы в специализированном пакете только для констант. Каковы наилучшие практики в этой области?
Спасибо.
Ответы
Ответ 1
Один недостаток, связанный с наличием констант в корпусе или спецификации пакета, заключается в том, что когда вы перекомпилируете пакет, любые пользовательские сеансы, которые имеют состояние пакета в PGA, получат ORA-04068. По этой причине в одной крупной среде разработки мы приняли соглашение о наличии отдельного пакета spec-only для хранения констант (и глобальных пакетов пакетов, если таковые имеются) для каждого пакета. Затем мы наложили правило, в котором говорилось, что этим пакетам только для спецификации разрешено ссылаться только на их "собственный" пакет, который мы применяем при проверке кода. Не идеальное решение, но оно работало для нас в то время.
По той же причине я бы никогда не рекомендовал одно-постоянный-пакет-to-rule-them-all, потому что каждый раз, когда кому-то нужно вводить новую константу или изменять существующую, все сеансы пользователей получают ORA-04068.
Ответ 2
Во многих случаях вы хотите сохранить их в спецификации, чтобы другие пакеты могли их использовать, особенно в качестве параметров при вызове функций и процедур из вашего пакета.
Только если вы хотите, чтобы они были закрыты для пакета, вы должны поместить их в тело.
Наличие пакета только для констант может быть хорошей идеей для тех констант, которые не связаны с какой-либо частью кода, в частности, но релевантными для всей схемы.
Ответ 3
Для нашего приложения все константы находятся в таблице. Для их извлечения используется простая функция. Нет проблем с перекомпиляцией, ORA-04068,...
Ответ 4
Лучший вариант, на мой взгляд. Сохраните "константу" в таблице и создайте общую функцию для получения значений. Нет 04068 😀
Ответ 5
Я предпочел бы, чтобы константы были по умолчанию в теле пакета, если вы не используете константу в качестве значения параметра для одной из ваших общих процедур/функций пакета или как возвращаемое значение для ваших функций.
Проблема с установкой ваших констант в спецификации пакета заключается в том, что если вам нужно изменить тип константы, другие пакеты могут не работать, если использовать константу, потому что она была там. Если константа была приватной в первую очередь, тогда вам не нужно выполнять анализ воздействия для каждого изменения.
Если вам нужно хранить такие группы, как язык по умолчанию или что-то вроде этого, я бы инкапсулировал эти константы в функции типа get_default_language
и т.д. и сохранял константы частными.
Ответ 6
У меня возникнет озабоченность по поводу того, что "один пакет управляет константами", потому что состояние пакета - константы, переменные и код - получают кэширование в пользовательской PGA при первом вызове любой публичной переменной или пакета. Константа пакета, если она общедоступна, должна быть привязана к пакету и использоваться только с помощью методов пакета.
Константа, область охвата которой охватывает пакеты, должна быть в таблице кодов с описанием, объединенной по мере необходимости. Постоянные нет, а переменные - нет. Наличие таблицы ключей "значение-значение" "константы" делает их общедоступными и делает возможным их динамическое изменение.