рефераты конспекты курсовые дипломные лекции шпоры

Реферат Курсовая Конспект

БАЗИСНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА PL/SQL

БАЗИСНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА PL/SQL - раздел Программирование, Основы Языка Pl/sql ...

ОСНОВЫ ЯЗЫКА PL/SQL

ВВЕДЕНИЕ

2. БАЗИСНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА PL/SQL

3. ТИПЫ PL/SQL

Скалярные типы

Составные типы

Ссылочные типы

Типы LOB

Объектные типы

Преобразование типов данных

4. ПРОГРАММНЫЕ КОНСТРУКЦИИ PL/SQL

ПЕРЕМЕННЫЕ И КОНСТАНТЫ

Объявление переменных

Работа с составными типами данных

Динамическое объявление типа переменных

УПРАВЛЯЮЩИЕ СТРУКТУРЫ

Условное управление

Итеративное управление

Последовательное управление

  PL/SQL — это собственный язык Oracle, предназначенный для разработки… Достоинства PL/SQL:

В начало

2. БАЗИСНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА PL/SQL   Набор символов: программа PL/SQL представляет собой строки текста, использующего следующий набор символов:

В начало

 

3. ТИПЫ PL/SQL

 

3.1. Скалярные типы

 

Семейство числовых типов

NUMBER (P,S); где Р — точность (precision), a S — масштаб (scale). Точность — это количество…  

Таблица 3. Значения точности и масштаба

Объявление Присвоенное значение Хранимое значение Примечание
NUMBER 1234.5678 1234.5678  
NUMBER(3)  
NUMBER(3) Ошибка — превышение точности  
NUMBER(4,3) 123.4567 Ошибка — превышение точности  
NUMBER(4,3) 1.234567 1.235 Если масштаб присваиваемого значения превышает заданный, то сохраняемое значение округляется до числа цифр, указанного в масштабе
NUMBER(7,2) 12345.67 12345.67  
NUMBER(3, -3) Если масштаб отрицателен, то сохраняемое значение округляется до числа цифр, указанного в масштабе, отсчет ведется влево от десятичной точки
NUMBER(3, -1) Если масштаб отрицателен, то сохраняемое значение округляется до числа цифр, указанного в масштабе, отсчет ведется влево от десятичной точки

 

Максимальная точность — 38 цифр, а масштаб может иметь значение в диапазоне от ­84 до 127.

Типу NUMBER эквивалентен ряд подтипов (альтернативных имен для некоторого типа), которые, в сущности, являются тем же самым, что и NUMBER. Альтернативные имена можно использовать для повышения удобочитаемости программ либо для обеспечения совместимости с типами данных, применяемыми в других базах данных (см. табл. 4).

 

Таблица 4. Подтипы, эквивалентные типу NUMBER

Имя подтипа Точность
DEC   38 десятичных знаков, могут содержать числа с плавающей запятой  
DECIMAL
NUMERIC
DOUBLE PRECISION 126 двоичных знаков (≈38 десятичных цифр), могут содержать числа с плавающей запятой
FLOAT
REAL 63 двоичных знака (≈18 десятичных цифр), могут содержать числа с плавающей запятой
INTEGER   38 десятичных знаков, могут хранить целые числа
INT
SMALINT

 

BINARY_INTEGER -служит для хранения знаковых целых значений, которые могут лежать в диапазоне от -2 147 483 647 до +2 147 483 647.

Данные, имеющие тип NUMBER, хранятся в десятичном формате, который специально создан для точного и эффективного хранения информации. Вследствие этого арифметические операции нельзя выполнять непосредственно над значениями типа NUMBER. Чтобы числовые величины могли быть обработаны, значения типа NUMBER должны быть преобразованы в двоичный тип. Если имеется арифметическое выражение, в котором используются значения типа NUMBER, то в PL/SQL это преобразование, а также (при необходимости) преобразование результата обратно к типу NUMBER выполняются автоматически. Если же значение не будет храниться в базе данных, а будет применяться лишь в вычислениях, можно воспользоваться типом данных BINARY_INTEGER. Данные этого типа хранятся в двоичном дополнительном формате, а это означает, что для их использования в вычислениях не требуется выполнять преобразование. Тип BINARY_INTEGER обычно имеют счетчики циклов. Как и для NUMBER, для типа BINARY_INTEGER определен ряд подтипов (см. табл. 5).

 

Таблица 5. Подтипы, эквивалентные типу BINARY_INTEGER

