Oracle программирование sql. Основные элементы предложений DML: выражения. Быстрое обращение к прошлым значениям данных

Oracle программирование sql. Основные элементы предложений DML: выражения. Быстрое обращение к прошлым значениям данных

26.04.2019

В своей книге «Oracle для профессионалов. Архитектура и основные особенности.» настаивает, что это просто необходимо. Даже если в вашей команде есть грамотный администратор, знание того, как работает СУБД Oracle поможет вам лучше понимать друг друга и эффективней взаимодействовать, не говоря уже о случае, когда такого специалиста у вас нет. В данном топике я упомяну об основных вещах, понимание которых позволит грамотно работать с БД Oracle и использовать некоторые её особенности с большой отдачей для вашего приложения. Если же вы уже прочитали вышеупомянутую книгу Тома Кайта, то можете просто исползовать эту статью в качестве памятки. Одно замечание - книжку я читал давно, и тогда еще последней версией БД Oracle была 9i, курсы по администрированию я тоже проходил по девятке, так что, если в десятке и выше что-то поменялось и добавилось, то не обессудьте. Хотя я пишу о довольно фундаментальных вещах, которые вряд ли сильно поменяись.

Что позволяет БД Oracle работать так быстро?

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

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

Механизм восстановления данных

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

Stand by копия

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

Подвисание некоторых запросов на запись

При зависании некоторых ваших запросов в произвольный момент времени стоит заглянуть в alert.log на предмет наличия incomplete checkpoint. Это говорит о том, что ваши оперативные журнальные файлы слишком большие или их слишком мало, таким образом, защищаемые ими данные не успевают сбрасываться из кэша на диск, а СУБД заполнила уже все доступные оперативные журнальные файлы и хочет использовать их по кругу повторно, чего делать ни в коем случае нельзя, вот и появляется пауза. Хотя если ваше приложение работает на java, то в первую очередь я бы загляну на наличия Full GC в логах.

Неблокирующее чтение и сегмент отката

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

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

Однако иногда сегмент отката может подложить свинью: если у вас есть большой job для bulk удаления данных (удаление генерирует всех больше данных в сегменте отката), то вы можете получить ORA-01555: snapshot too old . Главное что в этом случае надо помнить - это то, что не надо переписывать ваш job, чтобы он коммитил через каждые N операций, а нужно использовать отдельный специально созданный сегмент отката для таких операций.

Уровни изоляции транзакций

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

Вообще, в Oracle явно доступно всего два уровня изоляции: по умолчанию используется READ_COMMITTED, но при желании вы можете установить SERIALIZABLE.

Однако на уровне операторов (SELECT, UPDATE и т.д.) у вас по умолчанию уже есть REPEATABLE_READ, т.е. в рамках одного оператора вы всегда получаете согласованное чтение, что достигается конечно же за счет сегмента отката. Мне всегда очень нравился пример приводимый Томом Кайтом для описания того, что это дает. Допустим у вас есть очень большая таблица со счетами и вы выполняете SELECT на получение суммы. В Oracle, в отличие от многих других БД, даже если в середине вашего запроса другая транзакция переведет некоторую суммы с первого счета на последний, вы в итоге все равно получите данные актуальные на начало вашего запроса, так как дойдя до последний строчки ваш SELECT увидит, что строчка была изменена, пойдет в сегмент отката и прочитает данные, которые были в этой ячейке на момент начала выполнения запроса. Во многих других базах данных, вы получите ответ в виде суммы, никогда не существующей в вашей таблице. Однако в Oracle в данном случае есть опасность получить ORA-01555: snapshot too old .

В дополнение к стандартным уровням изоляции в Oracle еще есть так называемые READ_ONLY транзакции, которые дают REPEATABLE_READ в рамках всей транзакции, а не только в рамках одного оператора. Но как следует из названия, в такой транзакции вы можете выполнять только чтение.

Позвольте Oracle кэшировать ваши данные эффективно

В Oracle все данные читаются-пишутся не прямо на диск, а через кэш. По умолчанию кэш основан на LRU алгоритме, так что если вы читаете какую-нибудь очень большую табличку по идентификатору в больших количествах, запрашивая в каждый раз новую строчку, то такие запросы могут вытеснять из кэша небольшую статическую табличку, которой бы самое милое дело постоянно находиться в кэше. Для таких целей при создании таблицы вы можете указать специальный вид кэша, куда будут ходить запросы к вашим таблицам. Так для первой таблицы в вышеописанном примере подойдет кэш RECYCLE, который по сути не хранит никакие данные, а сразу их выбрасывает из кэша. А для второй таблицы подойдет кэш KEEP, который позволить хранить в кэше небольшие статические таблице и запросы ко всем остальным таблицам не будут вытеснять данные статических таблиц из кэша.

Пустые строки

В оракл есть одна очень интересная особенность, от которой они теперь уже никогда не смогут избавиться. Дело в том, что если вы кладете в БД пустую строку, то она сохраниться как NULL. Таким образом при последующем чтении вы никогда не получите пустой строки, а только NULL. Имейте так же в виду, что по этой же причине пустые строки не попадают в индекс, так что если вы будете делать запросы, план выполнения которых, будет использовать индекс, то ваше пустые (вернее NULL) строки вы никогда не получите, но об этом чуть позже.

Индексы

