Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
“Рецепт Счастья” — увлекательная игра в жанре «соедини предметы»! Помогите Эмили раскрыть тайны пропавшего родственника, найти сокровища и восстановить её любимое кафе.

Рецепт Счастья

Казуальные, Головоломки, Новеллы

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Oracle + Программирование

С этим тегом используют

SQL IT Собеседование База данных Mysql Postgresql Программист IT юмор Разработка Python Картинка с текстом Юмор Все
27 постов сначала свежее
IliaHohlov
IliaHohlov
1 год назад
Лига программистов

Является ли внешний ключ индексом? Конечно нет. Вот почему!⁠⁠

В этом видео расскажем создает ли определение внешнего ключа на таблице (foreign key) автоматически еще и индекс. Конечно не создает. Внешний ключ - это просто одна из разновидностей ограничений для таблиц (constraint). Если нужен еще и индекс по этому полю, то его нужно создавать дополнительно!

[моё] Программирование IT Собеседование SQL Oracle Ms SQL Индекс Ограничения Ключи Программист Видео YouTube
9
6
IliaHohlov
IliaHohlov
1 год назад
Лига программистов

Разбираем решение задачи по SQL с нашего телеграмм-канала про поиск и удаление дублей в таблице⁠⁠

Разбираем решение задачи по SQL с нашего телеграмм-канала про поиск и удаление дублей в таблице: https://t.me/sql_oracle_databases

#SQL #ORACLE #Уроки #вопросынасобеседовании #Задачи

Показать полностью
[моё] Программирование IT Разработка SQL Собеседование Задача База данных Oracle Mysql Ms SQL Видео YouTube
7
13
IliaHohlov
IliaHohlov
1 год назад
Лига программистов

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение⁠⁠

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Продолжаем проверять работу ученика нашего курса по Программированию в PL/SQL (ORACLE). Начало статьи можешь найти здесь.

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

Итак, ниже созданная учеником функция:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Пожалуйста, если Вы обучаетесь на нашем курсе Программирования в PL/SQL (ORACLE) не используйте этот материал как готовое решение. От этого не будет пользы. Постарайтесь сначала максимально самостоятельно составить алгоритм. Используйте подсказки, которые я даю для решения домашнего задания.

До разбора функции и уж точно до её тестирования нам хорошо бы хотя бы немного заполнить созданную таблицу дней исключений - таблицу DATES_OF_YEAR. Сейчас 2023 год, поэтому (согласно статье 112 трудового кодекса Российской Федерации) на 2023 год установлены следующие нерабочие праздничные дни в Российской Федерации:

1, 2, 3, 4, 5, 6 и 8 января — Новогодние каникулы и Рождество;

23 февраля — День защитника Отечества, а также 24-ое февраля также установлен выходным днём из-за того, что 1-ое января итак выпадает на выходной день;

8 марта — Международный женский день;

1 мая — Праздник Весны и Труда;

9 мая — День Победы, а также 8ое мая также установлен выходным днём;

12 июня — День России;

4 ноября — День народного единства, и, так как он выпадает итак на выходной день, выходным днём сделан 6-ое ноября.

В нашу таблицу дней-исключений необходимо добавить из Новогодних праздников дни со второго по шестое января. Первое, седьмое и восьмое января итак выходные. Также нужно добавить 23 февраля и 8-ое марта, так как эти даты выпадают на будни. Из майских добавляем 1-ое, 8-ое и 9-ое, из июньских - 12-ое число. И ещё добавляем 6-ое ноября.

Все даты внесены в таблицу дней-исключений:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Начинаем рассматривать решение ученика. Первое, на что обращаем внимание, это то, что в функции во вложенном курсоре, выбираются все будни до 2027-го года. То есть, похоже, работа функции рассчитана только до указанной даты. Такого не было в постановке задачи. При такой реализации нужно будет вовремя перепрограммировать функцию. И главное про это не забыть :) Опасное решение. А если еще в нашем банковском софте есть такие подводные камни? Вдруг есть функционал который уже сегодня не работает и клиентам формируются продукты с ошибочными данными. Вобщем, такое делать не нужно.

Второе, что тоже сразу бросается в глаза, - это использование метки:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

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

Начинаем проверять функцию, правильно ли она работает. Сразу возникает подозрение, вернёт ли функция субботнюю дату, если ей дать её на вход и если эта дата, согласно производственному календарю, установлена как рабочий день, то есть эта субботняя дата присутствует в таблице исключений. Функция должна вернуть её же. Тестируем! Добавляем субботнюю дату (например, 24.06.2023) в таблицу-исключений:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

И проверяем что вернёт функция, если ей дать эту дату на вход:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

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

Почему сразу появилось подозрение на то, что функция будет неправильно работать с рабочими субботами? Потому, что основная логика, реализованная с помощью курсора, выбирает только будни вплоть до 01.01.2027 включительно и то только те из них, которых нет в таблице исключений. А про выходные, установленные как рабочие, забыли:)

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

Для начала дорабатываем с учеником функцию, добиваемся, чтобы она работала правильно для всех случаев и потом упрощаем решение, то есть избавляемся от лишнего кода и, по возможности, от метки. И здесь тоже хорошо бы использовать в именовании входящих параметров функции префикс "p_". В предыдущей части в самом конце я объяснил почему. А в наименовании переменных можно использовать, например, префикс "v_".

Доработали функцию. Получаем:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Тестируем сначала на предыдущем примере:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Отработало корректно. Функции дали на вход субботнюю дату и, так как данная на вход дата присутствует в таблице исключений, то функция эту дату же и вернула. Протестируем на выходном дне, например 02.01.2023:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Так как данная на вход дата была праздничной, то функция вернула первое следующее рабочее число.