Имя подтипа Ограничение
NATURAL 0...2 147 483 647
NATURALN 0...2 147 483 647 NOT NULL
POSITIVE 1...2 147 483 647
POSITIVEN 1...2 147 473 647 NOT NULL
SIGNTYPE -1,0,1

 

PLS_INTEGER- имеет тот же диапазон значений, что и BINARY_INTEGER - от -2 147 483 647 до +2 147 483 647, и реализован также при помощи собственного двоичного дополнительного формата. Однако, если при выполнении некоторой операции переполняется значение типа PLS_INTEGER, возникает ошибка. В случае же переполнения значения, имеющего тип BINARY_INTEGER, результат может быть присвоен переменной типа NUMBER (который имеет больший диапазон) без всякой ошибки.

Семейство символьных типов

VARCHAR2(L[CHAR|BYTE]) где L — максимальная длина (length) переменной, CHAR или BYTE используется для… В поле столбца базы данных, имеющем тип VARCHAR2, можно хранить только 4000 байт. Поэтому, если длина…

Семейство типов RAW

RAW(L) , где L — длина переменной в байтах. Тип RAW. В отличие от символьных данных…  

Семейство типов ROWID

Идентификаторы строк обычно не создаются программами PL/SQL, они выбираются из псевдостолбца ROWID таблицы. Выбранное значение может быть…   UROWID- хотя каждая строка в таблице, доступной в базе данных Oracle, имеет адрес, это может быть не физический адрес.…

Семейство логических типов

BOOLEAN- единственный тип данных этого семейства. Логические переменные используются в управляющих структурах PL/SQL, таких как операторы IF-THEN-ELSE и LOOP. Возможные значения типа BOOLEAN: TRUE, FALSE и NULL.

В начало

В переменной, имеющей составной тип, находится одна или несколько скалярных переменных (называемых также атрибутами). Для применения составного типа… RECORD(запись PL/SQL) – переменная, составленная из одного или нескольких… TABLE (таблица PL/SQL) - одномерный массив, состоящий из на­бора элементов одного типа, индексированный по целому…

В начало

3.3 Ссылочные типы Ссылочный тип PL/SQL — это то же самое, что и указатель в С. Переменная,… В Oracle 7 был доступен только один ссылочный тип — REF CURSOR, называемый также курсорной переменной. Начиная с…

В начало

Используются для хранения больших объектов. Большой объект (large object) может быть либо двоичным, либо символьным значением размером до 4 Гбайт. В… BLOB - двоичный объект CLOB - символьный объект

В начало

Объектный тип является составным типом, который имеет внутри себя атрибуты (переменные других типов) и методы (подпрограммы). Информация об…

В начало

3.6. Преобразование типов данных PL/SQL может выполнять преобразования между различными семействами скалярных…

Явное преобразование типов данных

  Таблица 6. Функции преобразования типов данных PL/SQL и SQL …  

Неявное преобразование типов данных

Хотя в PL/SQL производится неявное преобразование типов данных, при программировании рекомендуется использовать явные функции преобразования.…

В начало

В PL/SQL имеется множество различных программных конструкций, начиная с модулей разных видов и заканчивая логическими конструкциями, управляющими…  

В начало

  5. ПЕРЕМЕННЫЕ И КОНСТАНТЫ  

DECLARE

var1 number(10):= 0;

BEGIN

var1:= var2(493);

var1:= var1 + 45;

END;

В разделе объявлений можно присвоить значение переменной с помощью ключевого слова DEFAULT. Например, объявление в предыдущем программном блоке можно изменить так:

var1 number(10) default 0

В строке текста, идентифицирующей переменную, могут присутствовать буквенно-цифровые символы A-Z, a-z и 0-9, а также специальные символы $,? и_, но не амперсанды (&), дефисы (-) или пробелы. Нужно также отказаться от использования в качестве имен переменных зарезервированных слов PL/SQL, иначе при компиляции блока Oracle возвратит сообщение об ошибке.

Область действия переменной — это фрагмент программы, в котором возможно обращение к данной переменной. Для переменной PL/SQL это фрагмент с момента ее объявления до конца блока. Когда переменная выходит из своей области действия, PL/SQL освобождает память, используемую для хранения переменной, и ссылки на нее становятся невозможны. На рис. 3 показано, что областью действия переменной var2 является только внутренний блок; после ключевого слова END внутреннего блока она становится недоступной. Область действия переменной var1 распространяется до ключевого слова END внешнего блока. Внутренний блок является областью действия обеих переменных.

Рис. 3. Область действия переменных Рис. 4. Область видимости переменных

 

Область видимости переменной — это фрагмент программы, в котором возможно обращение к этой переменной без использования ее квалифицированного имени. Область видимости всегда лежит в пределах области действия. Если переменная находится вне области своего действия, она невидима.

 

Рис. 5. Использование метки для ссылки на переменную

 

Рассмотрим пример, представленный на рисунке 4. В точке 1 переменные var1 и var2 находятся в границах своих областей действия и видимы. В точке 2 обе эти переменные находятся в пределах своих областей действия, но видима только переменная var1. При объявлении переменной var2 типа CHAR(11) объявление NUMBER(10) становится скрытым. В этой точке все четыре переменные находятся в границах своих областей действия, но видимы только три: var1, var3 и var2 CHAR(11). В точке 3 переменные var3 и var2 CHAR(11) находятся вне пределов своих областей действия и поэтому больше не видимы. Здесь действуют и видимы те же переменные, что и в точке 1: var1 и var2 NUMBER(10).

Как обратиться в программе к переменной, которая находится в своей области действия, но невидима? В блоке, приведенном на предыдущем рисунке, для внешнего блока создана метка «Metka1» (см. рисунок 5). В точке 2 переменная var2 NUMBER(10) невидима. Однако обратиться к ней можно с помощью метки следующим образом: metka1.var2

Язык PL/SQL позволяет определять новые подтипы как подмножество значений некоторого базового типа с тем же набором операций. Подтип не вводит никаких дополнительных операций над данными и не определяет никакого нового типа. Синтаксис:

SUBTYPE новый_тип IS исходный_тип;

В пакете STANDARD базы данных Oracle, автоматически подключаемом для любого блока PL/SQL, определено несколько подтипов: например, DECIMAL и INTEGER – подтипы NUMBER. Пользователь может определить свой тип как некоторый подтип в разделе объявлений блока PL/SQL.

Пример:

DECLARE

TYPE MyRec IS RECORD (time1 INTEGER, time2 INTEGER); SUBTYPE MyInterval IS MyRec; -- Основан на типе RECORD SUBTYPEID_N IS tbl1.f1%TYPE; -- Основан на типе столбца

DECLARE

var1 VARCHAR2(6); -- Объявление переменной с ограничением длины

SUBTYPE mystring IS var1%TYPE; -- Объявление пользовательского типа

В начало

  5.2. Работа с составными типами данных Запись PL/SQL

BEGIN

my_employee.my_empid := '12345';

my_employee.my_fname := 'Ольга';

my_employee.my_salary := 500;

my_employee.my_address.city := 'Москва';

END;

 

Если две переменных записи объявлены с одним и тем же типом данных, можно произвести массовое присваивание переменных одной записи переменным другой записи. Но ес­ли записи объявлены с двумя разными пользовательскими типами, присвоить одну переменную записи другой переменной нельзя, даже при совпадении всех элементов обеих записей.

 

Таблица PL/SQL

В Oracle таблицы PL/SQL бывают двух типов: индексные (index-by) и вложенные (nested). Различие заключается в том, что вложенные таблицы можно хранить в базе данных Oracle, а индексные, т.е. массивы переменных — нельзя. Таблица PL/SQL объявляется подобно записи: сначала определяется тип таблицы PL/SQL с помощью команды TYPE.

Синтаксис:

TYPE name IS TABLE OF datatype [INDEX BY BINARY_INTEGER],

где name — это имя таблицы PL/SQL, a datatype — тип данных каждого ее эле­мента. Указание конструкции [INDEX BY BINARY_INTEGER] означает, что таблица PL/SQL определяется как индексная.

Пример:

-- индексная таблица

TYPE team_type IS TABLE OF VARCHAR2 INDEX BY BINARY_INTEGER;

my_team team_type;

-- вложенная таблица

TYPE team_type IS TABLE OF VARCHAR2;

my_team team_type;

 

Значения элементам индексных и вложенных таблиц PL/SQL присваиваются по-разному. Одним из способов является указание описательного индекса, идентифицирующего элементы массива. Базовым индексом для элементов таблицы PL/SQL всегда является 1. Для перебора элементов массива с присвоением им значений можно пользоваться циклическими конструкциями.

Пример:

DECLARE

TYPE team_type IS TABLE OF VARCHAR2 INDEX BY BINARY_INTEGER;

my_team team_type;

mynum binary_integer;

BEGIN

FOR mynum IN 1.. 3 LOOP

-- присвоим значение элементу

IF mynum = 1 THEN

my_team (mynum) := 'ВОЛГАРЬ'

ELSIF mynum = 2 THEN

my_team (mynum) : = 'СПАРТАК'

ELSIF mynum = 3 THEN

