Oracle и подстановка схемы в запрос | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Всем привет.
На сервере с 11g2 имеется несколько однотипных схем вида <название проекта>_NNNN_DEV, где NNNN - число. Аналогичные схемы есть с постфиксами _TEST и _PROD. При написании кода функций очень хочется делать макроподстановку схемы в запрос, чтобы не делать при переносе поиск/замену схем и сократить объемы кода. Погуглив и покурив sql.ru понял, что никто ничего умнее case не предлагает. Максимум - собирать код запроса динамически и подставлять в execute immediate, что в свою очередь осложнит отладку и сопровождение. Безусловно я далеко не первый, у кого возникло такое желание. Кто как подошел к решению данной проблемы? |
Re: Oracle и подстановка схемы в запрос | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Зачем вообще нужно писать имя схемы в запросе или скрипте? Это код работающий одновременно с несколькими схемами?
Если работа идёт в рамках одной схемы, уточнять имена объектов не требуется. Ну а так - если речь идёт именно про скрипт, то там можно использовать подстановочные переменные Это типа фоксового макро. Естественно они работают лишь в рамках sqlplus или другого интерпретатора скриптов (если он тоже их поддерживает) - на сервер идут уже полноценные команды безо всяких макро. "Внутри кода" такую динамику может обеспечить действительно лишь динамический код. Только я не думаю что тебе на самом деле это нужно Для создания схем-клонов вполне хватит макро, а лучше (если нет меж-схемных обращений, или они локализованы в синонимах) вообще избавиться от префиксов имён схем в коде - как процедур так и скриптов. P.S. Что-то мне кажется несколько странным наличие суффиксов DEV, TEST и PROD - уж не держите ли вы продуктивные, тестовые и девелоперские схемы на одном сервере, да ещё и на одном инстансе оракла? Это очень, очень плохая практика... ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 21.04.17 16:53 |
Re: Oracle и подстановка схемы в запрос | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Да. Есть вьюха, собирающая данные из 6 схем, отличающихся только цифрами в названии. Есть редактор и функция в пакете, осуществляющая запись данных в таблицы с одинаковыми названиями и структурой, находящихся в этих 6 схемах. Сейчас сделал через case, но мне не нравится что абсолютно одинаковые запросы мне пришлось раскладывать на 6 веток из-за разных названий схем и из-за этого раздулся код. Есть еще _RO. Серверов как минимум 5, возможно больше. Точно не знаю - это не в моей компетенции и не моя забота. За них отвечают специально обученные люди. |
Re: Oracle и подстановка схемы в запрос | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В таком случае - т.е. когда РЕАЛЬНО нужно чтобы одна ХП обращалась в зависимости от условий к разным схемам - case и статические обращения через имя_схемы.имя_объекта это лучший вариант. Другое дело, что само тело такой ХП можно генерировать программно (и если понадобиться, добавлять 7-ю, 8-ю и т.д. схемы).
Если ты будешь использовать динамический запрос, то потеряешь возможность отслеживать целостность/корректность данной ХП. Так то она сразу будет видна как invalid если что произойдёт с любой из задействованных схем/объектов (и для этих самых объектов сервер покажет что "есть использование в такой-то ХП"). А иначе - только в рантайме, при исполнении кода вылезет ошибка. P.S. Если продакшн, тест и прочие сервера это разные инстансы, то не понимаю зачем вам мудрить с именами схем. У нас на девелоперском и тестовом сервере схемы называются точно так же как и на продакшн Зачем весь этот геморрой возникающий при переносе дампа с продуктива на тест или девелоп-базу, если имена схем различаются? ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 21.04.17 21:25 |
Re: Oracle и подстановка схемы в запрос | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Например, чтобы обеспечить некоторую автономность региональных филиалов друг от друга и при этом видеть целостную картину в головном управлении. В любом случае, сделано это было не мной, ломать и переделывать под моё видение никто не даст. Мне остается только смириться и сопровождать что есть. Здесь точно так же. Просто на каждом из серверов лежит комплект из 6 схем, поэтому мне нужно на каждом из них разложить одинаковый блок инсертов-апдейтов на 6 веток, т.е. всего получается 18 копий одного и того же кода, 18 комбинаций <схема>.<таблица> Именно это меня приводит в уныние. |
Re: Oracle и подстановка схемы в запрос | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну это то касается суффикса NNNN как я понимаю? Или суффиксы DEV PROD TEST это не про цель использования а тоже такие названия филиалов Да, у нас тоже есть такая хрень. За 20 "идентичных" схем, плюс "общая" где мега-вьюхи всё это UNION ALL-ящие. Правда из "общей" не предполагается что-то менять в "филиалах" - там лишь забираются данные для свода. Соответственно в "филиалах" либо вообще не используются префиксы, либо используется только один - на "свод". Да и то, насколько я помню это изолируется через синоним (чтобы только в 1 месте было обращение с префиксом). Соответственно вопросы возникают лишь для "свода" - там приходится программно некоторые объекты создавать - чтобы не повторять 20 раз один и тот же кусок кода. Не понимаю. Если на разных серверах названия схем идентичны, то количество серверов уже не имеет значения. Если нужно одни и те же скрипты исполнить на 6-ти схемах, и они касаются только одной этой схемы - то опять же просто не указывай имени схемы в скрипте - имя в строке соединения или в команде connect укажет где это должно работать. И только для "межсхемных" команд нужно заморачиваться с префиксами - и там как раз оптимальнее будет программная генерация скрипта - а сделать это можно используя тот же самый sqlplus - например направляя его вывод в файл и через dbms_output выводя нужные "строчки" - а потом этот же сгенерированный файл исполнить. Или использовать тот же EXECUTE_IMMEDIATE (правда там может мешать лимит на 32К символов на 1 строковую переменную - нужно много переменных использовать) или вообще пакет DBMS_SQL - там скрипт "построчно" можно подсунуть для исполнения (вряд ли потребуется обязательно "в одной строке" писать более 32К символов ). ------------------ WBR, Igor |
Re: Oracle и подстановка схемы в запрос | |
---|---|
Pekpytep Автор Сообщений: 727 Откуда: Луганск Дата регистрации: 19.10.2010 |
Нет, имя схемы важно. Я должен проверить запись какой схемы была отредактирована и писать именно в ту схему, запись которой редактировалась. Это как раз "межсхемная" функция. Думаю все-таки попробовать альтернативный подход. Через case функция уже реализована и отлажена, сделаю второй вариант с генерацией запроса и потом буду определяться какой из них оставить. В PLSQL есть аналог фоксовского TEXT..ENDTEXT ? Для сопровождения было бы удобнее скопипастить из воркшита готовый запрос с форматированием, а удалять переносы и лишние пробелы уже программно в переменной. И имена схем можно было бы подставлять, заменяя некую условную козябру через regexp_replace(). |
© 2000-2024 Fox Club  |