Шаг 41 - PL/SQL - блоки, литералы, переменные

Итак, ваш первый "курсор" в области SGA, совершив работу, выдал "Hello World!". Как он это сделал вы уже, наверное, успели немного разобраться! Давайте двигаться дальше. В прошлый раз мы просто вывели текст на экран и все проверив работу мантры! :) Но от таких программ мало толку и по этому давайте сделаем что-то полезное. Как правило, самой простой программой, которой обычно начинают изучать какой либо язык, является калькулятор! Конечно же писать калькулятор на языке PL/SQL - это излишество, но для начала вполне приемлемо! Итак, давайте разберем пару блоков PL/SQL:

SET SERVEROUTPUT ON -- Need first start

DECLARE

A INTEGER;
B INTEGER;

BEGIN 

	A := 3;
	B := 5;

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

END;
/

Получаем следующее:

SQL> SET SERVEROUTPUT ON -- Need first start

SQL> DECLARE
  2  
  3  A INTEGER;
  4  B INTEGER;
  5  
  6  BEGIN
  7  
  8  	A := 3;
  9  	B := 5;
 10  
 11  	DBMS_OUTPUT.enable;
 12  	DBMS_OUTPUT.put_line(A+B);
 13  
 14  END;
 15  /
8

PL/SQL procedure successfully completed

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

DECLARE

A INTEGER := 3;
B INTEGER := 7;

BEGIN 
.
.

Далее при выводе результата мы прямо в теле метода 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;
/

Получаем следующее:

SQL> DECLARE
  2  
  3  A INTEGER := 3;
  4  B INTEGER;
  5  K VARCHAR2(2) := '12';
  6  
  7  BEGIN
  8  
  9  B := 5;
 10  
 11  	DBMS_OUTPUT.enable;
 12  	DBMS_OUTPUT.put_line(TO_CHAR(TO_NUMBER(K)*A+B));
 13  
 14  END;
 15  /
41

PL/SQL procedure successfully completed

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

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

Но все же явное преобразование более понятно, и не теряйте чувство реальности! Давайте более ближе посмотрим на литералы. Например можно записать:

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;
/

Получаем следующее:

SQL> DECLARE
  2  
  3  A VARCHAR2(1) := ' ';
  4  B VARCHAR2(128) := 'Hello World!!!';
  5  C VARCHAR2(128) := 'How ''are'' you?';
  6  D VARCHAR2(128) := 'Hello Bob - "ok"!';
  7  E VARCHAR2(128) := '12345';
  8  F VARCHAR2(128) := '01/01/1989';
  9  G VARCHAR2(128) := '!@#$%^&*()_":;<,.?';
 10  H VARCHAR2(128) := ''' ''';
 11  
 12  I NUMBER := 12345;
 13  J NUMBER := -12345;
 14  K NUMBER := 12345.023745;
 15  L NUMBER := 100.;
 16  M NUMBER := 1.0237E2;
 17  N NUMBER := 1.0237E-2;
 18  O NUMBER := 0.34223;
 19  P NUMBER := .321434;
 20  
 21  BEGIN
 22  
 23  	DBMS_OUTPUT.enable;
 24  
 25  	DBMS_OUTPUT.put_line(A);
 26  	DBMS_OUTPUT.put_line(B);
 27  	DBMS_OUTPUT.put_line(C);
 28  	DBMS_OUTPUT.put_line(D);
 29  	DBMS_OUTPUT.put_line(E);
 30  	DBMS_OUTPUT.put_line(F);
 31  	DBMS_OUTPUT.put_line(G);
 32  	DBMS_OUTPUT.put_line(H);
 33  
 34  	DBMS_OUTPUT.put_line(TO_CHAR(I));
 35  	DBMS_OUTPUT.put_line(TO_CHAR(J));
 36  	DBMS_OUTPUT.put_line(TO_CHAR(K));
 37  	DBMS_OUTPUT.put_line(TO_CHAR(L));
 38  	DBMS_OUTPUT.put_line(TO_CHAR(M));
 39  	DBMS_OUTPUT.put_line(TO_CHAR(N));
 40  	DBMS_OUTPUT.put_line(TO_CHAR(O));
 41  	DBMS_OUTPUT.put_line(TO_CHAR(P));
 42  
 43  END;
 44  /
 
Hello World!!!
How 'are' you?
Hello Bob - "ok"!
12345
01/01/1989
!@#$%^&*()_":;<,.?
' '
12345
-12345
12345,023745
100
102,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;	-- можно и так!

Хорошим стилем программирования является объявление и инициализация переменных. Если инициализировать переменную, нет необходимости, то инициализацию можно опустить. Типы переменных мы уже рассматривали, все они применимы при их объявлении. Так что, можете с этим поэкспериментировать и проверить все ли так как я вам рассказал! :) Далее мы еще вернемся к созданию программы калькулятора.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 13.10.2003