my_ team (mynum) := 'ЗЕНИТ'

END IF;

END LOOP;

END;

Вложенным таблицам значения можно присваивать не только таким методом, но и с помощью конструкторов. Конструктор — это функция, автоматически гене­рируемая Oracle при создании вложенной таблицы, что позволяет строить таблицу из элементов, передаваемых функции.

Пример:

DECLARE

TYPE team_type IS TABLE OF VARCHAR2;

my_team team_type;

BEGIN

my_team := team_type('ВОЛГАРЬ' ,'СПАРТАК','ЗЕНИТ');

END;

Как видно, конструктор вложенной таблицы способен снизить объем операций, необходимых для присвоения начального набора значений вложенной таблице. После инициализации на отдельные элементы таблицы PL/SQL можно ссылаться в цикле и с помощью описательных индексов.

Для таблиц PL/SQL существует ряд атрибутов и операций, используемых програм­мистами для решения определенных задач.

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

DECLARE

TYPE team_type IS TABLE OF VARCHAR2;

my_team team_type;

mynum binary_integer;

BEGIN

my_team := team_type('ВОЛГАРЬ' ,'СПАРТАК','ЗЕНИТ');

mynum := my_team.COUNT;

END;

 

Список атрибутов и операций для таблиц PL/SQL (атрибуты с (n) принимают один целочис­ленный параметр):

COUNT - содержит число элементов таблицы PL/SQL.

EXISTS(n)- определяет, содержится ли в элементе n вложенной таблицы NULL-значение. Для индексных таблиц этот атрибут не имеет смысла, так как их элементы после объявления пусты.

FIRST - ссылается непосредственно на первый элемент таблицы PL/SQL.

LAST - ссылается непосредственно на последний элемент таблицы PL/SQL

PRIOR - ссылается на элемент таблицы PL/SQL, непосредственно предшествующий данному.

NEXT - ссылается на элемент таблицы PL/SQL, следующий сразу же после данного.

EXTEND(n) - добавляет n элементов в конец таблицы PL/SQL.

TRIM(n) - удаляет n элементов из конца таблицы PL/SQL. Указывать целое число при ссылке на этот атрибут не обязательно; при не указании числа из конца таблицы удаляется один элемент.

DELETE(n) - удаляет n-й элемент из таблицы PL/SQL. Так, конструкция my_tab.delete(3) удалит третий элемент таблицы my_tab. Указывать целое число при ссылке на этот атрибут не обязательно; при неуказании числа удаляются все элементы таблицы.

DELETE (m,n) - удаляет группу элементов таблицы PL/SQL, начиная с элемента m и заканчивая элементом n.

 

Изменяемый массив.

TYPE имя_типа IS (VARRAY | VARYING ARRAY] (максималъный_размер) OF тип_элементов [NOT NULL]; где имя_типа — это имя определяемого типа изменяемого массива, максимальный_размер — целое число, определяющее максимальное количество элементов в изменяемом массиве,

DECLARE

-- Изменяемый массив

TYPE d1 IS VARRAY(365) OFDATE;

TYPE rec1 IS RECORD (v1 VARCHAR2(10), v2 VARCHAR2(10));

-- Изменяемый массив записей

TYPE arr_rec IS VARRAY(250) OFrec1;

-- Изменяемый массив записей, основанный на курсоре

CURSOR c1 IS SELECT * FROMtbl1;

TYPE t1 IS VARRAY(50) OF c1%ROWTYPE;

 

В начало

  5.3 Динамическое объявление типа переменных Во многих случаях для работы с данными, хранимыми в таблицах базы данных, используются переменные PL/SQL. При этом…

В начало

 

 

6. УПРАВЛЯЮЩИЕ СТРУКТУРЫ

 

6.1. Условное управление

Условное управление иначе называется оператором IF-THEN (если-то), который говорит о том, что при истинности условия нужно выполнить следующий далее программный блок.

Оператор IF-THEN

Алгоритмы обработки с использованием условных операторов позволяют структурировать текст программы так, что определенные операторы будут или не будут исполняться — это определяется достоверностью операции сравнения. Общий принцип условных операторов таков: "если (IF) сравнение истинно (TRUE), то (THEN) сделать следующее". В конце оператора IF необходимо указывать ключевые слова END IF, в противном случае текст программы после условного выражения будет считаться частью конструкции ELSE, что вызовет ошибку в работе компилятора PL/SQL. В PL/SQL существует дополнительная конструкция — ELSE (иначе), которая заявляет: "в противном случае сделать то, что указано в конструкции ELSE":