Кроме всем известных индексов в виде B-деревьев в Oracle еще есть так называемые битовые индексы, которые показывают очень высокую производительность на запросах к таблицам в которых есть колонки с очень разреженными значениями. Особенно эффективно в этом случае будут работать запросы (по сравнению с обычными индексами) в которых присутствуют сложные комбинации OR и AND к разряженным столбцам. Данный индекс храниться не в B-дереве, а в битовых картах, что и дает возможность быстрого выполнения описанных запросов. Вопрос в количестве уникальных значений в таблице при которых данный индекс еще будет более предпочтителен весьма сложен: это может быть как 10 уникальных значений, так и 10 000. Здесь надо создавать индекс на конкретной таблице и смотреть что получается. Главное не пытайтесь использовать данный индекс на таблицах с большим количеством вставок и обновлений индексируемой колонки, так как такие операции будут блокировать довольно большие участки в индексируемой таблице и ваша система может встать колом или даже поймаете deadlock.

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

Еще одно интересное свойство индексов, о котором необходимо знать, это то, что в индексе не хранятся значения NULL. Таким образом если вы будете делать запросы с условием <, > или <> по индексируемой колонке, то в ответ строчек со значением NULL в индексируемой колонке вы обратно не получите. С другой стороны данное свойство можно очень эффективно использовать дня некоторых специфичных случаев. Например, у вас есть очень большая табличка в которой хранятся ордера, которая никогда не чистится. И существует фоновый процесс, который обязан все ордера отсылать в какую-нибудь backoffice систему. Первое решение, которое напрашивается - это завести еще одну колонку с флагом is_sent, где изначально стоит 0 и при отсылке мы будем проставлять 1. Т.е. фоновый процесс при каждом запуске будет делать запрос к таблице с условием is_sent=0. Битовый индекс вы здесь использовать не можете, так как табличка очень активно пополняется. Обычный индекс на основе В-дерева будет занимать очень много места, так как нужно хранить ссылки на огромное количество строчек. Но если мы слегка поменяем нашу логику и в качестве пометки отсылки, и в колонку is_sent будем класть NULL вместо 1, то индекс у нас будет крошечный, так как в любой момент в нем будут храниться только не NULL значения, а их будет очень мало.

Таблицы бывают разные

Кроме обычных таблиц в oracle как и во многих других БД есть так называемые индекс-таблицы, когда данные таблицы непосредственно лежат в индекс-дереве первичного ключа. Таким образом достигается сразу две вещи: во первых для чтения данных по первичному ключу вы имеете на одно чтение меньше, во вторых данные в таблице получаются упорядоченными по первичному ключу, так что операция ORDER BY PK будет выполняться без дополнительной сортировки. К недостаткам можно отнести тот факт, что отличить логирование в оперативные журнальные файлы данного индекса вы уже не сможете.

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

На основе кластерных таблиц есть еще кластерные хэш-таблицы, в которых для доступа вместо B-дерева используется таблица на основе хеша кластерного ключа. Звучит, конечно, очень интересно, но, честно говоря, на практике никогда не сталкивался.

Связывание переменных

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

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

Еще пара заметок для программиста

Если у вас колонка имеет тип VARCHAR2(100), то попытка туда запихнуть строку longString.substring(0, 100) не факт, что увенчается успехом, так как ограничение 100 в определении колонки по умолчанию относится к количеству байтов, а не символов, поэтому при наличии двухбайтовых символов вы можете попасть впросак. На самом деле данное поведение можно немного сконфигурировать, подробнее можно почитать . Хорошо если вы еще не пытаетесь выполнить вставку в бесконечном цикле, по принципу делать пока не получиться, ведь это «получиться» в данном случае никогда не наступит.

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

Заключение

Я попытался описать большинство вещей, который на мой взгляд могут пригодится программисту. Так как их довольно много, то я их только обозначил, часто не вдаваясь в детали. Как конкретно сделать необходимую настройку можно всегда прочитать в упомянутой книжке Тома Кайта, найти в колонке asktom или просто нагуглить. Главное знать что гуглить, и, надеюсь, данный топик вам это подсказал.

Теги:

  • oracle database
  • базы данных
Добавить метки

Одна из проблем при наличии множества вариантов разработки - выяснить, какой из них лучше всего подходит в конкретной ситуации. Все хотят получить максимальную гибкость (как можно больше вариантов), но при этом так, чтобы все было просто и понятно. Oracle дает разработчикам практически неограниченный выбор. Никто еще не говорил: Этого нельзя сделать в Oracle ; говорят иначе: Сколько способов сделать это в Oracle вам надо? . Я надеюсь, что книга поможет вам сделать правильный выбор.

Эта книга для тех, кто приветствует свободу выбора, но хотел бы получить рекомендации и узнать особенности реализации тех или ин1х средств и функций Oracle. Например, СУБД Oracle предлагает замечательную возможность создания виртуальной приватной базы данных (virtual private database). В документации Oracle описано, как использовать эту возможность и что она дает. В документации, однако, не сказано, когда ее использовать и, что видимо еще важнее, когда ее не надо использовать. В документации не всегда представлены детали реализации той или иной возможности, а если они не известны, то могут неожиданно встать на вашем пути. (Речь идет не об ошибках, но о предполагавшихся способах работы и первоначальном назначении соответствующих средств.)

Для кого предназначена эта книга?

Целевой аудиторией являются все разработчики приложений для Oracle как сервера баз данных. Книга написана для профессиональных разработчиков Oracle, интересующихся тем, как решить задачу средствами этой СУБД. Практическая ориентация книги означает, что многие разделы будут очень интересны администраторам баз данных (АБД). В большинстве примеров, приведенных в книге для демонстрации ключевых возможностей, используется утилита SQL*Plus, поэтому вы не сможете узнать из нее, как разрабатывать удобный и красивый графический пользовательский интерфейс, но зато узнаете, как работает СУБД Oracle, что позволяют сделать ее основные средства и когда их нужно (и не нужно) использовать.

