Курсоры
Курсор - область данных PGA в private SQL Area (результирующий набор строк), заполненную в результате выполнения SQL-оператора. Некоторая информация записывается в SGA.
Виды курсоров:
Явные - мы сами определяем его в разделе объявления PL/SQL-блока, открываем его, выбираем из него данные, закрываем. Применимо к командам select.
Неявные - автоматически создаются, выбираются данные и закрываются СУБД. Фактически, это все команды, которые выполняются в БД.
У курсоров есть атрибуты.
Есть специальные курсорные переменные - это указатели на курсоры, их можно передавать между программами.
Подробности в следующих постах.
Теперь вы знаете, что ответить на вопросы на собеседовании - "Что такое курсор? Какие виды курсоров бывают?" 🤓
#собеседование #курсоры
Курсор - область данных PGA в private SQL Area (результирующий набор строк), заполненную в результате выполнения SQL-оператора. Некоторая информация записывается в SGA.
Виды курсоров:
Явные - мы сами определяем его в разделе объявления PL/SQL-блока, открываем его, выбираем из него данные, закрываем. Применимо к командам select.
Неявные - автоматически создаются, выбираются данные и закрываются СУБД. Фактически, это все команды, которые выполняются в БД.
У курсоров есть атрибуты.
Есть специальные курсорные переменные - это указатели на курсоры, их можно передавать между программами.
Подробности в следующих постах.
Теперь вы знаете, что ответить на вопросы на собеседовании - "Что такое курсор? Какие виды курсоров бывают?" 🤓
#собеседование #курсоры
Курсорные переменные
Курсорная переменная - ссылка на область с результирующим набором.
Свойства:
1. Курсорные переменные обладают теми же атрибутами как и обычный курсор. Курсорная переменная - обычная переменная.
2. На один курсор может смотреть более 1 курсорной переменной (как ссылки на объекты).
3. Курсор активен пока на него ссылается хотя бы одна активная ссылка (курсорная переменная).
Типы курсорных переменных:
1. Пользовательские - определяются разработчиком как новый тип. Используется, если нужна сильная типизация результата.
2. Системные - универсальный тип sys_refcursor. Используется в большинстве случаев.
Когда использовать:
1. Курсорную переменную можно связывать с разными курсорами. Помогает в разработке гибких приложений.
2. Передавать результаты в вызывающую среду (в т.ч. внешнюю), вместо коллекций.
#курсоры #sys_refcursor
Курсорная переменная - ссылка на область с результирующим набором.
Свойства:
1. Курсорные переменные обладают теми же атрибутами как и обычный курсор. Курсорная переменная - обычная переменная.
2. На один курсор может смотреть более 1 курсорной переменной (как ссылки на объекты).
3. Курсор активен пока на него ссылается хотя бы одна активная ссылка (курсорная переменная).
Типы курсорных переменных:
1. Пользовательские - определяются разработчиком как новый тип. Используется, если нужна сильная типизация результата.
2. Системные - универсальный тип sys_refcursor. Используется в большинстве случаев.
Когда использовать:
1. Курсорную переменную можно связывать с разными курсорами. Помогает в разработке гибких приложений.
2. Передавать результаты в вызывающую среду (в т.ч. внешнюю), вместо коллекций.
#курсоры #sys_refcursor
Атрибуты курсора
Для управления и получения свойств курсора используются атрибуты.
%FOUND - true, если успешно выбрана хотя бы одна строка; в противном случае возвращает false
%NOTFOUND - true, если команда не выбрала ни одной строки; в противном случае возвращает false
%ROWCOUNT - количество строк, выбранных из курсора на данный момент времени
%ISOPEN - true, если курсор открыт; в противном случае возвращает false
%BULK_ROWCOUNT - количество измененных записей для каждого элемента исходной коллекции, заданной в команде forall
%BULK_EXCEPTIONS - информация об исключении для каждого элемента исходной коллекции, заданной в команде forall
Использование в явных курсорах: имя_курсора%имя_атрибута
Использование в неявных курсорах: SQL%имя_атрибута
В следующем посте, на примере, разберем как можно использовать атрибуты курсоров.
#plsql #теория #курсоры
Для управления и получения свойств курсора используются атрибуты.
%FOUND - true, если успешно выбрана хотя бы одна строка; в противном случае возвращает false
%NOTFOUND - true, если команда не выбрала ни одной строки; в противном случае возвращает false
%ROWCOUNT - количество строк, выбранных из курсора на данный момент времени
%ISOPEN - true, если курсор открыт; в противном случае возвращает false
%BULK_ROWCOUNT - количество измененных записей для каждого элемента исходной коллекции, заданной в команде forall
%BULK_EXCEPTIONS - информация об исключении для каждого элемента исходной коллекции, заданной в команде forall
Использование в явных курсорах: имя_курсора%имя_атрибута
Использование в неявных курсорах: SQL%имя_атрибута
В следующем посте, на примере, разберем как можно использовать атрибуты курсоров.
#plsql #теория #курсоры
Пример использования атрибута курсора %ROWCOUNT
Рассмотрим на простом примере. Нам необходимо обновить строчку по primary key, если её нет в таблице our_tab, нужно вставить в таблицу.
Для такого кейса отлично подходит атрибут неявного курсора %ROWCOUNT. После попытки обновить строку, мы проверяем сколько строк было изменено. Если таких строк нет, то производим вставку.
На практике, довольно, часто применяется такой прием, но лишь для тех случаев, когда вероятность update гораздо выше, чем insert.
#plsql #теория #курсоры
Рассмотрим на простом примере. Нам необходимо обновить строчку по primary key, если её нет в таблице our_tab, нужно вставить в таблицу.
Для такого кейса отлично подходит атрибут неявного курсора %ROWCOUNT. После попытки обновить строку, мы проверяем сколько строк было изменено. Если таких строк нет, то производим вставку.
На практике, довольно, часто применяется такой прием, но лишь для тех случаев, когда вероятность update гораздо выше, чем insert.
beginУчтите, что после update не должно быть никаких других команд, например, commit. Атрибут доступен только для предыдущего выполнения.
-- обновляем
update our_tab
set ...
where id = ...;
-- если не обновили, то вставляем
if sql%rowcount = 0 then
insert into our_tab ...;
end if;
end;
/
#plsql #теория #курсоры
Этапы работы с курсорами
Продолжая тему курсоров, стоит упомянуть об этапах работы с курсорами. Это довольно частый вопрос на собеседованиях.
В зависимости от типа курсора, либо это происходит автоматически, либо выполняем мы сами.
1. Разбор SQL команды - синтаксический анализ, формирование плана выполнения.
2. Привязка - установление соответствия между значениями программы и параметрами SQL-команды.
3. Открытие (open) - определяется результирующий набор строк. Указатель активной указывает на первую строку набора.
4. Выборка (fetch) - получение очередной строки из результирующего набора строк. После каждой выборки указатель смещается на 1 строку вперед.
5. Закрытие (close) - курсор закрывается и освобождается используемая память.
Цитата из книги “Oracle для профессионалов” Тома Кайта.
“При открытии курсора сервер Oracle не "отвечает " на запрос; он никуда не копирует данные при открытии курсора (представьте, сколько времени потребовало бы открытие курсора для таблицы с миллиардом строк в противном случае). Курсор просто открывается и дает результаты запроса по ходу обращения к данным. Другими словами, он будет читать данные из таблицы при извлечении их через курсор.”
#plsql #теория #курсоры #собеседование
Продолжая тему курсоров, стоит упомянуть об этапах работы с курсорами. Это довольно частый вопрос на собеседованиях.
В зависимости от типа курсора, либо это происходит автоматически, либо выполняем мы сами.
1. Разбор SQL команды - синтаксический анализ, формирование плана выполнения.
2. Привязка - установление соответствия между значениями программы и параметрами SQL-команды.
3. Открытие (open) - определяется результирующий набор строк. Указатель активной указывает на первую строку набора.
4. Выборка (fetch) - получение очередной строки из результирующего набора строк. После каждой выборки указатель смещается на 1 строку вперед.
5. Закрытие (close) - курсор закрывается и освобождается используемая память.
Цитата из книги “Oracle для профессионалов” Тома Кайта.
“При открытии курсора сервер Oracle не "отвечает " на запрос; он никуда не копирует данные при открытии курсора (представьте, сколько времени потребовало бы открытие курсора для таблицы с миллиардом строк в противном случае). Курсор просто открывается и дает результаты запроса по ходу обращения к данным. Другими словами, он будет читать данные из таблицы при извлечении их через курсор.”
#plsql #теория #курсоры #собеседование
🌐 Навигация по темам канала Oracle Developer
📘 Основы
#sql #plsql #теория #архитектура
#функции #секционирование #временныетаблицы
#транзакции #исключения #курсоры
#аналитическиефункции #иерархическиезапросы
#системныепредставления #компиляция #представления #коллекции #циклы
🛠 Практика и задачи
#задача #решениезадачи #asktom
🚀 Оптимизация и производительность
#оптимизация #nestedloops #индекс
🧩 Инструменты и технологии
#тестирование #postgresql #oracle #docker #oracle23c #ide #ai
💼 Карьера и Развитие
#карьера #собеседование #hr #тинькофф #magnit #вкусноиточка #leroymerlin #сбер #яндекс #Эффективность #КарьерныйРост #Denis_Kivillev #Работа
🎓 Дополнительные материалы
#видео #подкаст #аудиоподкаст #конкурс #марафон #юмор
—
В почти 700 (!) постах не мудрено заплутать. Поэтому решил сделать подобие навигации 😉
Не забывайте пользоваться обычным поиском, я не добавил сюда низкочастотные хештеги.
Канал Oracle Developer | Чатик💬
📘 Основы
#sql #plsql #теория #архитектура
#функции #секционирование #временныетаблицы
#транзакции #исключения #курсоры
#аналитическиефункции #иерархическиезапросы
#системныепредставления #компиляция #представления #коллекции #циклы
🛠 Практика и задачи
#задача #решениезадачи #asktom
🚀 Оптимизация и производительность
#оптимизация #nestedloops #индекс
🧩 Инструменты и технологии
#тестирование #postgresql #oracle #docker #oracle23c #ide #ai
💼 Карьера и Развитие
#карьера #собеседование #hr #тинькофф #magnit #вкусноиточка #leroymerlin #сбер #яндекс #Эффективность #КарьерныйРост #Denis_Kivillev #Работа
🎓 Дополнительные материалы
#видео #подкаст #аудиоподкаст #конкурс #марафон #юмор
—
В почти 700 (!) постах не мудрено заплутать. Поэтому решил сделать подобие навигации 😉
Не забывайте пользоваться обычным поиском, я не добавил сюда низкочастотные хештеги.
Канал Oracle Developer | Чатик💬