<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=93.158.179.15&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=93.158.179.15&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/93.158.179.15"/>
		<updated>2026-06-11T13:11:15Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=81772</id>
		<title>Репликация</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A0%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=81772"/>
				<updated>2021-12-20T11:02:13Z</updated>
		
		<summary type="html">&lt;p&gt;93.158.179.15: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Репликация''' — это поддержание одинаковых данных на нескольких узлах распределенной системы.}}&lt;br /&gt;
'''Типы репликации'''&lt;br /&gt;
* Синхронная -- требует введения распределенных транзакций и гарантирует одинаковое состояние реплик.&lt;br /&gt;
* Асинхронная -- допускает задержки репликации на репликах.&lt;br /&gt;
&lt;br /&gt;
'''Схемы репликации'''&lt;br /&gt;
* С основной копией -- запросы на запись поступают в централизованное место, а затем реплицируются&lt;br /&gt;
* Симметричная -- запросы на запись могут поступать в различные копии&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Реализация репликации ==&lt;br /&gt;
&lt;br /&gt;
=== С основной копией ===&lt;br /&gt;
[[Файл:Replication_Master.png|300px|thumb|right|Репликация с основной копией]]&lt;br /&gt;
Есть одна главная копия данных, изменения из неё реплицируются на все остальные копии. За согласованность изменений отвечает главная копия. Если изменения приводят к несогласованному состоянию, то транзакция откатывается. Запросы на чтение могут быть обработаны любой репликой.&lt;br /&gt;
Такая реализация эффективна, если количество записей сильно меньше количества запросов чтения.&lt;br /&gt;
&lt;br /&gt;
=== Симметричная ===&lt;br /&gt;
[[Файл:Replication_Symmetric.png|300px|thumb|right|Симметричная репликация]]&lt;br /&gt;
Чтение и запись могут быть обработаны любой копией. При необходимости реплики могут работать автономно.&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Запросы можно отправлять на географически ближайшую реплику&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
* Необходимо обрабатывать случай записей с разных копий, которые конфликтуют при репликации.&lt;br /&gt;
* При выходе из строя любой реплики, состояние системы не согласовано и данные потеряны.&lt;br /&gt;
&lt;br /&gt;
Таким образом, синхронная репликация сложна и малонадежна. В реалньости распределенные базы данных решают эту проблему лучше.&lt;br /&gt;
&lt;br /&gt;
=== Рассылка изменений ===&lt;br /&gt;
Информация обо всех сделанных изменения содержится в журнале транзакций. Репликация достигается за счёт рассылки протоколов транзакций.&lt;br /&gt;
&lt;br /&gt;
==== Репликация операторов ====&lt;br /&gt;
* На реплике выполняются те же операторы&lt;br /&gt;
* Пересылается малый объем данных&lt;br /&gt;
* Операторы должны быть детерминированны&lt;br /&gt;
* Необходимо учитывать взаимный порядок выполнения транзакций.&lt;br /&gt;
&lt;br /&gt;
==== Репликация записей ====&lt;br /&gt;
* Пересылается информация об изменении записей&lt;br /&gt;
* Результат детерминирован&lt;br /&gt;
* Вынужденно пересылается большое количество записей&lt;br /&gt;
&lt;br /&gt;
== Применения репликации ==&lt;br /&gt;
&lt;br /&gt;
=== Вертикальное масштабирование ===&lt;br /&gt;
Большое количество чтений, малое количество записей. Схема репликации с одной копией. Примеры: web-сервера, erp-системы.&lt;br /&gt;
&lt;br /&gt;
=== Горизонтальное масштабирование ===&lt;br /&gt;
Большое количество локальный операций (например, по критерию географической распределенности). Реплика отвечает за свой набор данных, т.е. по запросу всегда можно определить нужную реплику. Применение: географическая распределенность, независимость по данным, непостоянная связь.&lt;br /&gt;
&lt;br /&gt;
=== Повышение доступности ===&lt;br /&gt;
Ассиметричная схема репликации позволяет менять основную реплику не останавливая работу системы.&lt;br /&gt;
&lt;br /&gt;
=== Резервное копирование ===&lt;br /&gt;
Ассиметричная схема.&lt;br /&gt;
&lt;br /&gt;
* Для получения резервной копии добавим специальную реплику, которая будет синхронизирована с основной.&lt;br /&gt;
* В момент взятия резервной копии отключаем синхронизацию.&lt;br /&gt;
* Чтобы сделать следующую резервную копию, синхронизация снова включается.&lt;br /&gt;
* Реплика получает все изменения, сделанные с момента отключения.&lt;br /&gt;
&lt;br /&gt;
=== Преобразование данных ===&lt;br /&gt;
Ассиметричная схема репликации позволяет добавлять специальные реплики, которые занимаются обработкой данных. Периодически синхронизуясь, такая реплика преобразовывает данные, например: изменение формата хранения, консолидация данных, унификация данных.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* Дейт К. Введение в системы баз данных (глава 21)&lt;br /&gt;
* [https://www.postgresql.org/docs/current/high-availability.html PostgreSQL: High Availability, Load Balancing, and Replication]&lt;br /&gt;
* [https://dev.mysql.com/doc/refman/8.0/en/replication.html MySQL: Replication]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Базы данных]]&lt;/div&gt;</summary>
		<author><name>93.158.179.15</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B5%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=81771</id>
		<title>Секционирование</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%B5%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5&amp;diff=81771"/>
				<updated>2021-12-20T11:00:36Z</updated>
		
		<summary type="html">&lt;p&gt;93.158.179.15: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Секционирование''' — это разделение таблицы базы данных на отдельные фрагменты с раздельными настройками физического хранения.}}&lt;br /&gt;