Книга предназначена для тех, кто хочет получить от СУБД Oracle большую отдачу при меньших усилиях. Она для каждого, кто хочет знать, как средства Oracle могут применяться в практической работе (при этом не только приводятся примеры использования того или иного средства, но и объясняется, почему это средство необходимо). Еще одна категория людей, которым эта книга покажется интересной, - технические руководители групп разработчиков, реализующих проекты на базе Oracle. В некотором отношении очень важно, чтобы они знали особенности СУБД, имеющие принципиальное значение для успешной разработки. Эта книга может дать дополнительные аргументы руководителю проекта, желающему обучить персонал необходимым технологиям или убедиться, что разработчики уже знают то, что им необходимо знать.

Чтобы получить максимальную отдачу от этой книги, читатель должен:

О Знать яз1к SQL. He обязательно быть лучшим специалистом по SQL в стране, но хорошее практическое знание существенно поможет.

Понимать программе! на яз1ке PL/SQL. Это не обязательное требование, но знание PL/SQL поможет воспринять примеры. Эта книга, например, не объясняет, как создавать циклы FOR или объявлять тип записи - об этом достаточно написано в документации Oracle и в многочисленных книгах. Однако это не значит, что вы не узнаете много нового о программировании на PL/SQL, прочтя эту книгу. Узнаете. Вы очень близко познакомитесь со многими возможностями PL/SQL и узнаете новые способы решения задач, изучите пакеты и средства, о существовании которых, возможно, даже и не подозревали.

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

Ознакомиться с руководством Oracle Server Concepts Manual.

Несколько слов об этом руководстве. Из-за большого объема многих пугает документация Oracle. Если вы только начинаете изучение руководства или ранее не читали подобной документации, я рекомендую начать именно с OracleSi Concepts. Его объем - около 800 страниц, и в нем описаны многие из фундаментальных концепций Oracle, о которых вам надо знать. Это руководство не описывает все технические детали (именно этому посвящены остальные 10-20 тысяч страниц документации), но представляет все важнейшие концепции. В руководстве затронуты, в частности, следующие темы:

структура базы данных, организация и хранение данных;

распределенная обработка;

архитектура памяти Oracle;

архитектура процессов Oracle;

объекты пользовательской схемы (таблицы, индексы, кластеры и т.д.);

встроенные и определяемые пользователем типы данных;

хранимые процедуры;

особенности организации транзакций;

оптимизатор;

целостность данных;

управление одновременным доступом.

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

Структура книги

Чтобы облегчить восприятие, книга поделена на шесть отдельных частей (они описаны ниже). Это не просто структурные единицы - они помогут быстрее найти наиболее существенную информацию. Книга состоит из 23 глав, каждая из которых - мини-книга, то есть практически отдельный компонент. Изредка я ссылаюсь на примеры или возможности, описанные в других главах (часть, посвященная защите, например, больше других зависит от примеров и понятий, представленных в других главах). Но, как правило, вполне можно читать главу отдельно от остальной книги. Например, вовсе не нужно прочитать главу 10, чтобы понять главу 14.

Форматы и стили глав практически идентичны:

Введение в описываемые средства или возможности.

Почему это нужно (или не нужно) использовать. Я описываю ситуации, когда

имеет смысл использовать данное средство и когда этого делать не стоит.

Как это использовать. Это не просто цитата из справочного руководства по язы-

ку SQL, а пошаговое описание: вот что требуется, что для этого надо сделать, а вот предварительные условия применения. В этом разделе рассматривается:

Как применить то или иное средство или прием

Примеры, примеры и еще примеры

Отладка, поиск ошибок при реализации

Подводные камни при использовании средства

Устранение ошибок (превентивное)

О Резюме, подводящее итог рассмотрения.

В книге содержится множество примеров и большое количество кода, причем весь этот код доступен для загрузки на сайте http: www.wrox.com. Далее представлено подробное содержание каждой части.

Основные понятия

Глава 1. Разработка успешн1х приложений для Oracle. В этой главе описан мой принципиальный подход к программированию баз данных. Все СУБД устроены по-разному, и чтобы успешно и в срок разработать приложение, использующее базу данных, необходимо точно знать, что и как позволяет сделать ваша СУБД. Не зная возможностей СУБД, вы рискуете в очередной раз изобрести велосипед, то есть создать средства, уже предоставляемые базой данных. Если вы не знаете, как работает СУБД, то с большой вероятностью будете создавать неэффективные и непредсказуемые приложения.

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

[ 1 ] ...

Играть на онлайн деньги http://asino-zeon.com/ все о бонусах.

