:: Не фоксом единым
Oracle и подстановка схемы в запрос
Pekpytep
Автор

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Всем привет.
На сервере с 11g2 имеется несколько однотипных схем вида <название проекта>_NNNN_DEV, где NNNN - число. Аналогичные схемы есть с постфиксами _TEST и _PROD.
При написании кода функций очень хочется делать макроподстановку схемы в запрос, чтобы не делать при переносе поиск/замену схем и сократить объемы кода. Погуглив и покурив sql.ru понял, что никто ничего умнее case не предлагает. Максимум - собирать код запроса динамически и подставлять в execute immediate, что в свою очередь осложнит отладку и сопровождение.
Безусловно я далеко не первый, у кого возникло такое желание. Кто как подошел к решению данной проблемы?
Ratings: 0 negative/0 positive
Re: Oracle и подстановка схемы в запрос
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Зачем вообще нужно писать имя схемы в запросе или скрипте? Это код работающий одновременно с несколькими схемами?
Если работа идёт в рамках одной схемы, уточнять имена объектов не требуется.
Ну а так - если речь идёт именно про скрипт, то там можно использовать подстановочные переменные Это типа фоксового макро.
Естественно они работают лишь в рамках sqlplus или другого интерпретатора скриптов (если он тоже их поддерживает) - на сервер идут уже полноценные команды безо всяких макро.
"Внутри кода" такую динамику может обеспечить действительно лишь динамический код. Только я не думаю что тебе на самом деле это нужно
Для создания схем-клонов вполне хватит макро, а лучше (если нет меж-схемных обращений, или они локализованы в синонимах) вообще избавиться от префиксов имён схем в коде - как процедур так и скриптов.

P.S. Что-то мне кажется несколько странным наличие суффиксов DEV, TEST и PROD - уж не держите ли вы продуктивные, тестовые и девелоперские схемы на одном сервере, да ещё и на одном инстансе оракла? Это очень, очень плохая практика...


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 21.04.17 16:53
Ratings: 0 negative/0 positive
Re: Oracle и подстановка схемы в запрос
Pekpytep
Автор

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Igor Korolyov
Зачем вообще нужно писать имя схемы в запросе или скрипте? Это код работающий одновременно с несколькими схемами?
Да.

Igor Korolyov
"Внутри кода" такую динамику может обеспечить действительно лишь динамический код. Только я не думаю что тебе на самом деле это нужно
Есть вьюха, собирающая данные из 6 схем, отличающихся только цифрами в названии. Есть редактор и функция в пакете, осуществляющая запись данных в таблицы с одинаковыми названиями и структурой, находящихся в этих 6 схемах. Сейчас сделал через case, но мне не нравится что абсолютно одинаковые запросы мне пришлось раскладывать на 6 веток из-за разных названий схем и из-за этого раздулся код.

Igor Korolyov
P.S. Что-то мне кажется несколько странным наличие суффиксов DEV, TEST и PROD - уж не держите ли вы продуктивные, тестовые и девелоперские схемы на одном сервере, да ещё и на одном инстансе оракла? Это очень, очень плохая практика...
Есть еще _RO. Серверов как минимум 5, возможно больше. Точно не знаю - это не в моей компетенции и не моя забота. За них отвечают специально обученные люди.
Ratings: 0 negative/0 positive
Re: Oracle и подстановка схемы в запрос
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В таком случае - т.е. когда РЕАЛЬНО нужно чтобы одна ХП обращалась в зависимости от условий к разным схемам - case и статические обращения через имя_схемы.имя_объекта это лучший вариант. Другое дело, что само тело такой ХП можно генерировать программно (и если понадобиться, добавлять 7-ю, 8-ю и т.д. схемы).
Если ты будешь использовать динамический запрос, то потеряешь возможность отслеживать целостность/корректность данной ХП. Так то она сразу будет видна как invalid если что произойдёт с любой из задействованных схем/объектов (и для этих самых объектов сервер покажет что "есть использование в такой-то ХП"). А иначе - только в рантайме, при исполнении кода вылезет ошибка.

