Читайте также: |
|
DECLARE
CURSOR CR1 (CAPACITY_MIN JEU_12.AUDITORIUM.AUDITORIUM%TYPE, CAPACITY_MAX JEU_12.AUDITORIUM.AUDITORIUM%TYPE)
IS SELECT * FROM AUDITORIUM WHERE AUDITORIUM_CAPACITY BETWEEN CAPACITY_MIN AND CAPACITY_MAX ORDER BY AUDITORIUM_CAPACITY FOR UPDATE;
AUDITORIUM_REC JEU_12.AUDITORIUM%ROWTYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('---- [40; 80]-BEFORE');
FOR AUDITORIUM_REC IN CR1(40, 80)
LOOP
DBMS_OUTPUT.PUT_LINE(CR1%ROWCOUNT||' '||
TRIM(AUDITORIUM_REC.AUDITORIUM)||
' '||AUDITORIUM_REC.AUDITORIUM_CAPACITY);
END LOOP;
FOR AUDITORIUM_REC IN CR1(40, 80)
LOOP
UPDATE AUDITORIUM SET AUDITORIUM_CAPACITY=AUDITORIUM_CAPACITY*0.9 WHERE CURRENT OF CR1;
END LOOP;
DBMS_OUTPUT.PUT_LINE('---- [40; 80]-AFTER');
FOR AUDITORIUM_REC IN CR1(40, 80)
LOOP
DBMS_OUTPUT.PUT_LINE(CR1%ROWCOUNT||' '||
TRIM(AUDITORIUM_REC.AUDITORIUM)||
' '||AUDITORIUM_REC.AUDITORIUM_CAPACITY);
END LOOP;
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
29. Язык PL/SQL:применение псевдостолбцов ROWID, ROWNUM.
Псевдостолбец ROWID (зашифрованный 64-битовым ключом уникальный адрес строки таблицы)
Применяется для наиболее быстрого обращения к конкретной строке.
SELECT SUM(AUDITORIUM_CAPACITY) FROM AUDITORIUM;
DECLARE
CURSOR CURS_AUDITORIUM (CAPACITY JEU_12.AUDITORIUM.AUDITORIUM%TYPE)
IS SELECT AUDITORIUM, AUDITORIUM_CAPACITY, ROWID FROM AUDITORIUM
WHERE AUDITORIUM_CAPACITY>=CAPACITY FOR UPDATE;
BEGIN
FOR XXX IN CURS_AUDITORIUM(80)
LOOP
DELETE AUDITORIUM WHERE ROWID=XXX.ROWID;
END LOOP;
FOR YYY IN CURS_AUDITORIUM(30)
LOOP
UPDATE AUDITORIUM SET AUDITORIUM_CAPACITY=AUDITORIUM_CAPACITY*2 WHERE ROWID=YYY.ROWID;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
ROWNUM - логический номер записи в запросе, используется для обращения к определенным строкам, полученным в результате запроса(например с использованием order).
30. Язык PL/SQL: исключения, стандартные исключения, генерация и обработка исключения. Принцип распространения исключений. Инструкция RAISE_APPLICATION_ERROR.
Исключения - это события, сигнализирующие о возникновении неразрешимых или просто предусмотренных программистом ситуаций, требующих обработки до дальнейшего выполнения программного кода.
Встроенное исключение – исключение предопределенного (встроенного) в Oracle типа (no_data_found, too_many_rows…).
Пользовательские исключения – созданные пользователем типы исключений.
Оператор raise позволяет создать исключение ранее предопределенного типа, передавая в качестве параметра ему этот тип.
DECLARE
E_NAMESAKE EXCEPTION;
PRAGMA EXCEPTION_INIT(E_NAMESAKE, 100);
N NUMBER(5);
BEGIN
SELECT COUNT(*) INTO N FROM TEACHER T1, TEACHER T2
WHERE T1.TEACHER_NAME=T2.TEACHER_NAME AND T1.TEACHER!=T2.TEACHER;
IF N = 0 THEN RAISE E_NAMESAKE;
END IF;
DBMS_OUTPUT.PUT_LINE(N);
EXCEPTION
WHEN E_NAMESAKE
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE(SQLCODE);
DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK, 1, 200));
DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 200));
END;
Raise_A_E позволяет создать исключение ранее не определенного типа, передав в параметрах код исключения и информационное сообщение.
BEGIN
RAISE_APPLICATION_ERROR(-20000, 'USER ERROR MESSAGE');
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
DBMS_OUTPUT.PUT_LINE(SQLCODE);
DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_UTILITY.FORMAT_ERROR_STACK, 1, 200));
DBMS_OUTPUT.PUT_LINE(SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE, 1, 200));
END;
Во вложенных блоках ошибки обрабатываются ближайшими секциями обработки, способными перехватывать данный тип исключений. Иными словами, ошибка, возникшая во внутреннем блоке будет обработана его же секцией обработки, при условии наличия необходимого обработчика, если таковая имеется, в противном случае она будет обработана внешним ближайшим блоком обработки, способным обработать данный тип исключения.
DECLARE
AA EXCEPTION;
BB EXCEPTION;
CC EXCEPTION;
BEGIN --1
BEGIN --2
DBMS_OUTPUT.PUT_LINE('BLOCK 2');
RAISE AA;
EXCEPTION
WHEN AA THEN DBMS_OUTPUT.PUT_LINE('BLOCK 2:AA');
RAISE BB;
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE('BLOCK 2:OTHERS');
END; --2
DBMS_OUTPUT.PUT_LINE('BLOCK 1');
EXCEPTION
WHEN BB THEN DBMS_OUTPUT.PUT_LINE('BLOCK 1:BB');
END; --1
31. Язык PL/SQL:встроенные функции.
Числовые встроенные функции:
CEIL(10.455) --округление до верхнего целого
FLOOR(10.455) --округление до нижнего целого
TRUNC(10.455, 1) --усечение десятичных разрядов
ROUND(10.455, 1) --усечение десятичных разрядов
MOD(7, 4) --вычисление остатка от деления
POWER(2, 4) --вычисление степени числа
SIGN(-11) --выделение знака числа
GREATEST(11, 5, 7, 70) --вычисление наибольшего из списка значений
Встроенные функции для работы с датами:
CURRENT_DATE --получение текущей даты и времени
CURRENT_TIMESTAMP --получение штампа
TO_DATE('07.02.2038', 'DD.MM.YYYY') --преобразование строки в дату
TO_CHAR(SYSDATE, 'DD.MM') --преобразование даты в строку
NEXT_DAY('01-12-10', 'СУББОТА') --получение следующего дня недели
LAST_DAY(SYSDATE) --получение последнего дня месяца
EXTRACT(MONTH FROM SYSDATE) --выделение компонент даты
ROUND(SYSDATE, 'YEAR') --округление даты
TRUNC(SYSDATE, 'YEAR') --округление даты
Встроенные функции конвертации:
TO_NUMBER('666.74', '999.99') --преобразование строки в число
TO_CHAR(666.74, '999.99') --преобразование числа в строку
TO_DATE('07.02.2038', 'DD.MM.YYYY') --преобразование строки в дату
TO_CHAR(SYSDATE, 'DD.MM') --преобразование даты в строку
Дата добавления: 2015-11-16; просмотров: 60 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Операторы цикла в PLSQL | | | Методы и исключения для работы с коллекциями |