СТАТЬЯ |
16.10.01
|
Глава 7. Использование процедур и пакетов
Содержание части
Невозможно явно изменить независимую процедуру или пакет; такой объект должен быть заменен новым определением процедуры или пакета. Например, если вы хотите слегка исправить одно из предложений в теле независимой процедуры, то нельзя просто изменить одно это предложение. Вместо этого вы должны заново создать всю процедуру. Если вы использовали текстовый редактор для написания своих процедур и пакетов, вы можете просто отредактировать соответствующий текстовый файл и выполнить предложение 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. Отправить E-Mail http://www.interface.ru |
|
Ваши замечания и предложения отправляйте автору По техническим вопросам обращайтесь к вебмастеру Документ опубликован: 16.10.01 |