Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Вопросы для самопроверки. Продолжение работы после возбуждения исключения




Пример

Пример

Продолжение работы после возбуждения исключения

Exception

Обработка исключений

Транзакции

Для управления транзакциями и блокировками имеются операторы:

Commit - фиксация транзакции.

Savepoint<имя контрольной точки> ‑ определение контрольной точки.

Rollback[<имя контрольной точки>] - откат на начало транзакции или на указанную контрольную точку.

Исключения представляют собой отклонения от нормального хода вы­пол­не­ния программы из‑за просчетов проектирования, ошибок коди­­ро­ва­ния, сбоев оборудования и др. Хотя невозможно предвидеть все ошибки, вы можете спланировать обработку некоторых из них.

Исключения бывают предопределенными (cursor_already_open, dup_ val_on_in­dex, invalid_cursor, invalid_number, login_denied, no_da­ta_fo­und, not_logged_on, program_error, storage_error, timeout_on_resource, too_ma­ny_ rows, transaction_backed_out, value_error, zero_divide) и пользо­ва­тель­скими.

Пользовательские исключения объявляются в виде:

<имя исключения> Exception;

Для генерации исключения используется оператор:

Raise <имя исключения>;

Оператор вызова обработчика исключений имеет вид:

When <имя исключения> [ or <имя исключения>]... Then

<операторы обработки исключения>;

[When <имя исключения> [ or <имя исключения>]... Then

<операторы обработки исключения>; ]...

[When Others Then --обработка брошенных исключений

[Begin]

<операторы обработки исключения, не указанные в When>; ]

[Exception when others then null; --для предотвращения зацикливания]

[end;]

End;

Функции Sqlcode и Sqlerrm[(n)] возвращают номера и текст сооб­ще­ния (исключения с заданным номером n) для брошенного исключения соот­вет­ственно (dbms_output.put_line(‘Ошибка: ’||sqlerrm(sqlcode));).

Допускается вложенность обработчиков исключений. Если для блока не установлен обработчик исключительных ситуаций, то управление пере­да­ется следующему блоку более высокого уровня.

Пример создания и генерации пользовательского исключения

declare

out_of_stock exception; --объявление пользовательского исключения

number_on_hand number(4);

begin...

if number_on_hand < 1 then raise out_of_stock; end if;

...

exception

when out_of_stock then

... -- обработать ошибку

end;

После исправления ошибки в обработчике исключений нельзя вер­нут­ься в текущий блок для продолжения работы. Однако сущест­ву­ет спо­соб решения этой проблемы: поместить предло­жение в его собствен­ный подблок вместе с его собственными обработчиками исключений.

declare proc_vip_plana number(4,1);

begin

begin --начало подблока обработки

select 100 * fact / plan into proc_vip_plana from stroiki where ks = 101;

exception

when zero_divide then proc_vip_plana:= 100; --обработка деления на нуль

end; --конец подблока

insert into stats (ks, pv) values (101, proc_vip_plana);

end;

5.4.10. Динамический SQL‑оператор

Текст SQL‑оператора можно сформировать динамически в строковой переменной в процессе выполнения программы и выполнить оператором:

Execute [immediate] <имя строковой переменной> [using <параметр>,...].

Procedure Vkluhenij (ptable varchar2, Pprod varchar2, Pdesc varchar2) Is

sql_str varchar2(500); --объявление строковой переменной

Begin sql_str:=’insert into ‘ || ptable || ‘ values (:prod_id,:desc)’;

Execute immediate sql_str Using Pprod, Pdesc;

5.4.11. Внедрение SQL, PL/SQL в прикладные программы

Предкомпиляторы Oracle позволяют встраивать блоки PL/SQL в прог­раммы, написанные на любом из следующих языков высокого уров­­­ня: Ada, C, Cobol, Fortran, Pascal, PL/I, SQL*Plus. Такие программы и язы­ки на­зы­ваются соответственно хост-программами (прикладными прог­рам­мами) и хост-язы­ка­ми (базовыми языками). Написав прог­рамму, вы выполняете предкомпиляцию исходного файла. Предкомпиля­тор проверяет программу, а затем гене­ри­рует исходный файл, который можно ком­пи­ли­ро­вать, редактировать и выполнять обычным образом.

Хост-переменные используются для передачи данных из хост-прог­­­­раммы в блок PL/SQL и для передачи данных и информации сос­то­я­ния из блока PL/SQL в хост-программу. Как хост-язык, так и PL/SQL могут устанавливаться и обращаться к значению хост-переменной. Значение входной/выходной хост-пере­мен­ной устанавливается хост-прог­рам­мой/Oracle и используется Oracle/хост-программой. При обра­ще­нии к хост-переменной в блоке PL/SQL перед ее именем ставится двоеточие. Для объвления хост‑переменной в SQL*Plus используется команда:

Variable <имя хост‑переменной> <тип переменной>.

 

 

Внедренные операторы SQL, PL/SQL начинаются с префикса EXEC SQL. Рассмотрим операторы, обеспечивающих внедрение.

EXEC SQL BEGIN/END DECLARE SECTION ‑ начало и конец блока объявления хост‑переменных операторами хост‑языка.

EXEC SQL INCLUDE SQLCA ‑ включение области связи SQL, которая со­дер­­жит поля с данными об ошибках и состоянии. Прикладная программа мо­­жет анализировать эти данные после выполнения SQL‑оператора.

EXEC SQL WHENEVER { SQLERROR | SQLWARNING | NOT FOUND} {CONTINUE | GOTO <метка> } ‑ обработка ошибок (SQLERROR), предуп­реж­дений (SQLWARNING) или отсутствия записи (NOT FOUND) после вы­полнения любого оператора SQL, PL/SQL и задание возможных действий: иг­но­ри­рование (CONTINUE) или передача управления на указанную метку.

EXEC SQL CONNECT<пользователь> IDENTIFIED BY <пароль> ‑ под­клю­чение к Oracle c указанием имени пользователя и его пароля.

EXEC SQL COMMIT WORK RELEASE ‑ отключение от Oracle.

EXEC SQL EXECUTE, END-EXEC - начало и конец операторов внед­рен­ного блока PL/SQL.Предкомпилятор рассматривает блок PL/SQL как единое встроенное предложение SQL.

Индикаторная переменная (индикатор) используется совместно с хост‑пе­ре­менной и может принимать значения: 0 (связанная хост‑пе­ре­мен­ная содер­жит допустимое значение), меньше нуля (хост‑переменная условно имеет значение Null) и больше нуля (хост‑переменная содержит допустимое значение, ко­то­рое могло быть округлено или обрезано из‑за маленького размера хост‑переменной). Такие индикаторы решают проб­ле­му зна­че­ния Null для хост‑языков, в которых такое значение отсутствует. Ин­ди­ка­тор указывается во внедренном SQL‑операторе сразу после связан­ной с ним хост‑переменной и отделяемым от нее двоеточием. Для всех столбцов таблицы, которые могут содержать значение Null, при выборке необходимо указать свой индикатор, иначе ‑ СУБД фиксирует ошибку.

Пример использования хост‑переменной с индикатором.

EXEC SQL BEGIN DECLARE SECTION;/* начало объявления хост‑переменных*/

Char adres [51]; short adres_ind; /* хост‑переменная и ее индикатор*/

EXEC SQL END DECLARE SECTION; /* конец объявления хост‑переменных*/

aders_ind=-1; /* связанная хост‑переменная adres условно имеет значение Null*/

EXEC SQL UPDATE sotrudniki SET adres_sotr=:adress:adress_ind WHERE tn=11;

Пример. Программа на Pro*C запрашивает у пользователя имя со­т­руд­ника и передает его встроенному блоку PL/SQL, который использует это имя в запросе по базе данных. Результаты запроса передаются обратно в хост-программу, которая распечатывает их. Хост-переменная empname устанавливается перед тем, как войти в блок PL/SQL, а остальные хост-переменные (jobtype, hired и т.д.) принимают значения внутри блока. Все необходимые преобразования данных между типами данных ORACLE и стандартными типами данных хост-языка выполняются автоматически.

#include <stdio.h> /* подключение модуля ввод/вывода */

EXEC SQL BEGIN DECLARE SECTION;/* начало объявления хост‑переменных*/

VARCHAR empname[11]; VARCHAR jobtype[9]; VARCHAR hired[9];

int salary; int dept; int worked_longer; int higher_sal; int total_in_dept;

VARCHAR uid[20]; VARCHAR pwd[20]; /* имя и пароль пользователя */

EXEC SQL END DECLARE SECTION; /* конец объявления хост‑переменных*/

EXEC SQL INCLUDE SQLCA; /* включение области связи SQL */

main() /* начало тела основной программы */