Structured Query Language (структурированный язык запросов) или SQL - это декларативный язык программирования для использования в квази-реляционных баз данных. Многие из оригинальных черт SQL были взяты для кортежных исчислений, но последние расширения SQL включают все больше реляционной алгебры.
SQL изначально создан IBM , но многие производители разработали собственные диалекты. Он была принят в качестве стандарта американским Национальным институтом стандартов (ANSI) в 1986 и ISO в 1987 . В стандарте языка программирования SQL, ANSI заявил, что официальный произношение SQL является "эс кью эль". Тем не менее, многие специалисты базы данных употребляли "сленговое" произношение «Сиквель», что отражает первоначальное название языка, Sequel, которое было изменено позже из-за возникшего конфликта торговых марок и наименований у компании IBM. Программирование для начинающих.
Язык программирования SQL был пересмотрен в 1992 , и эта версия известна как SQL-92 в. Потом было вновь пересмотрено 1999 , чтобы стать SQL: 1999 (AKA SQL3). Программирование для чайников. SQL 1999 поддерживает объекты, которые ранее не поддерживается и в других версиях, но только в конце 2001 года лишь несколько систем управления базами данных поддерживали SQL реализации: 1999.
SQL, хотя определяется как ANSI и ISO, имеет множество вариаций и расширений, большинство из которых имеют собственные характеристики, такие как реализация корпорации Oracle «PL / SQL» или реализация Sybase и Microsoft под названием «Transact-SQL», что может запутать знакрмящегося с основами программирования. Также не редкость для коммерческих реализаций опустить поддержку основных особенностей стандарта, такие типы данных как дата и время, предпочитая какой-то их собственный вариант. Как результат, в отличие от ANSI C или ANSI Fortran которые обычно можно портирована с платформы на платформу без серьезных структурных изменений, запросы языка программирования SQL редко могут быть перенесены между разными системами баз данных без существенных модификаций. Большинство людей в области баз данных считают, что это отсутствие совместимости является намеренным, с тем чтобы обеспечить каждого разработчика собственной системой управления базами данных и привязать покупателя к конкретной базе данных.
Как следует из названия, язык программирования SQL предназначен для конкретных, ограниченных целей - запросов данных, содержащихся в реляционной базе данных. Как таковой, он представляет собой набор инструкций языка программирования для создания выборок данных, а не процедурный язык, такой как C или BASIC , которые предназначены для решения гораздо более широкого круга проблем. Расширения языка, таких как «PL / SQL» предназначены для решения этого ограничения, добавив процедурные элементы для SQL при сохранении преимуществ SQL. Другой подход заключается в том, что позволяется в зопросы SQL встраивать команды процедурного языка программирования и взаимодействовать с базой данных. Например, Oracle и другие поддерживают язык Java в базе данных, в то время как PostgreSQL позволяет писать функции на Perl, Tcl, или С.
Один анекдот про SQL: "SQL не является ни структурированным, ни языком." Суть шутки состоит в том, что SQL не является языком Тьюринга. .

Select * from T
C1 C2
1 a
2 b
C1 C2
1 a
2 b
Select C1 from T
C1
1
2
C1 C2
1 a
2 b
Select * from T where C1=1
C1 C2
1 a

Учитывая таблицу T, запрос Select * from T выведет на экран все элементы всех строк таблицы.
Из той же таблицы, запрос Select C1 from T выведет на экран элементы из столбца C1 всех строк таблицы.
Из той же таблицы, запрос Select * from T where C1=1 выведет на экран все элементы всех строк, где значение колонки С1 равно "1".

SQL ключевые слова

SQL слова делятся на ряд групп.

Первая - это Data Manipulation Language или DML (язык управления данными). DML является подмножеством языка, используемого для запроса к базам данных, добавления, обновления и удаления данных.

  • SELECT является одной из наиболее часто используемых команд DML и позволяет пользователю задать запрос как описание желаемого результата в виде множества. В апросе не указано, каким образом результаты должны быть расположены - перевод запроса в форму, которая может быть выполнена в базе данных, является работой системы баз данных, более конкретно оптимизатора запросво.
  • INSERT используется для добавления строк (формального набора) для существующей таблицы.
  • UPDATE используется для изменения значений данных в существующей строке таблицы.
  • DELETE определение существующих строк, которые будут удалены из таблицы.

Три другие ключевых слова, можно сказать, что попадают в группу DML:

  • BEGIN WORK (или START TRANSACTION, в зависимости от диалекта SQL) могут быть использованы, чтобы отметить начало транзакции базы данных, которые либо выполнятся все полностью или вообще не выполнятся.
  • COMMIT устанавливает, что все изменения данных в после совершения операций сохраняются.
  • ROLLBACK определяет, что все изменения данных после последней фиксации или отката должны быть уничтожены, до того момента, который был зафиксирован в БД как «откат».

COMMIT и ROLLBACK применяются в таких областях, как контроль транзакций и блокировки. Обе инструкции завершают все текущие транзакции (наборы операций над БД) и снимают все блокировки на изменение данных в таблицах. Присутствие или отсутствие BEGIN WORK или аналогичного заявления зависит от конкретной реализации SQL.

Вторая группа ключевых слов относится к группе Data Definition Language или DDL (язык определения данных) . DDL позволяет пользователю определять новые таблицы и связанные с ними элементы. Большинство коммерческих баз данных SQL имеют собственные расширения в DDL, которые позволяют осуществлять контроль над нестандартныыми, но обычно жизненно важными элементами конкретной системы.
Основные пункты DDL являются команды создавать и удалять.

  • CREATE определяет объекты (например, таблицы), которые будут созданы в базе данных.
  • DROP определяет, какие существующие объекты в базе данных будут удалены, как правило, безвозвратно.
  • Некоторые системы баз данных также поддерживают команду ALTER, которая позволяет пользователю изменять существующий объект по-разному - например, так можно произвести добавление столбцов в существующую таблицу.

Третьей группой ключевых слов SQL является Data Control Language или DCL(язык контроля данных) . DCL отвечает за права доступа к данным и позволяет пользователю контролировать, кто имеет доступ, чтобы просматривать или манипулировать данными в базе данных. Здесь два основных ключевых слова:

  • GRANT - разрешает пользователю выполнять операции
  • REVOKE - удаляет или ограничивает возможность пользователю выполнять операции.