Попробуем и на рабочем числе - получаем его же. Все отлично. Пример ниже:

Проверяем работу ученика курса программирования в PL/SQL (ORACLE) - продолжение IT, Программирование, SQL, Oracle, Длиннопост

Разберём поправленную функцию. Сначала можно посмотреть в самый её конец (иногда я с этого и начинаю разбирать незнакомую мне функцию) - функция вернёт то, что будет положено в переменную V_FOUND_DATE ☺️ Именно в неё будет рассчитано результирующее значение.

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

Дальше начинается цикл, бесконечно перебирающий даты (прибавляющий к дате V_FOUND_DATE один день), пока не будет найден день, являющийся рабочим и отсутствующим в таблице исключений или не будет найден выходной, присутствующий в таблице исключений.

Анализируем сначала данную на вход дату до прибавления к ней одного дня. В переменную V_EXISTS_IN_DATES_OF_YEAR кладётся значение 1, если есть в таблице дат исключений дата, которая сейчас анализируется в цикле (в начале анализируется дата, данная же и на вход). Если не удалось начитать в переменную V_EXISTS_IN_DATES_OF_YEAR значение 1, то есть если в таблице исключений DATES_OF_YEAR нет анализируемой даты, то переменной V_EXISTS_IN_DATES_OF_YEAR проставляется значение 0. Данную проверку можно реализовать многими другими способами, здесь приведён один из них.

Далее, зная к какому дню недели относится анализируемая дата и зная, есть ли она в таблице исключений написано условие выхода из цикла: если дата относится к будним дням и она отсутствует в таблице исключений, или же дата является субботой или воскресеньем, но дата занесена в исключения, то дата - рабочее число и её надо вернуть функции. В этом случае работу цикла завершаем (рабочая дата найдена).

Если проверка показала, что дата не рабочая, то к ней прибавляется один день и проверки начинаются заново: опять смотрим есть ли новая дата в таблице исключений и опять смотрим какой теперь день недели у новой даты.

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

Если хочешь стать участником нашего курса по SQL или PL/SQL, то записаться можно на нашем сайте: https://prime-soft.biz/courses

Буду рад оценке статьи лайком, твоим комментариям или если поделишься статьёй с друзьями!

Показать полностью 9
[моё] IT Программирование SQL Oracle Длиннопост
7
39
IliaHohlov
IliaHohlov
1 год назад
Лига программистов

MySQL: зачем нужны MyISAM таблицы, когда есть InnoDB⁠⁠

MySQL: зачем нужны MyISAM таблицы, когда есть InnoDB Mysql, Oracle, SQL, Программирование, IT

MySQL уверенно занимает второе место в мире по популярности среди реляционных СУБД, поэтому сегодня я решил написать немного про неё, вернее про типы её таблиц.

Всем, кто разрабатывает в MySql хорошо известно, что при создании таблиц в этой СУБД необходимо выбирать их тип (ещё это называют "движок"). В оригинале эта характеристика таблиц называется (storage) engine.

Есть два основных типа таблиц в MySQL (два основных storage engine): MyISAM и InnoDB. Примечательно, что в старых версиях СУБД, по-умолчанию, при создании таблиц, предлагалось их создавать с типом MyISAM. Начиная с MySQL 8.0 теперь по-умолчанию предлагается тип InnoDB.

Главным отличием таблиц этих двух типов является то, что таблицы MyISAM не поддерживают транзакции. Операции по вставке, изменению или удалению данных нельзя отменить (ROLLBACK не откатывает выполненные команды). Тип MyISAM обязательно указывают для таблиц, данные в которых должны быть вставлены/изменены/удалены вне зависимости от состояния основной транзакции, так как эта основная транзакция выполняющейся программы в некоторых случаях может быть отменена (например, в случае ошибки или другой непредвиденной ситуации, и вместе с откатом транзакции все данные во всех таблицах должны вернуться на место).

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

Программисты стараются делать программное обеспечение работающим всегда без ошибок, но в случае их возникновения, хотели бы иметь сохранённые данные о последовательности выполненных пользователем действий и состояния обрабатываемых данных. Эту информацию нужно сохранить в специальные таблицы (таблицы логирования) так, чтобы при откате изменений всех таблиц, данные в таблицах логирования тоже не откатились. В разных СУБД эта возможность реализуется разными способами. В ORACLE, например, используются АВТОНОМНЫЕ ТРАНЗАКЦИИ. То есть сохранение логируемых данных делается в отдельной независимой от главной транзакции (в автономной) и при откате/отмене главной транзакции, данные, вставленные отдельной (автономной) транзакцией, не будут откачены, а будут сохранены!

В MySQL нет возможности создавать автономные транзакции, но зато можно создать такие таблицы, данные из которых не откатывались бы при выполнении ROLLBACK - это таблицы с типом MyISAM.

Буду рад твоему лайку, если статья понравилась.

Напомню, что у нас есть два мощных курса по SQL и базам данных: общий, где ты научишься всему с нуля (или восполнишь множество пробелов), научишься писать запросы, работать с базами данных на примере ORACLE, и есть курс по программированию в PL/SQL (ORACLE). Он уже только для "ораклистов". В нем мы научимся не только кодировать на PL/SQL, но и разрабатывать сложные алгоритмы и пользоваться всеми средствами, что даёт ORACLE.

Показать полностью
[моё] Mysql Oracle SQL Программирование IT
6
9
dexsys
dexsys
2 года назад
Лига программистов
Серия Блеск и нищета технологии EBR