&lt;br /&gt;
Фрагменты могут хранится на разных компьютерах или дисках одного компьютера. Используется в целях повышения производительности и доступности больших баз данных. Это достигается за счет параллельного чтения и записи на различных дисках.&lt;br /&gt;
&lt;br /&gt;
== Типы секционирования ==&lt;br /&gt;
&lt;br /&gt;
=== Вертикальное ===&lt;br /&gt;
Разбиение таблицы &amp;quot;по столбцам&amp;quot;. Условие корректности: секции содержат надключ (следует из теоремы Фейгина).&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Отделение &amp;quot;частых&amp;quot; данных от &amp;quot;редких&amp;quot;&lt;br /&gt;
* Защита информации (можно задать разные права доступа на разные секции)&lt;br /&gt;
* Автоматическая поддержка для CLOB и BLOB (они хранятся отдельно от записи)&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
* Нет специальной поддержки&lt;br /&gt;
* Зависимость от представления&lt;br /&gt;
* Необходимость обновляемых представлений&lt;br /&gt;
&lt;br /&gt;
=== Горизонтальное ===&lt;br /&gt;
Разбиение таблицы &amp;quot;по строкам&amp;quot;. Условие корректности: каждая строка попадает ровно в одну секцию.&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* Отделение &amp;quot;близких&amp;quot; данных от &amp;quot;дальних&amp;quot; (например, зависящих от времени).&lt;br /&gt;
* Уменьшение размера секции&lt;br /&gt;
* Встроенная поддержка&lt;br /&gt;
* Прозрачность для пользователя&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
* Возможное замедление работы&lt;br /&gt;
&lt;br /&gt;
Пример: таблица Points(SId, CId, Mark, Date), секции разбиты по Date на основе года.&lt;br /&gt;
&lt;br /&gt;
== Методы секционирования ==&lt;br /&gt;
&lt;br /&gt;
* Простые&lt;br /&gt;
** По диапазонам (задается границами)&lt;br /&gt;
** По значениям (списки конкретных значений)&lt;br /&gt;
** По хешу (записи разбиваются по хеш значению заданного набора столбцов)&lt;br /&gt;
* По выражению (секция задается любым методом простого секционирования)&lt;br /&gt;
* Составные (секции ращбиваются на подсекции, например, сначала по диапазону, а затем по хешу)&lt;br /&gt;
&lt;br /&gt;
== Управление секциями ==&lt;br /&gt;
&lt;br /&gt;
==== Удаление секции ====&lt;br /&gt;
  '''alter table''' &amp;lt;font color=red&amp;gt;таблица&amp;lt;/font&amp;gt; '''drop partition''' &amp;lt;font color=red&amp;gt;секция&amp;lt;/font&amp;gt;''';'''&lt;br /&gt;