Системы баз данных с использованием SQL

Как стать профессионалом по разработке сайтов и начать зарабатывать? Недорогие видео курсы с ознакомительным введением.

Для грамотного использования Oracle необходимо иметь хорошее понимания языка SQL . Курс "Oracle. Программирование на SQL, PL/SQL и Java " раскрывает полный спектр возможностей языка SQL в Oracle и ряд аспектов неочевидных особенностей построения типовых конструкций БД.

  • PL/SQL - процедурный язык , разработанный фирмой Oracle для написания хранимых в БД подпрограмм. PL/SQL обеспечивает общую основу процедурного программирования как в клиентских приложениях, так и на стороне сервера, в том числе хранимых на сервере подпрограмм, пакетов и триггеров базы данных.
  • Java - объектный язык , который может использоваться для работы с Oracle в самых разных конфигурациях, в том числе, благодаря встроенной в Oracle Java-машине, в качестве второго языка для хранимых процедур. Java не зависит от конкретных платформ и может служить эффективным средством интеграции БД Oracle с другими приложениями, в том числе в Internet.

Курс сопровождается практическими упражнениями, позволяющими закрепить понимание базовых понятий и освоить основные технические приемы программирования на языках SQL, PL/SQL и Java.

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

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

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

Знания даются по следующим версиям:

  • Oracle Database 8i
  • Oracle Database 9i
  • Oracle Database 10g
  • Oracle Database 11g
  • Oracle Database 12c

Программа курса "Oracle. Программирование на SQL, PL/SQL и Java"

Введение в Oracle SQL

1. Основные понятия

  • Базы данных и реляционная модель
  • Базы данных
  • Реляционный подход к моделированию данных
  • Реализация реляционной СУБД
    Другие подходы к моделированию данных и другие типы СУБД
  • Что такое SQL ?
  • История и стандарты
  • Oracle-диалект SQL
  • PL/SQL

2. SQL*Plus и ввод предложений на SQL

3. Пример "схемы" базы данных

4. Создание, удаление таблиц и изменение структуры

  • Предложение CREATE TABLE
  • Типы данных в столбцах
  • Уточнения в описаниях столбцов
  • Указание NOT NULL
  • Значения по умолчанию
  • Проверка CHECK поступающих в таблицу значений
  • Создание таблиц по результатам запроса к БД
  • Именование таблиц и столбцов
  • Виртуальные столбцы
  • Удаление таблиц
  • Изменение структуры таблиц
  • Логические и технические особенности удаления столбца
  • Использование синонимов для именования таблиц
  • Переименования
  • Справочная информация о таблицах в БД

5. Основные элементы предложений DML: выражения

  • Непосредственные значения данных (литералы)
  • Числовые значения
  • Строки текста
  • Моменты и интервалы времени
  • "Системные переменные"
  • Числовые выражения
  • Выражения над строками текста
  • Выражения над типом "момент времени"
  • Функции
  • Скалярные функции
  • CASE-выражения
  • Скалярный запрос
  • Условные выражения
  • Отдельные замечания по поводу отсутствия значения в выражениях

6. Выборка данных

  • Фразы предложения SELECT
  • Общие правила построения предложения SELECT
  • Порядок обработки предложения SELECT
  • Пример 1 предложения SELECT
  • Пример 2 предложения SELECT
  • Логическая целостность обработки предложения SELECT
  • Фраза FROM предложения SELECT
  • Варианты указания столбца
  • Столбцы из разных таблиц
  • Использование псевдонимов в запросе
  • Подзапрос в качестве источника данных
  • Специальный случай для запроса-соединения
  • Фраза WHERE предложения SELECT
  • Общий алгоритм отработки фразы WHERE
  • Операторы сравнения для получения условного выражения
  • Связки AND, OR и NOT для комбинирования условных выражений
  • Условный оператор IS
  • Условный оператор LIKE
  • Условный оператор BETWEEN
  • Условный оператор IN с явно перечисляемым множеством
  • Условный оператор IN с множеством, получаемым из БД
  • Условия сравнения с подзапросом
  • Указание ANY и ALL для сравнения с элементами множества значений
  • Условный оператор EXISTS
  • Фраза SELECT и функции в предложении SELECT
  • Сокращенная запись для группового отбора столбцов
  • Выражения во фразе SELECT
  • Подзапросы во фразе SELECT
  • Уточнение DISTINCT
  • Особенности поведения стандартных агрегатных функций в предложении SELECT
  • Именование столбцов в результате запроса
  • Системная функция ("переменная") ROWNUM и особенности ее использования
  • Аналитические функции
  • Выражение типа ссылка на курсор
  • Фраза ORDER BY предложения SELECT
  • Простейшая сортировка
  • Упорядочение по значению выражения
  • Указание номера столбца
  • Двоичное и "языковое" упорядочение строк
  • Особенности обработки отсутствующих значений (NULL)
  • Фразы GROUP BY и HAVING предложения SELECT
  • Пример отработки фразы GROUP BY … HAVING
  • Отсутствие значения в выражении для группировки
  • Другие примеры
  • Указание ROLLUP, CUBE и GROUPING SETS в во фразе GROUP BY
  • Фраза CONNECT BY предложения SELECT
  • Специальные системные функции в предложениях с CONNECT BY
  • Упорядочение результата
  • Фраза WITH предварительной формулировки подзапросов
  • Комбинирование предложений SELECT
  • Комбинирование оператором UNION
  • Комбинирование оператором INTERSECT
  • Комбинирование оператором MINUS
  • Подзапросы
  • Операция соединения в предложении SELECT
  • Виды соединений
  • Новый синтаксис в версии 9
  • Особенности выполнения операции соединения

