Обработка запросов с использованием курсоров

Slides:



Advertisements
Similar presentations
Пример реализации приложения Программа отправки и анализа SMS-сообщений (через с WEB-интерфейсом.
Advertisements

Астрометрические каталоги К.В.Куимов, ГАИШ МГУ. Определение астрометрического каталога Астрометрический каталог – понятие неопределённое. Например, это.
Linguistic tools Лекция 5. ПОИСКОВЫЕ СИСТЕМЫ: предыстория Библейские индексы и конкордансы 1247 – Hugo de St. Caro – было задействовано 500 монахов для.
Елена Станиславовна Петрова Учитель-логопед высшей категории ГДОУ детский сад №47 комбинированного вида Фрунзенского района г. Санкт-Петербурга 2011 год.
Санкт-Петербургский Государственный Университет Математико-механический факультет Кафедра системного программирования Научный руководитель: Б.А. Новиков.
Запросы.
 Максимум информации, которую мы можем получить из современных сайтов кулинарных рецептов, это список ингредиентов и руководство по приготовлению  Но.
Некомпенсаторное агрегирование и рейтингование студентов Авторы: Гончаров Алексей Александрович, Чистяков Вячеслав Васильевич. НФ ГУ ВШЭ 2010 год.
«АЛЬФА Системс» г. Пенза, ул. Гагарина, 16, офис 112 Как удобство сайта влияет на продажи? Удобство для покупателя - залог.
Определение необходимого уровня запасов на складе.
Учитель математики Кулакова Т.М. МОУ ООШ №15 г.о Новокуйбышевск Самарской области Сентябрь 2011г.
Сохранение суммы фазовых координат. Важный частный случай представляют системы, в которых в течение всего процесса сохраняется постоянной сумма значений.
Скриптовые языки на примере Perl. Языки программирования Скриптовые Программа (или ее бай-код) интерпретируется Зачастую более высокий уровень абстрагирования.
Создание сервиса синхронизации разнородных баз данных Допущена к защите зав. кафедрой: д.ф.м.н., профессор Терехов А.Н. Научный руководитель: доцент Графеева.
ООП Классы – 2. Ссылки Ссылка – еще одно имя объекта. Используйте ссылки вместо указателя. Это более безопасно. Complex c(10,10); Complex c2& = c; c2+=10;
Блок 3. Семейства белков I. Множественное выравнивание Первый курс, весна 2008, А.Б.Рахманинова.
Язык JavaScript Скриптовый язык для выполнения на html-страницах.
1 Генерация контекстных ограничений для баз данных Выполнил: Жолудев В. Научный руководитель: Терехов А.Н. Рецензент: Иванов А.Н.
Введение в параллельные вычисления. Технология программирования MPI (день седьмой) Антонов Александр Сергеевич, к.ф.-м.н., н.с. лаборатории Параллельных.
Анатомия класса. Схожесть с др. языками   С# похож на язык Java в том, что он требует, чтобы вся программная логика была заключена в определения типов.
Основы цифровой обработки речевых сигналов. Общая схема процесса речеобразования x[n] – дискретные отсчеты сигнала возбуждения y[n] – дискретные отсчеты.
Growing Neural Gas Method Нейросетевой метод построения неструктурированных адаптивных сеток.
Сравнение различных методов хранения XML в реляционных базах данных и в разных системах. Нгуен Тхань Хуен- 545 группа Руководитель : Б.А. Новиков Рецензент:
PHP как язык программирования. Типы данных логические величины int, integer – целые числа real, double, float – вещественные числа string – строки array.
Гергель В.П. Общий курс Теория и практика параллельных вычислений Лекция 16 Методы разработки параллельных программ для многопроцессорных систем с общей.
Software & Services Group, Developer Products Division Copyright© 2010, Intel Corporation. All rights reserved. *Other brands and names are the property.
"The European Molecular Biology Open Software Suite"
Формантный синтезатор речи. Часть 1. Полюсы и нули – иное понимание Полюс – это пара чисел (B, F), B – ширина форманты, F – частота форманты Нуль – это.
1 Влияние машинной архитектуры Структура и принципы работы компьютера На разрабатываемый язык программирования машинная архитектура влияет двояко: –непосредственно.
ВЫЧИСЛЕНИЕ В ЛИСПЕ Функциональное программирование Григорьева И.В.
Учебная презентация. Список упражнений Перед вами небольшой список упражнений по Microsoft Power Point: Для начала потренируйтесь создавать новые слайды,
Текстовый процессор Word. Возможности программы Word 1. Работа с текстами: ввод текста; редактирование текста; форматирование текста (изменение параметров.
Синтаксис языка Java.
Язык Java. JSP..
Ряды и произведения sum(expr, n=a..b), где expr – выражение, зависящее от индекса суммирования, a..b – пределы индекса суммирования, Если требуется вычислить.
Поиск ошибок в многопоточном приложении (на примере Thread Checker) ЛЕКЦИЯ 9, часть 1.
Маршрут, цепь, цикл Маршрутом называют последовательность вершин и ребер, в которой любые два соседних элемента инцидентны (т.е. соединены). Например:
Методы анализа данных. Статистическая проверка гипотез.
Формы в HTML. Элемент FORM Элемент уровня «блок» Управляющие элементы Просто текст Атрибуты: action – url обработчика method – post или get enctype –
Демидов А.В г. Операционные системы Лекция 4 Работа с файлами.
Обработка исключений Гудов А.М., Завозкин С.Ю
ВВЕДЕНИЕ В ВЫЧИСЛИТЕЛЬНУЮ МАТЕМАТИКУ Лекция 5 6 октября 2009 ВЫЧИСЛИТЕЛЬНАЯ ЛИНЕЙНАЯ АЛГЕБРА.
XML - расширенный язык разметки Моисеевой О. Макушиной Д. (eXtensible Markup Language)
XML Схемы XML документов. XML Schema созданая Microsoft позволяет избавиться от DTD блоков. Основа – использование пространств имен и очень точная типизация.
Обработка исключений в C# Единая техника обнаружения ошибок времени выполнения и передачи информации о них.
1 PL/SQL programming Procedures and Cursors Lecture 1 Akhtar Ali.
INFSO-RI Enabling Grids for E-sciencE Управление заданиями в GRID. Н. Клопов ПИЯФ, Гатчина.
«Отгадай символы Рождества»
R E F R I G E R A T I O N A N D A I R C O N D I T I O N I N G Блок мониторинга и централизованного управления АK-SM 350.
Program with PL/SQL. Interacting with the Oracle Server.
Cursor. Cursors Operations Cursors adalah suatu nama area yang berisi hasil dari suatu statement SQL. 1. OPEN 2. FETCH 3. CLOSE.
L/O/G/O Working with Composite Data Types. Objectives After completing this lesson, you should be able to do the following: –Create user-defined PL/SQL.
Алгебра логики это раздел математики, изучающий высказывания, рассматриваемые со стороны их логических значений (истинности или ложности) и логических.
1 CursorsCursors. 2 SQL Cursor A cursor is a private SQL work area. A cursor is a private SQL work area. There are two types of cursors: There are two.
PL/SQL Block Structure DECLARE - Optional Variables, cursors, user-defined exceptions BEGIN - Mandatory SQL Statements PL/SQL Statements EXCEPTIONS - Optional.
Pavel Titenkov © SQL. Pavel Titenkov © Общий обзор англ. Structured Query Language — «язык структурированных запросов»англ. Это наиболее часто используемый.
Chapter Sixteen Cursors Objective: – Introduction to cursors – Use of cursors in a database record – Implicit & explicit cursors – Cursors & loops – Cursors.
ITEC 224 Database Programming PL/SQL Lab Cursors.
SQL (диалект Oracle). Выборки с помощью SELECT лекция-семинар 1.Фильтрация (where) и сортировка (order by) 2.Многотабличные запросы, inner join 3.Single.
implicit and an explicit cursor
Anekdot ANDROID CLUB Сегодня  Navigation Drawer  CardView  Calligraphy  TextToSpeech.
«Центр Разработки и Внедрения Террасофт Поволжье»
Program with PL/SQL Lesson 3. Interacting with the Oracle Server.
Захватывающее предложение по организации игры «Мафия» для event-агентств наши клиенты: тел.: сайт: (495)
Jokes Jokes Jokes Teacher: Where's your text book? Student: At home. Teacher: What's it doing there? Student: Having a.
7 Copyright © 2004, Oracle. All rights reserved. Using Explicit Cursors.
Cursors ITEC 224 Database Programming PL/SQL Lab.
Управление SQL Server c помощью PowerShell
Cursors.
Сортировка, поиск и фильтрация данных в базе данных и выборках
Presentation transcript:

Обработка запросов с использованием курсоров

Функции явного курсора Что такое курсор? Каждая команда SQL, выполняемая на сервере Oracle, имеет свой курсор. Два типа курсоров: Неявные курсоры: создаются для всех команд DML и команд SELECT PL/SQL. Явные курсоры: создаются программистом. Имя присваивает программист. Функции явного курсора Поочередная обработка строк, возвращаемых запросом. Отслеживание текущей обрабатываемой строки. Ручное управление курсорами в блоке PL/SQL.

Управление явными курсорами Нет DECLARE OPEN FETCH CLOSE Да EMPTY? Создание именованной рабочей области SQL Выявление активного набора строк Загрузка текущей строки в перемен-ные Проверка на наличие строки Возврат к FETCH если строка обнаружена Освобож-дение активного набора строк

Управление явными курсорами Открытие курсора Указатель Cursor Выборка строки из курсора Указатель Cursor Выборка до тех пор, пока не останется строк Указатель Cursor

Объявление курсора: синтаксис Объявление курсора: пример DECLARE CURSOR cursor_name IS select_statement; Не включайте выражение INTO в описание курсора. Объявление курсора: пример DECLARE . . . v_ord_id s_item.ord_id%TYPE; v_product_id s_item.product_id%TYPE; v_item_total NUMBER (11,2); CURSOR item_cursor IS SELECT product_id, price*quantity FROM s_item WHERE ord_id = v_ord_id; BEGIN

Открытие курсора: синтаксис Выборка данных из курсора: синтаксис OPEN cursor_name; Выборка данных из курсора: синтаксис FETCH cursor_name INTO variable1, variable2,...; Значения текущей строки выбираются в выходные переменные. Включается столько переменных, сколько столбцов в запросе. Последовательность имен переменных должна соответствовать последовательности столбцов. Проверьте, есть ли строки в курсоре.

Выборка данных из курсора: пример Закрытие курсора: синтаксис FETCH item_cursor INTO v_product_id, v_item_total; Закрытие курсора: синтаксис CLOSE cursor_name;

Атрибуты явного курсора Информацию о состоянии курсора можно получить с помощью атрибутов курсора. Атрибут Тип Описание %ISOPEN Boolean Истинно (TRUE), если курсор открыт. %NOTFOUND Boolean Истинно (TRUE), если последняя команда FETCH не вернула строку. %FOUND Boolean Истинно (TRUE), пока последняя команда FETCH возвращает строку. %ROWCOUNT Number Общее количество строк, выбранных на данный момент.

Управление многократной выборкой Для обработки нескольких строк из явного курсора можно организовать цикл. При каждом выполнении цикла извлекается одна строка. Проверку на неудачную выборку можно сделать с помощью атрибута %NOTFOUND. Успех каждой выборки можно проверить с помощью атрибутов явного курсора.

Атрибут %ISOPEN: пример Выборка строк возможна только при открытом курсоре. Прежде, чем выполнять операцию FETCH, проверьте, открыт ли курсор, с помощью атрибута %ISOPEN. IF item_cursor%ISOPEN THEN FETCH item_cursor INTO v_quantity, v_price; ELSE OPEN item_cursor; END IF;

Атрибуты %NOTFOUND и %ROWCOUNT: пример LOOP FETCH item_cursor INTO v_product_id, v_item_total; EXIT WHEN item_cursor%ROWCOUNT > 5 OR item_cursor%NOTFOUND; v_order_total := v_order_total + v_item_total; . . . END LOOP;

Курсоры и записи: пример Строки из активного набора строк удобно обрабатывать, выбирая значения в запись (RECORD) PL/SQL. CURSOR emp_cursor IS SELECT id, salary, start_date, rowid FROM s_emp WHERE dept_id = 41; emp_record emp_cursor%ROWTYPE; BEGIN OPEN emp_cursor; . . . FETCH emp_cursor INTO emp_record;

Курсоры с параметрами: синтаксис Курсоры с параметрами: пример CURSOR cursor_name [(parameter_name datatype, ...)] IS select_statement; Курсоры с параметрами: пример CURSOR emp_cursor (v_dept NUMBER, v_job VARCHAR2) IS SELECT last_name, salary, start_date FROM s_emp WHERE dept_id = v_dept AND title = v_job;

Циклы FOR с курсорами: синтаксис Циклы FOR с курсорами: пример FOR record_name IN cursor_name LOOP statement1; statement2; . . . END LOOP; Циклы FOR с курсорами: пример FOR item_record IN item_cursor LOOP -- неявное открытие и неявная выборка v_order_total := v_order_total + (item_record.price * item_record.quantity); i := i + 1; product_id_table (i) := item_record.product_id; order_total_table (i) := v_order_total; END LOOP; -- неявное закрытие

Предложение WHERE CURRENT OF Требует предварительной блокировки строк с помощью предложения FOR UPDATE в запросе. SELECT...FROM...FOR UPDATE [OF column-reference][NOWAIT] Используется для ссылки на текущую строку явного курсора. Если используется предложение FOR UPDATE, фиксация транзакций (COMMIT) между выборками из явного курсора не допускается. ... CURSOR emp_cursor IS SELECT ... FOR UPDATE; BEGIN FOR emp_record IN emp_cursor LOOP UPDATE ... WHERE CURRENT OF emp_cursor; END LOOP; COMMIT; END;

Курсорная переменная

Понятие курсорной переменной Курсорная переменная (cursor variable) может быть связана с различными операторами во время выполнения программы. Курсорные переменные аналогичны переменным PL/SQL, в которых могут содержаться различные значения.

Объявление курсорной переменной Курсорные переменные имеют ссылочный тип. С помощью та кого типа можно именовать области хранения данных во время выполнения программы. Чтобы воспользоваться ссылочным типом, необходимо сначала объявить переменную, а затем выделить область памяти. TYPE имя_типа IS REF CURSOR [RETURN возвращаемый_тип]; имя_типа — это имя нового ссылочного типа, а возвращаемый_тип - тип записи, указывающий типы списка выбора, которые в итоге будут возвращаться курсорной переменной.

Пример объявления курсорной переменной DECLARE - Описание при помощи %ROWTYPE TYPE t_StudentsRef IS REF CURSOR RETURN students%ROWTYPE; - Определяем новый тип записи, TYPE t_NameRecord IS RECORD ( first_name students.first_name%TYPE, last_name students. last_name%TYPE); - переменную этого типа v_NameRecord t_NameRecord; - и курсорную переменную, использующую этот тип записи. TYPE t_NamesRef IS REF CURSOR RETURN t_NameRecord; - При помощи %TYPE можно объявить еще один тип. TYPE t_NamesRef2 IS REF CURSOR RETURN t_NameRecord%TYPE; - Объявим курсорные переменные. v_StudentCV t_StudefitsRef; v_NameCV t_NamesRef;

Ограниченные и неограниченные курсорные переменные Ограниченные курсорные переменные (constrained) объявляются только для конкретного возвращаемого типа. Переменная должна открываться для такого запроса, список выбора которого соответствует типу, возвращаемому курсором. В противном случае возникает предопределенная исключительная ситуация ROWTYPE_MISMATCH. Для неограниченных курсорных переменных (unconstrained) предложение RETURN отсутствует. Такая переменная может быть открыта для любого запроса. DECLARE - Определим неограниченный ссылочный тип TYPE t_FlexibleRef IS REF CURSOR; - и переменную этого типа. v_CursorVar t_FlexibleRef;

Открытие курсорной переменной для запроса OPEN курсорная_переменная FOR onepamop_select; где курсорная_переменная — это ранее объявленная курсорная переменная, a onepamop_sekct — требуемый запрос. После выполнения OPEN...FOR можно считывать информацию из курсорной переменной.

Использование курсорной переменной. Пример. PROCEDURE SEL_TEST ( in_last_name IN VARCHAR2 DEFAULT NULL, in_date_birth IN VARCHAR2 DEFAULT NULL ) IS TYPE ref_cursor IS REF CURSOR; v_sql_stmt VARCHAR2 (4000); v_comma CHAR (1) := NULL; out_cur ref_cursor; BEGIN v_sql_stmt := 'select * FROM PERSON '; IF (in_last_name IS NOT NULL) or (in_last_name IS NOT NULL) THEN v_sql_stmt := v_sql_stmt||'WHERE'; END IF; IF in_last_name IS NOT NULL THEN v_sql_stmt := v_sql_stmt || v_comma || ' last_name=''' || in_last_name || ''''; v_comma := ‘ and ';

Использование курсорной переменной. Пример. (Продолжение) IF in_date_birth IS NOT NULL THEN v_sql_stmt := v_sql_stmt || v_comma || ' date_birth=to_date(''' || in_date_birth || ''',''DD-MM-YYYY'')'; v_comma := ','; END IF; OPEN out_cur FOR v_sql_stmt; …. END;

Ограничения на использование курсорных переменных Курсорные переменные нельзя объявлять в модуле. Сам тип можно, но переменную нельзя. Удаленные подпрограммы не могут возвращать значение курсорной переменной. Курсорные переменные могут передаваться между клиентской и серверной стороной PL/SQL (например, из клиента Oracle Form), но не между двумя серверами. Сборные конструкции PL/SQL (индексные таблицы, вложенные таблицы и изменяемые массивы) не могут хранить курсорные переменные. Аналогично, таблицы и представления базы данных не могут хранить столбцы REF CURSOR. Запрос, связанный с курсорной переменной в операторе OPEN...FOR, не может быть FOR UPDATE. Это ограничение снято в Oracle8i и выше.

Задание 1. Создайте процедуру TOP_DOGS1 для определения самых высокооплачиваемых служащих Для этого упражнения создайте новую таблицу с данными о служащих и их заработной плате. Включите параметр, чтобы пользователь мог ввести нужное количество самых высокооплачиваемых служащих (n). Создайте цикл FOR с курсором для выборки из таблицы S_EMP фамилий и заработной платы n самых высокооплачиваемых служащих. Сохраните фамилию и заработную плату в таблице TOP_DOGS. Предполагается что двух служащих с одинаковой заработной платой не существует. Проверьте особые случаи – например, с n=0 и с n, превышающим количество служащих в таблице S_EMP. После каждого теста удаляйте данные из таблицы TOP_DOGS.

Задание 2. Создайте хранимую процедуру ADD_STARS, которая в новом столбце STARS проставляет для каждого служащего по призовой звёздочке за каждый процент заработанных комиссионных. Используйте курсор и цикл WHILE. Для этого упражнения создайте в таблице S_EMP новый столбец для хранения звёздочек (*) Определите процент комиссионных для каждого служащего, округлив его до ближайшего целого числа. Рассмотрите случай, когда служащий не получает комиссионных. Добавляйте звёздочку в строку звёздочек за каждый процент комиссионных. Если, например, служащий получает 10 процентов комиссионных, символьная строка в столбце STARS должна содержать десять звёздочек. Проставьте соответствующее количество звёздочек для каждого служащего в столбце STARS.

Задание 3. Скопируйте процедуру TOP_DOGS1 из упражнения 1 и назовите новый вариант TOP_DOGS2. Измените процедуру TOP_DOGS2 с учётом случая, когда несколько служащих из упражнения 1 имеют одинаковую заработную плату. Для каждой фамилии в списке должны быть перечислены все служащие с такой же заработной платой. Выполните процедуру TOP_DOGS2. В качестве n введите число 6, 7 или 8. В этом случае в выходных данных должны появиться фамилии Ngao, Dumas и Quick-To_See. Если же n равно 9, 10 или 11, должны появиться фамилии Nagayama, Magee и Maduro. Не забывайте полностью удалять данные из таблицы TOP_DOGS после каждого теста.

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

Задание 6. Напишите процедуру, определяющую рейтинг лучших товаров по: суммарной цене приобретённого за указанный срок товара; количеству единиц приобретённого за указанный срок товара; количеству заказов, в которые входил приобретённого за указанный срок товар. Т.е. первым выдаётся на печать товар, у которого максимальный показатель по выбранному критерию, затем товар с более низким показателем и т.д. Какой из критериев использовать определяется по входным параметрам. Если указано несколько критериев, то их приоритет соответствует списку, указанному выше.

Задание 7. Скопируйте таблицу s_emp в s_emp_copy. Для s_emp_copy напишите пакет функций: Вставка строки в таблицу. Если отдел не введён то сотрудник заносится в самый малочисленный отдел. Выбор строки. Если указан id, то выводится строка с указанным ключом. Если нет, то происходит поиск по фамилии, имени, дате начала работы, году начала работы, отделу и заработной плате. Удаление. Если указана id, то удаляется строка с указанным ключом. Если нет, то происходит поиск по фамилии, имени, дате начала работы, году начала работы, отделу и заработной плате. Разработать структуру логирования информации для таблицы s_emp_copy с возможностью восстановления данных за нужный период.

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