Где держать МН константы / константы SQL?

Где Вы обычно храните свои МН константы / константы SQL? На уровне основания корпуса? В спецификации? Я также видел, что некоторые люди держат константы в специализированном пакете только для констант. Что такое лучшие практики в этой области?

Спасибо.

13
задан Ariod 17 February 2010 в 09:04
поделиться

5 ответов

Одним из недостатков наличия констант в теле пакета или спецификации является то, что при перекомпиляции пакета все пользовательские сессии, которые имели состояние пакета в PGA, получат ORA-04068. По этой причине в одной большой среде разработки мы приняли традицию иметь отдельный пакет, предназначенный только для спецификаций, для хранения констант (и глобальных значений пакета, если таковые имеются) для каждого пакета. Затем мы ввели правило, гласящее, что на эти пакеты spec-only можно ссылаться только в "собственном" пакете - что мы и обеспечивали при проверке кода. Это не идеальное решение, но в то время оно нам подходило.

По той же причине я бы никогда не рекомендовал использовать пакет с одной константой для управления всеми, потому что каждый раз, когда кому-то нужно ввести новую константу или изменить существующую, все пользовательские сессии получают ORA-04068.

6
ответ дан 1 December 2019 в 23:47
поделиться

Я бы предпочел, чтобы константы по умолчанию находились в теле пакета, если вы не используете константу в качестве значения параметра для одной из ваших публичных процедур / функций пакета или в качестве возвращаемого значения для ваших функций.

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

Если вам нужно хранить константы, такие как язык по умолчанию или что-то подобное, то я бы инкапсулировал эти константы в таких функциях, как get_default_language и т. Д., И оставил бы константы закрытыми.

1
ответ дан 1 December 2019 в 23:47
поделиться

Во многих случаях вы хотите сохранить их в спецификации, чтобы другие пакеты могли использовать их, особенно в качестве параметров при вызове функций и процедур из вашего пакета.

Только если вы хотите, чтобы они были закрыты для пакета, вы должны помещать их в тело.

Наличие пакета только для констант может быть хорошей идеей для тех констант, которые не связаны с каким-либо конкретным фрагментом кода, но относятся ко всей схеме.

4
ответ дан 1 December 2019 в 23:47
поделиться

Меня беспокоит наличие «одного пакета для управления константами», потому что состояние пакета - константы, переменные и код - кэшируются в пользовательский PGA при первом вызове любой общедоступной переменной или пакета. Константа пакета, если она общедоступна, должна быть привязана к пакету и использоваться только методами пакета.

Константа, область действия которой охватывает пакеты, должна быть в кодовой таблице с описанием, присоединенным по мере необходимости. В конце концов, константы - нет, а переменные - нет. Наличие таблицы пар "ключ-значение" "констант" делает их все общедоступными и делает возможным их динамическое изменение.

1
ответ дан 1 December 2019 в 23:47
поделиться

Для нашего приложения все константы находятся в таблице. Для их извлечения используется простая функция. Никаких проблем с перекомпиляцией, ORA-04068, ...

3
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: