Язык программирования баз данных Informix-4GL

Введение

1. Знакомство с системой программирования Informix-4GL

1.1. Cредства разработки Informix-4GL

1.2. Инструментарий разработчика 4GL-программы

1.3. Организация программы на языке Informix-4GL

1.4. Основы программирования на языке 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), в-третьих, Informix-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 и аппарата курсоров.

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

В пятой главе обсуждаются вопросы организации параллельной работы в СУБД Informix.

1. Знакомство с системой программирования Informix-4GL

1.1. Cредства разработки Informix-4GL

Кодовое представление на стороне клиента содержит в себе:

  • логику управления экраном на Informix-4GL и пользовательский интерфейс;
  • предложения SQL, которые направляются серверу Informix для обработки.

При написании своего приложения на языке Informix-4GL перед пользователем возникает задача выбора - какую версию из языковых средств Informix-4GL ему рационально использовать.

Система программирования Informix-4GL реализована в двух версиях:

  1. Informix-4GL Compiler Version - компилятор, преобразующий 4GL-программу с языка Informix-4GL в программу на языке Informix-ESQL/C, которая затем компилируется и линкуется с другими объектными модулями в выполняемый командный файл;
  2. Informix-4GL RDS - система быстрой разработки (Rapid Development System), содержащая в своем составе процедуры компиляции и запуска программ на языке Informix-4GL и создающей приложение на p-коде, полностью совместимое с приложением, подготовленным компилятором 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 System. При запуске в режиме GX обеспечиваются:

  • доступ с помощью мыши;
  • трехмерная обработка полутонов;
  • замена текстовых полей и их разделителей визуально различимыми полями формы.

Вторым существенным преимуществом Informix-4GL RDS является наличие в ней интерактивного отладчика Informix-4GL Interactive Debugger, который весьма удобен для трассировки переменных в вашей исходной программе и построчного исполнения программы.

Таким образом можно рекомендовать выполнение разработки вашего приложения с использованием Informix-4GL RDS, а затем откомпилировать полученный продукт, используя Informix-4GL С Compiler Version.

1.2.Инструментарий разработчика 4GL-программы

Система программирования Informix-4GL включает:

  • средства компиляции с языка Informix-4GL;
  • генератор и компилятор экранных форм;
  • средства подготовки help-файла.

Версия компилятора 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])]

 

Денежные суммы с фиксированной точкой, соответствующие DECIMAL(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).

Ниже приведен фрагмент программы, состоящей из двух блоков.