СТАТЬЯ |
27.09.01
|
ГЛАВА 7
ИСПОЛЬЗОВАНИЕ ПРОЦЕДУР И ПАКЕТОВ
Эта глава обсуждает процедурные возможности ORACLE. Темы этой главы включают обсуждение следующих вопросов:
Замечание: Информация в этой главе применима лишь к системам, использующим ORACLE с процедурной опцией. Если вы используете Trusted ORACLE, обратитесь также к документу Trusted ORACLE7 Server Administrator's Guide за важной информацией об использовании процедурной опции в этом окружении.
Следующие секции обсуждают шаги, необходимые для создания процедур и пакетов.
Прежде чем вы сможете создавать процедуры или пакеты, ваш администратор базы данных, подключившись как SYS, должен запустить скрипт CATRPOC.SQL. Этот скрипт автоматически выполняет все скрипты, требуемые для процедурной опции. Местоположение этого скрипта зависит от операционной системы; обратитесь к вашему руководству по инсталляции.
Общие рекомендации по созданию процедур и пакетов
Напишите текст процедуры или пакета с помощью текстового редактора, и сохраните исходный код как текстовый файл. Затем введите в ORACLE определение этой процедуры или пакета, запустив этот файл как скрипт. Этот метод дает следующие удобства:
ORACLE сохраняет переданный ему исходный код процедуры или пакета в словаре данных. Этот исходный код можно извлечь с помощью одного из следующих обзоров словаря данных: ALL_SOURCE, USER_SOURCE или DBA_SOURCE. Примеры использования этих и других обзоров словаря данных приведены в секции "Вывод информации о процедурах и пакетах" на странице 7-23.
Создание независимых процедур и функций
Независимая хранимая процедура имеет две части:
спецификация |
СПЕЦИФИКАЦИЯ объявляет процедуру или функцию.
Кроме этого, ТОЛЬКО для функций:
|
тело |
ТЕЛО определяет процедуру или функцию. Тело процедуры состоит из блока PL/SQL (который содержит предложения SQL и PL/SQL). |
Обе части процедуры создаются в одном шаге с помощью команды CREATE PROCEDURE или CREATE FUNCTION.
Используйте команду CREATE PROCEDURE, чтобы создать спецификацию и тело процедуры. Вы можете выдавать эту команду из любой интерактивной утилиты Oracle (такой как SQL*Plus или SQL*DBA). Следующее предложение создает процедуру SAL_RAISE:
PROCEDURE sal_raise (emp_id IN NUMBER, sal_incr NUMBER) AS /* Эта процедура принимает два аргумента. EMP_ID - это число, соответствующее номеру сотрудника. SAL_INCR - это величина, на которую необходимо увеличить жалованье сотрудника. */ BEGIN /* Если сотрудник существует, обновить его жалованье. */ UPDATE emp SET sal = sal + sal_incr WHERE empno = emp_id; IF SQL%NOTFOUND THEN raise_application_error(-20101, 'Invalid Employee Number: ' || TO_CHAR(emp_id)); END IF; END sal_raise;
При использовании SQL*DBA или SQL*Plus, обозначайте конец предложения CREATE PROCEDURE путем ввода одиночной наклонной черты ("/") после ввода последней строки кода процедуры.
Используйте команду CREATE FUNCTION, чтобы создать спецификацию и тело функции. Вы можете выдавать эту команду из любой интерактивной утилиты Oracle (такой как SQL*Plus или SQL*DBA).
Следующее предложение создает спецификацию и тело функции HIRE_EMP:
CREATE FUNCTION hire_emp (name VARCHAR2, job VARCHAR2, mgr NUMBER, hiredate DATE, sal NUMBER, comm NUMBER, deptno NUMBER) RETURN NUMBER IS
/* Эта функция принимает все аргументы для полей в таблице EMP, за исключением номера сотрудника. Значение для этого поля поставляется последовательностью. Функция возвращает номер последовательности, сгенерированный вызовом этой функции, в качестве номера нового сотрудника. */
new_empno NUMBER(10); /* используется для возврата */ BEGIN SELECT emp_sequence.NEXTVAL INTO new_empno FROM dual; INSERT INTO emp VALUES (new_empno, ename, job, mgr, hiredate, sal, comm, deptno); RETURN(new_empno);END hire_emp;
Объявление пакета имеет две части:
спецификация пакета |
СПЕЦИФИКАЦИЯ ПАКЕТА содержит объявления процедур и функций, переменных, констант и исключений, которые доступны извне пакета. |
тело пакета |
ТЕЛО ПАКЕТА определяет процедуры и функции, курсоры и исключения, которые были объявлены в спецификации пакета. Тело пакета может также определять процедуры, функции, переменные, константы, курсоры и исключения, которые не были объявлены в спецификации пакета; однако эти объекты доступны лишь внутри сферы пакета. |
Каждая часть пакета создается отдельной командой. Для создания спецификации пакета используйте команду CREATE PACKAGE. Для создания тела пакета используйте команду CREATE PACKAGE BODY.
Команда CREATE PACKAGE создает спецификацию пакета, содержащую объявления общих объектов этого пакета. Следующее предложение SQL создает спецификацию пакета EMP_MGMT:
CREATE PACKAGE emp_mgmt AS FUNCTION hire_emp (name VARCHAR2, job VARCHAR2, mgr NUMBER, hiredate DATE, sal NUMBER, comm NUMBER, deptno NUMBER) RETURN NUMBER; PROCEDURE fire_emp (emp_id NUMBER); PROCEDURE sal_raise (emp_id IN NUMBER, sal_incr NUMBER);END emp_mgmt;
Для создания тела пакета используйте команду CREATE PACKAGE BODY, чтобы специфицировать код для общих процедур и функций, объявленных в спецификации пакета. Вы можете также определить в теле пакета личные пакетированные процедуры, переменные и т.п.
Следующее предложение SQL создает тело пакета EMP_MGMT:
CREATE PACKAGE BODY emp_mgmt AS FUNCTION hire_emp (name VARCHAR2, job VARCHAR2, mgr NUMBER, hiredate DATE, sal NUMBER, comm NUMBER, deptno NUMBER) RETURN NUMBER IS /* Эта функция принимает все аргументы для полей в таблице EMP, за исключением номера сотрудника. Значение для этого
поля поставляется последовательностью. Функция возвращает
номер последовательности, сгенерированный вызовом этой
функции, в качестве номера нового сотрудника. */ new_empno NUMBER(10); /* используется для возврата */ BEGIN SELECT emp_sequence.NEXTVAL INTO new_empno FROM dual; INSERT INTO emp VALUES (new_empno, ename, job, mgr, hiredate, sal, comm, deptno); RETURN(new_empno); END hire_emp; (продолжение на следующей странице) PROCEDURE fire_emp (emp_id NUMBER) IS /* Эта процедура удаляет сотрудника с номером сотрудника,
заданным аргументом EMP_ID. Если сотрудник не найден, возбуждается исключение. */ BEGIN DELETE FROM emp WHERE empno = emp_id; IF SQL%NOTFOUND THEN raise_application_error(-20101, 'Invalid Employee Number: ' || TO_CHAR(emp_id)); END IF; END fire_emp;
END emp_mgmt; PROCEDURE sal_raise (emp_id IN NUMBER, sal_incr NUMBER) IS /* Эта процедура принимает два аргумента. EMP_ID - это число,
соответствующее номеру сотрудника. SAL_INCR - это величина,
на которую необходимо увеличить жалованье сотрудника. */ BEGIN /* Если сотрудник существует, обновить его жалованье. */ UPDATE emp SET sal = sal + sal_incr WHERE empno = emp_id; IF SQL%NOTFOUND THEN raise_application_error(-20101, 'Invalid Employee Number: ' || TO_CHAR(emp_id)); END IF;
END sal_raise;
Объявление общих и личных данных и процедур в пакетах
Объявляйте процедуру, переменную, константу, курсор или исключение либо в спецификации пакета, либо в теле пакета, чтобы сделать этот конструкт пакета ОБЩИМ или ЛИЧНЫМ, соответственно.
Объявляйте общую процедуру, переменную, константу, курсор или исключение в спецификации пакета, чтобы сделать этот объект доступным вне пакета (как и внутри пакета). Общие конструкты объявляются в следующих ситуациях:
Чтобы объявить общий конструкт пакета, просто включите объявление этого конструкта в спецификацию пакета. После того, как общая процедура объявлена в спецификации пакета, она должна быть определена в теле пакета.
Личные процедуры, переменные, константы, курсоры или исключения не объявляются в спецификации пакета. Поэтому они доступны только в сфере тела пакета (если они объявлены в теле пакета) или в сфере процедуры (если они объявлены внутри пакетированной процедуры).
Используйте личные конструкты там, где требуется большая степень защиты для исполнения пакетированной процедуры или доступности пакетированных переменных или курсоров.
Переменные, константы и курсоры в процедурах и пакетах
Переменные, константы и курсоры отличаются от других конструктов языка тем, что они имеют состояние или значение, которое может изменяться или оставаться неизменным на определенное время жизни. Продолжительность состояния переменной, константы или курсора зависит от местоположения ее (его) объявления:
процедурные Состояние переменной, константы или курсора, переменные, объявленных в независимой или пакетированной константы процедуре, сохраняется только на время, пока и курсоры продолжается вызов процедуры, и теряется, когда исполнение процедуры заканчивается.
пакетированные Состояние переменной, константы или курсора, переменные, объявленных в спецификации или теле пакета (т.е. константы не внутри процедуры), сохраняется на время и курсоры сессии пользователя (т.е. даже между транзакциями), и теряется, когда текущая сессия заканчивается, или при перекомпиляции пакета.
Пакетированные переменные, константы и курсоры имеют следующие уникальные особенности:
Предпочтительнее использовать процедурные переменные и курсоры, если только вам не требуется, чтобы состояние этих конструктов сохранялось между вызовами процедуры в контексте транзакции или даже между транзакциями.
предыдущая часть | содержание | следующая часть
Дополнительную информацию Вы можете получить в компании Interface Ltd.
Обсудить на форуме Oracle
Отправить ссылку на страницу по e-mail
Interface Ltd. Отправить E-Mail http://www.interface.ru |
|
Ваши замечания и предложения отправляйте автору По техническим вопросам обращайтесь к вебмастеру Документ опубликован: 27.09.01 |