BEGIN

IF choice=1 THEN

m_var=15;

ELSE

m_var=20;

END IF;

END;

Операторы IF-THEN могут быть вложенными, что позволяет выполнять сложные и взаимоисключающие условные операции.

Пример: Предположим, что нужно классифицировать предметы одежды по пяти цветам: желтому, красному, синему, зеленому и черному. Желтую одежду нужно положить в желтую корзину, красную — в красную и т. д.— для одежды всех указанных цветов. Это один из примеров организации логической схемы с условиями, в которой используются вложенные операторы if-then:

IFcolors = ‘ЖЕЛТЫЙ’ THEN

yellow_bin(id);

ELSE

IF colors = 'КРАСНЫЙ' THEN

red_bin(id);

ELSE

IF colors = 'СИНИЙ' THEN

blue_bin(id);

ELSE

IF colors = 'ЗЕЛЕНЫЙ' THEN

green_bin(id);

ELSE

IF colors = 'ЧЕРНЫЙ' THEN

black_bin(id);

END IF;

END IF;

END IF;

END IF;

END IF;

 

Если нужно расширить программу, добавив новый цвет, скажем, оранжевый, в одних точках программы добавление не вызовет ошибок, а в других вызовет. Ключевое слово ELSIF (второй буквы "е" в нем нет) является альтернативой простому вложению еще одного оператора IF внутрь конструкции ELSE, так как оно позволяет реализовать взаимоисключающие операции более четко. Такая конструкция иногда называется логической таблицей.

IFcolors = 'ЖЕЛТЫЙ' THEN

yellow_bin(id);

ELSIFcolors = 'КРАСНЫЙ' THEN

red_bin(id);

ELSIF colors = 'СИНИЙ' THEN

blue_bin(id);

ELSIF colors = 'ЗЕЛЕНЫЙ' THEN

green_bin(id);

ELSIFcolors = 'ЧЕРНЫЙ' THEN

black_bin(id);

ELSIF colors = 'ОРАНЖЕВЫЙ' THEN

orange_bin(id);

END IF;

 

Как видим, построением операций IF-THEN с помощью ключевого слова ELSIF в действительности создается логическая таблица из взаимоисключающих условных операций без вложения многочисленных операторов IF-THEN друг в друга.

 

Оператор CASE

Оператор CASE – это упрощенная конструкция, которая выполняет тоже что и блок IF-THEN-ELSE. CASE имеет следующую структуру:

CASE test_var

WHEN значение_1 THEN последователъностъ_операторов_1;

WHEN значение_2 THEN последовательностъ_операторов_2;

WHEN значение_n THEN последователъностъ_операторов_n;

[ELSE последователъностъ_е1sе;]

END CASE;

где test_var— проверяемая переменная или выражение любой сложности, содержащее вызовы функций, значение_1... значение_n — сравниваемые значения, а последователъностъ_операторов_1 ... последователъностъ_операторов_n — соответствующий код для выполнения. Типы значений_1 … _n должны быть совместимы с типом test_var. Если test_var равна, например, значению_2, будет выполняться последователъностъ_операторов_2. Если ни одно из значений не совпадает, выполняется код последователъностъ_еlsе. Например, рассмотрим блок, который выбирает курс для студента на основе его специализации:

Пример

DECLARE

v_Major students.major%TYPE;

v_CourseName VARCHAR2(10);

BEGIN

- Извлекаем профилирующую дисциплину данного студента

SELECT major INTO v_Major FROM students WHERE ID = 10011;

- На основе специализации выбираем курс

CASE v_Major

WHEN 'Информационные технологии' THENv_CourseName = 'ИТ 11';

WHEN 'Экономика' THENv_CourseName = 'ЭК 23';

WHEN 'История' THENv_CourseName = 'ИР 11';

WHEN 'Русский язык и литература' THEN v_CourseName = 'РЛ 12';

WHEN 'Химия' THEN v_CourseName = 'ХМ 37';

ELSE

v_CourseName = 'Не определено';

END CASE;

DBMS_OUTPUT.PUT_LINE(v_CourseName);

END;

 

Операторы CASE без предложения ELSE

Предложение ELSE оператора CASE является необязательным. В случае если оно не указано, а проверяемое выражение не соответствует ни одному из сравниваемых значений, PL/SQL порождает предопределенную ошибку CASE_NOT_FOUND, которая эквивалентна ORA-6592.

 

Операторы CASE с меткой

Оператор CASE может иметь метку. Если оператор CASE помечен, то метка может указываться также после предложения END CASE, например:

Пример

DECLARE