Блеск и нищета технологии Edition-based redefinition в Oracle Database: часть 2. Нищета⁠⁠

«Внедрять или не внедрять?» - вот в чем вопрос

В предыдущей части статьи мы познакомились с технологией Edition-based redefinition (EBR) и поговорили о том, для чего она используется и какими плюсами обладает. Если вы еще не знакомы с EBR, то читайте первую часть статьи.

Сегодня я расскажу вам о трудностях, с которыми наша команда столкнулась в ходе внедрения, разработки и эксплуатации EBR, минусах и болях технологии и помогу понять, в каких случаях ее стоит или не стоит внедрять.

Блеск и нищета технологии Edition-based redefinition в Oracle Database: часть 2. Нищета IT, Программирование, Опыт, Oracle, Длиннопост

С чего все началось?

В 2020 году руководство банка предложило внедрить EBR для нашей системы с целью уменьшения общегодового Downtime и получения возможности быстро и безболезненно исправлять критичные ошибки.

Перед внедрением мы провели исследование,чтобы узнать, насколько уменьшится общегодовое время простоя системы. Вычисленное уменьшение Downtime выглядело прилично, внедрению EBR дали зеленый свет.

Нам помогали коллеги, уже работавшие с этой технологией. Но система, которую они использовали, была меньше по объему данных и хранимого кода, поэтому перевести нашу систему на EBR стало вызовом для обеих команд. Весь процесс занял у нас полгода, как это было - сейчас расскажу.

Отмечу, что EBR до сих пор является достаточно сырой, а в 2020 году с нее практически капало, так что мы заводили задачи на Oracle при очень некорректной работе технологии. Насколько я знаю, у EBR до сих пор существуют ограничения:

  • не более 2000 редакций;

  • зависимость редакций друг от друга линейная.

Блеск и нищета технологии Edition-based redefinition в Oracle Database: часть 2. Нищета IT, Программирование, Опыт, Oracle, Длиннопост

Слева ожидания от ветвления редакций EBR, справа реальность

Начало работы. Первые трудности

Для работы с EBR мы установили несколько патчей от Oracle. Патч с исправлением некоторых ошибок нам пришлось ждать очень долго, из-за этого часть задач мы не успели сделать в срок.

Также, в процессе внедрения EBR, мыпоменяли джобы установки патчей в Jenkins (Если вам интересно как работают процессы CI/CD в нашем банковском проекте - пишите в комментарии, я расскажу отдельно), чтобы установка автоматически происходила с созданием редакций EBR.

Самой главной нашей задачей было подготовить саму базу для внедрения, так как для корректной работы EBR существуют определенные требования к объектам и к процессу разработки:

  • запрещено изменять объекты в родительских редакциях, для которых нет актуализированных версий в дочерних. В этом случае необходимо вначале актуализировать объект в дочерней редакции, которая является непосредственным потомком текущей;

  • перед тем как выдать грант на объект, его нужно актуализировать в текущей редакции. Если пакет нельзя перекомпилировать (в случае, если выполняем выдачу грантов вручную на горячей базе), то для выдачи гранта необходимо определить редакцию, в которой объект был последний раз актуализирован, после чего дать ему грант в этой редакции. Для этого мы создали специальную функцию;

  • для компиляции большого числа невалидов нам пришлось написать функцию валидации объектов, которая работает только с конкретной редакцией.Старую функцию, которая делала это в параллели, мы перестали использовать, так как она компилировала объекты во всех редакциях. Во время разработки на dev-среде необходимо запускать функцию валидации, если пакет используют связанные объекты;

  • при непосредственной разработке на базе необходимо запускать процедуру валидации объектов (см. выше) после актуализации пакетов, на которые могут ссылаться другие пакеты, иначе это может привести к их развалу через некоторое время;

  • неверсионируемые объекты не могут ссылаться на версионируемые, поэтому функциональные индексы для таблиц необходимо создавать, используя функции в специальных noneditionable пакетах;

  • editionable abstract data type (ADT) не могут быть evolved (таким образом, типы в editioned схемах необходимо редактировать через drop/create);

  • Все новые объекты PL/SQL при разработке обязательно должны создаваться как Editionable.

Также, по-хорошему, при использовании EBR, для каждой таблицы должно создаваться Editionable View, которое будет использоваться в объектах PL/SQL, так как таблица – это всегда Noneditionable объект, и, если этого не сделать, то в некоторых редакциях объекты будут ссылаться на несуществующие столбцы.
Расскажу на довольно распространенном в сети примере:

Предположим, у нас есть таблица TPERSON, в которой есть поле FULL_NAME, где хранятся ФИО клиентов. Но появилась задача разделить фамилию, имя и отчество на разные столбцы SONAME, NAME и MIDDLE_NAME. Если мы добавим данные столбцы, то пакеты в предыдущих редакциях станут невалидными. Для того, чтобы этого не происходило, необходимо, чтобы пакеты не обращались напрямую к таблице, а обращались к представлению VPERSON. Например, для старых редакций представление будет содержать следующий код:

Create or replace view VPERSON as
Select full_name, birthday, ... from TPERSON;

А для новых редакций:

Create or replace view VPERSON as
Select name, soname, middle_name, birthday, ... from TPERSON;

В дальнейшем мы помечаем столбец FULL_NAME как UNUSED. И этот столбец может быть удален при техническом обслуживании системы, когда мы уже точно будем знать, что откат на редакции, которые его используют, не будет произведен.

