Язык программирования баз данных Informix-4GL
1. Знакомство с системой программирования Informix-4GL
Усилия по решению важнейшей задачи информационных систем - хранению и обработке данных, привели к появлению в конце 60 - начале 70-х гг. специализированного программного обеспечения - систем управления базами данных (DataBase Management Systems - DBMS), которые позволяют организовать и структурировать данные для их компьютерной обработки и хранения.
Однако, как справедливо отмечено в [1], представление о СУБД сложилось у большинства отечественных пользователей на основе опыта использования систем на платформе персональных компьютеров таких, как FoxBASE, Paradox, Clipper, dBASE, Clarion, FoxPro и т.д. Причины такой популярности заключаются как в относительной простоте и легкости освоения самих СУБД, так и в практически неограниченных возможностях нелегального копирования программного обеспечения. В результате персональные СУБД используются зачастую для автоматизации таких задач, которые требуют инструментальных средств с качественно иными функциональными возможностями.
Тем не менее уровень развития информационных технологий заставляет задумываться большинство средних и крупных организаций о создании действительно открытых и распределенных информационных систем на основе многопользовательских профессиональных СУБД. К числу таких коммерческих многопользовательских СУБД на сегодняшний день можно отнести
В рамках любой СУБД функционально можно выделить:
Сервер любой из перечисленных выше СУБД представляет собой программную компоненту, организация и сложность которой по ряду показателей сравнима с операционной системой [2]. Любая операционная система, будучи универсальной, является эффективной в среднем и не может в полной мере учесть специфики конкретной области применений. Сервер же базы данных, являясь ядром СУБД, использует более эффективные способы организации, хранения и поиска данных (зачастую не пользуясь услугами файловой системы), более эффективные способы управления работами и ресурсами (потоковая архитектура, например).
Являясь специализированным программным обеспечением, СУБД нуждается и в специализированных средствах разработки программных приложений. Спектр средств разработки перечисленных СУБД достаточно широк, начиная от встроенного SQL и библиотек SQL-вызовов до объектно-ориентированных графических программных продуктов по проектированию и разработке приложений баз данных.
Предлагаемое учебное пособие является справочным руководством по языку Informix-4GL, являющимся базовым языком для разработки приложений баз данных в СУБД Informix.
Почему из всего спектра разработки приложений выбран именно Informix-4GL? Во-первых, язык Informix-4GL лежит в основе большинства других средств разработки фирмы Informiх (NewEra, HyperScript и пр.), во-вторых, схожие языковые средства можно найти в других СУБД (Progress 4GL, Ingress/4GL, Sybase 4GL), в-третьих, Info
rmix-4GL, по сути дела, является стандартом языков четвертого поколения для разработки приложений баз данных. Немаловажным является и то обстоятельство, что в отечественной литературе за исключением небольшого числа статей в специальных журналах [2-4] отсутствует систематизированное изложение данного вопроса.Как язык программирования Informix-4GL обладает несколькими важными свойствами:
- средств доступа к базам данных (посредством SQL-запросов);
- построения отчетов на основе таблиц базы данных и других данных;
- средств построения пользовательского интерфейса с использованием экранных форм, окон и меню;
Все эти особенности делают Informix-4GL удобным инструментом для разработки приложений баз данных.
Предлагаемое учебное пособие предназначено для самостоятельного изучения основ языка Informix-4GL в рамках курсов "Базы данных " и "Распределенные базы данных", читаемых студентам специальности 01.02 факультета прикладной математики и информатики.
В первой главе приведены базовые понятия (типы данных, описание структуры программы, набор операторов и конструкций общего назначения) и основные правила программирования на языке Informix-4GL. Описывается система программирования Informix-4GL и инструментарий пользователя при работе с ней. Полный синтаксис операторов языка Informix-4GL приведен в приложениях методических указаний [5
-6].Во второй главе обсуждаются средства общения с базой данных в языке Informix-4GL. При этом предполагается, что слушатели знакомы с языком SQL (Structured Query Language) хотя бы в объеме [7-8]. При этом основной упор делается на обсуждение средств динамического SQL и аппарата курсоров.
Третья и четвертая главы посвящены соответственно описанию средств экранного взаимодействия (экранные формы, окна, меню) и создания отчетов.
В пятой главе обсуждаются вопросы организации параллельной работы в СУБД Inform
ix.1. Знакомство с системой программирования Informix-4GL
1.1. Cредства разработки Informix-4GL
Кодовое представление на стороне клиента содержит в себе:
При написании своего приложения на языке Informix-4GL перед пользователем возникает задача выбора - какую версию из языковых средств Informix-4GL ему рационально использовать.
Система программирования Informix-4GL реализована в двух версиях:
Оба средства используют один и тот же способ кодирования и одни и те же предложения Informix-4GL, но отличаются схемой реализации фаз компиляции и исполнения.
В случае RDS производится компиляция исходного кода, представленного на Informix-4GL (файл source.4gl) в псевдокод, т.е. р-код (файл source.4go). Одна из причин названия языкового средства как Rapid Development System заключается в том, что время компиляции по такой технологической цепочке будет достаточно малым. Компоновка программы из отдельных объектных модулей (файл prog.4gi) производится их механическим объединением.
Время на компиляцию для языкового средства Informix-4GL Compiler Version значительно больше. Сначала программное представление на Informix-4GL (файл source.4gl) транслируется в код на ESQL/C. Полученный файл (файл source.ec) преобразуется в код на языке С, с получением файла source.c. Далее source.c преобразуется в объектный код (файл source.o). Наконец, производится преобразование объектного кода в двоичный код (файл prog.exe), пригодный для машинного исполнения.
В представленном рассмотрении нет никаких доводов, чтобы не использовать Informix-4GL RDS. Но прежде чем сделать окончательный вывод, следует обратить внимание, как будет протекать фаза исполнения по этим двум вариантам Informix-4GL.
Если результатом работы Informix-4GL С Compiler Version является готовая программа (либо полученная в результате объединения объектных модулей), которая может быть непосредственно запущена, то Informix-4GL RDS генерирует псевдокод, который не может быть непосредственно использован компьютером. Поэтому исполнитель такого псевдокода (программная компонента fglgo) выбирает предложения, написанные на Informix-4GL и транслирует их в представление, которое может быть выполнено на машине. Поэтому при использовании Informix-4GL RDS может потребоваться достаточно много времени на исполнение.
Версия Informix-4GL |
Запуск на выполнение |
Informix-4GL С Compiler Version |
$ prog.exe |
Informix-4GL RDS |
fglgo prog.4gi |
Все разработчики хотят, чтобы их программы исполнялись быстро. Поэтому вы можете пожертвовать временем компиляции в пользу скорости исполнения. Но прежде чем сделать выбор того или иного решения, необходимо учесть те средства, которые доступны при работе с Rapid Development System.
Первым важным преимуществом RDS является возможность использования графических представлений в ваших RDS приложениях с помощью средств Informix-4GL/GX (программная компонента fglgx). При этом не требуется перепрограммирования, рекомпиляции или повторного линкования. Informix-4GL/GX работает с GX дисплеем, с использованием пользовательского интерфейса, где применимы те же базовые конструкции, что и в символьно-ориентированной версии Rapid Development Syst
em. При запуске в режиме GX обеспечиваются:Вторым существенным преимуществом Informix-4GL RDS является наличие в ней интерактивного отладчика Informix-4GL Interactive Debugger, который весьма удобен для трассировки переменных в вашей исходной программе и построчного исполнения программы.
Таким образом можно рекомендовать выполнение разработки вашего приложения с использованием Informix-4GL RDS, а затем откомпилировать полученный продукт, используя Informix-4GL С Compiler Version.
1.2.Инструментарий разработчика 4GL-программы
Система программирования Informix-4GL включает:
Версия компилятора Informix-4GL представлена программной компонентой c4gl. Ниже приведен упрощенный синтаксис команды c4gl.
Версия Informix-4GL RDS представлена программными компонентами fglpc, fglgo, из которых первая используется на этапе подготовки приложения, а вторая - при его запуске. Ниже приведен упрощенный синтаксис команд fglpc, fglgo.
Компилятор экранных форм Informix-4GL представлен программной компонентой form4gl, преобразующей текст экранной формы (файл form.per) в файл form.frm, который может вызываться из 4GL-программы.
Приведенные в диаграммах обозначения имеют смысл:
source.4gl - имя исходной программы на языке Informix-4GL;
esqlc.ec, source.c, obj.o, yourlib - соответственно исходные модули на языке ESQL/C, Си, объектные модули и библиотеки, дополнительно подключаемые при использовании компилятора c4gl;
-о outfile - имя создаваемого выполняемого файла при использовании компилятора c4gl (по умолчанию a.out); при использовании системы быстрой разработки fglpc имя создаваемой на выходе программы на р-коде source.4go;
- e - выполнить только препроцессорную обработку;
-V - указание получить информацию о версии программы;
argument - аргументы при запуске программы на выполнение;
filename - имя запускаемого файла в системе быстрой разработки (полученные программой fglpc файлы filename.4go, либо полученные конкатенацией файлов filename.4go файлы filename.4gi);
form.per - имя файла с экранной формой;
-d - указание сгенирировать экранную форм по умолчанию;
- database-name, table-name - имя базы данных и имена таблиц при генерации экранной формы по умолчанию.
Для подготовки help-файла используется утилита mkmessage первым параметром указывается имя текстового файла, вторым - имя формируемого утилитой mkmessage откомпилированного файла.
1.3. Организация программы на языке Informix-4GL
Программа на языке Informix-4GL состоит из одного или нескольких файлов (модулей) с исходными текстами. К ней также относятся файлы с описаниями используемых экранных форм, которые компилируются отдельно. Имя каждого модуля должно иметь расширение .4gl, а имя файла с описанием экранных форм -расширение .per.
Каждый модуль содержит описания переменных и, возможно, несколько процедурных блоков FUNCTION и REPORT (блоки печати). В программе должен быть один блок MAIN - главный блок, начинающийся с ключевого слова MAIN и заканчивающийся END MAIN. На него будет передаваться управление при запуске программы. Для программирования функций (подпрограмм) в языке используется оператор FUNCTION. Все аргументы функции должны быть объявлены. Аргументы передаются по значению. Если функция возвращает какие-либо значения, то при вызове ее нужно воспользоваться в операторе CALL предложением RETURNING с перечислением переменных, в которые возвращаются значения.
Программа на языке Informix-4GL состоит из идентификаторов, ключевых слов, констант, операторов и выражений. Формат записи операторов языка Informix-4GL свободный, подобно языкам С или Pascal. Окончание операторов определяется по контексту и никаких разделителей операторов, таких, как точка с запятой, не требуется, однако некоторые предложения языка, если это необходимо, завершаются ключевым словом END вместе с ключевым словом этого предложения (например, END WHILE или END IF). Комментарии, занимающие несколько строк, ограничиваются знаками "{" и "}", одностроковые комментарии начинаются с символов "#" или "--" и продолжаются до конца строки. Весь набор ключевых слов зарезервирован, их нельзя использовать для других целей. Не делается никаких различий между прописными и строчными буквами.
Программа на языке Informix-4GL оперирует константами, локальными, модульными и глобальными переменными, экранными формами, метками, окнами, функциями и отчетами. За исключением констант, остальные объекты должны именоваться с помощью идентификаторов. Идентификатор представляет собой последовательность длиной до 8 символов, состоящую из букв, цифр и символов "_" и начинающуюся с буквы или символа "_".
1.4. Основы программирования на языке Informix-4GL
В данном разделе описываются такие элементы языка Informix-4GL, как константы, программные переменные, операции, выражения и операторы общего назначения.
Константы
В Informix-4GL допускаются строковые, числовые константы, константы даты и времени. Существуют три предопределенные константы: TRUE=1, FALSE=0, NOTFOUND=100.
Переменным и значениям полей таблиц допускается присваивание значения NULL. Значение NULL отлично от нуля для чисел и от пробелов для строк. Способ его кодирования считается неизвестным для программиста.
Строковая константа - последовательность символов, записанная на одной строке и заключенная в кавычки или апострофы. Для использования в строке двойных кавычек они должны быть удвоены, либо им должен предшествовать знак "\".
Числовые константы записываются в обычной для языков программирования форме, причем только по основанию 10. Допускается экспоненциальная нотация. Константы типа DATA, DATATIME, INTERVAL задаются как с помощью символьных строк, так и специальным образом.
15
654.89
12967.0e-3
"1.01.97"
"Для продолжения нажмите \"Д\""
Типы данных Informix-4GL. Программные переменные
В языке Informix-4GL имеются простые переменные, переменные типа запись и массивы. Для описания всех переменных служит оператор DEFINE, в котором задаются идентификаторы и соответствующие типы данных.
Informix-4GL поддерживает 7 различных представлений числовых данных, некоторые из которых обозначаются более чем одним ключевым словом.
Типы данных |
Описание и представление |
|
DECIMAL[(m,n)], DEC[(m,n)], NUMERIC[(m,n)] |
Десятичные числа с фиксированной точкой с m (<=32) значащими цифрами, из которых n (<=m) - после запятой |
|
DECIMAL[(m)], DEC[(m)], NUMERIC[(m)] |
Десятичные числа с плавающей точкой, лежащие в интервале от 10**(-128) до 10**128 (по умолчанию DECIMAL(16)) |
|
MONEY[(m[,n])] |
Денежные суммы с фиксированной точкой, соответствующие DECIM AL(m,n) |
|
FLOAT[(n)], DOUBLE PRECISION[(n)] |
Двоичные числа с плавающей точкой c точностью, соответствующей double в C |
|
REAL, SMALLFLOAT |
Двоичные числа с плавающей точкой c точностью, соответствующей float в C |
|
INT, INTEGER |
Целые числа в интервале от -2,147,483,647 до 2,147,483,647 аналогично integer в C |
|
SMALLINT |
Целые числа в интервале от -32,767 до 32,767 аналогично short в C |
Informix-4GL поддерживает следующие типы данных для отслеживания времени.
Типы данных |
Описание и представление |
|
DATE |
Календарные даты, хранимые в виде целых чисел дней, прошедших от 31 декабря 1899 года |
|
DATETIME |
Моменты времени (дата и время дня), хранимые в виде десятичных чисел с плавающей точкой с нулевой дробной частью и различной точностью, зависящей от требований |
|
INTERVAL |
Интервалы времени со знаком, прошедшие между двумя значениями DATETIME |
Informix-4GL располагает набором встроенных функций, выполняющих различные преобразования данных указанных типов.
Функция |
Описание |
|
DAY(date-expr) |
Возвращает номер дня месяца от переменных типа DATE или DATETIME |
|
MONTH(date-expr) |
Возвращает номер месяца от переменных типа DATE или DATETIME |
|
WEEKDAY(date-expr) |
Возвращает номер дня недели от переменных типа DATE или DATETIME |
|
EXTEND(date,quel) |
Меняет точность DATE или DATETIME значений, возвращая значение DATETIME |
|
YEAR(date-expr) |
Возвращает номер года от переменных типа DATE или DATETIME |
|
DATE(date-expr) |
Преобразует целое или символьную строку в переменную типа DATE или DATETIME |
|
MDY(m,d,y) |
Строит значение DATE из целочисленных значений месяца, дня, года |
|
TODAY |
Строит значение DATE с текущим значением даты |
Informix-4GL поддерживает три типа строковых данных.
Типы данных |
Описание и представление |
|
CHAR(n), CHARACTER(n) |
Строки фиксированной длины до 32,767 ASCII символов |
|
VARCHAR(m) |
Строки переменной длины до 256 байт |
|
TEXT |
Символьные строки до 2**31 байт |
Ниже приведен пример описания простых переменных различных типов:
Помимо перечисленных выше простых типов данных Informix-4GL позволяет организовывать записи и массивы. Переменная типа запись описывается при помощи конструкции RECORD . . . END RECORD и включает группу переменных, в общем случае различных типов и возможно другие записи. Обращение к полю element_name записи record_name производится как record_name. element_name, а ко всем полям записи как record_name.* Конструкции LIKE table.column позволяют определять тип данных в соответствии со значением типа столбца column таблицы table. Если определить запись с помощью конструкции LIKE table.*, то запись будет иметь столько же полей, сколько столбцов в таблице table и таких же типов. Элементами записи могут быть другие записи. Переменная типа массив имеет описатель ARRAY [i,j,k] OF type, где type - тип простой переменной или конструкция RECORD. Ниже приведены примеры определения записей и массивов:
Переменные подразделяются на локальные, модульные и глобальные. Локальная переменная объявлена внутри блока function, main, report. Память под локальные переменные выделяется динамически и определение действует внутри блока, в котором переменная объявлена. Модульная переменная должна быть объявлена в самом начале модуля с исходным текстом вне любого блока report, function или main. Память под модульные переменные выделяется статически и определение действует внутри всего модуля за исключением блоков, в которых это имя переобъявлено и является для них локальным. Глобальные переменные должны быть определены с помощью блока GLOBALS . . . END GLOBALS в этом или отдельном модуле, либо в специальном файле, обращение к которому производится в виде GLOBALS "globals-filename". Для обращения к глобальным переменным в модуле ранее всех программных блоков должно содержаться их определение. Ниже приведен пример описания переменных разных классов и области их действия для программы, состоящей из трех файлов:
Областью действия глобальных переменных, определенных в файле Define.4gl, является вся программа (файлы Define.4gl, Sklad.4gl, Funk.4gl), исключая переменную init_day, которая в функции Funk1 переопределена как локальная. Аналогично областью действия модульных переменных, определенных в файле Sklad.4gl, является весь этот файл, исключая переменную audit, которая в блоке main() переопределена как локальная.
Областью действия идентификаторов форм, окон, функций и отчетов является вся программа. Область действия идентификаторов предложений PREPARE и DECLARE начинается с самого предложения и продолжается до конца модуля.
Операции в языке Informix-4GL
Числовые операции языка
Informix-4GL представлены таблицей
+ |
сложение |
- |
вычитание |
* |
умножение |
/ |
деление |
** |
возведение в степень |
mod |
деление по модулю |
() |
выделение приоритета |
USING |
форматирование |
Правила выполнения операций над датами подчинены следующим правилам:
time-var + interval-var = time-var;
time-var - time-var = interval-var.
Набор операций и функций для работы со строковыми типами данных и строковых преобразований в Informix-4GL представлен ниже
Операции и функция |
Описание |
|
char-var, char-var |
Конкатенация строк |
|
char-var[s,t] |
Выделение подстроки значений CHAR или VARCHAR |
|
ASCII int-var |
Преобразование ASCII-кода в CHAR(1) |
|
char-var CLIPPED |
Удаление конечных пробелов |
|
value USING "format" |
Получение символьного представления значения value в соответствии с форматом |
|
LENGTH(char-var) |
Получение длины символьного выражения, исключая конечные пробелы |
Логическое выражения, принимающего значения true, либо false может быть записано в одной из форм
expr1 rel_op expr2
или expr или NOT expr,где rel_op - операция отношения из следующего набора:
Операция rel_op |
Описание |
Тип expr |
Примечание |
= |
Равно |
Любой |
|
> |
Больше |
Любой |
|
>= |
Больше или равно |
Любой |
|
!=, <> |
Не равно |
Любой |
|
< |
Меньше |
Любой |
|
<= |
Меньше или равно |
Любой |
|
[NOT] LIKE |
Вхождение |
Символьный |
|
[NOT] MATCHES |
Вхождение |
Символьный |
|
IS [NOT] NULL |
NULL-значение |
Любой |
expr2 отсутствует |
Несколько логических выражений могут быть объединены в более сложное с использованием логических операторов NOT, AND, OR. При этом Informix-4GL делает все возможное, чтобы выполнить преобразование типов данных.
Операторы общего назначения
В данном разделе обсуждаются три группы операторов языка Informix-4GL (подробный синтаксис операторов приведен в приложении Г
[5]):К первой группе операторов относятся:
LET |
Значение, вычисленное в общем случае как результат выражения, присваиваемое простой программной переменной, элементу массива или записи. |
INITIALIZE |
Инициализация списка переменных или записи значением NULL или значениями, которые определены как значения по умолчанию для столбцов указанной таблицы. |
Ко второй группе операторов относятся:
СALL |
Вызов функции, возвращающей нуль или более значений, указанных в конструкции RETURNING. |
FOR |
Заголовок цикла, заканчивающийся предложением END FOR и выполняющийся до тех пор, пока переменная цикла не достигнет предельного значения. |
FOREACH |
Заголовок цикла, заканчивающийся предложением END FOREACH и выполняющийся по одному разу для всех строк, возвращенных как результат запроса к базе данных. |
WHILE |
Заголовок цикла, заканчивающийся предложением END WHILE и выполняющийся до тех пор, пока условие, сформулированное в заголовке цикла, не станет ложным. |
CONTINUE |
Переход к следующей итерации цикла, к следующему пункту меню или к продолжению ввода. |
EXIT |
Преждевременный выход из предложений FOR, FOREACH, WHILE, MENU, INPUT, CASE или из всей программы. |
IF |
Заголовок условного оператора, заканчивающегося конструкцией END IF. |
CASE |
Заголовок оператора выбора, заканчивающегося конструкцией END CASE. |
GOTO |
Переход к заранее определенному месту программы на указанную метку. |
LABEL |
Определение метки программы для безусловного перехода. |
SLEEP |
Задержка выполнения программы на указанный промежуток времени. |
RETURN |
Возврат управления из функции, возможно, с возвратом списка выражений, число и типы которых совпадают с обозначенными в предложении RETURNING оператора CALL при вызове функции. |
RUN |
Запуск некоторой программы средствами операционной системы. |
К третьей группе операторов относятся:
MAIN |
Основной блок программы, на который передается управление при запуске и который заканчивается предложением END MAIN. |
FUNCTION |
Программный блок, содержащий последовательность операторов языка Informix-4GL, заканчивающийся предложением END FUNCTION и, возможно, возвращающий вызвавшей ее функции нуль или более значений посредством оператора RETURN. |
REPORT |
Блок, содержащий спецификации по выводу и форматированию отчета (см. гл. 4). |
Ниже приведен фрагмент программы, состоящей из двух блоков.