Читайте также:
|
|
Loop – оператор бесконечного цикла, в том случае если используется без вспомогательных выражений. Может использоваться с выражением выхода из цикла exit when.
LOOP
X:=X + 1;
DBMS_OUTPUT.PUT_LINE(X);
EXIT WHEN X >= 5;
END LOOP;
While – оператор цикла, содержащий в себе условие выполнения цикла.
WHILE(X<5)
LOOP
X:=X+1;
DBMS_OUTPUT.PUT_LINE(X);
END LOOP;
For – оператор цикла, содержащий в себе условие выполнения, в виде интервала значений.
FOR K IN 1..5
LOOP
DBMS_OUTPUT.PUT_LINE(K);
END LOOP;
27. Язык PL/SQL: явные и неявные курсоры. Схемы обработки курсора. Атрибуты курсора. Курсорные переменные.
Курсор — ссылка на контекстную область памяти. В некоторых реализациях информационно-логического языка SQL (Oracle, Microsoft SQL Server) — получаемый при выполнении запроса результирующий набор и связанный с ним указатель текущей записи.
Курсор - механизм построчной обработки результирующего набора.
В PL/SQL поддерживаются два типа курсоров: явные и неявные. Явный курсор объявляется разработчиком, а неявный курсор не требует объявления.
Курсор может возвращать одну строку, несколько строк или ни одной строки. Для запросов, возвращающих более одной строки, можно использовать только явный курсор. Для повторного создания результирующего набора для других значений параметров курсор следует закрыть, а затем повторно открыть.
Курсор может быть объявлен в секциях объявлений любого блока PL/SQL, подпрограммы или пакета.
Неявный курсор:
DECLARE
FACULTY_REC FACULTY%ROWTYPE;
BEGIN
SELECT * INTO FACULTY_REC FROM FACULTY WHERE FACULTY LIKE '%ИДиП%';
DBMS_OUTPUT.PUT_LINE(RTRIM(FACULTY_REC.FACULTY)||':'||FACULTY_REC.FACULTY_NAME);
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
Явный курсор:
DECLARE
CURSOR CURS_TEACHER IS SELECT TEACHER, TEACHER_NAME, PULPIT FROM TEACHER;
M_TEACHER JEU_12.TEACHER.TEACHER%TYPE;
M_TEACHER_NAME JEU_12.TEACHER.TEACHER_NAME%TYPE;
M_PULPIT JEU_12.TEACHER.PULPIT%TYPE;
BEGIN
OPEN CURS_TEACHER;
DBMS_OUTPUT.PUT_LINE('ROWCOUNT = '||CURS_TEACHER%ROWCOUNT);
LOOP
FETCH CURS_TEACHER INTO M_TEACHER, M_TEACHER_NAME, M_PULPIT;
EXIT WHEN CURS_TEACHER%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(CURS_TEACHER%ROWCOUNT||' '||
M_TEACHER||' '||M_TEACHER_NAME
||' '||M_PULPIT);
END LOOP;
DBMS_OUTPUT.PUT_LINE('ROWCOUNT = '||CURS_TEACHER%ROWCOUNT);
CLOSE CURS_TEACHER;
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
Неявный курсор использует точную выборку – запрос должен возвращать ровно одну строку, в противном случае генерируется исключение too_many_rows или no_data_found.
Явный курсор предполагает следующую схему работы:
Declare – объявить курсор.
Open – открыть курсор.
Fetch – просмотреть курсор.
Close – закрыть курсор.
Атрибуты курсора - предопределенные системные переменные, характеризующие состояние курсора.
%ISOPEN — возвращает значение TRUE, если курсор открыт.
%FOUND — определяет, найдена ли строка, удовлетворяющая условию.
%NOTFOUND — возвращает TRUE, если строка не найдена.
%ROWCOUNT — возвращает номер текущей строки.
Статические курсоры связанны с одним SQL-оператором, который был известен при компиляции блока. Курсорная же переменная (cursor variable) может быть связана с различными операторами во время выполнения программы. Курсорные переменные аналогичны переменным PL/SQL, в которых могут содержаться различные значения. Статические же курсоры аналогичны константам PL/SQL, так как они могут быть связаны только с одним запросом на этапе выполнения программы.
TYPE PULPIT_TYPE IS REF CURSOR RETURN PULPIT%ROWTYPE;
XCURS PULPIT_TYPE;
Или
XCURS SYS_REFCURSOR;
DECLARE
TYPE PULPIT_TYPE IS REF CURSOR RETURN PULPIT%ROWTYPE;
XCURS PULPIT_TYPE;
REC_PULPIT PULPIT%ROWTYPE;
BEGIN
OPEN XCURS FOR SELECT * FROM JEU_12.PULPIT;
FETCH XCURS INTO REC_PULPIT;
WHILE (XCURS%FOUND)
LOOP
DBMS_OUTPUT.PUT_LINE(XCURS%ROWCOUNT||' '||TRIM(REC_PULPIT.PULPIT_NAME)||' '||REC_PULPIT.FACULTY);
FETCH XCURS INTO REC_PULPIT;
END LOOP;
CLOSE XCURS;
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
--
DECLARE
XCURS SYS_REFCURSOR;
REC_PULPIT PULPIT%ROWTYPE;
BEGIN
OPEN XCURS FOR SELECT * FROM JEU_12.PULPIT WHERE FACULTY='ИДиП';
FETCH XCURS INTO REC_PULPIT;
WHILE (XCURS%FOUND)
LOOP
DBMS_OUTPUT.PUT_LINE(XCURS%ROWCOUNT||' '||TRIM(REC_PULPIT.PULPIT_NAME)||' '||REC_PULPIT.FACULTY);
FETCH XCURS INTO REC_PULPIT;
END LOOP;
CLOSE XCURS;
EXCEPTION
WHEN OTHERS
THEN DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
28. Язык PL/SQL: курсорные подзапросы, конструкция CURRENT OF.
Курсорный подзапрос – метод построения запросов, при котором одним из возвращаемых значений (один из столбцов) будет курсор, а остальные будут являть собой обычные значения. В дальнейшем с этим возвращаемым в каждой строке курсором можно работать как с обычным, то есть просматривать при помощи fetch.
Дата добавления: 2015-11-16; просмотров: 55 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Системные и объектные привилегии СУБД Oracle. | | | Конструкция CURRENT OF применяется для обращения к последней просмотренной в курсоре строке с целью ее изменения или удаления из таблицы. |