Шаг 44 - PL/SQL - GOTO и его определения, типы данных...

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

BEGIN
	BEGIN
		GOTO MID;
	END;
	<<MID>>
	NULL;
END;
/

Собственно <<MID>> есть метка для указания места перехода оператора GOTO. Так она объявляется. Двойные кавычки после метки не ставятся. Оператор NULL является заполнителем, вместо него вы могли бы вставить свой код. Таким образом данный код легко выполняется, но ничего не производит:

SQL> BEGIN
  2    BEGIN
  3      GOTO MID;
  4  
  5    END;
  6    <<MID>>
  7    NULL;
  8  END;
  9  /

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

Рассмотрим несколько другой случай:

BEGIN
	GOTO MID;
	BEGIN
		<<MID>>
		NULL;   
	END;
END;
/

В результате получаем:

SQL> BEGIN
  2  	GOTO MID;
  3  	BEGIN
  4  		<<MID>>
  5  		NULL;
  6  	END;
  7  END;
  8  /
    GOTO MID;
         *
ошибка в строке 2:
ORA-06550: Строка 2, столбец 10: 
PLS-00201: идентификатор 'MID' должен быть объявлен 
ORA-06550: Строка 2, столбец 5: 
PL/SQL: Statement ignored 

Здесь на лицо нарушение области видимости для оператора GOTO. Внутри блока переменная <<MID>> для него не доступна, что и приводит к ошибке компиляции. То есть внешний блок не имеет информации о содержимом вложенного блока. Так же нельзя переходить из одного блока в другой:

BEGIN
	BEGIN
		GOTO OTHER;
	END;

	BEGIN
		<<OTHER>>
		NULL;   
	END;
END;
/

Получаем:

SQL> BEGIN
  2  	BEGIN
  3  		GOTO OTHER;
  4  	END;
  5  
  6  	BEGIN
  7  		<<OTHER>>
  8  		NULL;
  9  	END;
 10  END;
 11  /
     GOTO OTHER;
          *
ошибка в строке 3:
ORA-06550: Строка 3, столбец 11: 
PLS-00201: идентификатор 'OTHER' должен быть объявлен 
ORA-06550: Строка 3, столбец 6: 
PL/SQL: Statement ignored 

Что собственно и требовалось доказать. Так же нельзя производить переход из предшествующих блоков, условных операторов в последующий блок. Вот так:

BEGIN
	IF (TRUE) THEN
		GOTO OTHER;
	ELSE
		<<OTHER>>
		NULL;  
	END IF;
END;
/

Получаем:

SQL> BEGIN
  2  	IF (TRUE) THEN
  3  		GOTO OTHER;
  4  	ELSE
  5  		<<OTHER>>
  6  		NULL;
  7  	END IF;
  8  END;
  9  /
     GOTO OTHER;
     *
ошибка в строке 3:
ORA-06550: Строка 3, столбец 6: 
PLS-00375: недопустимый оператор GOTO; этот GOTO не может выполнять переход к 
метке 'OTHER' 
ORA-06550: Строка 4, столбец 3: 
PL/SQL: Statement ignored 

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

BEGIN
	<<INFINITE_LOOP>>
	GOTO INFINITE_LOOP
END;
/

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

-- Это строка комментария!

И второй это как в языке ANSI C:

/* Это комментарий */

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

А вот их основные определения:

ТипПодтипОписаниеОграничение значенийОграничения для БД
CHARCHARACTER
STRING
ROWID
NCHAR
Символьные строки фиксированной длиныВозможный размер 0-32767 байт;
по умолчанию 1
255 байт
VARCHAR2VARCHAR
STRING+
NVARCHAR
Символьные строки переменной длиныВозможный размер 0-32767 байт;
по умолчанию 1
4000 байт
NUMBER(p,s)NUMERIC
DEC
DECIMAL
INT
INTEGER
FLOAT
REAL
DOUBLE
PRECISION
SMALLINT
Упакованные десятичные значения. p - общее число цифр. s - масштаб.Диапазон: 1.0E-129 - 9.99E125
Точность: 1-38 (по умолчанию максимальное значение поддерживаемое системой)
Масштаб: -84-127 (по умолчанию 0)
То же что и для PL/SQL
DATE Внутреннее представление даты.1 января 4712 года до н.э. время в секундах начиная с полуночи (по умолчанию 0:00)То же что и для PL/SQL

Вот собственно описания основных типов данных, которые понадобятся вам в ближайшем будущем. Зная их описание и внутреннее устройство вы легко справитесь с любой заданной задачей. Это, конечно же, не все типы данных и данных БД, но остальные мы рассмотрим по ходу нашего повествования. А пока запомните эти описания.


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