Закончив знакомство с синтаксисом и объявлениями, давайте наконец, займемся делом. Напишем нашу с вами первую процедуру и познакомимся со всем, что с этим связано. Итак, запускаем SQL*Plus и отправим на исполнение следующий код: (программирование однако!)
CREATE PROCEDURE TESTPRG AS BEGIN NULL; END TESTPRG; /
Получаем после компиляции:
SQL> CREATE PROCEDURE TESTPRG 2 AS 3 4 BEGIN 5 6 NULL; 7 8 END TESTPRG; 9 / Процедура создана. SQL>
Ура! Наша первая с вами процедура создана и находится внутри нашего сервера и не только находится, но еще и готова к дальнейшему использованию! Итак, для начала давайте убедимся, что она есть и здорова! Введем следующий запрос:
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE' /
Получаем после прохода:
SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS 2 FROM USER_OBJECTS 3 WHERE OBJECT_TYPE = 'PROCEDURE' 4 / OBJECT_NAME OBJECT_TYPE STATUS ------------ ----------- ------ TESTPRG PROCEDURE VALID SQL>
Что ж теперь в вашем владении есть процедура TESTPRG и она совершенно исправна, о чем говорит запись в поле STATUS со значением VALID. К слову сказать, при выполнении оператора CREATE PROCEDURE вследствие того, что он является оператором DDL, то неявно вызывается оператор COMMIT. Помните в шаге 6, я намеренно сделал ошибку сказав, что сделайте COMMIT после оператора GRANT! После чего получил кучу нареканий, от некоторых гугу жанра! Но, я это сделал по той простой причине, .... а впрочем какая разница, сделал я это намеренно или нет! :) Идем дальше. Итак, теперь надеюсь кое-что стало яснее. При первом приближении хорошо видно, что наша процедура совершенно бесполезна, так как, в объявлении ее тела стоит только оператор NULL, который как мы знаем ничего собственно не делает кроме как объявляет сам себя. Но это не так ведь мы с вами учимся, значит это не совсем бесполезно! :) Оставим в покое нашу процедуру, в плане полезности и попробуем, немного переделать ее:
CREATE PROCEDURE TESTPRG IS BEGIN -- Empty Operator ------- NULL; END TESTPRG; /
Получаем:
SQL> CREATE PROCEDURE TESTPRG 2 IS 3 4 BEGIN 5 -- Empty Operator ------- 6 NULL; 7 8 END TESTPRG; 9 / CREATE PROCEDURE TESTPRG * ошибка в строке 1: ORA-00955: имя уже задействовано для существующего объекта
Ой - а вот здесь, как раз нужно было ее удалить, а потом вновь создать, например вот так:
DROP PROCEDURE TESTPRG /
Увидим:
SQL> DROP PROCEDURE TESTPRG 2 / Процедура удалена.
Но, это не совсем рентабельно, давайте снова создадим нашу с вами процедуру, но несколько по другому:
CREATE OR REPLACE PROCEDURE TESTPRG AS BEGIN NULL; END TESTPRG; /
Получаем после компиляции:
SQL> CREATE OR REPLACE PROCEDURE TESTPRG 2 AS 3 4 BEGIN 5 6 NULL; 7 8 END TESTPRG; 9 / Процедура создана. SQL>
Вот теперь изменить ее можно так же за один проход не применяя DROP PROCEDURE TESTPRG! Попробуем проделать следующее:
CREATE OR REPLACE PROCEDURE TESTPRG IS BEGIN -- Empty Operator ------- NULL; END TESTPRG; /
Получаем после компиляции:
SQL> CREATE OR REPLACE PROCEDURE TESTPRG 2 IS 3 4 BEGIN 5 -- Empty Operator ------- 6 NULL; 7 8 END TESTPRG; 9 / Процедура создана. SQL>
Все что мы сделали - это добавили строку комментария и сменили AS на IS, что само по себе не принципиально, но позволяет показать как можно создать процедуру изменить ее или удалить! Вот и все три действия, которыми мы как правило пользуемся! Думаю, что теперь вы сами можете что-нибудь создать! :)