v_TestVar NUMBER:= 1;

BEGIN

- Этот оператор CASE является помеченным

<<MyCase>>

CASE v_TestVar

WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('Один! ');

WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Два!');

WHEN3 THEN DBMS_OUTPUT.PUT_LINE('Три!');

WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('Четыре!');

END CASE MyCase;

END;

Метка после END CASE является законной только в случае, если сам оператор CASE является помеченным, и обе метки должны совпадать.

 

Операторы CASE с поиском

В рассмотренных выше примерах использовались операторы CASE с проверкой — каждое предложение WHEN сравнивало значение с единственным тестовым выражением. Применяются также операторы CASE с поиском, они имеют следующую структуру:

CASE

WHEN testl THEN последователъностъ_операторов_1;

WHEN test2THEN последователъностъ_операторов_2;

WHEN test3 THEN последователъность_операторов_n;

[ELSE последователъностъ_е1sе;]

END CASE;

Здесь нет проверяемого выражения; вместо этого каждое предложение WHEN содержит логическое выражение. Подобно оператору IF-THEN, если тестовое выражение оценивается как TRUE, то выполняется соответствующая последовательность операторов.

Пример

DECLARE

v_Test1 NUMBER := 2;

v_Test2 VARCHAR2(20) := 'Выход';

BEGIN

CASE

WHEN v_Test1 = 1 THENDBMS_OUTPUT.PUT_LINE('Единица! ');

WHEN v_Test1 > 1 THENDBMS_OUTPUT.PUT_LINE('Больше единицы!');

WHEN v_Test2 = 'Выход' THENDBMS_OUTPUT.PUT_LINE('Выход');

ELSE

DBMS_OUTPUT.PUT_LINE('Неизвестно');

END CASE;

END;

В этом примере показаны предложения WHEN, имеющие в своем составе более одного оператора. Отметим также: хотя v_Test2 равно 'Выход' и, следовательно, третье условие WHEN будет истинным, оно не выполняется, так как предыдущее условие уже было оценено как TRUE.

В начало

6.2. Итеративное управление Итеративное управление называется также циклом. Цикл (LOOP) повторяет… Операторы LOOP-EXIT, называемые основными циклами

Оператор LOOP-EXIT

Оператор LOOP-EXIT — самый простой цикл в PL/SQL. Ключевое слово LOOP указывает на начало повторяемого программного блока, а ключевые слова END LOOP — на его окончание. Ключевое слово EXIT, указываемое отдельно, означает, что цикл нужно прервать, а ключевые слова EXIT WHEN — что предлагаемый оператор сравнения нужно проверить на необходимость завершить выполнение оператора.

Пример:

DECLARE

my_var1 NUMBER(10):= 0;

my_var2 NUMBER (10):= 0;

BEGIN

LOOP

my_var1:= my_var1+1;

find_proc (my_var1,my_var2);

IF my_var1 = 25 THEN

EXIT;

END IF;

END LOOP;

END;

С помощью оператора IF-THEN определяется, требуют ли условия в цикле его прекращения. Оператор EXIT говорит о том, что из цикла нужно выйти. Альтернативой оператору IF-THEN для определения необходимости окончания цикла является условие WHEN, добавляемое к оператору EXIT. В этом условии содержится операция сравнения, которую должен был бы выполнять оператор IF-THEN. Пример простого оператора LOOP с использованием оператора EXIT WHEN приведен в следующем программном блоке. Обратите внимание, эта программная конструкция, по сути дела, является простым блоком LOOP, но представленным в ином виде.

DECLARE

my_var1 NUMBER(10) := 0;

my_var2 NUMBER (10) := 0;

BEGIN

LOOP

my_var1 := my_var1 + 1;

find_proc (my_var1, my_var2) ;

EXIT WHEN my_var1 = 25;

END LOOP;

END;

Конструкция WHEN полезна разработчику, поскольку предлагает более интересное решение вопроса окончания цикла, в противоположность оператору EXIT, скрытому внутри оператора IF-THEN.

Операторы WHILE-LOOP

Циклы этого типа похожи на операторы LOOP-EXIT WHEN. Можно изменить текст предыдущего блока, включив в него WHILE-LOOP. Единственным отличием оператора WHILE-LOOP от оператора LOOP-EXIT WHEN является оценка условия выхода EXIT. В операторе WHILE-LOOP условие выхода оценивается в начале оператора, а в операторе LOOP-EXIT WHEN — при обнаружении оператора EXIT WHEN. В определенном смысле оператор LOOP-EXIT WHEN более гибок, чем WHILE LOOP, так как позволяет разработчику указывать условие EXIT в любом месте. Однако недостаточная гибкость оператора WHILE-LOOP компенсируется элегантностью реализации в нем сравнения, поскольку оператор EXIT в нем не нужен.

