Опубликован: 25.09.2009 | Уровень: специалист | Доступ: свободно
Лекция 1:

PL/SQL в Oracle Forms. Блоки и переменные PL/SQL

Лекция 1: 12 || Лекция 2 >

Переменные PL/SQL

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

  • Временное хранение данных.
  • Манипуляция хранимыми значениями.
  • Возможность многократного использования.
  • Простота обслуживания.
  • Повышение читаемости программы.

С понятием переменная чаще всего связываются такие понятия, как область видимости переменной, идентификаторы, ее тип и имя.

Типы переменных PL/SQL

PL/SQL, как и любой другой язык программирования, оперирует различными типами данных (табл. 15.1). Переменные PL/SQL:

  • Скалярные (Scalar) - скалярные типы данных содержат одно значение. К скалярным типам данных относятся все основные типы данных сервера Oracle, за исключением Boolean, которые не могут быть назначены для столбцов.
    Таблица 15.1. Типы данных PL/SQL
    Типы данных Описание
    CHAR (size) Строка фиксированной длины Максимум 255 символов Умолчание - 1 байт
    VARCHAR2(size) Переменная длина записи Максимально - 2000 байт. Не допускается для применения в параметрах функций
    FLOAT (p) Числа с плавающей точкой (позиция точки не зафиксирована) Максимально FLOAT (126)
    NUMBER (p, s) Фиксированные с фиксированной позицией точки. Максимально 38 значащих цифр
    DATE Формат типа дата. Хранение в Юлианском календаре (количество дней после 1 января 4712 до нашей эры; максимальная дата 31 декабря 4712 нашей эры) Формат преобразования по умолчанию определяется переменной NLS_DATE_FORMAT или ALTER SESSION параметром
  • Составные (Composite) - это составной тип данных, такой как записи, который позволяет объявить группу полей и манипулировать ей блоком PL/SQL.
  • Ссылочные (Reference) - ссылочные типы данных содержат значения, называемые указателями.
  • LOB (Large Objects) - позволяют хранить неструктурированные данные (картинки, текстовые файлы, видео, звук) объемом до 4 гигабайт. LOB поддерживает произвольный доступ к данным. Различают четыре типа LOB:
    • CLOB (character large object) - позволяет хранить большие блоки символьных данных;
    • BLOB (binary large objects) - служит для хранения больших бинарных объектов;
    • BFILE (binary file) - служит для хранения больших бинарных объектов за пределами Базы Данных;
    • NCLOB (national-language character large objects) - служит для хранения больших single-byte или fixed-width NCHAR Unicode данных;
    • EXPR - любое значение, которое подходит по смыслу и типу данных.
Примечание: в PL/SQL также используются связываемые переменные (bind variable) и переменные операционной системы, но они не относятся к PL/SQL.
Объявление переменных

Все переменные PL/SQL необходимо объявлять в декларативном разделе - DECLARE. Рассмотрим синтаксис объявления переменной:

Identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]

Identifier - имя переменной. После объявления имени переменой на нее можно ссылаться по имени из любой части программы.

CONSTANT - это переменная, значение которой нельзя изменить. Эта переменная должна быть инициализирована. Инициализация в данном контексте означает, что значение переменной при создании должно быть определенно, то есть значение этой переменной необходимо присвоить в разделе DECLARE. Инициализация переменной производится с помощью оператора присвоения (:=) или ключевого слова DEFAULT.

Datatype - определяет тип данных: скалярный, составной, ссылочный и LOB.

