СТАТЬЯ
16.10.01

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

Глава 7. Использование процедур и пакетов

Отладка процедур и пакетов

Содержание части

  • Замена процедур и пакетов
  • Удаление независимых процедур и пакетов
  • Привилегии, требуемые для удаления процедур и пакетов
  • Вопросы зависимостей
  • Вывод информации о процедурах и пакетах
  • Пример 2: Вывод исходного кода процедуры
  • Пример 3: Вывод информации о размере процедуры
  •  

    Замена процедур и пакетов

    Невозможно явно изменить независимую процедуру или пакет; такой объект должен быть заменен новым определением процедуры или пакета. Например, если вы хотите слегка исправить одно из предложений в теле независимой процедуры, то нельзя просто изменить одно это предложение. Вместо этого вы должны заново создать всю процедуру. Если вы использовали текстовый редактор для написания своих процедур и пакетов, вы можете просто отредактировать соответствующий текстовый файл и выполнить предложение CREATE PROCEDURE или CREATE PACKAGE BODY, чтобы определить новую версию кода. Аналогично, вы не можете переопределить отдельную процедуру внутри тела пакета; вы должны заменить тело пакета целиком.

    Чтобы заменить процедуру или пакет, вы должны включить опцию OR REPLACE в соответствующее предложение CREATE PROCEDURE, CREATE FUNCTION, CREATE PACKAGE или CREATE PACKAGE BODY. Опция OR REPLACE введена для того, чтобы можно было заменять существующую

    процедуру или пакет новой версией, не затрагивая никаких грантов, которые были предоставлены для предыдущей версии этой процедуры или пакета.

    Замечание: Альтернативно, процедуру можно удалить и создать заново. Однако при удалении процедуры будут удалены также все гранты, выданные на эту процедуру, так что их придется выдавать заново после повторного создания процедуры.

    Например, предположим, что вы уже владеете процедурой SAL_RAISE или пакетом HIRE_FIRE. Если вы выдаете предложение CREATE PROCEDURE или CREATE PACKAGE BODY, чтобы создать новую версию этой процедуры или тела этого пакета, вы должны включить опцию OR REPLACE:

    CREATE OR REPLACE PROCEDURE sal_raise . . . END;
    CREATE OR REPLACE PACKAGE hire_fire . . . END hire_fire;

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

    Удаление независимых процедур и пакетов

    Независимая процедура, независимая функция, тело пакета, или весь пакет могут быть удалены с помощью команд DROP PROCEDURE, DROP FUNCTION, DROP PACKAGE BODY и DROP PACKAGE, соответственно. Предложение DROP PACKAGE удаляет одновременно как спецификацию, так и тело пакета.

    Следующее предложение удаляет процедуру OLD_SAL_RAISE в вашей схеме:

    DROP PROCEDURE old_sal_raise;
    

    Привилегии, требуемые для удаления процедур и пакетов

    Чтобы удалить процедуру или пакет, вы должны иметь ее (его) в своей схеме, или иметь привилегию DROP ANY PROCEDURE. Нельзя удалить индивидуальную процедуру внутри пакета; чтобы добиться этого, пересоздайте весь пакет, удалив из него ненужную процедуру.

    Вопросы зависимостей

    Существует несколько вопросов зависимостей, которые следует рассматривать перед тем, как удалять процедуру или пакет. Полное обсуждение этих вопросов содержится в главе 9.

    Вывод информации о процедурах и пакетах

    Следующие обзоры словаря данных предоставляют информацию о процедурах и пакетах:

    Обзоры _OBJECT_SIZE показывают размеры объектов PL/SQL. Для полного описания этих обзоров словаря данных обратитесь к приложению D.

    В приведенных ниже трех примерах используются независимые процедуры FIRE_EMP и HIRE_EMP, созданные следующими предложениями:

    CREATE PROCEDURE fire_emp(emp_id NUMBER) AS
      BEGIN
        DELETE FROM em WHERE empno = emp_id;
      END
    /
    CREATE PROCEDURE hire_emp (name VARCHAR2, job VARCHAR2,
        mgr NUMBER, hiredate DATE, sal NUMBER, comm NUMBER,
        deptno NUMBER)
    IS
    BEGIN
      INSERT INTO emp VALUES (emp_sequence.NEXTVAL, name, job, mgr,
        hiredate, sal, comm, deptno);
    END;
    /

    Первое предложение CREATE PROCEDURE содержит ошибку в предложении DELETE (в имени таблицы 'emp' пропущена буква 'p').

    Пример 1: Вывод ошибок компиляции для объектов

    Следующий запрос возвращает все ошибки для объектов в ассоциированной схеме:

    SELECT name, type, line, position, text
    FROM user_errors;

    Возвращаются следующие результаты:

    NAME     TYPE LIN POS TEXT
    -------- ---- --- --- ------------------------------------------
    FIRE_EMP PROC   3  15 PL/SQL-00201: identifier 'EM' must be ...
    FIRE_EMP PROC   3   3 PL/SQL: SQL Statement ignored

    Пример 2: Вывод исходного кода процедуры

    Следующий запрос возвращает исходный код для процедуры HIRE_EMP, которая была создана в начале этой секции:

    SELECT line, text FROM user_source
      WHERE name = 'HIRE_EMP';
    

    Возвращаются следующие результаты:

    LINE TEXT
    ---- -------------------------------------------------------
       1 PROCEDURE hire_emp (name VARCHAR2, job VARCHAR2,
       2     mgr NUMBER, hiredate DATE, sal NUMBER, comm NUMBER,
       3     deptno NUMBER)
       4 IS
       5 BEGIN
       6   INSERT INTO emp VALUES (emp_sequence.NEXTVAL, name, ...
       7     hiredate, sal, comm, deptno);
       8 END;

    Пример 3: Вывод информации о размере процедуры

    Следующий запрос возвращает информацию о количестве памяти в табличном пространстве SYSTEM, которое требуется для хранения процедуры HIRE_EMP:

    SELECT name, source_size + parsed_size + code_size + error_size
               "TOTAL SIZE"
      FROM user_object_size
      WHERE name = 'HIRE_EMP';
    

    Возвращаются следующие результаты:

    NAME                    TOTAL SIZE
    ----------------------- ----------
    HIRE_EMP                      3897

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

    Продолжение статьи будет опубликовано в течение недели

    Дополнительную информацию Вы можете получить в компании Interface Ltd.

    Обсудить на форуме Oracle
    Отправить ссылку на страницу по e-mail


    Interface Ltd.
    Тel/Fax: +7(095) 105-0049 (многоканальный)
    Отправить E-Mail
    http://www.interface.ru
    Ваши замечания и предложения отправляйте автору
    По техническим вопросам обращайтесь к вебмастеру
    Документ опубликован: 16.10.01