Шаг 42 - PL/SQL - переменные, инициализация, правила

Кажется, жизнь налаживается. Продолжаем разбираться с переменными. Итак, еще раз внимательнее посмотрим, как их правильно записывают и, как и где инициализируют. Итак, давайте рассмотрим такую последовательность:

DECLARE		-- Открывается неименованный блок.
	Price NUMBER(5,2) := 12.43;	-- Переменная типа NUMBER (с плавающей точкой 
				-- с точностью 5ть знаков, два после запятой.
	Sytki NUMBER := 123;	-- Переменная типа NUMBER простая.
	LGos  INTEGER := 2;	-- Переменная типа INTEGER подкласс NUMBER типа.
	Max_Dist CONSTANT REAL := 0.45;	-- Константа типа REAL.
					-- Тип CONSTANT требует обязательной инициализации!!!
	Dis_Tp VARCHAR2(1) := NULL;	-- Строковая переменная типа VARCHAR2 (присвоено значение NULL)
	Ds_Nm CHAR(20) := NULL	-- Строковая переменная типа CHAR (присвоено значение NULL)
	Tk_Ir VARCHAR2(50) NOT NULL := 'Hello World!!!';	-- Строковая переменная
						-- типа VARCHAR2 не может иметь значение NULL!!!
	Tk_Sr BOOLEAN NOT NULL := TRUE;	-- БУЛЕВА! переменная типа BOOLEAN не может иметь значение NULL!!!
	It_Nm VARCHAR2(50) DEFAULT 'Hummer';	-- Строковая переменная типа VARCHAR2 имеет значение по умолчанию

Теперь напишем неименованный блок и посмотрим все ли правильно мы написали:

SET SERVEROUTPUT ON
DECLARE
	Price NUMBER(5,2) := 12.43;
	Sytki NUMBER := 123;         
	LGos INTEGER := 2;          
	Max_Dist CONSTANT REAL := 0.45; 
	Dis_Tp VARCHAR2(1) := NULL;   
	Ds_Nm CHAR(20) := NULL;
	Tk_Ir VARCHAR2(50) NOT NULL := 'Hello World!!!'; 
	Tk_Sr BOOLEAN NOT NULL := TRUE;
	It_Nm VARCHAR2(50) DEFAULT 'Hummer';
  
BEGIN
	DBMS_OUTPUT.enable;
	DBMS_OUTPUT.put_line(TO_CHAR(Price));
	DBMS_OUTPUT.put_line(TO_CHAR(Sytki));
	DBMS_OUTPUT.put_line(TO_CHAR(LGos));
	DBMS_OUTPUT.put_line(TO_CHAR(Max_Dist));
	DBMS_OUTPUT.put_line(Dis_Tp);
	DBMS_OUTPUT.put_line(Ds_Nm);   
	DBMS_OUTPUT.put_line(Tk_Ir);             
	DBMS_OUTPUT.put_line(It_Nm);   
END;
/

Получаем такой вывод SQL*Plus:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2 	Price NUMBER(5,2) := 12.43;
  3 	Sytki NUMBER := 123;
  4 	LGos INTEGER := 2;
  5 	Max_Dist CONSTANT REAL := 0.45;
  6 	Dis_Tp VARCHAR2(1) := NULL;
  7 	Ds_Nm CHAR(20) := NULL;
  8 	Tk_Ir VARCHAR2(50) NOT NULL := 'Hello World!!!';
  9 	Tk_Sr BOOLEAN NOT NULL := TRUE;
 10 	It_Nm VARCHAR2(50) DEFAULT 'Hummer';
 11  
 12 BEGIN
 13 	DBMS_OUTPUT.enable;
 14 	DBMS_OUTPUT.put_line(TO_CHAR(Price));
 15 	DBMS_OUTPUT.put_line(TO_CHAR(Sytki));
 16 	DBMS_OUTPUT.put_line(TO_CHAR(LGos));
 17 	DBMS_OUTPUT.put_line(TO_CHAR(Max_Dist));
 18 	DBMS_OUTPUT.put_line(Dis_Tp);
 19 	DBMS_OUTPUT.put_line(Ds_Nm);
 20 	DBMS_OUTPUT.put_line(Tk_Ir);
 21 	DBMS_OUTPUT.put_line(It_Nm);
 22 END;
 23 /
12,43                                                                                               
123                                                                                                 
2                                                                                                   
,45                                                                                                 
Hello World!!!                                                                                      
Hummer                                                                                              

Процедура PL/SQL успешно завершена.

Действительно, первые три переменных просто вывелись на экран. Это числовые переменные разных типов и точности. А вот четвертую переменную стоит рассмотреть по ближе. Это CONSTANT переменная, то есть константа. Кроме того, она имеет тип REAL, являющимся разновидностью NUMBER. При таком типе объявления переменная должна сразу же получать значение, то есть инициализироваться! Все константы должны инициализироваться при объявлении! Запомните.

Пятая и шестая переменные - это просто строковые литералы разных типов, это я думаю понятно. Седьмая переменная - это строковый литерал, но с хитростью! Он не может иметь значение NULL! Так обычно определяют первичный ключ в таблице. Здесь тоже самое просто применяется, при объявлении переменной!

А, вот восьмая переменная - это, как говорят, отдельная песня! Это BOOLEAN переменная, да еще с грифом NOT NULL! Вообще в PL/SQL тип BOOLEAN привнесен, как мне кажется, немного искусственно для того, чтобы он был полноценным языком программирования. Почему? Как вам, наверное, известно, а если нет, то говорю, в Oracle, как и во многих SQL серверах в таблицах нельзя объявить тип поля (столбца) BOOLEAN! В этом смысле я обычно применяю поле VARCHAR2(1) и просто записываю туда либо T, либо F! А не иметь в самом PL/SQL типа BOOLEAN, было бы не очень красиво! По этому он есть. Что самое интересное, это я вывел экспериментально, TRUE соответствует 1, а FALSE соответствует 0! Прямо как в языке C++! Собственно чего и следовало ожидать!

Девятая переменная, это тоже строковый литерал, но он кроме этого имеет значение по умолчанию! Тот же фокус проделывается, когда создается таблица БД! Вот так, если кратко объявляются и инициализируются переменные в PL/SQL! Практически все способы, которые вам могут понадобиться в дальнейшем, я вам показал! А, дальше это все нужно хорошенько запомнить или записать!!! :)

Кстати, все правила работы с BOOLEAN переменными и константами, те же что я приводил в "Шаг 17 - Составные операторы в условии WHERE"! Есть еще функция XOR она выглядит, для троичной логики так:

X       Y       X XOR Y
------------------------
TRUE   TRUE      FALSE
TRUE   FALSE     TRUE
TRUE   NULL      NULL
FALSE  TRUE      TRUE
FALSE  FALSE     FALSE
FALSE  NULL      NULL
NULL   TRUE      NULL
NULL   FALSE     NULL
NULL   NULL      NULL

Вот таким образом строится работа для функции XOR, для AND, OR, NOT смотрите шаг 17. Пока мы с вами делали, линейные алгоритмы блоков. В следующем шаге будем рассматривать способы ветвления и правила работы со строками. Пока закрепляйте пройденное!!! :)


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