7. Обновление данных в таблицах

  • Добавление новых строк
  • Явное добавление строки
  • Добавление строк, полученных подзапросом
  • Добавление в несколько таблиц одним оператором
  • Изменение существующих значений полей
  • Использование умолчательных значений в INSERT и UPDATE
  • Удаление строк из таблицы
  • Выборочное удаление
  • Вариант полного удаления
  • Комбинирование UPDATE, INSERT и DELETE в одном операторе
  • Логическая целостность операторов обновления данных таблиц и реакция на ошибки
  • Реакция на ошибки в процессе исполнения
  • Фиксация изменений в БД
  • Данные о системном номере изменения для строки
  • Ускорение выполнения COMMIT

8. Быстрое обращение к прошлым значениям данных

  • Чтение старых значений строк таблицы
  • Восстановление таблиц и данных ранее удаленных таблиц

9. Схемные ограничения целостности

  • Разновидности схемных ограничений целостности
  • Ограничение NOT NULL
  • Первичные ключи
  • Уникальность значений в столбцах
  • Внешние ключи
  • Дополнительное условие для значения в поле строки
  • Дополнительное условие, связывающее значения в нескольких полях строки
  • Добавление ограничения при наличии нарушений
  • Приостановка проверки схемных ограничений в пределах транзакции
  • Отключение и включение схемных ограничений целостности
  • Технология включения и выключения схемных ограничений целостности
  • Более сложные правила целостности

10. Виртуальные таблицы (производные, выводимые: views)

  • Основные ("базовые") и виртуальные таблицы
  • Обновление виртуальных таблиц
  • Ограничения прямой модификации данных через виртуальные таблицы
  • Запрет непосредственных обновлений
  • Сужение возможности непосредственных обновлений
  • Виртуальные таблицы с хранием данных
  • Особенности именованых виртуальных таблиц
  • Неименованые виртуальные таблицы без хранения данных

11. Нескалярные типы для "сложно устроенных" данных в Oracle

  • Хранимые объекты
  • Простой пример
  • Использование свойств и методов объектов
  • Использование ссылок на объект
  • Коллекции
  • Вложенные таблицы
  • Массивы VARRAY
  • Тип XMLTYPE
  • Простой пример
  • Таблицы данных XMLTYPE
  • Преобразование табличных данных в тип XMLTYPE
  • Тип ANYDATA

12. Вспомогательные виды хранимых объектов

  • Генератор уникальных номеров
  • Каталог операционной системы
  • Таблицы с данными временного хранения
  • Ссылка на другую БД
  • Подпрограммы
  • Индексы
  • Индексы для проверки схемных ограничений целостности
  • Таблицы с внешним хранением данных

13. Некоторые замечания по оптимизации SQL-предложений

14. Транзакции и блокировки

  • Транзакции в Oracle
  • Примеры блокировок данных транзакциями
  • Разновидности блокировок
  • Неявные блокировки при операциях DML
  • Влияние внешних ключей
  • Явная блокировка таблиц (тип TM) командой LOCK
  • Явная блокировка отдельных строк таблиц
  • Недокументированная разновидность групповой блокировки
  • Блокировки предложениями DDL

15. Пользователи (схемы) и дополнительные средства разграничения доступа к данным

16. Таблицы системного каталога (словаря-справочника)

18. Встроенный SQL

  • Некоторые примеры составления запросов

19. Выдать сотрудников в соответствии с большим (меньшим) окладом

  • Вопрос к БД
  • "Очевидное", но неправильное решение
  • Правильные решения
  • Решение типа top-N (начиная с версии 8.1.5)
  • Решение с использованием аналитических функций ранжирования

20. Переформулировка запроса с HAVING

22. Ловушка условия с отрицанием NOT

23. Ловушка в NOT IN (S)

Введение в PL/SQL

1. Основные понятия

  • Место PL/SQL в архитектуре Oracle
  • Общая структура программы на PL/SQL

2. Основные типы и структуры данных

  • Скалярные переменные
  • Числовые типы
  • Строковые типы
  • Моменты времени и интервалы
  • Булевы переменные
  • LOB-типы
  • Объявление переменных и постоянных
  • Записи
  • Объявление записей в программе
  • Присвоения
  • Ссылка на типы уже имеющихся данных
  • Пользовательские подтипы

3. Выражения

4. Основные управляющие структуры

  • Ветвление программы
  • Предложение IF-THEN
  • Предложение IF-THEN-ELSE
  • Предложение IF-THEN-ELSIF
  • Предложения CASE
  • Безусловная передача управления
  • Циклы
  • Простой цикл
  • Счетный цикл (FOR)
  • Цикл по курсору (FOR)
  • Цикл WHILE
  • Имитация цикла REPEAT UNTIL
  • Метки в циклах и в блоках

5. Подпрограммы

  • Локальные подпрограммы
  • Переопределение «внешних» имен
  • Предваряющие (forward) объявления
  • Повторение имен на одном уровне (overloading)
  • 6. Взаимодействие с базой данных: статический SQL
  • Использование записей вместо (списка) скаляров

7. Регулирование изменений в БД

  • Управление транзакциями
  • Блокировки
  • Автономные транзакции

8. Встроенный динамический SQL

  • Операторы встроенного динамического SQL
  • Сравнительный пример двух способов работы с динамическим SQL

