Специальные символы, конструкция блоков 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Специальные символы, конструкция блоков



В PL/SQL действует соглашение, что все символы приводятся к верхнему регистру поэтому объявления типа:

a VARCHAR2(5);

A VARCHAR2(5);

 

Типы специальных символов PL/SQL:

1. Арифметические операторы:

+ Сложение и унарный плюс
- Вычитание и унарный минус
* Умножение
/ Деление
** Возведение в степень

2. Операторы отношения (используются в логических выражениях):

= Равенство
< Меньше
> Больше
<> Не равно
!= Не равно (альтернатива)
~= Не равно (альтернатива)
^= Не равно (альтернатива)
<= Меньше или равно
>= Больше или равно

3. Выражение и списки (используются в операторах, объявлениях типов данных, объявлениях списков параметров, ссылках на переменные и таблицы):

:= Присвоение
( Начало списка или подвыражения
) Конец списка или подвыражения
, Отдельные элементы списка (как в списке параметров)
.. Оператор диапазона используется в операторах FOR-IN
|| Конкатенация строк
=> Ассоциация (используется в списке параметров)
; Конец выражения
% Атрибут курсора или типа объекта
. Спецификация объекта
@ Индикатор удаленной базы данных
' Начало/конец строки символов
: Индикатор внешней переменной
& Индикатор связанной переменной

4. Комментарии и метки

-- Комментарий в одной строке
/* Начало многострочного комментария
*/ Конец многострочного комментария
>> Начало метки
<< Конец метки

 

Блоки PL/SQL, могут быть "именованными" и "не именованными". Блок PL/SQL является фундаментальной программной конструкцией. Программирование модулями позволяет разрабатывать легко читаемый код и программировать сверху вниз. Неименованный блок PL/SQL, имеет три раздела - Declaration (объявления), Body (тело) и, как правило, Exception (исключения).

Стандартная конструкция неименованного блока:

 

DECLARE

-- объявления

 

BEGIN

-- выполняемый код

 

EXCEPTION

-- обработка исключений

 

END;

 

/ -- символ завершения для запуска блока на компиляцию

 

Открытие PL/SQL редактора

Для начала выбираем в меню: Пуск\Все программы\Oracle Database 10g Express Edition\Run SQL Command Line

Для соединения с сервером ORACLE как администратор вводим:

Conn / as sysdba

1.После чего вводим представленные команды поочередно.

2.Либо создаём текстовый файл записываем в него команды и затем в Run SQL Command Line вводим команду: start <Путь к файлу>.(Значительно проще)

Пример: start c:\1.txt и видим в окне результаты выполнения программы.

 

Для примера рассмотрим:"Hello World!".

SET SERVEROUTPUT ONBEGINDBMS_OUTPUT.enable;DBMS_OUTPUT.put_line('Hello World!!!');END;/

Получаем после компиляции:

SQL> SET SERVEROUTPUT ONSQL> BEGIN 2 DBMS_OUTPUT.enable; 3 DBMS_OUTPUT.put_line('Hello World!!!'); 4 END; 5 /Hello World!!! PL/SQL procedure successfully completed

Блоки, литералы, переменные

Рассмотрим пару блоков PL/SQL:

SET SERVEROUTPUT ON DECLARE A INTEGER;B INTEGER; BEGIN A:= 3; B:= 5; DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(A+B); END;/

В разделе DECLARE мы обьявили две переменных - A и B. Все переменные объявляются между оператором DECLARE и BEGIN. Затем в теле блока мы присвоили значениям переменных числа 3 и 5. Инициализация переменных может производиться либо при объявлении, либо в теле блока!

Далее при выводе результата мы прямо в теле метода put_line объявили сумму двух переменных. Но вернее было бы провести явное преобразование типа с помощью функции TO_CHAR() вот так:

DBMS_OUTPUT.enable;DBMS_OUTPUT.put_line(TO_CHAR(A+B));

В первом примере мы не сделали ошибки, а произошло неявное преобразование типа

В данном случае можно записать более сложное выражение для наглядности:

DECLARE A INTEGER:= 3;B INTEGER;K VARCHAR2(2):= '12'; BEGIN B:= 5; DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(TO_CHAR(TO_NUMBER(K)*A+B)); END;

Хорошо виден приоритет унарных операций 12*3+5 = 41 - верно. Функция TO_NUMBER(), преобразует строковый литерал K в числовой литерал. С этими функциями преобразования мы еще не раз встретимся и их очень много и будем разбирать их последовательно, так будет проще. Так же разнообразно инициализированы переменные, что тоже не плохо, но лучше делать это одним способом, код будет более читаем. Давайте более ближе посмотрим на литералы. Например можно записать:

DECLARE A VARCHAR2(1):= ' ';B VARCHAR2(128):= 'Hello World!!!';C VARCHAR2(128):= 'How ''are'' you?';D VARCHAR2(128):= 'Hello Bob - "ok"!';E VARCHAR2(128):= '12345';F VARCHAR2(128):= '01/01/1989';G VARCHAR2(128):= '!@#$%^&*()_":;<,.?';H VARCHAR2(128):= ''' '''; I NUMBER:= 12345;J NUMBER:= -12345;K NUMBER:= 12345.023745;L NUMBER:= 100.;M NUMBER:= 1.0237E2;N NUMBER:= 1.0237E-2;O NUMBER:= 0.34223;P NUMBER:=.321434; BEGIN DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(A); DBMS_OUTPUT.put_line(B); DBMS_OUTPUT.put_line(C); DBMS_OUTPUT.put_line(D); DBMS_OUTPUT.put_line(E); DBMS_OUTPUT.put_line(F); DBMS_OUTPUT.put_line(G); DBMS_OUTPUT.put_line(H); DBMS_OUTPUT.put_line(TO_CHAR(I)); DBMS_OUTPUT.put_line(TO_CHAR(J)); DBMS_OUTPUT.put_line(TO_CHAR(K)); DBMS_OUTPUT.put_line(TO_CHAR(L)); DBMS_OUTPUT.put_line(TO_CHAR(M)); DBMS_OUTPUT.put_line(TO_CHAR(N)); DBMS_OUTPUT.put_line(TO_CHAR(O)); DBMS_OUTPUT.put_line(TO_CHAR(P)); END;/Hello World!!!How 'are' you?Hello Bob - "ok"!1234501/01/1989!@#$%^&*()_":;<,.?' '12345-1234512345,023745100102,37,010237,34223,321434 PL/SQL procedure successfully completed Итак строковые литералы могут быть типов CHAR, VARCHAR2. В строковых литералах компилятор различает регистры символов. Давайте посмотрим, что здесь и как! Строковые литералы: A VARCHAR2(1):= ' '; -- пробелB VARCHAR2(128):= 'Hello World!!!'; -- строкаC VARCHAR2(128):= 'How ''are'' you?'; -- строка с выводом символа 'D VARCHAR2(128):= 'Hello Bob - "ok"!'; -- строка с выводом символа "E VARCHAR2(128):= '12345'; -- это не число, это строкаF VARCHAR2(128):= '01/01/1989'; -- это не дата, это строка. хотя похоже!G VARCHAR2(128):= '!@#$%^&*()_":;<,.?'; -- литералы могут содержать и специальные символы!H VARCHAR2(128):= ''' '''; -- строка содержит три символа "' '" -- (одинарная кавычка, пробел одинарная кавычка)

Числовые литералы:

I NUMBER:= 12345; -- целое числоJ NUMBER:= -12345; -- отрицательное числоK NUMBER:= 12345.023745; -- плавающая точкаL NUMBER:= 100.; -- с нулевой точностьюM NUMBER:= 1.0237E2; -- научная записьN NUMBER:= 1.0237E-2; -- отрицательная степеньO NUMBER:= 0.34223; -- ведущий ноль не нужен!P NUMBER:=.321434; -- можно и так!

 

Хорошим стилем программирования является объявление и инициализация переменных. Если инициализировать переменную, нет необходимости, то инициализацию можно опустить.

 

Операторы IF-THEN-ELSE

Самым простым в использовании, в PL/SQL является оператор IF. Его основная логическая форма имеет вид:

IF(некоторое условие справедливо) THEN-- условие справедливо, выполнять это.ELSE -- условие не выполняется-- выполнять оператор в этой части.END IF; -- конец условного оператора.

 

Первый блок оператора после IF-THEN называется "ПРЕДЫДУЩИМ", а блок следующий за ELSE "ПОСЛЕДУЮЩИМ". Каждый оператор IF-THEN может содержать обрамляющие блоки BEGIN - END, если в этом есть необходимость, так как при записи типа:

IF(некоторое условие справедливо) THEN -- оператор 1 -- оператор 2 -- оператор 3 -- оператор 4END IF; -- конец условного оператора.

Можно уверенно сказать, что все четыре оператора выполнятся наверняка. Но, если применить такую конструкцию:

IF(некоторое условие справедливо) THEN BEGIN -- оператор 1 -- оператор 2 -- оператор 3 -- оператор 4 END; END IF; -- конец условного оператора.

Код будет более нагляден, хотя это вопрос относится к стилю программирования. Так же считается, хорошим стилем наличие комментария при использовании оператора IF. Особенно в случае большого количества вложений. Оператор IF можно вкладывать на любую глубину выражения. Таким образом, можно задать достаточно сложную логику выражения. Так же для экономии памяти, возможно использовать конструкцию, типа:

IF(некоторое условие справедливо) THEN -- проверка условия BEGIN -- условие справедливо, выполнять это... END; ELSE -- условие не выполняется DECLARE x NUMBER; BEGIN.. END; END IF; -- конец условного оператора.

