Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Управление данными. Использование технологий ORACLE для реализации баз данных. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
722 Кб
Скачать

3.Сделать выборку из таблицы UNIVERSITY с использованием курсора

ицикла с методом %FOUND или %NOTFOUND для получения данных о факультетах с рейтингом, большим 200.

4.Сделать выборку из таблицы EXAM_MARKS с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения сведений об экзаменах, сданных в определённую дату.

5.Сделать выборку из таблицы SUBJLECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о преподавателях, читающих предмет с данным номером.

6.Сделать выборку из таблицы STUDENT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о студентах, живущих в Москве, и использовать пользовательскую исключительную ситуацию для исключения среди выбранных студентов тех, у которых стипендия меньше 200.

7.Сделать выборку из таблицы SUBJECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о предметах во 2-м семестре с использованием пользовательской исключительной ситуации для исключения из полученного списка предметов с количеством часов 72.

8.Сделать выборку из таблицы EXAM_MARKS с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения сведений об экзаменах, сданных в определённую дату, и исключить с помощью пользовательской исключительной ситуации данные об оценках, полученных по заданному номеру предмета.

9.Сделать выборку из таблицы SUBJLECT с использованием курсора и цикла с методом %FOUND или %NOTFOUND для получения данных о преподавателях, читающих предмет с данным номером, и исключить из полученного множества данные с помощью пользовательской исключительной ситуации о преподавателях с заданной фамилией.

4.7.СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ПРОЦЕДУР И ФУНКЦИЙ

Подпрограммы (процедуры и функции) в PL/SQL бывают хранимые и локальные. Хранимые подпрограммы во многом отличаются от локальных. Если подпрограмма должна будет вызываться из многих блоков, то ее делают хранимой, она хранится в базе данных. Короткие процедуры и функции рекомендуется объявлять локально в блоке, если они вызываются только из одного конкретного фрагмента программы. Хранимые подпрограммы (процедуры и функции) хранятся в базе данных в откомпилированном виде и могут вызываться из любого блока.

62

В этом разделе будем рассматривать хранимые подпрограммы. Хранимые процедуры и функции это объекты базы данных и, следовательно, они создаются командой CREATE и уничтожаются командой DROP. При создании процедуры и функции должны быть определены: имя объекта, перечень и тип параметров и логика работы процедуры или функции, описанные на языке PL/SQL.

Чтобы создать процедуру или функцию, необходимо иметь системные привилегии CREATE PROCEDURE. Для создания процедуры, функции или пакета в схеме, отличной от текущей схемы пользователя, требуются системные привилегии CREATE ANY PROCEDURE. После определения имени новой процедуры или функции необходимо задать ее имена, типы и виды параметров. Для каждого параметра должен быть указан один из видов параметра – IN, OUT или IN OUT. Вид параметра IN предполагает, что значение параметра должно быть определено при обращении к процедуре и не изменяется процедурой.

Попытка изменить в теле процедуры параметр вида IN приведет к сообщению об ошибке. Вид параметра OUT предполагает изменение значения параметра в процессе работы процедуры, т.е. параметр вида OUT – это возвращаемый параметр. Параметр IN OUT – это параметр, которому при вызове должно быть присвоено значение, которое может быть изменено в теле процедуры. Параметры процедур или функций имеют виды, присвоенные по умолчанию.

Дополнительно к определениям, необходимым для процедуры, в определении функции должен быть указан тип данных единственного возвращаемого функцией значения. Возврат значения функции выполняется командой PL/SQL RETURN. Оператор определения процедуры ORACLE использует следующий синтаксис:

CREATE [OR REPLACE] PROCEDURE [схема.]имя_процедуры [ (имя_параметра[{IN | OUT | IN OUT}] тип_данных [,имя_параметра[{IN | OUT

| IN OUT}] тип_данных...])]

{IS | AS}

Ключевое слово OR REPLACE указывает на безусловное замещение старого текста процедуры. Если ключевое слово OR REPLACE не указано, и процедура определена, то замещения старого значения кода процедуры не происходит, и возвращается сообщение об ошибке.

В описании переменных процедуры не используется ключевое слово DECLARE. Блок определения данных начинается сразу после ключевого слова IS (или AS, по выбору пользователя).

63

Рассмотрим пример создания процедуры, которая заносит в таблицу значения, зависящие от числового параметра. Пусть таблица сформирована предложением:

CREATE TABLE SUBJLECT(LECT_ID NUMBER, SUBJ_ID NUMBER);

Пример 4.21.

SQL>CREATE OR REPLACE PROCEDURE InsRec ( Argl IN NUMBER,

Arg2 IN NUMBER ) IS

Coeff CONSTANT NUMBER:=0.5;

BEGIN

INSERT INTO SUBJLECT VALUES(Coeff*Argl, Coeff*Arg2);

END;

/

Исполнение созданной процедуры INSREC может быть выполнено оператором EXEC языка PL/SQL. Последующая выборка из таблицы SUBJLECT иллюстрирует изменения в базе данных, осуществленные вызовом процедуры

InsRec:

SQL> EXEC InsRec (240,120);

Чтобы уточнить выявленные в процессе синтаксического анализа ошибки, можно воспользоваться командой PL/SQL SHOW ERRORS. Эта команда показывает ошибки, обнаруженные в процессе выполнения CREATE PROCE-

DURE, CREATE FUNCTION, CREATE PACKAGE, CREATE PACKAGE BODY, CREATE TRIGGER. Если команда SHOW ERRORS используется без параметров, то возвращаются ошибки последней компилированной процедуры, функции, пакета, тела пакета или триггера.

Рассмотрим пример обнаружения и исправления ошибки. В процедуре, представленной выше, добавим ошибочный оператор, изменяющий значение параметра вида IN, который не должен изменяться.

Пример 4.22.

SQL>CREATE OR REPLACE PROCEDURE InsRec (Argl IN NUMBER, Arg2 IN NUMBER) IS

Coeff CONSTANT NUMBER:=0.5;

BEGIN

Argl:=Argl+200; -- ОШИБКА

NSERT INTO SUBJLECT VALUES(Coeff*Argl, Coeff*Arg2);

END;

64

Протокол выполнения:

SQL>SHOW ERRORS

Errors for PROCEDURE InsRec:

LINE/COL ERROR

4/1 PLS-00363: expression 'Arg1’ cannot be used as an assignment target 4/1 PL/SQL: Statement ignored

Напомним, что функции PL/SQL отличаются от процедур тем, что возвращают в вызывающую среду результат. Оператор определения функции ORACLE использует следующий синтаксис:

CREATE [OR REPLACE] FUNCTION [схема.]имя_функции [ (имя_параметра[{IN | OUT | IN OUT}] тип_данных

[, имя_параметра[{IN | OUT | IN OUT}] тип_данных...])] RETURN тип_данных

{IS | AS}

Описание типа данных для возвращаемого функцией значения требуется обязательно. При описании переменных функции так же, как и при описании переменных процедуры, не используется ключевое слово DECLARE. Блок определения данных начинается сразу после ключевого слова IS (или AS, по выбору пользователя).

Рассмотрим пример создания функции, которая вычисляет сумму значений атрибутов, таких, что один из атрибутов попадает в заданный параметрами функции интервал. Пусть таблица сформирована предложением как, в примере 4.20.

Пример 4.23.

SQL>CREATE OR REPLACE FUNCTION SumRecInt (Argl IN NUMBER, Arg2 IN NUMBER)

RETURN NUMBER

IS

Sum_Var NUMBER:=0.0;

BEGIN

SELECT Sum(LECT_ID) INTO Sum_Var FROM SUBJLECT WHERE SUBJ_ID BETWEEN Argl AND Arg2;

RETURN Sum_Var;

END;

/

FUNCTION CREATED

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

65

функцию. В собственной схеме пользователю не требуются дополнительные привилегии для уничтожения процедуры или функции. Для уничтожения процедуры или функции в схеме другого пользователя необходимо наличие приви-

легии DROP ANY PROCEDURE.

Для уничтожения {процедуры | функции} ORACLE использует следующий синтаксис:

DROP {PROCEDURE | FUNCTION} [схема.]имя_процедуры Например,

SQL>DROP FUNCTION SumRecInt

Function dropped;

УПРАЖНЕНИЯ

1.Описать процедуру, которая заносит данные в таблицу STUDENT в зависимости от параметров процедуры, вызвать эту процедуру.

2.Описать процедуру, которая заносит данные в таблицы STUDENT и EXAM_MARKS с соблюдением ссылочной целостности, в зависимости от параметров процедуры, вызвать эту процедуру.

3.Описать процедуру, которая заносит данные в таблицы STUDENT и SUBJECT с соблюдением ссылочной целостности, в зависимости от параметров процедуры, вызвать эту процедуру.

4.Описать процедуру, которая заносит данные в таблицы STUDENT и UNIVERSITY с соблюдением ссылочной целостности, в зависимости от параметров процедуры, вызвать эту процедуру.

5.Описать процедуру, которая заносит данные в таблицу LECTURE в зависимости от параметров процедуры, вызвать эту процедуру.

6.Описать и вызвать функцию, которая вычисляет сумму баллов для студентов, номера которых находятся в заданном интервале в таблице

EXAM_MARKS.

7.Описать и вызвать функцию, которая вычисляет для студентов, номера которых находятся в данном диапазоне, максимальный балл по заданному предмету (с некоторым номером) в таблице EXAM_MARKS.

8.Описать и вызвать функцию, которая определяет для студентов с заданной фамилией сумму баллов по заданному предмету в таблице EXAM_

MARKS.

9. Описать и вызвать функцию, которая вычисляет для студентов, номера которых находятся в данном диапазоне, максимальный балл по заданному названию предмета.

66

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]