9. Использование курсоров

  • Явные курсоры
  • Объявление явных курсоров
  • Открытие явных курсоров
  • Извлечение результата через явный курсор
  • Закрытие явного курсора
  • Отсутствие запрета изменений таблиц при открытом курсоре
  • Атрибуты для явных курсоров
  • Несколько примеров использования циклов и курсоров
  • Курсоры с блокировкой строк таблицы
  • Предложение SELECT … FOR UPDATE
  • Предосторожности употребления курсоров с блокировкой
  • Возможность изменять строки, выбираемые курсором
  • Ссылки на курсор
  • Общие сведения
  • Пример употребления для структуризации программы
  • Неявные курсоры

10. Обработка исключительных ситуаций

  • Объявление исключительных ситуаций
  • Примеры обработки
  • Порождение исключительных ситуаций
  • Зона действия и распространение
  • «Внутренние» исключительные ситуации блока
  • Использование функций SQLCODE и SQLERRM

11. Хранимые процедуры и функции

  • Общий синтаксис
  • Параметры
  • Тип параметра
  • Режим использования параметра
  • Значения по умолчанию
  • Способы указать фактические значения параметрам
  • Обращение к параметрам и к локальным переменным в теле подпрограммы
  • Указания компилятору при создании подпрограмм
  • Хранимые подпрограммы и привилегии доступа к данным в БД
  • Две логики реализации привилегий доступа к данным БД
  • Особенности передачи привилегий через роли

12. Триггерные процедуры

  • Создание триггерной процедуры
  • Отключение триггерных процедур
  • Триггерные процедуры для событий категории DML
  • Комбинированные триггерные процедуры
  • Управление транзакциями в теле триггерной процедуры
  • Последовательность срабатывания триггерных процедур, когда их несколько
  • Триггерные процедуры INSTEAD OF для выводимых таблиц
  • Триггерные процедуры для событий категории DDL
  • Триггерные процедуры для событий уровня схемы и БД

13. Пакеты в PL/SQL

  • Общая структура пакета
  • Обращение к элементами пакета
  • (Глобальные) данные пакета
  • Взаимные вызовы и повторения имен
  • Инициализация пакета
  • Прагма SERIALLY_REUSABLE

14. Вызов функций PL/SQL в предложениях SQL

  • Требования и ограничения на применение функций пользователей в SQL
  • Обращение в SQL к функциям из состава пакетов
  • Разрешение конфликта имен столбцов и функций
  • Табличные функции в SQL

15. Более сложные типы данных: коллекции

  • Синтаксис объявления типов для коллекций
  • Работа с ассоциативными массивами
  • Создание вложенной таблицы и массива VARRAY в программе
  • Добавление и убирание элементов в коллекциях
  • Множественные действия с коллекциями
  • Преобразования коллекций
  • Методы для работы с коллекциями в программе
  • Примеры использования коллекций в программе
  • Привилегии
  • Серийное выполнение и привязывание запросов к массивам
  • Серийное выполнение однотипных операций: конструкция FORALL
  • Привязка массивами: конструкция BULK COLLECT INTO
  • Пример для схемы SCOTT
  • Использование коллекций в табличных функциях (потоковой реализации)
  • Простой пример
  • Использование для преобразования данных

16. Отладка процедур в PL/SQL

  • Таблицы словаря-справочника
  • Зависимости подпрограмм
  • Системные пакеты
  • Пакет DBMS_PROFILER
  • Пакет DBMS_TRACE
  • Функции пакета DBMS_UTILITY
  • Пакет DBMS_DEBUG
  • Пример построения профиля работы программы

17. Системы программирования для PL/SQL

18. Системные пакеты PL/SQL

  • Пакеты STANDARD и DBMS_STANDARD
  • Прочие системные пакеты
  • Запись данных из программы в файл и обратно
  • Шифрование данных
  • Автоматический запуск заданий в Oracle
  • Управление динамическим размещением объектов в библиотечном буфере
  • Манипулирование большими неструктурированными объектами NULL
  • Доступ к старым значениям данных
  • Рассылка сообщений из программы на PL/SQL
  • Возможности работы в PL/SQL с COM Automation
  • Дополнительные сведения
  • Простой пример разделения открытия курсора и обработки
  • Более сложный пример разделения работы

20. Атрибуты триггерных процедур уровня схемы БД и событий в СУБД

ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ORACLE НА JAVA

1. Основные понятия

  • Место Java в архитектуре Oracle
  • Соотношение и взаимосвязь PL/SQL и Java в Oracle

2. Особенности Java и среда работы программ на Java

  • Архитектура Java
  • Программные компоненты в среде разработки на Java
  • Установка среды разработки для Java
  • Среда окружения OC

3. Создание самостоятельных программ на Java

  • Пример транслирования и выполнения программы

4. Создание хранимых программ на Java в Oracle

  • Дополнительные компоненты СУБД Oracle для работы с хранимыми программами на Java
  • Ограничения на хранимые программы на Java
  • Установка, удаление и обновление JServer/OJVM
  • Пример создания хранимой Java-программы
  • Создание с помощью loadjava
  • Создание SQL-предложением
  • Обращение к загруженному классу
  • Работа со словарем-справочником
  • Организация справочной информации
  • Просмотр Java-элементов
  • Просмотр исходных текстов
  • Преобразование имен
  • Особенности встроенной JVM
  • Интерпретатор ojvmjava