{ /* формирование имени и пароля пользователя */

strcpy (uid.arr,“Plehev“); uid.len = strlen(uid.arr); strcpy (pwd.arr,“PVV“);

pwd.len = strlen(pwd.arr); printf(“\n\n\tДемонстрация встраивания PL/SQL \n\n“);

printf(“Попытка подключения к Oracle“); /* вывод сообщения */

EXEC SQL WHENEVER SQLERROR GOTO errprint; /* обработчик исключений*/

EXEC SQL CONNECT:uid IDENTIFIED BY:pwd; /* подключение к Oracle*/

printf(“ Подключены к Oracle\n“); /* вывод сообщения */

for (;;) /* цикл обработки данных сотрудника */

{ printf(“\n** Имя сотрудника? (для выхода нажмите клавишу Enter)“);

gets(empname.arr); /* ввод имени сотрудника */

if (strlen(empname.arr) == 0) /* имя не введено */

{ EXEC SQL COMMIT WORK RELEASE; /* отключение от Oracle */

exit(0); /* выход из основной программы */

}

empname.len = strlen(empname.arr); jobtype.len = 9; hired.len = 9;

EXEC SQL EXECUTE /* начало PL/SQL‑блока */

BEGIN

/* специальность, стаж, оклад и подразделение сотрудника */

SELECT job,hiredate,sal,deptno INTO:jobtype,:hired,:salary,:dept

FROM emp WHERE ename = UPPER(:empname);

/* число сотрудников со стажем работы меньше, чем у сотрудника */

SELECT COUNT(*) INTO:worked_longer FROM emp WHERE hiredate<:hired;

/* число сотрудников с окладом больше, чем y сотрудника*/

SELECT COUNT(*) INTO:higher_sal FROM emp WHERE sal >:salary;

/* число сотрудников в подразделении, в котором он работает */

SELECT COUNT(*) INTO:total_in_dept FROM emp WHERE deptno =:dept;

END;

END-EXEC; /* конец PL/SQL‑блока */

jobtype.arr[jobtype.len] = '\0'; hired.arr[hired.len] = '\0'; /* вставка конца строки */

/* вывод полученной информации */

printf(“\n%s специальность: %s Стаж: %s\n“,empname.arr,jobtype.arr,hired.arr);

printf(“ %d число сотрудников с меньшим стажем\n“, worked_longer);

printf(“Оклад: %d\n“, salary);

printf(“%d число сотрудников с большим окладом\n“, higher_sal);

printf(“Подразделение: %d\n “, dept);

printf(“ %d Число сотрудников в подразделении\n“, total_in_dept);

} /* конец цикла обработки данных сотрудника */

errprint: /* метка начала обработки исключений */

EXEC SQL WHENEVER SQLERROR CONTINUE; /* игнорирование ошибок */

printf(“\n\nОшибки при выполнении программы:\n“); /* вывод сообщения */

printf(“%s\n“, sqlca.sqlerrm.sqlerrmc); /* вывод текста сообщения об ошибке */

EXEC SQL ROLLBACK RELEASE; /* отмена транзакции */

exit(1); /* выход из основной программы с кодом 1 */

} /* конец тела основной программы */

 

Вопросы для самопроверки и контроля

1. Укажите область допустимых значений для полей типа Varchar.

2. Каким образом представляются поля типа Int?

3. Укажите область допустимых значений для переменных типа Binary_Integer.

4. Укажите область допустимых значений для полей типа Numeric.

5. Для чего используется тип переменной Varray?

6. Что означает параметр %Type в операторе объявления переменной?

7. Для чего используется тип переменной Ref Cursor?

8. Что представляет собой коллекция?

9. Что представляет собой пакет в PL/SQL?

10. Какая форма записи параметров допускается в подпрограммах?

11. Что означает атрибут курсора %Isopen?

12. Что означает атрибут курсора %Rowcount?

13. Для чего предназначен оператор Fetch?

14. Что такое динамический SQL‑оператор?

15. Каково назначение оператора Savepoint?

16. Каково назначение оператораRollback?

17. Каково назначение оператора Raise?

18. Каково назначение SQL‑команды Create View?

19. Каково назначение метода таблицы Limit?

20. Каково назначение метода таблицы Trim([n])?

 

Контрольные вопросы

1. Укажите область допустимых значений для полей типа Nvarchar2.

2. Укажите область допустимых значений для полей типа Char.

3. В чем заключается отличие типа Pls_Integer от типа Binary_Integer?

4. Укажите область допустимых значений для переменных типа Pls_Integer.

5. Укажите область допустимых значений для переменных типа Boolean.

6. Для чего используется тип переменной Record?

7. Для чего используется тип переменной Table?

8. Что означает параметр %Rowtype в операторе объявления переменной?

9. Что представляют собой перезагружаемые подпрограммы?

10. Что понимается под курсором?

11. Могут ли использоваться переменные курсоры в динамических SQL‑опе­ра­торах?

12. Что означает атрибут курсора %Found?

13. Каково назначение SQL‑оператора Execute?

14. Каково назначение контрольной точки?

15. Каким оператором вызывается обработчик исключений?

16. Каково назначение SQL‑оператора Grant?

17. Каково назначение метода таблицы Exists?

18. Каково назначение метода таблицы Count?

19. Каково назначение хост‑переменных?

20. Каково наначение предкомпиляторов Oracle?


Глава 6. Обзор СУБД




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


Дата добавления: 2014-12-10; Просмотров: 380; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.05 сек.