&lt;br /&gt;
==== Разбиение секции ====&lt;br /&gt;
  '''alter table''' &amp;lt;font color=red&amp;gt;таблица&amp;lt;/font&amp;gt; '''reorganize''' &amp;lt;font color=red&amp;gt;секция&amp;lt;/font&amp;gt; '''into ('''...''')''';&lt;br /&gt;
&lt;br /&gt;
==== Перехеширование ====&lt;br /&gt;
  '''alter table''' &amp;lt;font color=red&amp;gt;таблица&amp;lt;/font&amp;gt; '''add partition''' &amp;lt;font color=red&amp;gt;число&amp;lt;/font&amp;gt;''';'''&lt;br /&gt;
  '''alter table''' &amp;lt;font color=red&amp;gt;таблица&amp;lt;/font&amp;gt; '''coalesce partition''' &amp;lt;font color=red&amp;gt;число&amp;lt;/font&amp;gt;''';'''&lt;br /&gt;
&lt;br /&gt;
==== Оптимизация запросов ====&lt;br /&gt;
Оптимизатор запросов умеет использовать секционирование для повышения производительности. Ненужные секции могут быть отброшены, а запросы на оставшихся станут параллельными. Например, может быть оптимизирована операция '''select''' со сравнениями, '''=''', '''in''', '''between'''.&lt;br /&gt;
&lt;br /&gt;
==== Индексы ====&lt;br /&gt;
&lt;br /&gt;
Индексы могут быть секционированы.&lt;br /&gt;
&lt;br /&gt;
Типы индексов:&lt;br /&gt;
* Локальный - один на секцию&lt;br /&gt;
* Глобальный - один на таблицу&lt;br /&gt;
* Секционированный - разбит на секции по-своему&lt;br /&gt;
&lt;br /&gt;
Локальный и глобальный индекс нужны для оптимизации запросов.&lt;br /&gt;
&lt;br /&gt;
Секционированный индекс имеет смысл, если глобальный индекс слишком велик по размеру. Секционирование таблицы и индекса должено быть согласовано, чтобы не относить секцию таблицы к нескольким секциям индекса. Однако разрешается относить несколько секций таблицы к одной секции индекса.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* [https://www.postgresql.org/docs/current/ddl-partitioning.html PostgreSQL: Table Partitioning]&lt;br /&gt;
* [https://dev.mysql.com/doc/refman/8.0/en/partitioning.html MySQL: Partitioning]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Базы данных]]&lt;/div&gt;</summary>
		<author><name>93.158.179.15</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%80%D1%81%D0%BE%D1%80%D1%8B&amp;diff=81330</id>
		<title>Курсоры</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D1%83%D1%80%D1%81%D0%BE%D1%80%D1%8B&amp;diff=81330"/>
				<updated>2021-12-13T12:33:36Z</updated>
		
		<summary type="html">&lt;p&gt;93.158.179.15: /* Описание команд */ Исправила форматирование&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Курсор''' — способ перебора результатов запроса, позволяющий достать из результата запроса множество строк.}}&lt;br /&gt;
Курсор можно рассматривать как итератор, специфичный для баз данных.&lt;br /&gt;
&lt;br /&gt;
== Объявление курсора ==&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;declare &amp;lt;font color = red&amp;gt;имя&amp;lt;font color = green&amp;gt; -- объявление курсора с именем &amp;lt;/font&amp;gt;&lt;br /&gt;
 {&amp;lt;font color = black&amp;gt;sensitive&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;insensitive&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;asensitive&amp;lt;/font&amp;gt;}&amp;lt;font color = green&amp;gt; -- чувствительность курсора&amp;lt;/font&amp;gt;&lt;br /&gt;
 [[&amp;lt;font color = black&amp;gt;no&amp;lt;/font&amp;gt;] &amp;lt;font color = black&amp;gt;scroll&amp;lt;/font&amp;gt;]&amp;lt;/font&amp;gt;&amp;lt;font color = green&amp;gt; -- возможность ходить произвольным образом по данным вперед и назад (default - no scroll) &amp;lt;/font&amp;gt;&lt;br /&gt;
 cursor select&amp;lt;font color = gray&amp;gt;...&amp;lt;/font&amp;gt;&amp;lt;font color = green&amp;gt; -- запрос данных, по которым будет ходить курсор&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;[&amp;lt;/font&amp;gt; for &amp;lt;font color = red&amp;gt;{&amp;lt;/font&amp;gt;read &amp;lt;font color = black&amp;gt;only&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;update &amp;lt;font color = red&amp;gt;[&amp;lt;/font&amp;gt;of &amp;lt;font color = red&amp;gt;столбцы]}]&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt; -- права на чтение(дефолтное право) или на обновление (всей таблицы или выбранных столбцов)&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Чувствительность курсора ===&lt;br /&gt;
Данные из курсора обрабатываются по одной строке, во время таких итераций можно поменять данные самой таблицы, по которой построен текущий курсор. В зависимости от желаемого поведения в таких случаях можно выбрать разную чувствительность курсора.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{sensitive}&amp;lt;/tex&amp;gt; - курсор, чувствительный к изменениям. Измененные данные можно будет увидеть в курсоре, если эти данные еще не были пройдены. Иначе, если изменённые данные были просмотрены в прошлом, то они не обновятся. Итерация по реальным данным.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{insensitive}&amp;lt;/tex&amp;gt; - курсор фиксированных данных. Данные зафиксированы на момент открытия курсора. Никакие изменения данных не будут отображены через курсор. Итерация по временной копии таблицы.&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{asensitive}&amp;lt;/tex&amp;gt; - курсор, наиболее предпочтительный для данной СУБД. Связано с различными способами реализациями СУБД: для одних легче реализуем sensitive cursor, а для других - insensitive. В данном случае сама СУБД данных будет решать, какую чувствительность курсора использовать.&lt;br /&gt;
&lt;br /&gt;
Если данные во время использования курсора меняться не будут, то чувствительность курсора не важна.&lt;br /&gt;
&lt;br /&gt;
===Примеры===&lt;br /&gt;
&lt;br /&gt;
Взятие курсора на чтение для студентов, упорядоченных по идентификатору:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;declare &amp;lt;font color = black&amp;gt;SCursor&amp;lt;/font&amp;gt; cursor&lt;br /&gt;
 select &amp;lt;font color = gray&amp;gt;*&amp;lt;/font&amp;gt; from &amp;lt;font color = black&amp;gt;Students&amp;lt;/font&amp;gt;&lt;br /&gt;
 order by &amp;lt;font color = black&amp;gt;SId&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Взятие курсора с правом на изменение поля SName для студентов группы M3439:&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;declare &amp;lt;font color = black&amp;gt;SCursor&amp;lt;/font&amp;gt; cursor&lt;br /&gt;
 select &amp;lt;font color = gray&amp;gt;*&amp;lt;/font&amp;gt; from &amp;lt;font color = black&amp;gt;Students&amp;lt;/font&amp;gt; where &amp;lt;font color = black&amp;gt;GId&amp;lt;/font&amp;gt; &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'M3439'&amp;lt;/font&amp;gt;&lt;br /&gt;
 for update of &amp;lt;font color = black&amp;gt;SName&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Открытие и закрытие==&lt;br /&gt;
Объявление курсора говорит о намерении получения данных. Реальная выборка в момент объявления не производится. Она происходит в момент открытия курсора. Если курсор ''insensitive'', то в момент открытия фиксируются данные, которые попадут в курсор.&lt;br /&gt;
&lt;br /&gt;
С курсором ассоциируются ресурсы, поэтому их необходимо закрывать. При выходе из блока, в котором был объявлен курсор, он будет автоматически закрыт. При повторном открытии курсора произойдет повторная инициализация, влекущая новое прочтение данных для ''insensitive'' курсора. &lt;br /&gt;
&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;open&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;курсор&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;close&amp;lt;/font&amp;gt; &amp;lt;font color = red&amp;gt;курсор&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Получение данных ==&lt;br /&gt;
&lt;br /&gt;
=== Синтаксис === &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;fetch&lt;br /&gt;
 &amp;lt;font color = red&amp;gt;[&amp;lt;/font&amp;gt;next&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;prior&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;last&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;first&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;absolute n&amp;lt;font color = gray&amp;gt;|&amp;lt;/font&amp;gt;relative n&amp;lt;font color = red&amp;gt;]&lt;br /&gt;
 курсор&amp;lt;/font&amp;gt; &amp;lt;font color = blue&amp;gt;into &amp;lt;/font&amp;gt;&amp;lt;font color = red&amp;gt;переменные&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Описание команд ====&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{next}&amp;lt;/tex&amp;gt; - получение следующей записи (доступно по умолчанию, все команды ниже доступны только для ''scroll'' курсора)&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{prior}&amp;lt;/tex&amp;gt; - предыдущая запись&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{last}&amp;lt;/tex&amp;gt; - последняя запись &lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{first}&amp;lt;/tex&amp;gt; - первая запись&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{absolute}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt; - получить запись с номером n от начала&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{relative}&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;\mathtt{n}&amp;lt;/tex&amp;gt;- запись с номером n, нумерация с текущей позиции (n может быть отрицательным, в этом случае движение назад)&lt;br /&gt;
&lt;br /&gt;
=== Отсутствие данных ===&lt;br /&gt;
Если данные закончились, либо при помощи команд был осуществлен невалидный переход, то случится событие '''not found'''&lt;br /&gt;
&lt;br /&gt;
=== Пример ===&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;fetch &amp;lt;/font&amp;gt;&amp;lt;font color = black&amp;gt;SCursor &amp;lt;font color = blue&amp;gt;into &amp;lt;/font&amp;gt;Sid&amp;lt;font color = gray&amp;gt;,&amp;lt;/font&amp;gt; FirstName&amp;lt;font color = gray&amp;gt;,&amp;lt;/font&amp;gt; LastName&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для получения всех данных из курсора, можно создать цикл, предварительно создав обработчик ошибок на '''not found''', в котором выйдем из цикла, когда все элементы будут обработаны.&lt;br /&gt;
&lt;br /&gt;
== Позиционированные изменения ==&lt;br /&gt;
Изменение или удаление ровно одной строчки, которую последней выдал курсор.&lt;br /&gt;
=== Синтаксис ===&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;update &amp;lt;font color = red&amp;gt;таблица&amp;lt;/font&amp;gt; set &amp;lt;font color = red&amp;gt;что&amp;lt;/font&amp;gt; where current of &amp;lt;font color = red&amp;gt;курсор&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;delete from &amp;lt;font color = red&amp;gt;таблица&amp;lt;/font&amp;gt; where current of &amp;lt;font color = red&amp;gt;курсор&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
===Пример применения курсора===&lt;br /&gt;
 &amp;lt;font color = blue&amp;gt;if &amp;lt;font color = black&amp;gt;FirstName&amp;lt;/font&amp;gt; &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; &amp;lt;font color = green&amp;gt;'Иван'&amp;lt;/font&amp;gt; then&lt;br /&gt;
    delete from &amp;lt;font color = black&amp;gt;Students&amp;lt;/font&amp;gt; where current of &amp;lt;font color = black&amp;gt;SCursor&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 end if&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
== Пример применения курсора ==&lt;br /&gt;
 create procedure &amp;lt;font color = black&amp;gt;updateNameStat&amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;name&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 begin&lt;br /&gt;
    declare &amp;lt;font color = black&amp;gt;cnt int&amp;lt;/font&amp;gt; default &amp;lt;font color = darkgreen&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
    declare exit &amp;lt;font color = black&amp;gt;handler&amp;lt;/font&amp;gt; for &amp;lt;font color = black&amp;gt;sqlstate&amp;lt;/font&amp;gt; not &amp;lt;font color = black&amp;gt;found&amp;lt;/font&amp;gt; begin&lt;br /&gt;
        insert into &amp;lt;font color = black&amp;gt;Stats &amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;Name, Cnt&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt; values &amp;lt;font color = black&amp;gt;&amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;name, cnt&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
    end&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
    declare &amp;lt;font color = black&amp;gt;SCursor&amp;lt;/font&amp;gt; cursor&lt;br /&gt;
        select &amp;lt;font color = black&amp;gt;FirstName&amp;lt;/font&amp;gt; from &amp;lt;font color = black&amp;gt;Students&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
    open &amp;lt;font color = black&amp;gt;SCursor&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
    loop&lt;br /&gt;
        declare &amp;lt;font color = black&amp;gt;sname varchar&amp;lt;font color = gray&amp;gt;(&amp;lt;/font&amp;gt;&amp;lt;font color = darkgreen&amp;gt;20&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;)&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
        fetch &amp;lt;font color = black&amp;gt;SCursor&amp;lt;/font&amp;gt; into &amp;lt;font color = black&amp;gt;sname&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
        if &amp;lt;font color = black&amp;gt;name &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; sname&amp;lt;/font&amp;gt; then set &amp;lt;font color = black&amp;gt;cnt &amp;lt;font color = gray&amp;gt;=&amp;lt;/font&amp;gt; cnt + &amp;lt;font color = darkgreen&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;/font&amp;gt;&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt; end if&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
    end loop&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt;&lt;br /&gt;
 end&amp;lt;font color = gray&amp;gt;;&amp;lt;/font&amp;gt; &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Особенности курсоров==&lt;br /&gt;
Курсоры, описанные в данной статье, являются '''внутренними'''. Они существуют внутри базы данных, используются, в том числе для взаимодействия между различными частями базы данных при планировании.&lt;br /&gt;
&lt;br /&gt;
===Внешние курсоры===&lt;br /&gt;
Результат запроса к базе данных может быть слишком велик и стать виной нехватки памяти как на стороне клиента, так и на стороны сервера, увеличить нагрузку на сеть. Поэтому наружу данные выдаются в виде внешнего курсора. После исполнения команды select выдается внешний курсор на данные, аналогично внешний курсор выдается при возврате результат из хранимой процедуры.&lt;br /&gt;
&lt;br /&gt;
===Размер выборки===&lt;br /&gt;
Может быть указан для внешнего курсора каким-либо образом (в количестве записей либо в объеме данных).&lt;br /&gt;
&lt;br /&gt;
При выдаче курсора приходит метаинформация о курсоре и первая порция данных, размер которой мы указали. Для получения последующих порций данных необходимо обращаться к серверу. В конце сервер сообщит о том, что данные закончились, автоматически освободит ресурсы. &lt;br /&gt;
&lt;br /&gt;
Возникают альтернативы:&lt;br /&gt;
&lt;br /&gt;
* Малый размер выборки — много повторных обращений.&lt;br /&gt;
* Большой размер выборки — требуется много памяти.&lt;br /&gt;
 &lt;br /&gt;
Выдача курсора приводит к расходу ресурсов сервера (память, блокировки и так далее). Поэтому внешний курсор стоит закрыть как можно раньше.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
* ''Дейт К. Введение в системы баз данных (главы 4 и 17)''&lt;br /&gt;
* ''Уидом Д., Ульман Д. Основы реляционных баз данных (раздел 7.4)''&lt;br /&gt;
* ''Gulutzan P., Pelzer T. SQL-99 complete, really''&lt;br /&gt;
** [https://crate.io/docs/sql-99/en/latest/chapters/25.html Chapter 25 – SQL-Invoked Routine]&lt;br /&gt;
** [https://crate.io/docs/sql-99/en/latest/chapters/26.html Chapter 26 – PSM: Not Just Persistent Stored Modules]&lt;br /&gt;
[[Категория: Базы данных]]&lt;/div&gt;</summary>
		<author><name>93.158.179.15</name></author>	</entry>

	</feed>