Следующей проблемой стало то, что в нашей системе много кода, и большую его часть написал вендор. И на предложение переделать все таблицы на Editionable view нам выкатили счет, сравнимый с ВВП небольшого города, и срок в пять лет. Такой вариант нас не устроил, поэтому изменения, требующие модификации таблиц, мы продолжаем производить с Downtime, как раньше. Благо, такие изменения производятся нечасто.

В итоге, на EDITIONABLE VIEW в старом коде мы решили не переходить, но некоторые преобразования все же сделать пришлось:

  • мы вынесли все функции, используемые в функциональных индексах, в отдельный noneditionable пакет и перестроили индексы;

  • написали новые правила разработки и обучили разработчиков;

  • позаимствовали и доработали функции выдачи грантов, валидации объектов, проверки редакций и логирования у помогавшей нам с переводом системы команды;

  • определили, какие объекты должны быть noneditionable, а какие нет. Noneditionable, например, были типы, которые отвечают за взаимодействие с другими системами;

  • пересоздали публичные синонимы, такие как editionable. Если этого не сделать, то синоним может инвалидироваться. Попытка его перекомпилить ничего не дает, а если попытаться удалить в редакции, то он обозначится как non-existance, и пересоздать его не получится. Это одна из проблем, возникшая на тестовых контурах, и решить ее получается только удалением из корневой редакции ORA$BASE

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

Мы продолжили тестировать и исследовать. Сделали множество деплоев, проверяли как это будет работать. Заметили дополнительно следующие моменты:

  • для того, чтобы PL/SQL developer начал открывать пакеты из новой редакции по умолчанию, его необходимо перезапустить. Если этого не делать, то новые окна открываются в старой редакции;

  • объекты могут развалиться, если существуют несоответствия временных меток компиляции связанных объектов. Для обнаружения этих проблем мы сделали специальное представление VTIMESTAMP_MISMATCHES, которое сравнивает timestamp у связанных объектов и выводит их в случае несоответствия. Проблемные объекты, найденные с помощью данного представления, подлежат компиляции (для пакетов необходимо актуализировать и тело, и спецификацию в одной и той же редакции) и последующей валидации с помощью написанной процедуры

Запуск

Спустя 6 месяцев работы мы поняли, что готовы запустить и установить первый патч на продуктив с использованием EBR. И вот оно чудо. Все прошло гладко! Гладко на первый взгляд… Уже на следующий день мы словили ошибку - в какой-то момент пакеты развалились. В дальнейшем мы отловили еще море ошибок, по некоторым писали в службу поддержки Oracle, а некоторые задачки системы обеспечили бессонные ночи всей команде. Список ошибок, их описание и методы решения, которые мы нашли, смотрите в таблице ниже.

Описанные выше в статье проблемы я не стал включать в таблицу, так как с ними все уже более-менее ясно. К сожалению, мы не сразу начали вести реестр ошибок EBR, и, если вы знаете другие ошибки или способы решения, которые сработали бы лучше, - пишите в комментарии.

Блеск и нищета технологии Edition-based redefinition в Oracle Database: часть 2. Нищета IT, Программирование, Опыт, Oracle, Длиннопост
Блеск и нищета технологии Edition-based redefinition в Oracle Database: часть 2. Нищета IT, Программирование, Опыт, Oracle, Длиннопост

Чаще всего мы не имели возможности четко анализировать ошибки, связанные с EBR, так как решать их нужно было срочно, а на тесте они не воспроизводились, и, в связи с этим, мы не могли предметно пообщаться по этому поводу со службой поддержки Oracle.

Сейчас мы используем установку с EBR для внеочередных патчей (исправление критичных багов), если не планируется планового Downtime, и если это не слишком маленькое изменение. Например, когда требуется обновить один пакет, затрагивающийся одним отчетом, запускаемым раз в день, то смысла в создании новой редакции не возникает. На тестовые, за исключением стендов регрессионного тестирования, и разработческие стенды мы ничего с EBR не устанавливаем. Точнее, не создаем новые редакции, так как в процессе работы возникали путаницы. К примеру: тестировщик не перезапустил PL/SQL developer, заметил в системе ошибку и решил посмотреть еще и на код, но увидел код из старой редакции. И, соответственно, потратил больше рабочего времени, чтобы разобраться в причине ошибки.

Что в итоге?

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

Возвращаясь к главному вопросу этой статьи: «Внедрять или не внедрять?», я отвечу так: технология EBR будет вам полезна, если

1) у вас не так много программного кода, и вы сможете переписать взаимодействие со всеми noneditionable объектами;

2) у вас не так часто происходит выход новых версий, так как лимит в 2000 редакций при деплое несколько раз в день можно исчерпать довольно быстро;

3) если вы нечасто используете функциональные индексы;

4) если систему вы пишете полностью сами и не зависите от вендора, который будет запрашивать большие деньги за разработку «по-новому»;

5) и если у вас не так много интеграций с другими системами или, хотя бы, интеграция настроена нормально, так, что системы могут переподключаться без проблем и Downtime

И однозначное «внедрять!»: если у вас нет ни одной строчки кода. Смело внедряйте EBR на новые проекты.

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

Автор статьи: Александр, разработчик Pl/SQl, линейный руководитель гильдии разработчиков DexSys

Если у вас остались вопросы или примечания к этой статье - пишите в комментарии, я с радостью пообщаюсь с вами на эту тему:)

Показать полностью 4
[моё] IT Программирование Опыт Oracle Длиннопост
3
13
dexsys
dexsys
2 года назад
Лига программистов
Серия Блеск и нищета технологии EBR

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск⁠⁠