В этом случае переменная x будет создана, если условие предыдущего блока ложно. Хотя использовать, такие конструкции не всегда оправдано. Так же условные операторы в PL/SQL вычисляются с помощью так называемой "сокращенной" оценки. Допустим, есть такое условие:

IF(a AND b) THEN -- проверка условия BEGIN.. END; END IF; -- конец условного оператора.

Если выражение a равно FALSE, то дальнейшее выражение не вычисляется! Все выражения вычисляются слева направо, а выражения в скобках, имеют наивысший приоритет. Например, вот так:

IF((a OR f) AND (c OR k)) THEN -- проверка условия BEGIN.. END; END IF; -- конец условного оператора.

Выражения в скобках вычисляются первыми. Работа с NULL. Оператор IF работает с NULL достаточно просто и эффективно. Если записать:

IF(X = NULL) THEN -- проверка условия..END IF; -- конец условного оператора. IF(X!= NULL) THEN -- проверка условия..END IF; -- конец условного оператора.

Такое условие будет иметь значение FALSE и ничего выполняться не будет. Правильная запись будет такая:

IF(X IS NULL) THEN -- проверка условия..END IF; -- конец условного оператора. IF(X IS NOT NULL) THEN -- проверка условия..END IF; -- конец условного оператора.

А что делать, если необходимо проверить одно значение несколько раз? Например, вот так:

IF(val = 1) THEN -- проверка условия..END IF; -- конец условного оператора.... IF(val = 9) THEN -- проверка условия..END IF; -- конец условного оператора.

Такое количество операторов IF конечно можно использовать, но это слишком громоздко и не верно, так как существует конструкция IF - THEN - ELSIF.

IF (val = 1) THEN -- проверка условия..ELSIF (val = 2) THEN..ELSIF (val = 3) THEN..ELSIF (val = 9) THEN..ELSE -- не сработало не одно из условий! END IF; -- конец условного оператора.

Вот так это выглядит, достаточно просто и наглядно. Очень похоже на оператор CASE в языке Pascal. Но не совсем, хотя выполняет ту же функцию. Секция ELSE срабатывает, если не выполнилось ни одно из условий. Таким образом работает этот оператор. Как видите, на первый взгляд, все достаточно просто, хотя и реализует всю функциональность самого языка. Данный оператор является первым фундаментальным оператором языка PL/SQL. Рассмотрим еще один пример. Запускайте SQL*Plus и в любом редакторе наберите следующее:

OPER VARCHAR2(5):= '&TODO'; SET SERVEROUTPUT ON DECLARE A INTEGER:= 7;B INTEGER:= 4;OPER VARCHAR2(2):= '+'; BEGIN DBMS_OUTPUT.enable; IF (OPER = '+') THEN DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'sum = '||TO_CHAR(A+B)); ELSIF (OPER = '-') THEN DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'res = '||TO_CHAR(A-B)); ELSIF (OPER = '*') THEN DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'mul = '||TO_CHAR(A*B)); ELSIF (OPER = '/') THEN DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'div = '||TO_CHAR(A/B)); END IF; END;/

После запуска получаем:

SQL> SET SERVEROUTPUT ONSQL> DECLARE 2 3 A INTEGER:= 7; 4 B INTEGER:= 4; 5 OPER VARCHAR2(2):= '+'; 6 7 BEGIN 8 9 DBMS_OUTPUT.enable; 10 IF (OPER = '+') THEN 11 DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'sum = '||TO_CHAR(A+B)); 12 ELSIF (OPER = '-') THEN 13 DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'res = '||TO_CHAR(A-B)); 14 ELSIF (OPER = '*') THEN 15 DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'mul = '||TO_CHAR(A*B)); 16 ELSIF (OPER = '/') THEN 17 DBMS_OUTPUT.put_line('Operation is '||OPER||' '||'div = '||TO_CHAR(A/B)); 18 END IF; 19 20 END; 21 /Operation is + sum = 11 Процедура PL/SQL успешно завершена.

3. Задание для самостоятельной работы

1. Подобный примеру “Hello, world” написать свой блок

2. Создать блок команд с использованием унарных операций, при этом использовать переменные.

3. Создать блок, используя условие IF-THEN.

4. Создать блок, используя условие IF-THEN- ELSE.

 

4. Контрольные вопросы

1. Что представляет собой язык PL/SQL?

2.Перечислите типы специальных символов

3. В чем преимущества использования PL/SQL вместо SQL?

4. Что такое блок?

5. Структура блока?

6. Какие типы данных вы знаете?

7. Структура условия IF-THEN-ELSE?

 


 



Поделиться:


Последнее изменение этой страницы: 2017-02-09; просмотров: 264; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.61.16 (0.017 с.)