DECLARE

my_var1 NUMBER(10) := 0;

my_var2 NUMBER(10) := 0;

BEGIN

WHILE my_var1 <= 25 LOOP

my_var1:= my_var1 + 1;

find_proc (my_var1,my_var2);

END LOOP;

END;

 

Операторы FOR-LOOP

Примером циклических конструкций является оператор FOR LOOP, позволяющий разработчику указывать конкретное число раз исполнения программы до ее прерывания в PL/SQL. Для этого в операторе FOR LOOP указываются счетчик цикла и диапазон циркуляции счетчика. При желании можно организовать циркуляцию счетчика цикла в обратном направлении, т. е. в порядке убывания чисел. После этого счетчик цикла становится доступен операторам конструкции FOR LOOP.

В операторах for loop существует встроенный счетчик, автоматически увеличивающийся на 1. Нижней и верхней границами этого цикла могут быть переменные, причем совсем не обязательно, чтобы нижней границей была 1, при условии, что и нижняя, и верхняя граница — целые числа.

DECLARE

my_var1 NUMBER(10) := 0;

my_var2 NUMBER(10):= 0;

BEGIN

FOR my_var1 IN 1. .25 LOOP

find_proc (my_var1,my_var2);

END LOOP;

END;

Использование оператора FOR LOOP делает этот программный блок более интересным. Оператор, увеличивающий значение переменной my_var1, больше не нужен, так как приращение в операторе FOR LOOP организуется автоматически.

Ниже приведен программный фрагмент с тем же анонимным блоком PL/SQL, но на этот раз оператор FOR LOOP исполняется в обратном направлении. Обратите внимание: начальное и конечное значения не нужно указывать как-то иначе; Oracle сделает все надлежащим образом, воспользовавшись ключевым словом REVERSE.

DECLARE

my_var1 NUMBER(10) := 0;

my_var2 NUMBER(10) := 0;

BEGIN

FOR my_var1 IN REVERSE 1. .25 LOOP

find_proc (my_var1,my_var2) ;

END LOOP;

END;

В обычном режиме в PL/SQL нельзя увеличивать или уменьшать счетчик цикла FOR LOOP на значение, отличное от 1. Это позволяет сделать указание в операторе FOR LOOP функции mod():

DECLARE

my_var1 NUMBER(10) := 0;

my_var2 NUMBER(10) := 0;

BEGIN

FOR my_var1 IN 1..25 LOOP

IF mod(my_var1,2) = 0 THEN

find_proc (my_var1,my_var2);

END IF;

END LOOP;

END;

 

В начало

6.3. Последовательное управление Последовательное управление иначе называется оператором GOTO. При его… Рассмотренные выше циклические конструкции тоже могут быть вложенными. Предлагаемый метод удобен для обработки…

DECLARE

rownum number;

desknum number;

pencilnum number;

BEGIN

-- Организуем цикл для всех рядов на верхнем уровне

FOR rownum IN1..6 LOOP

-- Организуем цикл для всех парт в текущем ряду

FOR desknum IN 1. . 10 LOOP

-- процесс добавлениякарандаша для каждой парты

. . . . .

pencilnum := pencilnum - 1;

END LOOP;

END LOOP;

END;

 

Допустим, купленных каранда­шей на всех учеников в классе не хватает. В PL/SQL существует конструкция, кото­рая называется меткой и позволяет выйти из цикла при нехватке карандашей. Метка— это всего лишь короткая последовательность символов, отмечающая не­который исполняемый блок. Акцент на слове "исполняемый" сделан умышленно, так как нельзя разместить метку перед неисполняемым оператором, например перед END IF, END LOOP или ключевым словом END, завершающим программный блок. Оператор GOTO дает возможность перейти от места его указания в программе непосредственно к метке. Синтаксис меток и операторов GOTO представлен в следую­щем программном блоке:

DECLARE

rownum number;

desknum number;

pencilnum number;

BEGIN

-- Организуем цикл для всех рядов на верхнем уровне

FOR rownmn IN1..6 LOOP

--Организуем цикл для всех парт в текущем ряду

FOR desknum IN 1..10 LOOP

-- процесс добавления карандаша на каждую парту

. . .

pencilnum := pencilnum - 1;

IF pencilnum< 1 THEN

goto no_more_pencils;

END IF;

END LOOP;

END LOOP;