Сейчас бесшовные обновления – это одно из главных требований для многих систем, и системы, использующие базы данных Oracle, не являются исключением. В этой статье я расскажу о технологии Edition-based redefinition, которая создана для решения данной проблемы, а также о трудностях, с которыми мы столкнулись в процессе внедрения и использования этой технологии.


Данная статья может пригодиться тем, кто работает с высоконагруженными системами, использующими СУБД Oracle и хочет начать обновлять их, не отключая пользователей.


Начну с того, что мы используем Edition-based redefinition (далее EBR) в одной из банковских систем уже около двух лет и смогли заметить как достоинства, так и недостатки. Технология была внедрена в 2020 как средство процесса внесения изменений в схему данных, позволяющее изменять объекты в БД без вмешательства в работу текущих пользователей.


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


Что же такое EBR?


Edition-based redefinition – это технология баз данных Oracle, позволяющая использовать несколько версий объектов PL/SQL, представлений и синонимов в одной схеме, что позволяет выполнять обновления приложений базы данных без Downtime, при этом не затрагивая работу текущих пользователей.


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


Редакция или Edition - это, по сути, метка версии, которую можно назначить всем редактируемым (Editionable) объектам в схеме. Начиная с версии 11.2 в Oracle можно заводить разные редакции (editions), каждую со своим набором хранимых объектов и возможностью переключаться между ними. Редакции зависят друг от друга, а именно находятся в отношениях родитель (предок)-потомок. Причём, каждая редакция может иметь только одного прямого потомка и одного прямого родителя. Все редакции являются потомками редакции «ORA$BASE», которая создается при включении EBR. На рис. 1. приведен пример редакций на базе. Как можно увидеть, изначально была редакция «ORA$BASE», от которой была создана редакция «RT20_1» в качестве потомка, а далее, уже от неё редакция «RT20_2» и т.д. То есть, последовательность редакций имеет линейную структуру. Одна из редакций является редакцией по умолчанию, т.е. это та редакция, к которой подключается пользователь, если он не указал редакцию специально.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 1. Editions


При создании новой редакции на основе старой, она наследует все определенные в родителе объекты. На практике, в целях оптимизации, Oracle копирует объекты в новую редакцию только при их изменении, данная стратегия носит название copy-on-change. Процесс копирования объекта в наследуемую редакцию называется актуализацией, по факту - это пересоздание данного объекта в дочерней редакции. Если объект актуализирован в текущей редакции, при его вызове будет загружена текущая версия. Если объект не актуализирован в текущей редакции, при его вызове будет загружена версия из последней редакции, где он актуализирован. Актуализировать объект можно скомпилировав его с определенными опциями: ALTER ... COMPILE REUSE SETTINGS.


Рассмотрим пример на рис.2. Пакет CONTRACT определен в редакциях ORA$BASE, RT20_1 и RT20_3, а в редакции RT20_2 используется пакет CONTRACT из ближайшей родительской редакции, т.е. из редакции RT20_1. Для того чтобы актуализировать пакет CONTRACT в редакции RT20_2 нужно выполнить в данной редакции команду ALTER CONTRACT COMPILE REUSE SETTINGS

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 2. Пример использования пакета в разных редакциях


Не все объекты баз данных Oracle можно создавать в разных редакциях и версионировать. Некоторые объекты существуют в единственном экземпляре и используются для всех редакций одновременно, такие объекты называются noneditionable. Примером такого объекта являются таблицы, поэтому при модификации таблиц некоторые объекты в некоторых редакциях могут инвалидироваться. Для решения этой проблемы обычно используются Editionable views, подробнее я расскажу во второй части этой статьи. Какие же объекты являются Editionable? Это все объекты PL/SQL, а также Views и Synonym, см. рис. 3.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 3. Editionable объекты


Теперь рассмотрим пример установки патча с EBR. Представьте, что Петр, Инна и Иван работают в системе, использующей БД Oracle, в редакции T20_1_1, которая на данный момент является редакцией по умолчанию, а Семен и Полина на обеде, см. рис. 4. На рисунке CONTRACT, PERSON, CLIENT - примеры пакетов.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 4. Пример установки патча с EBR


Начинается установка патча T20.1.2, и создается новая редакция T20_1_2, см. рис. 5.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 5. Пример установки патча с EBR


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

.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 6. Пример установки патча с EBR


После деплоя патча, редакция T20_1_2 устанавливается редакцией по умолчанию, и, когда Семен и Полина возвращаются с обеда, они подключаются уже к вновь созданной редакции, см. рис. 7.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 7. Пример установки патча с EBR


У Ивана завершается формирование отчета, и он подключается к редакции T20_1_2, см. рис. 8.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис.8. Пример установки патча с EBR


Через некоторое время и остальные подключаются к новой редакции, и уже никто не работает в старой, см. рис. 9.

Блеск и нищета технологии Edition-based redefinition в Oracle Database Часть 1. Блеск IT, Программирование, Oracle, Опыт, Длиннопост

Рис. 9. Пример установки патча с EBR


Таким образом, пользователь подключается к БД к определенной редакции и работает только с ее объектами, и, в то же самое время, другие пользователи могут менять объекты в других редакциях, никак не затрагивая первого. Обобщив информацию, можно сказать, что в общем плане установка происходит следующим образом:


1) пользователи работают в редакции E_OLD_EDITION;

2) создается новая редакция E_NEW_EDITION, в ней создаются/меняются/удаляются объекты, не влияя на существующих пользователей;

3) новая редакция E_NEW_EDITION становится общей редакцией БД по умолчанию;

4) все пользователи переключаются на новую редакцию.


Может сложиться мнение, что EBR - это чудесная технология, которая позволяет обновлять БД, не создавая никаких проблем и дает возможность для быстрого отката к предыдущей редакции в случае сложных ошибок, но, к сожалению, это не соответствует действительности. Проблемы возникают на разных этапах. Об этом читайте в следующей части, мы скоро ее выложим:)

Показать полностью 9
[моё] IT Программирование Oracle Опыт Длиннопост
2
22
IliaHohlov
IliaHohlov
2 года назад
Лига программистов

Решаем задачи по SQL и отвечаем на вопросы с нашего Телеграм-канала⁠⁠

[моё] SQL Oracle Задача Программирование Собеседование Вопрос Видео YouTube
0
Партнёрский материал Реклама
specials
specials

Как бросить курить и не сорваться: инструкция от тех, кто смог⁠⁠

Выходишь покурить на пять минут, а возвращаешься через 10 лет: с хрипом, тремя неудачными попытками бросить и пачкой мятных жвачек в кармане. Это как плохой сериал: тянется слишком долго, а финал все равно разочарует. Но выйти из этого сценария можно и даже не обязательно драматично. Мы собрали истории тех, кто боролся с зависимостью ради любимого человека, здоровья или лучшей жизни.

Как бросить курить и не сорваться: инструкция от тех, кто смог Курение, Борьба с курением, Зависимость, Telegram (ссылка), ВКонтакте (ссылка), Длиннопост

История 1 — отражение

@holoroad

Маленькая дочка почти научилась ходить и всюду телепалась за мной. Я не курил при ней. Ходил на балкон, а она, прильнув к стеклу, смотрела на меня и ждала, когда я докурю и выйду к ней. И в какой-то момент она начала повторять за мной вот эти движения. Маленький человечек, ей было года полтора или два, прикладывала воображаемую сигарету к губам, а потом делала вид, что выпускает дым. И весело так на меня смотрела, сквозь стекло балконной двери. Ей нравилось все, что со мной связано, и она подражала всем моим действиям. Я курил уже двадцать лет и, конечно, делал множество попыток бросить до этого. Но в этот раз у меня в первый раз появилась по-настоящему важная причина бросить. Это важно для человека, который безгранично мне доверяет. С тех пор прошло почти десять лет, в течение которых я не сделал ни одной затяжки.

Решение бросить курить — одно из лучших, которое вы можете принять для своего здоровья, будущего и близких. Но справиться с зависимостью только потому, что «это вредно» будет тяжело. А вот если хотите не задыхаться, поднимаясь по лестнице, или волнуетесь за своего ребенка, которые вдыхает табачный дым, — уже другое дело.

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

История 2 — список

@maxneb

Беременность жены, рождение ребенка, здоровье, деньги — ничего не было веским поводом бросить окончательно. Постоянно срывался. Помогло составить список, что теряю и что получаю от сигарет, и понимание, что хотя бы одна затяжка — и все насмарку: пару месяцев буду курить. Только список и его осознание. Для каждого он свой. И постоянное обращение к нему. После составления списка курил еще. Но он как заноза висел в голове с вопросом «зачем?»... Так, что-то щелкнуло и сейчас не тянет. Иногда тянет физически, но осознание бесполезности курения сразу глушит позывы. Полгода, полет нормальный...

Бросать на авось — идея, которая подойдет не всем. Нужно понимать, что делать в трудные моменты:

  • Определите дату отказа. Подготовьтесь морально, уберите сигареты, зажигалки, пепельницы.

  • Замените привычки. Сигарету в руках можно заменить орешками, палочками морковки, жвачкой или даже кубиком льда.

  • Займите время. Вспомните, чем вы любили заниматься: спорт, хобби, прогулки.

  • Планируйте, что делать при тяге. Она длится всего 3–5 минут. Дыхательные практики или звонок другу помогут пережить сильное желание закурить.

  • Откажитесь от «наградных сигарет». Одна затяжка и вы откатитесь назад.

Можно бросить резко, «с понедельника», или постепенно, снижая количество сигарет до нуля. Главное — определиться и не отступать.

История 3 — переключение

@Spaka

45 лет, стаж 30. Пытался завязать много раз, потом понял, что после каждой попытки бросить, курить начинаешь больше. Как ребенок, которому не дают вкусняшку, а она случайно попала ему в руки. Из чего мозг сделал вывод: не уверен — не бросай. Потом стал замечать, что организм уже стал сам просить перестать курить. По утрам было очень неприятно во рту, удовольствие после сигареты стало короче, а негатив, приходящий следом, ощутимее: неприятные ощущения в горле, боли миндалин, страх схватить онкодиагноз. Хотя врачи говорили, что все ок, в голове-то гоняешь мысли. Я решил попробовать обмануть сам себя. Не делать из процесса отказа какого-то события. Бросить так, как будто это и должно было произойти, но ты не знаешь когда. Про себя помолился, как сумел, и попросил помощи, хитро прищурил глаз и в момент, когда забыл купить про запас (оставалась пара штук в пачке), просто перестал курить. Мне теперь даже странно, как я раньше это делал. Так и живу почти два года. Кстати, раньше в момент завязки курящих ненавидел, дым был очень противен, до тошноты. Теперь все равно. Присоединяйтесь ;)

Есть несколько стратегий отказа от курения:

  • Резкий. Эффективный и решительный подход.

  • Постепенный. Сначала — меньше сигарет, потом — меньше затяжек. И так до нуля.

  • Психологическая замена. Каждая сигарета — это ритуал. Найдите для каждого из них «здоровую замену».

  • Медикаментозная терапия. При сильной зависимости врач может порекомендовать никотинозаместительную терапию (пластыри, таблетки, жвачки) или препараты, которые помогают справиться с синдромом отмены. Но любые лекарства принимаются только по рекомендации специалиста.

Каждый, кто хочет оставить зависимость в прошлом, может обратиться в центры здоровья, которые работают при поддержке нацпроекта «Продолжительная и активная жизнь», и получить необходимую помощь специалистов. Адреса доступны на официальном портале Минздрава России о здоровье: takzdorovo.ru. Также можно позвонить на горячую линию по отказу от зависимостей 8 800 200-0-200.

История 4 — форма

Аноним

Курила электронки 2 года как замену обычным сигаретам. Думала, что это не так дорого, не так вредно да и для девушки вроде более привлекательно: не пахнут волосы и руки. А потом решила привести свое тело в форму. Стала ходить в зал и поняла, что задыхаюсь на первом же упражнении, хотя женщины гораздо старше меня бодрячком. Было очень тяжело слезть. Друзья советовали заменять сигаретами. А потом уехала в отпуск в страну, где нельзя покупать электронки, отвлеклась, и после возвращения уже не тянуло. Даже на тусовках, где все дымят.

За модными гаджетами и фруктовыми ароматами скрывается химическая бомба, разрушающая организм быстрее, чем обычные сигареты. Электронные сигареты активно продвигаются производителями как «безопасная» альтернатива сигаретам. Но курение вейпа может обернуться серьезными проблемами: от кашля и одышки до поражения сосудов и дыхательных путей.

«Особую тревогу вызывает рост потребления табачных изделий и электронных сигарет. Согласно исследованию, проведенному в нашем Центре, 36,8% курильщиков потребляют одновременно и табак, и электронные сигареты. Среди молодежи в возрасте 25-39 лет этот показатель превышает 45%. Электронные никотиносодержащие и безникотиновые устройства поражают сердце, сосуды, дыхательную систему и ДНК организма не менее пагубно, чем традиционные сигареты, а в ряде случаев способны вызывать острые состояния, включая сосудистые поражения и летальные исходы» – рассказывает руководитель Центра профилактики и контроля потребления табака НМИЦ терапии и профилактической медицины Минздрава России Маринэ Гамбарян.

История 5 — пари

@kernima

Вроде не было никаких серьезных предпосылок, чтобы бросить. Да и чтобы начать: просто все вокруг курили, думал, это сейчас тренд. А потом как-то сидели в баре и решили поспорить с некурящим другом. Он затирал, что моя жизнь из-за электронки катится ко дну, я — доказывал, что это всего лишь маленькая шалость. В общем поспорили на пять тысяч. Чтобы было легче и можно было отвлечься, начал бегать по утрам. Друг проиграл, а я возвращаться к курению не стал. Вдруг снова у еды появился вкус, я начал высыпаться и больше не устаю на втором лестничном проеме. Короче, советую!))

Сульфат никотина, один из компонентов электронных сигарет, раньше использовали как пестицид, но запретили из-за высокой токсичности. Жидкость для «электронок» содержит и опасные химикаты вроде пропиленгликоля, ацетальдегида и акролеина — промышленных веществ, способных вызывать воспаления, поражения органов и мутации клеток. Ароматизаторы, создающие иллюзию безвредности, на деле могут привести к более тяжелой интоксикации, чем при курении сигарет. А еще вейпы содержат не природный, а синтетический никотин — солевой. Он быстрее всасывается, дольше выводится и вызывает зависимость стремительнее.

Когда организм отвыкает от никотина, бывает нелегко: люди становятся раздражительным и нервозными, быстро устают, возникают сухость во рту, кашель, трудности с концентрацией. Важную роль в борьбе с этими симптомами играет питание. В рацион стоит включить овощи, фрукты, орехи, семечки. Клетчатка способствует очищению организма от токсинов. Важно питаться сбалансировано: с достаточным количеством белков, жиров, углеводов и витаминов. Лучше временно исключить продукты, усиливающие удовольствие от табака (например, мясо), а также отказаться от алкоголя, кофе и крепкого чая. Они могут спровоцировать желание закурить. А вот большое количество воды, травяных чаев и настоев облегчит очищение организма и поможет справиться с сухостью во рту.

История 6 — связь

Аноним

Устал курить, понял, что мне это мешает заниматься спортом и в целом комфортно себя чувствовать. Пошел через ассоциации: покурил во время головной боли, и потом через самовнушение дал себе установку, что голова болела от курения. Звучит странно, конечно, но это сработало. Никотиновую зависимость снижал постепенно через редкое курение кальяна (2-3 раза в неделю с последующим уменьшением).

Чтобы добиться успеха в отказе от курения, стоит подготовиться. Обязательно расскажите о своем решении друзьям и близким — поддержка со стороны очень важна. Если вы уже предпринимали попытки бросить, вспомните, что тогда пошло не так, и постарайтесь не повторять этих ошибок.

Разберитесь, что именно тянет вас к сигарете: скука, стресс, привычка? Когда вы это осознаете, будет легче подобрать альтернативные действия — прогулку, книгу, разговор с близким. Учитесь распознавать моменты, когда особенно хочется закурить, и переключаться на что-то другое. Можно подключиться к программам или группам поддержки — это поможет не сдаваться. И главное: уберите из дома все сигареты.

История 7 — вершина

Аноним