NOT NULL - ограничение, которое говорит о том, что значение переменой не может быть пустым. Эта переменная должна быть инициализирована.

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

  1. Создайте новую форму и сохраните под именем Var.fmb.
  2. Перейдите в узел "Блоки Данных". Правым щелчком мыши вызовите всплывающее меню и выберите пункт "Редактор Разметки".
  3. Разместите новую кнопку на канве. После того как вы разместите кнопку на канве, Oracle Forms автоматически создаст блок.
  4. Выделите кнопку и вызовите всплывающее меню. Во всплывающем меню выберите пункт Универсальные триггеры | WHEN-BUTTON-PRESSED. В появившемся PL/SQL-редакторе наберите и скомпилируйте нижеприведенный код:
    DECLARE
     Height NUMBER (5, 2) := 172.43;
     Age NUMBER:= 21;
     Weight CONSTANT NUMBER := 74.5;
     Name VARCHAR2 (10) := 'Сергей';
     S_name CHAR (20) := NULL;
     F_name VARCHAR2 (20) NOT NULL:= 'Васильевич';
     Man BOOLEAN NOT NULL:= TRUE;
     City VARCHAR2 (50) DEFAULT 'Мариуполь';
     Born DATE default sysdate;
    BEGIN
     Message('height: '||height);
     Message('Age: '||age);
     Message('Weight: '||weight);
     Message('Name: '||name);
     Message('S_name: '||s_name);
     Message('F_name: '||f_name);
     Message('City: '||city);
     synchronize;
    END;
    • Height - переменная численного типа с пятью знаками до запятой и двумя после, хранит значение высоты;
    • Age - переменная численного типа без определения разряда, хранит значение возраста;
    • Weight - константа численного типа. Значение инициализации 74.5;
    • Name - переменная символьного типа, хранит значение имени. Максимальный размер - десять символов;
    • S_name CHAR (20) - переменная символьного типа, хранит значение фамилии. Максимальный размер - двадцать символов;
    • F_name - значение символьного типа. Не может быть пустым, инициализировано значением "Васильевич";
    • Man - переменная логического типа, инициализирована в TRUE ; значение TRUE или FALSE указывать без кавычек. Переменная типа Boolean может принимать только три типа значений:
      • TRUE ;
      • FALSE ;
      • NULL.
    • City - переменная символьного типа, инициализированная значением по умолчанию - "Мариуполь". Максимальный размер - пятьдесят символов;
    • Born - переменная типа даты, по умолчанию хранит значение текущей даты.
  5. Запустите форму и нажмите на кнопку. После нажатия кнопки на экране последовательно будут появляться сообщения со значениями переменных.

В PL/SQL существует множество зарезервированных слов (табл. 2), которые не могут быть использованы для объявления переменных. Также не следует называть переменные именами столбцов. Ниже приведен пример неправильного объявления переменных:

DECLARE 
 Select varchar(20); 
 Pr_key number; 
 I number; 
BEGIN
 Select age from about where pr_key=pr_key; 
END;

Объявление переменных с атрибутом %TYPE

Префикс %TYPE используется для объявления переменных, ассоциированных с ранее объявленными переменными или столбцами Базы Данных. Основное преимущество префикса в том, что при объявлении переменная, которая впоследствии будет ассоциирована со столбцом Базы Данных, должна быть точно объявлена (имя, разряд) во избежание ошибок. Вы не можете помнить все значения типов данных столбцов таблицы, разрядность численных типов и размерность символьных полей, поэтому понимание использования этого префикса очень важно. Ниже приведен синтаксис и пример объявления префикса:

Identifier table_name.column_name%TYPE; 
Identifier previous_var_name%TYPE;
DECLARE
City VARCHAR2 (50);
t_city city%TYPE:='Мариуполь';
pr_key about.pr_key%TYPE
…

t_city - переменная типа city. Переменная символьного типа, хранит значение - "Мариуполь";

pr_key - хранит значение столбца таблицы about.pr_key.

Примечание: NOT NULL столбцы не могут быть объявлены с префиксом %TYPE.
Область видимости переменной

