Основы программирования на языке Informix-L
В данном разделе описываются такие элементы языка 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 |
Функция | Описание | |
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 с текущим значением даты |
Типы данных | Описание и представление | |
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) | Получение длины символьного выражения, исключая конечные пробелы |
expr1 rel_op expr2 или expr или NOT expr,
где rel_op - операция отношения из следующего набора:
Операция rel_op | Описание | Тип expr | Примечание |
= | Равно | Любой | |
> | Больше | Любой | |
>= | Больше или равно | Любой | |
!=, <> | Не равно | Любой | |
< | Меньше | Любой | |
<= | Меньше или равно | Любой | |
[NOT] LIKE | Вхождение | Символьный | |
[NOT] MATCHES | Вхождение | Символьный | |
IS [NOT] NULL | NULL-значение | Любой | expr2 отсутствует |
При этом 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). |