Отсутствие запрета изменений таблиц при открытом курсоре     — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

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

2022-12-20 37
Отсутствие запрета изменений таблиц при открытом курсоре     0.00 из 5.00 0 оценок
Заказать работу

Открытый курсор не запрещает изменять данные таблиц, выбираемых курсором, и даже удалять их строки, так как на курсор распространяется правило целостности операции 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;) атрибутов не имеет.

 

 


Поделиться с друзьями:

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.013 с.