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

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

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

2022-12-20 36
Отсутствие запрета изменений таблиц при открытом курсоре     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;) атрибутов не имеет.

 

 


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

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...



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

0.01 с.