P.S. Если продакшн, тест и прочие сервера это разные инстансы, то не понимаю зачем вам мудрить с именами схем. У нас на девелоперском и тестовом сервере схемы называются точно так же как и на продакшн Зачем весь этот геморрой возникающий при переносе дампа с продуктива на тест или девелоп-базу, если имена схем различаются?


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 21.04.17 21:25
Ratings: 0 negative/0 positive
Re: Oracle и подстановка схемы в запрос
Pekpytep
Автор

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Igor Korolyov
Если продакшн, тест и прочие сервера это разные инстансы, то не понимаю зачем вам мудрить с именами схем.
Например, чтобы обеспечить некоторую автономность региональных филиалов друг от друга и при этом видеть целостную картину в головном управлении. В любом случае, сделано это было не мной, ломать и переделывать под моё видение никто не даст. Мне остается только смириться и сопровождать что есть.

Igor Korolyov
У нас на девелоперском и тестовом сервере схемы называются точно так же как и на продакшн
Здесь точно так же. Просто на каждом из серверов лежит комплект из 6 схем, поэтому мне нужно на каждом из них разложить одинаковый блок инсертов-апдейтов на 6 веток, т.е. всего получается 18 копий одного и того же кода, 18 комбинаций <схема>.<таблица>
Именно это меня приводит в уныние.
Ratings: 0 negative/0 positive
Re: Oracle и подстановка схемы в запрос
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Pekpytep
Например, чтобы обеспечить некоторую автономность региональных филиалов друг от друга и при этом видеть целостную картину в головном управлении.
Ну это то касается суффикса NNNN как я понимаю? Или суффиксы DEV PROD TEST это не про цель использования а тоже такие названия филиалов
Pekpytep
В любом случае, сделано это было не мной, ломать и переделывать под моё видение никто не даст. Мне остается только смириться и сопровождать что есть.
Да, у нас тоже есть такая хрень. За 20 "идентичных" схем, плюс "общая" где мега-вьюхи всё это UNION ALL-ящие.
Правда из "общей" не предполагается что-то менять в "филиалах" - там лишь забираются данные для свода. Соответственно в "филиалах" либо вообще не используются префиксы, либо используется только один - на "свод". Да и то, насколько я помню это изолируется через синоним (чтобы только в 1 месте было обращение с префиксом).
Соответственно вопросы возникают лишь для "свода" - там приходится программно некоторые объекты создавать - чтобы не повторять 20 раз один и тот же кусок кода.
Pekpytep
Здесь точно так же. Просто на каждом из серверов лежит комплект из 6 схем, поэтому мне нужно на каждом из них разложить одинаковый блок инсертов-апдейтов на 6 веток, т.е. всего получается 18 копий одного и того же кода, 18 комбинаций <схема>.<таблица>
Именно это меня приводит в уныние.
Не понимаю. Если на разных серверах названия схем идентичны, то количество серверов уже не имеет значения.
Если нужно одни и те же скрипты исполнить на 6-ти схемах, и они касаются только одной этой схемы - то опять же просто не указывай имени схемы в скрипте - имя в строке соединения или в команде connect укажет где это должно работать. И только для "межсхемных" команд нужно заморачиваться с префиксами - и там как раз оптимальнее будет программная генерация скрипта - а сделать это можно используя тот же самый sqlplus - например направляя его вывод в файл и через dbms_output выводя нужные "строчки" - а потом этот же сгенерированный файл исполнить. Или использовать тот же EXECUTE_IMMEDIATE (правда там может мешать лимит на 32К символов на 1 строковую переменную - нужно много переменных использовать) или вообще пакет DBMS_SQL - там скрипт "построчно" можно подсунуть для исполнения (вряд ли потребуется обязательно "в одной строке" писать более 32К символов ).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Oracle и подстановка схемы в запрос
Pekpytep
Автор

Сообщений: 727
Откуда: Луганск
Дата регистрации: 19.10.2010
Igor Korolyov
Если нужно одни и те же скрипты исполнить на 6-ти схемах, и они касаются только одной этой схемы - то опять же просто не указывай имени схемы в скрипте
Нет, имя схемы важно. Я должен проверить запись какой схемы была отредактирована и писать именно в ту схему, запись которой редактировалась. Это как раз "межсхемная" функция.

Думаю все-таки попробовать альтернативный подход. Через case функция уже реализована и отлажена, сделаю второй вариант с генерацией запроса и потом буду определяться какой из них оставить.

В PLSQL есть аналог фоксовского TEXT..ENDTEXT ? Для сопровождения было бы удобнее скопипастить из воркшита готовый запрос с форматированием, а удалять переносы и лишние пробелы уже программно в переменной. И имена схем можно было бы подставлять, заменяя некую условную козябру через regexp_replace().
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 4 (Гостей: 4)

© 2000-2024 Fox Club 
Яндекс.Метрика