Шаг 86 - PL/SQL - Язык программирования Oracle
В "Шаг 73 - PL/SQL - функции PL/SQL осталось немного..." мы с вами закончили близкое рассмотрение функций PL/SQL - вот теперь давайте вернемся к этому вопросу, а именно изучению языка PL/SQL. В "Шаг 38 - PL/SQL - вводный курс" я уже останавливался на описании языка PL/SQL, но кое что, еще осталось и думаю, что это вам будет не безынтересно. Итак SQL - в PL/SQL соответствует стандарту ANSI (American National Standards Institute - Американский национальный институт стандартов.) определенному документом ANSI X3.135-1992 "Database Language SQL". Именно этот стандарт известный как SQL92 (или SQL2), сам по себе определяет язык SQL и не описывает 3GLPL/SQL. Cтандарт SQL92 имеет три уровня согласования: Entry (начальный), Intermediate (промежуточный) и Full (полный). Oracle 7 варианта 7.2 - (и все другие версии более высокого уровня, в том числе Oracle8) соответствует стандартам Entry SQL92, что одобрено NIST (National Institute for Standards and Technology - Национальный Институт стандартов и технологий). В настоящее время Oracle - работает с ANSI, чтобы обеспечить, соответствие будущих версий Oracle и PL/SQL полному стандарту. Может показаться неожиданным, но язык PL/SQL разработан на основе языка третьего поколения Ada (хотя мне лично, как кажется я уже говорил он очень напоминает язык Pascal!). Многие конструкции, применяемые в Ada можно найти в PL/SQL - такие, например как модули - так называемые пакеты. Но о них мы поговорим позже. Как Вы, наверное, поняли базовой единицей языка PL/SQL является блок (block), который имеет следующую структуру:
DECLARE
............
BEGIN
........
EXCEPTION
........
END;
Думаю, знакомая вам конструкция!? :) Это так называемый анонимный блок. Такой блок каждый раз при выполнении компилируется. Так же он не хранится в базе данных и не может быть вызван из другого блока. В данном случае приступим к изучению именованных блоков - процедур и функций. Такие блоки хранятся в базе данных и могут быть использованы повторно. А вот это не маловажный фактор! Итак, собственно первая конструкция, которую мы рассмотрим, это именованный блок или ПРОЦЕДУРА. Синтаксис его объявления таков:
-------------- CREATE [OR REPLACE] PROCEDURE - имя_процедуры --------------------------------- (аргумент [IN] [OUT] [IN OUT] тип, ..... ) AS [IS] ---------------------------- тело процедуры --------------------------------------------------
где:
· (имя_процедуры) - имя создаваемой процедуры,
· (аргумент) - имя параметра процедуры,
· (тип) - это тип соответствующего параметра,
· (тело процедуры) - это блок PL/SQL в котором содержится текст процедуры.
Для изменения программного кода процедуры ее необходимо удалить, а затем создать вновь, для того, чтобы делать это за один проход применяется дополнительный оператор объявления REPLACE, что буквально понимается, как заменить. Если его не применять, то процедуру необходимо удалить с помощью оператора DROP PROCEDURE имя. Вот таким образом, определяется данная конструкция. Далее мы с вами поучимся создавать процедуры.
Шаг 87 - PL/SQL - Именованные блоки процедуры
Закончив знакомство с синтаксисом и объявлениями, давайте наконец, займемся делом. Напишем нашу с вами первую процедуру и познакомимся со всем, что с этим связано. Итак, запускаем 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, что само по себе не принципиально, но позволяет показать как можно создать процедуру изменить ее или удалить! Вот и все три действия, которыми мы как правило пользуемся! Думаю, что теперь вы сами можете что-нибудь создать! :)
Шаг 88 - PL/SQL - Работаем с процедурами
Вот теперь давайте создадим, что то осмысленное и попытаемся получить хоть какой-то результат... Снова вступает в бой MILLER/KOLOBOK наперевес с SQL*Plus. Запишем такую процедуру:
CREATE OR REPLACE PROCEDURE TESTPRGTWO
IS
BEGIN
DBMS_OUTPUT. enable;
DBMS_OUTPUT. put_line('HELLO!!! I AM TESTPRGTWO!!! REMEMBER ME?!');
END TESTPRGTWO;
/
После компиляции получаем:
SQL> CREATE OR REPLACE PROCEDURE TESTPRGTWO
2 IS
3
4 BEGIN
5
6 DBMS_OUTPUT. enable;
7 DBMS_OUTPUT. put_line('HELLO!!! I AM TESTPRGTWO!!! REMEMBER ME?!');
8
9 END TESTPRGTWO;
10 /
Процедура создана.
SQL>
Итак, вот теперь наша процедура выводит приветственное послание - HELLO!!! I AM TESTPRGTWO!!! REMEMBER ME?! Но как в этом убедится, что она вообще, что то выводит? Можно вот так - применив, оператор EXECUTE:
SET SERVEROUTPUT ON
EXEC TESTPRGTWO;
Увидим:
SQL> SET SERVEROUTPUT ON
SQL> EXEC TESTPRGTWO;
HELLO!!! I AM TESTPRGTWO!!! I HEVE REPLACE MYSELF NOW!
Процедура PL/SQL успешно завершена.
Вот теперь судя по последней записи, совершенно ясно, что наша процедура откомпилирована, хранится в БД (поэтому она еще называется хранимая процедура) и выполняет определенные действия. Есть еще и второй способ, это вызвать процедуру на исполнение напрямую из анонимного блока, скажем вот так:
SET SERVEROUTPUT ON
DECLARE
BEGIN
TESTPRGTWO;
END;
/
Получаем:
SQL> SET SERVEROUTPUT ON
SQL>
SQL> DECLARE
2
3 BEGIN
4
5 TESTPRGTWO;
6
7 END;
8 /
HELLO!!! I AM TESTPRGTWO!!! I HEVE REPLACE MYSELF NOW!
Процедура PL/SQL успешно завершена.
Теперь, анонимный блок вызвал именованный, и после выполнения завершился. Теперь, у нас с вами две процедуры, одна из которых, вообще ничего не делает, а другая приветствует, да и то, только если попросят! :) Давайте посмотрим запрос из прошлого шага, но более полный:
SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
2 FROM USER_OBJECTS
3 /
OBJECT_NAME OBJECT_TYPE STATUS
----------------- ------------------ -------
BOYS TABLE VALID
CUSTOMERS TABLE VALID
GIRLS TABLE VALID
OFFICES TABLE VALID
ORDERS TABLE VALID
PRODUCTS TABLE VALID
SALESREPS TABLE VALID
SYS_C003505 INDEX VALID
SYS_C003506 INDEX VALID
SYS_C003507 INDEX VALID
SYS_C003511 INDEX VALID
SYS_C003512 INDEX VALID
SYS_C003513 INDEX VALID
SYS_C003515 INDEX VALID
TESTPRG PROCEDURE VALID
TESTPRGTWO PROCEDURE VALID
16 rows selected
SQL>
Вот теперь хорошо видно, что у нас с вами семь таблиц, семь индексов и, о чудо! Две процедуры! Надеюсь, что вскоре их станет больше! :)
Шаг 89 - PL/SQL - Процедуры и их параметры
Наверное вы уже заметили, что в наших прошлых процедурах, явно чего-то не хватает. Думаю, если кто-либо из вас знаком с языками программирования, например C++ или Pascal, то вы могли задать вопрос, а можно в PL/SQL - процедурах передавать параметры? Да не просто можно, а нужно! И работа с параметрами процедур PL/SQL довольно интересна! Давайте попробуем написать процедуру с параметрами:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