Область видимости переменной - это область, в которой она определена. В большинстве случаев все переменные имеют единую область видимости. Переменная может быть локальной, глобальной или одновременно и той и другой. Локальная переменная - это переменная, локальная для блока, в котором она объявлена. Глобальная переменная - это переменная, действующая для всех вложенных блоков, которые находятся внутри блока, где она объявлена. Если на одном из уровней вложенности эту переменную переопределить, то она станет глобальной для всех нижестоящих уровней. Блоку, стоящему на одном уровне вложенности с другим, нельзя ссылаться на переменную, объявленную в этом блоке.

В этом разделе мы рассмотрели основные типы данных, применяемых в PL/SQL, а также правила и способы их объявления.

Обращение к элементам Oracle Forms в операторах PL/SQL

Для того чтобы обращаться к элементам, блокам, окнам и параметрам, нужно перед названием объекта поставить двоеточие. Ниже приведены основные примеры обращения к объектам Oracle Forms:

  • :parameter.param_name - обращение к параметру. Слово parameter обязательно.
  • :block_name.item_name - обращение к элементу блока. Block_name - это идентификатор блока данных, которому принадлежит элемент, к коему мы обращаемся. Если в форме элемент один, то название блока можно будет опустить, в противном случае вы получите ошибку - "Неверная переменная привязки".
  • :block - обращение к блоку. В этом случае никаких вспомогательных префиксов не требуется.
  • :column_name - обращение к элементу. Если элемент в форме один, к нему можно обращаться без указания имени блока.
  • :system.variable_name - обращение к системной переменной. Слово SYSTEM является обязательным.
  • :global.global_name - обращение к глобальной переменной. Слово global является обязательным.
Косвенное обращение к элементам

В Oracle Forms существует два вида непрямого обращения к элементам:

  • Процедура COPY.
  • Функция NAME_IN.
Процедура COPY

COPY - копирует указанное значение в указанный элемент. Ниже рассмотрено два вида обращения к элементу.

: about.age:=20 - это прямое обращение, элементу age присваивается значение 20.

COPY(20, 'about.age') - непрямое обращение, в элемент age помещается значение 20.

Функция NAME_IN

NAME_IN - возвращает содержимое элемента или переменной. Эта функция может быть вложена в другие функции. Ниже приведены примеры обращения к элементам с помощью функции NAME_IN:

DECLARE
 Val varchar2(20);
BEGIN
 Val:=NAME_IN('about.age');
END;
Val:=TO_NUMBER(NAME_IN('about.age')); 
Val:=TO_DATE (NAME_IN('about.date_born'));

Функция NAME_IN может использоваться совместно с процедурой COPY, например, копирование в элемент REF указанного значения:

COPY('Сергей', NAME_IN('about.ref_item')); 
COPY(NAME_IN('about.name'), 'about.f_i_o');

Косвенное обращение часто используется в программных модулях и библиотеках, где прямое обращение к элементам нежелательно или недопустимо.

Комментарии

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

  • однострочные;
  • многострочные.
Однострочные комментарии

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

однострочного комментария, который объясняет назначение процедуры sum_price:

IF price>100 THEN 
 Sum_price (5); -- процедура sum_price понижает прайсовую стоимость 
                --всех товаров на 5% 
END IF;
Многострочные комментарии

В случае когда необходимо закомментировать большой фрагмент программы, расстановка однострочных комментариев займет приличное время, так как они удобны скорее для небольших фрагментов кода. Многострочный комментарий полезен для написания больших пояснений к тексту программы. В многострочном комментарии текст размещается между парой символов (/*) и (*/) - весь текст, размещенный между этой парой символов считается закомментированным. Ниже приведен пример многострочного комментария:

/* Эта процедура предназначена для выгрузки и данных
в EXCEL и обратно
Файл источник - Out.xls
Файл приемник - In.xls
Выполнение этой процедуры требует наличие Microsoft Excel
*/
DECLARE
…
BEGIN
…
END;

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

Лекция 1: 12 || Лекция 2 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет
Жанбек Сарсенов
Жанбек Сарсенов
Россия, Москва, Московский Государственный Университет имени Ломоносова М.В., 2002