5. Элементы программирования на Java

  • Основы языка
  • Базовые конструкции языка
  • Переменные
  • Операторы
  • Выражения, предложения и блоки
  • Передача управления
  • Объекты и простые структуры
  • Классы и наследование
  • Создание классов
  • Механика использования класса в программе
  • Наследование
  • Интерфейсы
  • Обработка исключительных ситуаций
  • Некоторые приемы программирования на Java
  • Графический интерфейс
  • Группы объектов (коллекции)
  • Потоковый ввод и вывод
  • Параметризация работы программы с помощью наборов свойств
  • Сериализуемость объектов

6. Взаимодействие с базой данных через JDBC

  • Использование JDBC
  • JDBC и JDBC-драйверы
  • JDBC-драйверы в Oracle
  • Установка JDBC-драйверов для работы с Oracle
  • Программа на Java для проверки связи через JDBC
  • Работа с данными Oracle из внешних программ на Java
  • Обращение к БД через толстый OCI-драйвер
  • Работа с данными Oracle из хранимых программ на Java
  • Обращение к БД через толстый драйвер («родной», kprb)
  • Обращение к БД через тонкий драйвер
  • Обращение к данным из триггерных процедур Oracle

7. Дополнительные свойства протокола JDBC

  • Соединение с СУБД с помощью техники DataSource
  • Простой пример соединения техникой DataSource
  • Пример соединения с использованием службы JNDI
  • Пример кеширования соединений
  • Примеры организации логических соединений
  • Изменение данных в БД и обращение ко хранимым подпрограммам
  • Изменение данных
  • Управление транзакциями
  • Обращение к хранимым программам
  • Параметризация запросов
  • Использование типов данных Oracle
  • Повышение эффективности обращений к БД
  • Повторяющиеся запросы
  • Пакетное выполнение
  • Ссылка из программы на курсор в СУБД

8. Взаимодействие с базой данных через SQLJ

  • Простой пример программы
  • Транслирование и выполнение программы с SQLJ
  • Более сложный пример: множественная выборка из БД
  • Использование SQLJ в хранимых процедурах на Java
  • Пример с загрузкой извне
  • Пример с внутренней трансляцией

9. Основы построения приложений для web с помощью Java и Oracle

  • Клиентская часть: работа с аплетами
  • Пример транслирования и выполнения аплета
  • Web-сервер Apache
  • Общение с web-сервером по протоколу HTTP
  • Общие понятия обмене сообщениями в HTTP
  • Организация диалога в HTML
  • Работа с сервлетами Java
  • Общие сведения о сервлетах Java и о контейнерах сервлетов
  • Устройство сервлета Java
  • Пример составления сервлета на Java
  • Пример обращения к сервлету
  • Пример сервлета с обращением к базе данных
  • Использование класса HttpServlet
  • Работа с JavaServer Pages
  • Пример составления страницы JSP
  • Пример обращения к странице JSP
  • Некоторые возможности построения страниц JSP
  • Способы обращение к БД из страницы JSP
  • Модель MVC организации приложения для web

10. Взаимодействие компонентов приложения для web

  • Передача управления компонентов приложения web друг другу
  • Обращение на страницах HTML к страницам JavaServer и сервлетам
  • Передача управления со страниц JavaServer
  • Передача управления компонентам web из сервлетов
  • Абстракции Java для построения приложения web
  • Запрос и ответ
  • Область действия (scope)
  • Контекст сервлета
  • Предопределенные объекты страницы JavaServer
  • Передача данных компонентов приложения web друг другу
  • Передача данных через параметры запроса
  • Передача данных через контекст и компоненты JavaBeans

11. Пример построения приложения для web средствами Java и Oracle

  • Страница Logon.html
  • Сервлет Logon
  • Страница LogonError.html
  • Страница Main.jsp
  • Страница CompanyData.jsp и класс orajava.demos.StuffData
  • Сервлет Logout
  • Транслирование классов, размещение файлов и проверка приложения
  • Дополнительные сведения

12. Пример программирования собственной разметки JSP

  • Пример использования готовой разметки
  • Пример программирования собственной разметки

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

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

Сегодня невозможно представить работу крупнейших компаний, банков или государственных организаций без использования баз данных и средств Business Intelligence . Базы данных позволяют нам хранить и получать доступ к большим объемам информации, а система управления базами данных (СУБД) - осуществлять менеджмент доступных хранилищ информации.

В Учебном центре « Интерфейс» Вы научитесь эффективно использовать системы управления базами данных: быстро находить нужную информацию, ориентироваться в схеме базы данных, создавать запросы, осуществлять разработку и создание баз данных.

Обучение позволит Вам не только получить знания и навыки, но и подтвердить их, сдав соответствующие экзамены на статус сертифицированного специалиста. Опытные специалисты по СУБД Microsoft SQL Server или Oracle могут быть заинтересованы в изучении систем бизнес-аналитики. Это задачи достаточно сложные, использующие громоздкий математический аппарат, но они позволяют не только анализировать происходящие процессы, но и делать прогнозы на будущее, что востребовано крупными компаниями. Именно поэтому специалисты по бизнес-аналитике востребованы на рынке, а уровень оплаты их труда весьма и весьма достойный, хотя и квалифицированным специалистам по базам данных, администраторам и разработчикам, жаловаться на низкий уровень дохода тоже не приходится. Приходите к нам на курсы и получайте востребованную и высокооплачиваемую профессию. Мы ждем Вас!

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

Учебный центр "Интерфейс" оказывает консалтинговые услуги по построению моделей бизнес-процессов, проектированию информационных систем, разработке структуры баз данных и т.д.

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


© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows