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

Сноуборд

Спорт, Аркады, На ловкость

Играть

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

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

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

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

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

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

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

Oracle + SQL

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

IT Программирование Собеседование База данных Mysql Postgresql Обучение Программист Python Все
37 постов сначала свежее
10
IliaHohlov
IliaHohlov
1 год назад
Лига программистов

Разница между VARCHAR и VARCHAR2 в ORACLE⁠⁠

Разница между VARCHAR и VARCHAR2 в ORACLE SQL, Oracle, Собеседование, База данных, Вопрос, Задача, Длиннопост

Здравствуйте, друзья!

Всем хорошего понедельника! Предлагаю повторить разницу между типами данных VARCHAR и VARCHAR2 в ORACLE. А заодно расскажу ещё несколько интересных фактов!

Оба типа мы можем использовать в качестве типа данных при создании столбцов в таблице.

Тип VARCHAR2 - это аналог VARCHAR (тоже служит для хранения текстовой информации в столбце) и есть только в СУБД ORACLE.

ORACLE взял за основу VARCHAR и создал у себя такой же тип данных, но немного оптимизировал его.

Итак, VARCHAR2 есть только в ORACLE, то есть это Оракловый тип данных, аналогичный стандартному VARCHAR. Преимущество VARCHAR2 в скорости: поиск по нему ведётся быстрее. Ещё одно преимущество VARCHAR2: с версии ORACLE 12с значительно увеличен максимальный размер, который можно указывать для этого типа данных.

Для VARCHAR максимальное количество символов 4.000.
Для VARCHAR2 максимальное количество байт 32.767.

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

CREATE TABLE CLIENTS (
ID  NUMBER,
NAME  VARCHAR(100),
INN  VARCHAR(12)
)

Для VARCHAR мы указываем в скобочках именно количество символов, а для VARCHAR2 - количество байт. По стандарту, для неюникодных баз данных, 1 байт - это один символ. Но для юникодных баз данных 1 символ кодируется двумя байтами, поэтому для VARCHAR2 в юникодных базах данных нужно указывать размер в два раза больший, чем размер символов, который требуется иметь возможность хранить в столбце. То есть наш пример пришлось бы переделать на:

CREATE TABLE CLIENTS (
ID  NUMBER,
NAME  VARCHAR2(200),
INN  VARCHAR2(24)
)

Итак, повторим: для VARCHAR в скобочках указывается максимальное количество символов, которое можно хранить в столбце, а для VARCHAR2- максимальное количество байт. Для русского, английского языка 1 байт = 1 символ. ORACLE позволяет с помощью NLS параметров указать другую единицу измерения максимальной длины данных. То есть можно настроить, что для VARCHAR2 тоже будет указываться количество символов, а не байт. Можно настроить как удобно!

И ещё, при объявлении столбца с типом данных VARCHAR2, можно указывать даже явно единицу измерения:

CREATE TABLE CLIENTS (
ID  NUMBER,
NAME  VARCHAR2(100 BYTE),
INN  VARCHAR2(12 CHAR)
)

И напоследок очень важная деталь: для типа данных VARCHAR2 понятие пустой строки и NULL.... это одно и тоже! То есть если в некотором столбце типа данных VARCHAR2 пустая строка, то это NULL. Всех разработчиков это когда то застигает врасплох! Ведь согласно ANSI стандарту пустая строка и NULL - это разные вещи! Но не для VARCHAR2! Дело в том, что ORACLE придумал тип данных VARCHAR2 до того, как появился стандарт ANSI, регламентирующий это. И теперь приходится с этим жить!

Ещё больше полезного и интересного в моём Телеграмм-Канале: https://t.me/sql_oracle_databases

Всем хорошего начала рабочей и учебной недели!

Показать полностью
[моё] SQL Oracle Собеседование База данных Вопрос Задача Длиннопост
4
11
IliaHohlov
IliaHohlov
1 год назад
Офисные будни

SQL задачи на поиск ошибок⁠⁠

IT Собеседование Задача Пример База данных Урок SQL Ms SQL Oracle Видео YouTube
0
8
IliaHohlov
IliaHohlov
1 год назад
Лига программистов

Программирование в PL/SQL (ORACLE). Массивы, Циклы⁠⁠

Уроки программирования в PL/SQL (ORACLE). Разбираем задачу с массивами, циклами. Оптимизация решения, поиск ошибок.

[моё] Программирование Собеседование IT SQL Oracle Видео YouTube
3
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
Hope.end
Hope.end
2 года назад
Лига тестировщиков

Крик о помощи⁠⁠

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

Подскажите где можно найти информацию или поделитесь опытом тестирования БД. В автоматизации не сильна от слова совсем. Есть знания sql на уровне простых запросов по типу select from join. Ранее тестировала бд, но как manual и через оболочку приложения.

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