Поднимался с сыном по Пушкинской тропе на гору Железная. Мне лет сорок пять было, идем общаемся, сын бегает туда-сюда. Ну идем короче, а сзади нас догоняет семейная пара, мирно о чем-то щебеча между собой. Догнали и обходят. И так спокойно удаляются… Все бы ничего, но им лет по шестьдесят, если не больше. Я попробовал в их темпе, но задыхаться стал. Короче, поднялся я на гору, спустился, смял пачку и выкинул в мусорную урну. Вот уже 13 лет не курю. Стаж 27 лет.

Курение — это быстро развивающаяся зависимость, схожая по механизму с наркотической. Никотин воздействует на мозг, вызывая кратковременное улучшение настроения, за которым следует упадок сил и потребность в новой дозе. Со временем формируется толерантность, и прежние негативные реакции организма на табак ослабевают. Физическая зависимость сочетается с психологической: сигарета начинает ассоциироваться с отдыхом, решением задач, рутиной. Курение укрепляется поведенческими шаблонами: кофе, вождение, паузы на работе уже не мыслимы без сигареты.


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

Хорошая новость в том, что вы не одни. В сообществе «Давай бросать» (ВКонтакте и мессенджере Telegram), который работает при поддержке нацпроекта «Продолжительная и активная жизнь» знают, каково бороться с триггерами, искать замену привычке и удерживать себя от срыва. Здесь делятся историями тех, кто смог, поддерживают тех, кто только начал, и помогают разобраться в главном: как пережить отказ без мучений.

Социальная реклама. АНО «Национальные приоритеты», ИНН: 9704007633

Показать полностью
Курение Борьба с курением Зависимость Telegram (ссылка) ВКонтакте (ссылка) Длиннопост
14
IliaHohlov
IliaHohlov
2 года назад
Лига программистов

Как обойти ограничение в 1000 элементов для оператора IN в ORACLE⁠⁠

Как обойти ограничение в 1000 элементов для оператора IN в ORACLE SQL, Задача, Oracle, Ограничения, Программирование, Длиннопост

Рано или поздно, каждый специалист, работающий с базами данных ORACLE, наталкивается на ограничение максимального количества элементов для оператора IN:


SELECT *

FROM VOUCHERS
WHERE CLIENT_ID IN (28, 45, 46, 102,...)


В ORACLE для оператора IN в скобках можно перечислять не более 1000 элементов через запятую.


Иногда этого количества может не хватать. Что делать в этом случае?

Во-первых, давай рассмотрим случай когда такого большого количества может не хватать? Не каждый день составляешь запрос и вручную перечисляешь через запятую тысячу элементов, верно? :)


На самом деле, SQL-запросы могут формировать и программы (прямо налету), а не люди. Например, в некотором приложении пользователь нажал кнопку, согласно которой должны выбраться все счета из таблицы VOUCHERS базы данных, но именно счета видимых в данный момент на экране (а список клиентов определённым образом отфильтрован).

И программа динамически строит запрос, как я и написал выше, где в скобках для оператора IN перечисляются идентификаторы видимых на экране клиентов. И далее этот запрос для отчёта или для другой экранной формы должен выбрать данные.

SQL-запросы с большим количеством элементов для оператора IN могут составляться не только программно, но и человеком. Однажды написанный SQL запрос с оператором IN/NOT IN, может со временем, дорабатываться и включать в себя всё новые элементы. Через какое-то время количество элементов у оператора IN/NOT IN может превысить установленный Ораклом лимит и такой запрос не сможет быть выполненным.


Как-то одному из разработчиков ORACLE задали вопрос: почему именно 1.000 элементов и не планируется ли в будущих выпусках ORACLE увеличить этот лимит?
На что разработчик ответил: а какой бы Вы хотели иметь лимит? 2.000, 5.000, или, может быть, 100.000? Вы можете написать SQL более оптимально и не придётся перечислять такое большое количество элементов для оператора IN.

Как можно поправить SQL запрос, убрав ограничение в 1.000 элементов?


Способ первый:

Использование (временной) таблицы. (Временная) таблица (пусть называется TMP_TABLE) заполняется значениями (например, идентификаторами клиентов) и далее они используются в ограничении выборки путём INNER JOIN-а с этой таблицей или её также можно использовать в IN:


Сначала заполняем (временную) таблицу:

INSERT INTO TMP_TABLE
(CLIENT_ID)
VALUES
(28);

INSERT INTO TMP_TABLE
(CLIENT_ID)
VALUES
(45);
...

И далее используем её для ограничения вывода данных из основной таблицы:


SELECT v.*
FROM VOUCHERS v
INNER JOIN TMP_TABLE t
ON v.CLIENT_ID = t.CLIENT_ID


Или так:


SELECT *
FROM VOUCHERS
WHERE CLIENT_ID IN (SELECT CLIENT_ID FROM TMP_TABLE)


Способ второй:

Использование нескольких операторов IN:


SELECT *
FROM VOUCHERS
WHERE ( CLIENT_ID IN (28, 45, 46, 102,...)
OR CLIENT_ID IN (1789, 1800,..) )


Есть и ещё способы обойти ограничения в 1.000 элементов оператора IN в ORACLE, о них ты можешь почитать тут.


Программы, строящие SQL-запросы динамически и с применением IN, контролируют сколько элементов размещается в скобках через запятую. При большом количестве элементов, они будут размещены в нескольких операторах IN, соединённых между собой оператором OR (второй способ).


Буду рад, если оценишь статью лайком и подпишешься на мой канал, если ещё не подписан.

Показать полностью
[моё] SQL Задача Oracle Ограничения Программирование Длиннопост
12
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии