СТАТЬЯ
27.09.01

предыдущая часть | содержание | следующая часть

ГЛАВА 7

ИСПОЛЬЗОВАНИЕ ПРОЦЕДУР И ПАКЕТОВ

Создание процедур и пакетов
  • Предварительные условия
  • Общие рекомендации по созданию процедур и пакетов
  • Создание независимых процедур и функций
  • Создание пакетов
  • Переменные, константы и курсоры в процедурах и пакетах
  • Код автоматического первоначального исполнения
  • Именование процедур, функций и пакетов
  • Недействительность пакетов и состояние пакета в сессии
  • Допустимые предложения и ограничения для процедур и пакетов
  • Привилегии, требуемые для создания процедур и пакетов
  • Обработка ошибок
  • Объявление исключений и программы обработки исключений
  • Идентификация ошибок компиляции для процедур и пакетов
  • Отладка процедур и пакетов
  • Создание пакета DBMS_OUTPUT
  • Включение отладочной информации
  • Пример применения DBMS_OUTPUT
  • Вызов процедур
  • Вызов процедуры из другой процедуры или триггера
  • Интерактивный вызов процедур из инструментов ORACLE
  • Явный вызов процедур в приложениях
  • Разрешение имен при вызове процедур
  • Привилегии, требуемые для исполнения процедуры
  • Специфицирование значений для аргументов процедуры
  • Вызов удаленных процедур
  • Обращения к удаленным объектам
  • Синонимы для процедур и пакетов
  • Замена процедур и пакетов
  • Удаление независимых процедур и пакетов
  • Привилегии, требуемые для удаления процедур и пакетов
  • Вопросы зависимостей
  • Вывод информации о процедурах и пакетах
  • Пример 2: Вывод исходного кода процедуры
  • Пример 3: Вывод информации о размере процедуры
  • Эта глава обсуждает процедурные возможности 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.
    Тel/Fax: +7(095) 105-0049 (многоканальный)
    Отправить E-Mail
    http://www.interface.ru
    Ваши замечания и предложения отправляйте автору
    По техническим вопросам обращайтесь к вебмастеру
    Документ опубликован: 27.09.01