Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...
Топ:
Определение места расположения распределительного центра: Фирма реализует продукцию на рынках сбыта и имеет постоянных поставщиков в разных регионах. Увеличение объема продаж...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Интересное:
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Дисциплины:
2022-12-20 | 36 |
5.00
из
|
Заказать работу |
|
|
Открытый курсор не запрещает изменять данные таблиц, выбираемых курсором, и даже удалять их строки, так как на курсор распространяется правило целостности операции SQL:
DECLARE
CURSOR curs_ a IS SELECT deptno FROM dept ORDER BY deptno DESC;
CURSOR curs_ b IS SELECT deptno FROM dept ORDER BY deptno DESC;
dno dept.deptno%TYPE;
BEGIN
OPEN curs_a;
FETCH curs_a INTO dno; DBMS_OUTPUT.PUT_LINE('cursor A:' || dno);
DELETE FROM dept WHERE deptno = 40;
OPEN curs_b;
FETCH curs _a INTO dno; DBMS_OUTPUT.PUT_LINE('cursor A:' || dno);
FETCH curs_b INTO dno; DBMS_OUTPUT.PUT_LINE('cursor B: ' || dno);
FETCH curs_a INTO dno; DBMS_OUTPUT.PUT_LINE('cursor A:' || dno);
FETCH curs_b INTO dno; DBMS_OUTPUT.PUT_LINE('cursor B: ' || dno);
FETCH curs_a INTO dno; DBMS_OUTPUT.PUT_LINE('cursor A:' || dno);
FETCH curs_b INTO dno; DBMS_OUTPUT.PUT_LINE('cursor B: ' || dno);
CLOSE curs_a;
CLOSE curs_b;
END;
/
SELECT * FROM dept;
ROLLBACK;
(Обратите внимание, что целостность данных, выдаваемых курсором, не пострадала).
Однако для изменения текущей строки, выбираемой с помощью курсора, есть более эффективное средство (см. фразу WHERE CURRENT OF в блокирующем курсоре ниже).
Атрибуты для явных курсоров
У каждого явно открываемого курсора имеются для использования в программе четыре атрибута:
Атрибут | Значение |
%ISOPEN | Имеет значение TRUE, если курсор открыт и FALSE, если нет |
%FOUND | Исключительное состояние INVALID_CURSOR, если курсор не открыт с помощью OPEN или закрыт с помощью CLOSE NULL – перед первым выполнением FETCH TRUE – после успешного выполнения FETCH FALSE – если FETCH не сумел выдать строку |
%NOTFOUND | Исключительное состояние INVALID_CURSOR, если курсор не открыт с помощью OPEN или закрыт с помощью CLOSE NULL – перед первым выполнением FETCH FALSE – после успешного выполнения FETCH TRUE – если FETCH не сумел выдать строку |
%ROWCOUNT | Исключительное состояние INVALID_CURSOR, если курсор не открыт с помощью OPEN или закрыт с помощью CLOSE Число – общее число строк, извлеченных после последней операции FETCH для курсора |
|
Синтаксис использования атрибута: имя_курсора % атрибут.
Пример использования в программе:
DECLARE
caller_rec caller_package.caller_cursor%ROWTYPE;
BEGIN
OPEN caller_package.caller_cursor
LOOP
FETCH caller_package.caller_cursor INTO caller_rec;
EXIT WHEN caller_package.caller_cursor%NOTFOUND
OR
caller_package.caller_cursor%ROWCOUNT > 10;
UPDATE call
SET caller_id = caller_rec.caller_id
WHERE call_timestamp < SYSDATE;
END LOOP;
CLOSE caller_package.caller_cursor;
END;
(Здесь предполагается, что имеется таблица с именем CALL с информацией о телефонных звонках и что есть пакет CALLER_PACKAGE для работы с этой информацией).
Неявные курсоры
Открываются при непосредственном указании в тексте операторов INSERT, UPDATE, DELETE и SELECT INTO. Явных операций открытия, OPEN, FETCH и CLOSE они не требуют.
В случае SELECT INTO возможны исключительные ситуации, при возникновении которых управление передается в раздел обработки исключительных ситуаций:
NO_DATA_FOUND – если не извлечено ни единой строки
TOO_MANY_ROWS – если извлечено более одной строки
С неявными курсорами связаны следующие атрибуты:
Атрибут | Значение |
%ISOPEN | Всегда FALSE, так как атрибут открывается неявно и закрывается сразу после отработки SQL-предложения |
%FOUND | NULL – перед выполнением SQL-оператора TRUE – если оператор обработал несколько строк (выдал – только одну) FALSE – если оператор не обработал ни одной строки |
%NOTFOUND | NULL – перед выполнением SQL-оператора FALSE – если оператор обработал несколько строк (выдал – только одну) TRUE – если оператор не обработал ни одной строки |
%ROWCOUNT | Число – количество обработанных строк |
%BULK_ROWCOUNT | Псевдо-индексная таблица с числом обработанных строк при использовании привязки массивом (только начиная с версии 8.1) |
|
Синтаксис использования атрибута: SQL% атрибут.
Пример использования в программе (в SQL*Plus):
BEGIN
UPDATE emp SET sal = sal WHERE deptno = &department_no;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('No employees in this department');
ELSE
DBMS_OUTPUT.PUT_LINE('Perfectly done for '|| SQL%ROWCOUNT ||’ employees’);
END IF;
END;
/
Неявный курсор для множественного отбора в цикле (FOR rec IN (SELECT … FROM …) LOOP … END LOOP;) атрибутов не имеет.
|
|
Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...
Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначенные для поддерживания проводов на необходимой высоте над землей, водой...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!