Команда DECLARE CURSOR общие правила
Команда DECLARE CURSOR позволяет построчно извлекать записи из таблицы для манипулирования. Это позволяет производить построчную обработку вместо традиционной обработки наборами данных, которую осуществляет SQL.
В самом первом приближении при работе с курсором используются следующие шаги.
Курсор создается командой DECLARE. Курсор открывается командой OPEN.
Операции с курсором производятся при помощи команды FETCH. Курсор закрывается командой CLOSE.
В команде DECLARE CURSOR указывается инструкция SELECT. Каждую строку, возвращаемую инструкцией SELECT, можно извлекать и обрабатывать индивидуально. В следующем примере для Oracle курсор объявляется в блоке объявлений вместе с несколькими другими переменными. После этого в последующем блоке BEGIN…END курсор открывается, по нему производится выборка, и курсор закрывается.
DECLARE
CURSOR title_price_cursor IS SELECT title, price FROM titles
WHERE price IS NOT NULL; title_price_val title_price_cursor ROWTYPE; new_price NUMBER(10.2);
BEGIN
OPEN title_price_Cursor;
FETCH title_price_cur-sor INTO title_price_val;
new_price := ‘title_price_val.price’ * 1.25 INSERT INTO new_title_price VALUES
(title_price_val.title, new_price) CLOSE title_price_cursor; END;
Поскольку в этом примере используется PL/SQL, большую часть кода мы в этой книге разъяснять не будем. Однако в блоке DECLARE ясно видно объявление курсора. В исполняемом блоке PL/SQL курсор инициализируется командой OPEN, значения извлекаются командой FETCH и, наконец, курсор закрывается командой CLOSE.
Инструкция SELECT- это основа курсора, так что хорошей практикой является ее тщательное тестирование перед включением в инструкцию DECLARE CURSOR. Инструкция SELECT может работать с базовой таблицей или представлением. Поэтому курсоры «только для чтения» могут работать с необновляемыми представлениями. Инструкция SELECT может содержать такие предложения, как ORDER BY, GROUP BY и HAVING, если эти предложения не обновляют исходную таблицу. Если курсор определен как FOR UPDATE, то рекомендуется удалять такие предложения из инструкции SELECT.
Локальные курсоры часто используются в качестве выходных параметров хранимых процедур. Поэтому в хранимой процедуре можно определить и заполнить курсор и передать его вызвавшему ее пакетному заданию или хранимой процедуре.
В следующем простом примере для DB2 мы объявим курсор, который просматривает номера департаментов, названия департаментов и номера менеджеров в admin_group ‘ХО1’.
EXEC SQL
DECLARE dept_cursor CURSOR
FOR SELECT dept_nbr, dept_name, mgr_nbr
FROM department
WHERE admin_group=’X01′
ORDER BY d’ept_name ASC, dept_nbr DESC, mgr_nbr DESC;
В следующем примере для Microsoft SQL Server объявляется и открывается курсор для таблицы publishers. Курсор отбирает из таблицы publishers первую запись, соответствующую инструкции SELECT, и вставляет ее в другую таблицу. Затем он переходит к следующей записи, потом к следующей — до тех пор, пока все записи не будут обработаны. И наконец, курсор закрывается и высвобождает память (команда DEALLOCATE используется только в Microsoft SQL Server).
DECLARE @publisher_name VARCHAR(20)
DECLARE pub_cursor CURSOR FOR SELECT pub_name FROM publishers WHERE country ‘USA’
OPEN pub_cursor
FETCH NEXT FROM pub_cursor INTO publisher_name
WHILE @s>FETCH_STATUS=0
BEGIN
INSERT INTO foreign_publishers VALUES(«j>publisher_name)
END
CLOSE pub_cursor DEALLOCATE pub_cursor
В этом примере можно видеть, как курсор передвигается по набору записей. (Этот пример призван только продемонстрировать данную идею, поскольку в действительности существует лучший способ решения данной задачи, а именно инструкция INSERT, SELECT.)