<<no_more_pencils>>

dbms_output.put_line('ряд: ' || to_char(rownum) || парта: ' || to_char(desknum));

END;

 

Хотя метка заключена в << и >>, эти специальные символы не указаны в операторе GOTO, ссылающемся на метку. Кроме того, метка должна предшествовать исполняемому оператору.

Чтобы поместить метку туда, где исполняемого оператора быть не может, нужно воспользоваться ключевым словом NULL, завершив его точкой с запятой. Этот опе­ратор не производит никаких действий; но он удовлетворяет семантическим требованиям, предъявляемым к меткам, и программным требованиям приложения:

<<no_more_pencils>>

Null;

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

DECLARE

rownum number;

desknum number;

pencilnum number;

BEGIN

Goto lose_a_pencil;

FORrownum IN 1..6 LOOP -- Организуем цикл для всех парт в текущем ряду FOR desknum IN1.. 10 LOOP

В начало

 

 

– Конец работы –

Используемые теги: Базисные, Элементы, языка, PL/SQL0.057

Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: БАЗИСНЫЕ ЭЛЕМЕНТЫ ЯЗЫКА PL/SQL

Что будем делать с полученным материалом:

Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:

Еще рефераты, курсовые, дипломные работы на эту тему:

Понятие литературный язык. Место литературного языка среди других форм существования языка
Литературный язык это язык государственных и культурных учреждений школьного обучения радио и телевидения науки публицистики художественной... Современный литературный язык многофункционален Он используется в различных... Основные сферы использования литературного языка телевидение и кино наука и образование печать и радио...

ОСНОВНЫЕ ПОНЯТИЯ И ОПРЕДЕЛЕНИЯ. ЭЛЕМЕНТЫ ЯЗЫКА. ЭЛЕМЕНТЫ ДАННЫХ. ВЫРАЖЕНИЯ. ОСНОВНЫЕ ИНСТРУКЦИИ. ПРОЦЕДУРЫ. ПРЕПРОЦЕССОР. СТИЛЬ ПРОГРАММИРОВАHИЯ
ВВЕДЕНИЕ... ОСНОВНЫЕ ПОНЯТИЯ И...

Два объекта истории русского языка: живой язык диалектный и литературный язык
Новые общественные функции приобретает русский язык по мере сложения новой исторической общности советского народа он становится межнациональным... Современный период... Горшкова Хабургаев ИГРЯ...

ИНОСТРАННЫЙ ЯЗЫК: АНГЛИЙСКИЙ ЯЗЫК
высшего профессионального образования... Алтайская государственная академия культуры и искусств... Факультет информационных ресурсов и дизайна...

перевода с английского языка на русский язык зоонимов
Учение о категории рода имеет давнюю традицию. Вопрос о способах языкового выражения различия пола живых существ интересует многих ученых. Среди работ, посвященных проблеме категории рода в английском языке, следует… Данная дипломная работа представляется актуальной, так как исследование в ней проводится в русле культурологической и…

Русский Язык - Язык мира вольных людей
На сайте allrefs.net читайте: "Русский Язык - Язык мира вольных людей"

Способы отражения русских реалий во французском языке (язык художественных произведений и прессы)
Обьектом нашего исследования являются способы отражения русских реалий во французском языке. Реалии это слова и словосочетания, называющие объекты, характерные для жизни… Актуальность избранной темы обуславливается тем, что исследование слов-реалий является одной из проблем современной…

Лекції № 7, 8. План лекцій. 7. Ларина Т.В. Англичане и русские: Язык, культура, коммуникация. – М.: Языки славянских культур, 2013. – 360 с
Language amp Communication... План лекцій... Common mistakes in English Differences between the American and the British English...

Грамматика как языковой уровень. Морфология и смежные уровни языка; морфология и фонология; основные понятия морфонологии; морфология и синтаксис
Термин quot морфология quot состоит из двух древнегреческих корней и буквально означает quot учение о форме quot Он имеет два основных... Система механизмов языка обеспечивающая построение и понимание его... раздел грамматики изучающий закономерности функционирования и развития этой системы...

изучение основных встроенных функций, системных переменных и выражений языка PL/SQL
На сайте allrefs.net читайте: "изучение основных встроенных функций, системных переменных и выражений языка PL/SQL"

0.027
Хотите получать на электронную почту самые свежие новости?
Education Insider Sample
Подпишитесь на Нашу рассылку
Наша политика приватности обеспечивает 100% безопасность и анонимность Ваших E-Mail
Реклама
Соответствующий теме материал
  • Похожее
  • По категориям
  • По работам