Учебно-справочное пособие по СУБД Informix

         

Операторы Описания Данных.



1. Операторы Описания Данных.

Операторы описания данных предназначены для описания (создания), изменения описания и уничтожения объектов базы данных.
В SQL различаются следующие виды объектов:

база данных (database); таблица (table); столбец (column); индекс (index); снимок (view); синоним (synonym).
Каждый объект имеет собственное имя - идентификатор. Каждый объект имеет владельца - т.е. того пользователя, который его создал. Имя объекта можно уточнять с помощью имени его владельца (owner-name) в такой форме: moshkow.table1
Ниже приводятся примеры использования всех операторов описания данных. Полный же их синтаксис можно найти в "Кратком справочнике по 4GL", либо в "Справочном руководстве по INFORMIX-4GL".

Создание базы данных. CREATE DATABASE zawod
В любой момент времени вы можете иметь доступ к объектами только одной - ТЕКУЩЕЙ (CURRENT) - базы данных. Оператор DATABASE делает новую базу текущей, закрывая при этом доступ к объектам предыдущей текущей базы. Оператор CLOSE DATABASE просто закрывает текущую базу данных. DATABASE zawod . . . # текущей является база zawod DATABASE stanciq . . . # текущей является база stanciq CLOSE DATABASE # текущей базы нет
Создаются таблицы kadry и ceh, содержащие столбцы разных типов. CREATE TABLE kadry ( nomerceh INT, tabnom SERIAL , fio CHAR(20) UNIQUE, zarplata MONEY(16,2), datarovd DATE, pribytie DATETIME year TO minute )

CREATE TABLE ceh ( nomerceh int, nameceh char(20) )
В уже существующей таблице мы можем поменять тип столбца, добавить новый, уничтожить старый. ALTER TABLE kadry ADD (dolvnostx CHAR(20) BEFORE zarplata), DROP(pribytie), ADD CONSTRAINT UNIQUE(tabnom, fio) CONSTRAINT tabnomfio

ALTER TABLE items MODIFY (manu_code char(4))
Изменение структуры таблицы приводит к физическому преобразованию данных в ней. Если изменен тип столбца, то данные в нем преобразуются к новому типу, и если это невозможно осуществить, то оператор ALTER "валится" с кодом ошибки, а таблица остается в неизмененном состоянии.


View - "псевдо" таблица, базируется на существующих таблицах. CREATE VIEW poor AS SELECT tabnom, fio, datarovd FROM kadry WHERE zarplata < 120 # создано view - "псевдотаблица" из трех столбцов содержащая # строки из таблицы kadry, в которых zarplata меньше 120 рублей.
Ведет себя точно так же, как настоящая таблица, только место на диске под нее не отводятся, поскольку данные, лежащие в ней на самом деле хранятся в таблице, на которой это view базируется.
Индекс - дополнительная структура к столбцам таблицы, нужен для ускорения поиска значений в столбце. CREATE UNIQUE INDEX indkdtb ON kadry (tabnom) # создан индекс для столбца tabnom из таблицы kadry. Индекс # уникальный, значит в столбце не могут появиться одинаковые # значения.
Мы можем физически упорядочить таблицу в соответствии с индексом. В кластеризованной таблице SELECT работает быстрее. ALTER INDEX indkdtb TO CLUSTER
Имена столбцов в разных таблицах могут совпадать. Если в каком либо операторе SQL упоминаются два столбца с одинаковыми названиями, то их нужно уточнять именами таблиц, их содержащих. Перед именем любого объекта можно (а иногда и необходимо) указать имя его владельца (owner-name) - входное имя пользователя, который создал (CREATE) этот объект. kadry.nomerceh # столбец nomerceh из таблицы kadry ceh.nomerceh # столбец nomerceh из таблицы ceh iwanow.table1.c1 # столбец c1 из таблицы table1, владельцем которой является iwanow moshkow.table1.c1 # столбец c1 из другой (!) таблицы table1, владельцем которой является moshkow
Синоним для имени таблицы используется для сокращения записи. CREATE SYNONYM t1 FOR petrow.sostoqnie_postow
Теперь повсюду можно (хотя и не обязательно) вместо имени petrow.sostoqnie_postow использовать имя t1.
База данных может иметь системный журнал транзакций (logfile). START DATABASE zawod WITH LOG IN "/udd/moshkow/logfile/zawod"
Если нет журнала транзакций для всей базы данных, то для отдельных таблиц в базе с той же целью можно создать audit trail.CREATE AUDIT FOR kadry IN "/udd/moshkow/kadry.audit"
Естественно, что любой созданный в базе данных объект можно уничтожить. Надо только помнить, что операторы описания данных не откатываются назад, а потому если вы уничтожили таблицу, или базу данных то знайте, что это навсегда. DROP VIEW poor # Уничтожается только view. С данными в таблицах, на которых оно базировалось ничего не происходит. DROP TABLE kadry # уничтожает таблицу вместе с данными. DROP INDEX indkdtb DROP SYNONYM t1 DROP DATABASE zawod # уничтожает базу вместе со всеми данными и системным журналом

Операторы задания прав доступа в базе данных.



2. Операторы задания прав доступа в базе данных.

Выдавать и забирать права доступа к таблице может владелец таблицы, Администратор Базы Данных (имеющий DBA права), а так же пользователь, которому было выдано право выдавать права (Оператором GRANT WITH GRANT OPTIONS) REVOKE ALL ON customer FROM PUBLIC GRANT ALL ON customer TO iwanow, petrow WITH GRANT OPTION

GRANT UPDATE(fname,lname,company, sity),SELECT ON customer TO PUBLIC

REVOKE CONNECT FROM sidorowa, root REVOKE DBA FROM ivanov
Отобрать у вас права DBA (если вы, конечно, им являетесь) может только другой DBA. На время транзакции все измененные строки автоматически блокируются системой от изменения (но не от просмотра). Вы можете явно блокировать всю таблицу целиком, тогда система не будет блокировать строки по отдельности. Вы можете блокировать таблицу целиком не только от изменения но и от просмотра. BEGIN WORK LOCK TABLE kadry . . . UNLOCK TABLE kadry . . . LOCK TABLE kadry EXCLUSIVE
Если ваш оператор пытается записать в блокированную другим пользователем строку, то оператор "сваливается". Вы можете установить для своей программы режим "Ждать разблокирования строк". SET LOCK MODE TO WAIT



Операторы транзакций и восстановления данных.



3. Операторы транзакций и восстановления данных.

В базе данных, не имеющей системного журнала невозможно выполнение транзакций и восстановления до текущей контрольной точки.
Поскольку за все хорошее приходится платить, наличие системного журнала у базы данных вызывает заметный рост накладных расходов и замедление работы запросов. К тому же при активной работе с базой системный журнал быстро "распухает". За ним нужно следить и периодически чистить.
Указать базе новый системный журнал. START DATABASE zawod WITH LOG IN "/ARM/log/zawod"
Восстанавливают разрушенную (например из-за сбоя оборудования) базу данных так:
В среде UNIX

Уничтожают остатки базы. Заливают вместо них копию базы с ленты (например, недельной давности) используя команду cpio или утилиту INFORMIX dbimport. Входят в среду INFORMIX и выполняют операторы: DATABASE kadry EXCLUSIVE # чтобы никто не лез ROLLFORWARD DATABASE kadry # прогнать базу вперед # по системному журналу CLOSE DATABASE # теперь всем можно работать
Транзакция BEGIN WORK # начать транзакцию . . . # операторы



IF все нормально THEN COMMIT WORK ELSE ROLLBACK WORK END IF
Если во время транзакции программа "свалилась" то INFORMIX автоматически сделает откатку.



Операторы Манипуляции Данными.



4. Операторы Манипуляции Данными.

Следующая группа операторов предназначена для манипулирования данными в таблицах. В нее входят операторы выбора (SELECT) строк из таблицы (или таблиц), уничтожения (DELETE) строк в таблице, вставки (INSERT) строк, и изменения (UPDATE) значений в существующих в таблице строках.

Оператор DELETE.

Уничтожить в таблице kadry все строки, в которых номер цеха равен 4, а фамилия кончается на буквы "ов" DELETE FROM kadry WHERE ceh=4 AND fio MATCHES "*ов"
В результате из списков будут вычеркнуты работники 4-го цеха "Петров", "Иванов", "Сидоров" и т.п Как видим, INFORMIX предоставляет националистически озабоченным руководителям мощные средства для воплощения в жизнь своих идей.
А этот оператор уничтожит ВСЕ строки в таблице kadry, владельцем которой является moshkow, но не саму таблицу DELETE FROM moshkow.kadry

Простейшая форма оператора SELECT.

Первый пример находит в таблице kadry строку, в которой столбец tabnum=345 . Из этой строки берутся только три указаных столбца. Второй пример выбирает ВСЕ строки из таблицы ceh, и все столбцы. SELECT fio, dolvn, zarplata FROM kadry WHERE tabnom=345

SELECT * FROM ceh

SELECT kadry.fio, ceh.nameceh WHERE kadry.nomerceh=ceh.nomerceh
Третий пример выбирает фамилии работников из таблицы кадры, а названия цехов, в которых они работают, из таблицы ceh.

Оператор INSERT.

Может вставить в таблицу одну строку, если используется в форме INSERT INTO ... VALUES, а может вставить в таблицу целый набор строк, выбранных подзапросом SELECT из другой таблицы. INSERT INTO kadry VALUES (4,0,"Грицько",num,"10/25/1939",NULL)

INSERT INTO customer VALUES (ps_customer.*) # ps_customer - переменная типа RECORD - аналог структуры в # языке Си. Этот оператор вставляет значения элементов записи # ps_customer в соответствующие поля таблицы customer

INSERT INTO kadry (tabnom, fio, nomerceh, dolvnostx) SELECT 0 , fio, 4, dolvnostx FROM kadryold WHERE nomerceh=3 AND fio IS NOT NULL # последний оператор вставляет сразу несколько строк


Если мы хотим, чтобы при вставлении строки в столбец типа SERIAL автоматически заносилось очередное значение счетчика, нужно вставлять в этот столбец константу 0. Если не во все столбцы вставляемой строки вносится значение (как это сделано в третьем операторе), то незаполненные столбцы заполняются значением NULL.
В операторах DELETE, UPDATE, SELECT может присутствовать WHERE предложение, в котором можно задать условия на строки, которые требуется обработать (соответственно уничтожить, изменить или выбрать). Рассмотрим примеры использования WHERE предложения.
Оператор UPDATE.
Меняет значения столбцов, в строках, удовлетворяющим WHERE условию. UPDATE kadry SET fio="Зыкова" WHERE fio="Гирусова"
UPDATE ceh SET kod_ceha[1,4]=nameceh[5,8] WHERE nomerceh BETWEEN 3 AND 5 OR nameceh IN ("токарный","литейный")
В таблице ceh в цехах номер 3,4,5 а так же в токарном и литейном первые четыре символа в коде цеха будут заменены на подстроку поля nameceh из той же строки.
Предложение WHERE.
Предложение WHERE может присутствовать в любом из операторов DELETE, UPDATE, SELECT, когда нужно задать условия на строки, которые требуется обработать (соответственно, уничтожить, изменить или выбрать). Рассмотрим структуру и примеры использования предложений WHERE.
В предложении WHERE пишется логическое условие, которое получается соединением с помощью логических операторов AND, OR и NOT элементарных сравнений типа: выражение1 < выражение2, выражение1 >= выражение2, и т.п.,
а так же элементарных сравнений специального вида: column-name IS [NOT] NULL выраж [NOT] BETWEEN выраж1 AND выраж2 выраж [NOT] IN (выраж1 , ... [, ...] )
Можно выяснить, подходит ли символьная строка под определенный шаблон, или нет. Для этого используются две операции сравнения по шаблону - LIKE и MATCHES. симв-выражение MATCHES "шаблон" симв-выражение LIKE "шаблон"
LIKE имеет более простой шаблон. В нем используются только два спецсимвола: (%) замещает произвольное количество символов, (_) замещает ровно один символ.


Все остальные символы в шаблоне обозначают сами себя. Если мы хотим включить в шаблон % или _ отменив их специальный смысл, то перед ними надо поставить ESC-символ (по умолчанию это (\)).
Допустим нам нужно выбрать из таблицы tab8 все строки, в которых символьный столбец string1 содержит символ "+" а предпоследняя буква в нем - "Ы". Оператор выборки будет выглядеть так: SELECT * FROM tab8 WHERE string1 LIKE "%+%Ы_"
MATCHES использует такие спецсимволы шаблона: *, ?, [, ], ^, -.


* заменяет любое количество символов
? заменяет один любой символ
[...] заменяет один символ из перечисленных в скобках
возможно указание от и до (-), и не (^)
[abH] любой из символов a, b, H
[^d-z] любой символ, исключая d,e,f,g, ... ,y,z
\ отменяет спецсмысл спецсимволов *,?,[,]

Если вы хотите воспользоваться спецсимволами как обычными, примените escape-char. Если escape-char="\", то \? обозначает просто символ ?, \* обозначает просто символ *, \\ обозначает просто символ \ . Зато знак кавычки (") внутри шаблона нужно обозначать двумя кавычками ("").
Выбрать все данные о заказчиках в названии компании которых вторая буква не лежит в интервале от G до L, а третья буква c. (Кстати, коды русских букв на БЕСТЕ идут подряд, но в отличие от латинских букв, русские не упорядочены по алфавиту.) SELECT * FROM customer WHERE company MATCES"?[^G-L]c*"
Выбрать все данные о заказчиках в названии компании которых присутствует вопросительный знак. SELECT * FROM customer WHERE company MATCHES "*Я?*" ESCAPE"Я"
В данном примере использовался ESC-символ "Я" для отмены спецсмысла символа "?".
Если вы хотите:
Сравнить выражение с результатом другого SELECT оператора выраж сравн {ALL | [ANY | SOME]} (SELECT-statement)
Определить, принадлежит ли выражение результатам другого SELECT оператора. выраж [NOT] IN (SELECT-statement)
Выяснить, выбрал ли хоть что-нибудь другой SELECT оператор. [NOT] EXISTS (SELECT-statement)


то применяйте условия с подзапросом.
Условия с Подзапросом. SELECT fio FROM kadry WHERE zarplata= (SELECT MAX(zarplata) FROM kadry )
Здесь подзапрос возвращает единственное значение - максимальное значение зарплаты. А внешний SELECT оператор находит фамилии обладателей оной. SELECT fio, shifr, organizaciq FROM zaqwki WHERE denxgi_rek is not NULL and gorod in (SELECT gorod FROM regiony WHERE region="Урал")
Здесь запрос выводит данные об руководителях, получивших финансирование и работающих на Урале. SELECT order_num,stock_num,manu_code, total_price FROM items x WHERE total_price > (SELECT 2*MIN(total_price) FROM items WHERE order_num=x.order_num)
Этот запрос (используя связанный подзапрос) выводит список всех изделий, чья общая цена не менее чем в два раза превосходит минимальную цену изделий перечисленных в этом же ордере.
Вы можете соединять любое количество вышеперечисленных условий вместе, используя логические операторы NOT, AND, OR.
Оператор UNLOAD.
Оператор UNLOAD сбрасывает данные из таблицы в файл в печатном представлении. Каждая строка преобразуется в отдельную запись, значения из столбцов разделяются символом "|".
После выполнения оператора UNLOAD TO "kadry19.unl" SELECT * FROM kadry
в файле kadry19.unl можно будет обнаружить следующее: 5|5|туев |завхоз |100.0|31.12.1946| 4|6|петунин|кладовщик|80.0 | | . . .
Оператор LOAD.
Оператор LOAD выполняет обратную операцию - считывает строки из файла и вставляет их в таблицу. Естественно, что типы и количество значений в строках файла должны соответствовать столбцам таблицы. LOAD FROM "kadry20.unl" INSERT INTO kadry

Снова Оператор SELECT.



5. Снова Оператор SELECT.

Предложения INTO, INTO TEMP, FROM.

Выбрать все строки (нет предложения WHERE) из таблицы kadry, взять в них все столбцы (вместо перечисления столбцов стоит *), оставить только различные строки (ключевое слово UNIQUE) и поместить результат во временную таблицу (INTO TEMP) x, которая будет при этом создана с такими же столбцами, что и у kadry. SELECT UNIQUE * FROM kadry INTO TEMP x
Выбирать можно из нескольких таблиц. При этом берутся все возможные комбинации строк из первой таблицы со второй. Предположим, что таблице tab1 6 строк а в tab2 - 7 строк. Результат нижеприведенного примера - таблица, содержащая три столбца и 7*6=42 строки. SELECT tab1.a-tab2.b, tab1.a, tab2.b FROM tab1, tab2
Мы сейчас не будем уточнять, куда именно результирующая таблица помещается. Но использовать ее можно по разному: ее можно перегнать (INTO TEMP) во временную таблицу, ее можно отдать на обработку другому оператору (если выборку осуществлял подзапрос), для нее можно создать курсор ("буфер" с указателем на текущую строку), а можно положить ее (INTO) в простую программную переменную (если выбрано не более одной строки).
Выбранные строки можно упорядочить по возрастанию (убыванию) значения в столбце (столбцах) SELECT a,b,c,d+e FROM tabl ORDER BY b,c SELECT a,b,c,d+e FROM tabl ORDER BY 2,3
В ORDER BY предложении вместо имени столбца можно указывать его порядковый номер в списке выборки (select-list). Вышеприведенные операторы эквивалентны.
Поместить значения из столбцов в переменные: (Поскольку lname используется и как имя переменной, и как имя столбца, то имя столбца предваряется знаком (@) SELECT customer_num, @lname,city INTO cnum,lname,town FROM customer

Агрегатные функции.

К выбранным строкам можно применять агрегатные функции COUNT(*) - количество, MAX(column) и MIN(column) - максимальное и минимальное значение в столбце, SUM(column) - сумма всех значений в столбце, AVG(column) - среднее значение в столбце.
Поместить в переменную num количество строк в таблице orders, в которых столбец customer_num равен 101: SELECT COUNT(*) INTO num FROM orders WHERE customer_num=101


Пример с использованием соединения таблиц. Находится среднее значение зарплаты превосходящей 300 (столбец zarplata принадлежит одной из таблиц), при условии совпадения столбцов dolvnost в двух таблицах. SELECT AVG (zarplata) FROM table1,table2 WHERE table1.dolvnost=table2.dolvnost and zarplata>300
Группировка GROUP BY.
Группировка используется для для "сплющивания" группы (строк) в одну. Результат запроса содержит одну строку для каждого множества строк, удовлетворяющих WHERE предложению и содержащих одно и то же значение в указанном столбце. SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY dolvnostx
Получить количество работающих и их среднюю зарплату по каждой должности из штатного расписания. SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY 1
Эквивалентная запись.
Предложение HAVING накладывает дополнительные условия на группу. SELECT order_num, AVG(total_priece) FROM items GROUP BY order_num HAVING COUNT(*) > 2
Этот запрос возвращает номера ордеров и среднее значение total_price в заявках для всех ордеров, имеющих не менее двух заявок.
Внешнее соединение таблиц.
Строки из таблицы, присоединенной внешним образом (на внешнее соединение указывает ключевое слово OUTER) будут выбираться не смотря на то, удовлетворяют они условиям WHERE предложения или нет. В некоторых случаях это полезно, когда у вас есть главная таблица и есть вспомогательная, и данные из главной таблицы вам нужно получить в любом случае. Пример внешнего соединения: SELECT company, order_num FROM customer c, OUTER orders o WHERE c.customer_num=o.customer_num
Запрос находит названия компаний и номера ордеров, которые они послали. Если же компания ордеров не присылала, то ее название все равно будет выбрано, а номер ордера в этой строке будет равен NULL. (А если бы мы запустили запрос без параметра OUTER, то названия этих компаний вообще бы не попали в выборку.)

Сложные Примеры Манипуляции Данными.



6. Сложные Примеры Манипуляции Данными.

Операторы манипуляции данными - самая мощная составляющая SQL.
Следующий пример ликвидирует одинаковые строки в таблице kadry. select unique * from kadry into temp kd delete from kadry where 1=1 insert into kadry select * from kd drop table kd
Следующий пример изменяет информацию в строках по значению ключа:

Tаблица b содержит (kl int, pole char(20)); причем все kl различны В таблице kadry заменить kadry.dolvnostx на b.pole в строках где kadry.tabnom=b.kl SELECT b.kl,b.pole, nomerceh,dolvnostx,zarplata,datarovd FROM kadry, b WHERE kadry.tabnom=b.kl into temp kd

DELETE FROM kadry WHERE tabnom in (SELECT kl FROM b) INSERT INTO kadry SELECT * FROM kd DROP TABLE kd
Ту же самую операцию можно проделать с помощью одного оператора UPDATE, использующего подзапрос: UPDATE kadry SET dolvnostx=(select pole from b where kadry.tabnom=b.kl) WHERE tabnom IN (select kl from b)
Пример изменяет информацию в строках по значению ключа при выполнении условий , наложенных на меняемые строки:

Таблица agent Таблица cia

##

fio
John
Piter
Bob
har
лентяй
агент КГБ
хороший
cen
$300

$25
fio
John
...
Piter
...
Bob
Ronny
...

... har
трудяга

агент CIA

плохой
плохой
... cen
$600

$45

$15

В таблице cia хранятся сведения о сотрудниках. На основе последних исследований была составлена таблица agent, с поправками к содержанию cia. Строчка будет подменяться, если за новую информацию о сотруднике в таблице agent заплачено больше, чем за хранящуюся в cia. UPDATE cia SET (har,cen)=( (SELECT har,cen FROM agent WHERE cia.fio=agent.fio) ) WHERE fio IN (SELECT fio FROM agent) AND cen < (SELECT cen FROM agent WHERE cia.fio=agent.fio);



Архитектура Клиент-Сервер.



Архитектура Клиент-Сервер.

Очень многие СУБД разделяют свою работу на два уровня по системе "Клиент-Сервер". Хитрость состоит в том, что не только пользователь, но и программист этого не замечает. Разделение функций его задачи выполняется автоматически системой.

Итак, двухуровневая система "Клиент-Сервер" это:

Клиент - Программа обработки, она же пользовательская, она же прикладная программа. Занимается обычно интерфейсом с пользователем, а всю фактическую работу с базой данных возлагает на плечи БД-сервера. Сервер Базы Данных - базис (database engine), он же ядро базы данных. Отдельная программа, выполняемая как отдельный процесс. Передает выбранную из базы информацию по межпроцессному каналу клиенту. Именно он, и только он фактически работает с данными, занимается их размещением на диске.
В первый момент может возникнуть вопрос, а зачем такие сложности? Вот несколько соображений в пользу такого подхода.
Представьте, вы работаете в сети, ваша программа обработки идет на одном компьютере, а сама база данных хранится на другом. Тут разделение выглядит совершенно естественным: клиент - ваша программа (точнее, та ее часть, которая отвечает за интерфейс с вами), гонит по сети запросы на обработку самих данных на другой компьютер, а там БД-сервер их прочитывает, выполняет требуемое, и по сети гонит ответы вам. При этом по сети передается только полезная информация.
Другое соображение: постоянно идет работа по совершенствованию самого метода хранения и обработки информации, и если его реализация (т.е. БД-сервер) сменилась, та вам не потребуется перелопачивать и перекомпилировать с новыми библиотеками все свои разработанные программы, а достаточно будет инсталлировать новый БД-сервер взамен старого и перевести свои базы данных в формат нового сервера (применив для этого прилагаемую к нему утилиту). Естественно, все это можно проделать, если новый сервер придерживается тех же правил обмена между ним и пользовательской программой, что и старый, что, впрочем, наверняка имеет место.
Всвязи с СУБД INFORMIX нас, естественно, интересует только одна модель данных - реляционная. Сетевых и иерархических моделей рассматривать здесь я не буду. Можно, конечно, дать строгое определение реляционной модели данных по Э.Ф. Кодду, но ведь ни одну из коммерческих СУБД нельзя назвать реляционной в строгом смысле этого слова.



Bcheck - Целостность индексных файлов



1. bcheck - Целостность индексных файлов

Проверяет и восстанавливает целостность индексных файлов базы данных INFORMIX-SE. (С расширением .idx и .dat ) bcheck -ilnyqs cisamfiles ... -i только проверить индексные файлы -l list entries in b-trees -n считать, что на все вопросы отвечается No -y считать, что на все вопросы отвечается Yes -q no program header -s resize the index file node size



Dbexport - Базу из INFORMIX в ASCII



3. dbexport - Базу из INFORMIX в ASCII

Сбрасывает данные из базы данных в ASCII файлы, для переноса их в другие базы данных. Данные помещаются в директорию database-name.exp. В нее же помещается файл database-name.sql с операторами описания данных. dbexport database-name [-c] [-q] [{-o <dir> | -t <device> -b <blksz> -s <tapesz> [-f <sql-command-file>]}] -c продолжать, даже если случатся ошибки -q проделать всю работу молча -o поместить в директорию <dir> -t сбросить на устройство <device> (напр./dev/rmt) -b размер блока на ленте -s размер ленты -f поместить файл с описаниями данных не на ленту а в файл



Dbimport - Базу из ASCII в INFORMIX



4. dbimport - Базу из ASCII в INFORMIX

Позволяет создать базу данных из ASCII файлов, созданных утилитой dbexport. dbimport <database> [-c] [-q] [-l [{ buffered | <log-file> }] [-ansi]] [{ -i <dir> | -t <tapedev> [ -b <blksz> -s <tapesz> ] [-f <script-file>]}] порядок аргументов не важен -c продолжать, даже если случатся ошибки -q проделать всю работу молча -i взять из директории <dir> -t взять с устройства <device> (напр. /dev/rmt) -b размер блока на ленте -s размер ленты -f взять файл с описаниями данных из файла. -d (только в OnLine) -l импортируемая база данных использует logfile <log-file> должно быть указано полное маршрутное имя buffered (только в OnLine) -ansi создать базу данных в MODE ANSI



Dbload - Из ASCII в INFORMIX



2. dbload - Из ASCII в INFORMIX

Закачивает данные из ASCII файлов в базу данных INFORMIX. Файлы могут быть созданы другими продуктами INFORMIX, и даже другими (не INFORMIX) Системами Управления Базами Данных.
Поддерживает следующие возможности:

Данные из конкретных полей одного или более входных файлов можно поместить в конкретные столбцы одной или нескольких таблиц базы данных. Начинать можно с произвольной строки входного файла. Закачать n строк. (Ключ -i) Данные фиксированной и переменной длинны. Для любого поля записи можно указать обозначение NULL значения. К данным можно добавлять константы, которых не было во входных файлах. Ошибочные записи перехватываются и помещаются в error log файл. Можно задать лимит на количество ошибок, допустимых при закачке. Если он превзойдется, утилита остановится. (Ключ -e) Можно задать сколько строк достаточно успешно прочесть, чтобы записать их в базу данных. (Ключ -n) dbload [-d dbname] [-c cfilname] [-l errlogfile] [-e errnum] [-n nnum] [-i inum] [-s] [-p] [-r] -d имя базы данных -c имя командного файла -l log file для ошибочных строк -e кол-во допустимых ошибочн.строк before abort -n кол-во of row(s) before commit -i сколько строк сначала пропустить. -s только проверить синтаксические ошибки -p при останове спрашивать: commit или нет -r загружать без блокированных таблиц



Dblog - Содержание SE или C-ISAM log файла



10. dblog - Содержание SE или C-ISAM log файла

Содержание INFORMIX-SE или C-ISAM log файла. dblog



Dbschema - SQL код для создания таблицы



5. dbschema - SQL код для создания таблицы

Генерит операторы SQL, необходимые, чтобы создать указанную таблицу или базу данных. dbschema [-t tabname] [-s user] [-p user] -d dbname [filename] если -t не задан, то берется для всех таблиц -t имя таблицы -s синонимы, созданные только пользователем user -p разрешения доступа для пользователя user -d имя базы данных filename имя файла, в который поместить SQL операторы



в базу данных SQL версии



8. dbupdate - Upgrade базу SQL 1 в SQL 2

Преобразует базу данных, созданную в SQL версии 1 в базу данных SQL версии 2 (Т.е совместимой с современной версией INFROMIX). dbupdate [-bn] old-db-name new-db-name -n объявить все столбцы NOT NULL -b не преобразовывать строки пробелов в NULL, запрашивает, переводить ли 0 в NULL без флагов строки пробелов преобразует в значения NULL, запрашивает, переводить ли 0 в NULL


Динамическое Изготовление Операторов SQL. Курсоры.



Динамическое Изготовление Операторов SQL. Курсоры.

Операторы PREPARE и EXECUTE предназначены для динамического (во время выполнения программы) изготовления и выполнения операторов языка SQL (не 4GL !!!).
В приведенном ниже фрагменте в ответ на запрос пользователь сможет ввести с клавиатуры строку с оператором языка SQL (Пусть, например, он введет строку: DROP DATABASE buhgalteriq). Программа изготовит из этой строки настоящий оператор и выполнит его с помощью оператора EXECUTE. Если при выполнении зарегистрирована ошибка, о чем сообщит установленный в отрицательное значение код завершения status, пользователя снова попросят ввести оператор. DEFINE stroka char(200)

MAIN . . . LABEL METK2:PROMPT "введите оператор языка SQL: " FOR stroka

WHENEVER ERROR CONTINUE # Включить режим "В случае # ошибки продолжить выполнение # программы"

PREPARE st1 FROM stroka # Изготовить оператор из # символьной строки EXECUTE st1 # Выполнить изготовленный оператор IF status<0 THEN ERROR "ошибка номер ", status, " в вашем операторе" GOTO metk2 END IF

WHENEVER ERROR STOP # Восстановить режим # "В случае ошибки прервать # выполнение программы" . . . END MAIN
В системную переменную status помещается код выполнения каждого оператора 4GL (status=0 если все нормально, status<0 если произошла ошибка). Переменная status может проверяться после любого оператора программы и в зависимости от ее значения могут предприниматься какие-либо действия.



Динамическое создание операторов.



Динамическое создание операторов.

PREPARE statement-id FROM {char-variable | "SQL-оператор [ы] "}
Изготовить SQL - statement из символьной строки
Нельзя включать имена переменных, нужно заменять их на знак ?

Нельзя готовить операторы: DECLARE PREPARE LOAD

OPEN EXECUTE UNLOAD

CLOSE FETCH SELECT INTO variables

EXECUTE statment-id [USING input-list]
Выполняет, заменив знаки ? на input-list FREE { statment-id | cursor-name }



DISPLAY и INPUT



DISPLAY и INPUT

Оператор DISPLAY выводит данные в поля экранной формы. DISPLAY a,b,zap[i].nomerceh TO pole1,fscr.* ATTRIBUTE(BOLD)
Если имена выводимых переменных совпадают с именами экранных полей в текущей экранной форме, то можно применить ключевое слово BY NAME. DISPLAY BY NAME fio, dolvnostx
Оператор INPUT используется для ввода значений через поля экранной формы. Можно предусмотреть дополнительные действия при вводе. Для этого в оператор можно включить контрольные блоки AFTER, BEFORE, ON KEY. INPUT kadr.* FROM fio, dolvnostx, nomerceh BEFORE FIELD nomerceh message "Сегодня обслуживаются цеха 5 и 6" sleep 2 message "" AFTER FIELD nomerceh IF kadr.nomerceh > 6 then MESSAGE "Нет такого цеха, повторите" NEXT FIELD NOMERCEH ENF IF END INPUT



Формат блока REPORТ. (Генерация отчетов).



Формат блока REPORТ. (Генерация отчетов).

REPORT report-name (argument-list)

DEFINE variable-list { type | LIKE table-column | RECORD { LIKE table.* | variable-list type [,...] END RECORD } }[,...]

[OUTPUT по умолчанию:

[REPORT TO { "filename | PIPE "program" | PRINTER } ] SCREEN [ LEFT MARGIN integer ] 5 [ RIGHT MARGIN integer ] 132 [ TOP MARGIN integer ] 3 [ BOTTOM MARGIN integer ] 3 [ PAGE LENGTH integer ] 66 ]

[ORDER [EXTERNAL] BY sort-list ] подсписок переменных, входящих в аргументы
FORMAT EVERY ROW простейший оператор формата.
В этом случае нельзя использовать контрольные блоки.
либо
FORMAT включает несколько контрольных блоков, которые содержат обычные операторы 4GL и операторы применимые только в REPORТ ON EVERY ROW выводит строку statement . . . FIRST PAGE HEADER выводит заголовок первой страницы statement . . . ON LAST ROW окончание REPORT (подведение итогов) statement . . . PAGE HEADER заголовок каждой страницы statement . . . PAGE TRAILER в конце каждой страницы statement . . . BEFORE GROUP OF variable в начале группы строк statement . . . . . . AFTER GROUP OF variable в конце группы строк statement . . . . . . END REPORT


В контрольных блоках кроме обычных операторов 4GL используются: NEED num-expr LINES если на странице осталось менее expr строк, то начать с новой страницы. PAUSE ["Сообщение"] вывести Сообщение на экран и ждать нажатия CR PRINT FILE "filename" вывести на печать содержимое файла

SKIP { integer LINE | TO TOP OF PAGE }

PRINT список выражений [;] вывести на печать [не переводя строку]

в REPORT можно использовать следующие функции:

num-expr SPACES вставить пробелы char-exp WORDWRAP [RIGHT MARGIN integer] вывести длинную строку

LINENO номер строки на странице PAGENO номер печатаемой страницы

Агрегатные функции: [GROUP] functioп [WHERE условие] [для группы строк] применить функцию [только для строк, удовлетворяющих условию] где functioп может быть: { COUNT(*) | PERCENT(*) | { SUM | MAX | MIN | AVG }(expr) } в процентах от среднее общего кол-ва строк



Формат Входного Файла:



Формат Входного Файла:

Все значения в символьном печатном представлении.
Записи должны разделяться символом NewLine (^J=10 в коде ASCII)
В каждой записи одинаковое число полей.
Если данные переменной длинны, то поля должны разделяться каким-нибудь разделителем.
формат дат: mm/dd/yyyy
формат DATETIME и INTERVAL: yyyy-mm-dd hh:mi:ss.fff



Фрагмент, реализующий окошко подсказки.



Фрагмент, реализующий окошко подсказки.

Ниже приведен пример программирования подсказки (в процессе интерактивного диалога) с использованием экранного массива. Таблица ceh содержит два столбца: номер цеха и его название. В приведенном фрагменте вызывается функция wyborceh, которая выводит содержимое таблицы ceh в экранный массив. Пользователь передвигает курсор на название нужного ему цеха и нажимает клавишу CR. Подпрограмма определяет номер цеха и возвращает его вызывающей программе. DATABASE zawod . . . let nc= wyborceh() . . . FUNCTION wyborceh() # Выбор цеха, для внесения изменений DEFINE counter int DEFINE ceharr ARRAY[25] OF RECORD # массив для хранения nomerceh int, # номерцеха данных из таблицы nameceh char(20) # название цеха ceh END RECORD

# Открыть окно с рамкой и вывести в него экранную форму cehform OPEN WINDOW cehwind AT 4 ,6 WITH FORM "cehform" ATTRIBUTE(BORDER)

# Объявить курсор для выбора содержимого из таблицы ceh DECLARE cehcurs CURSOR FOR SELECT * FROM ceh ORDER BY nomerceh

# Выполнить запрос и все выбранные строки поместить в програм- # ный массив ceharr LET counter = 0 FOREACH cehcurs INTO ceharr[counter+1].* LET counter = counter + 1 IF counter >=25 THEN EXIT FOREACH END IF END FOREACH # счетчик counter равен фактическому числу строк выданных в # курсор

MESSAGE "Выберите цех и нажмите CR"

# Вывести в экранный массив cehscreen в экранной форме cehform # counter первых строк из программного массива ceharr call set_count(counter) DISPLAY ARRAY ceharr TO cehscreen.* ON KEY (CONTROL-M) EXIT DISPLAY END DISPLAY # Прервать показ экранного массива при нажатии клавиши CR

# закрыть окно с экранной формой cehform CLOSE WINDOW cehwind

let counter=arr_curr() #номер строки массива, #на котором нажато CR RETURN ceharr[counter].nomerceh #номер цеха, #на котором нажато CR END FUNCTION
А это пользователь увидит на экране: ¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' ¬ номер цех ¬  ¬  [3 ] [токарный ]¬  ¬  [4 ] [гараж ]¬  ¬  [5 ] [конюшня ]¬  ¬  [6 ] [столовая ]¬  ¬  [ ] [ ]¬  ¬  Выберите цех и нажмите CR ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬"



Генерация отчетов.



Генерация отчетов.

START REPORT report-name [TO {file-name | PRINTER | PIPE program}]

OUTPUT TO REPORT report-name (выражение, выражение [, ...])

FINISH REPORT report-name



Группы операторов языка SQL.



Группы операторов языка SQL.

SQL содержит 4 группы операторов:

Операторы описания данных: CREATE, DROP, ALTER и др. Операторы манипуляции данными: INSERT, DELETE, SELECT, UPDATE и др. Операторы задания прав доступа в базе данных: GRANT / REVOKE , LOCK / UNLOCK , SET LOCK MODE Операторы защиты, восстановления данных и прочие операторы.



Идентификаторы INFORMIX



Идентификаторы INFORMIX

Идентификатор (имя объекта) - это слово, состоящее из букв, цифр, и знаков подчеркивания (_), начинающееся с буквы или знака (_). В INFORMIX-4GL не различаются маленькие и большие буквы. Поэтому i_Un1023Tt и I_UN1023TT - одно и тоже имя.
Имя базы данных не длиннее 10.
Имена прочих объектов SQL - таблиц, столбцов, view (псевдотаблиц) , синонимов - не длиннее 18.



INFORMIX-4GL. Main Menu



INFORMIX-4GL. Main Menu

INFORMIX-4GL RDS стартуется командой r4gl
Пользователь попадает в главное меню INFORMIX-4GL: INFORMIX-4GL: Module Form Program Query-language Exit

Modulе Создавать, исправлять, выполнять отдельные модули на 4GL
Form Создавать, исправлять, компилировать 4GL экранные формы
Program Описание и компиляция многомодульных программ
Query-languagе Использование Структурного Языка Запросов SQL. Вызывает INFORMIX-SQL, команду Query-language
Exit Выход из INFORMIX-4GL.

Для того, чтобы создавать, компилировать, запускать на выполнение и отлаживать модули на языке 4GL, выберите команду Module и вы попадаете в меню MODULЕ: MODULE: Modify New Compile Program_Compile Run Debug Exit

Modifу Исправлять существующий программный модуль на 4GL.
Создать новый программный модуль на 4GL.
Compilе Компилировать отдельный программный модуль.
Program_Compilе Компилировать всю программу.
Run Запуск на выполнение откомпилированной программы или модуля.
Debug Отладка программного модуля или программы на 4GL. Вызывает Диалоговый Отладчик 4GL INFORMIX'а.
Exit Возврат в INFORMIX-4GL Главное Меню.



INFORMIX-SQL MAIN MENU



INFORMIX-SQL MAIN MENU

Form Создавать, выполнять, удалять экранные формы SQL
Report Создавать, выполнять, удалять отчеты.
Query-Language Use Informix Structured Query Language.
User-menu Запускать и модифицировать пользовательское меню.
Database Выбрать, создать или уничтожить базу данных.
Table Создавать, изменять или удалять таблицы в базе данных.

FORM option вызывает FORM Menu
Run Выполнять экранную форму
Modify Модифицирует форму with Us-Editor RK
Generate Генерит стандартную экранную форму
New Создать новую экранную форму
Compile Компилирует экранную форму
Drop Уничтожает экранную форму
RUN команда FORM Menu
QUERY сделать выборку строк
NEXT показать следующую строку
PREVIOUS показать предыдущую строку
ADD добавить строку в таблицу
UPDATE исправить строку
REMOVE удалить строку из таблицы
CURRENT показать текущую строку
SREEN переключится на другую страницу экранной формы
OUTPUT вывести выбранные строки в файл или на печать
TABLE переключить форму на другую таблицу
MASTER переключиться на следующую таблицу
DETAIL переключиться на предыдущую таблицу
VIEW команда не реализована
S Q L -- Structured Query Language. S Q L MENU
CTRL-W HELP - синтаксис SQL операторов
New Ввести SQL операторы используя SQL-editor
Run Выполнить SQL операторы
Мodify Исправлять SQL операторы используя SQL-editor
Use-editor Исправлять SQL операторы используя RK
Оutput Сбросить результаты запроса в файл, на принтер
Сhoose Вызвать файл с SQL операторами
Save Сохранить SQL операторы в файле.sql
Info Информация о таблицах в текущей database
Drop Уничтожить файл.sql

ЕSC=Закончить CTRL-R=Перерисовать
CTRL-A=Вставка/Замена СR =Перевод(Вставка) строки
NL,<стрелка>=Двигаться СTRL-X = Del char(Del line)
CTRL-D = Delete rest of line СTRL-N = Русский алфавит
CTRL-O = English alphabet



Язык Программирования 4-го Поколения 4GL.



Язык Программирования 4-го Поколения 4GL.

Включает следующие возможности:

Средства стандартных языков программирования 3-го поколения. Программные переменные. Изготовление операторов по ходу программы. Операторы манипуляции базой данных. SQL. Переброска данных из базы данных в программные переменные, и обратно. Курсоры. Печать результатов запросов. Отчеты. Экранный обмен с пользователем. Меню. Окна. Экранные формы, экранные поля, экранные массивы. Файл описания экранной формы. Файлы с исходными текстами. Описание состава программы.



Экранные формы Informix-4GL.



Экранные формы Informix-4GL.

DATABASE { db-name | FORMONLY } [WITHOUT NULL INPUT]

SCREEN [ SIZE lines [BY columns] ] {

. . . Текст . . . [fieldtag ] fieldtag(метка поля)- слово из букв и цифр, начинающееся с буквы . . .
Графические символы для рисования рамок: \gp-------q\g \g|\g \g|\g \gb-------d\g } TABLES # Открывать не более 12 таблиц! [tab-alias=[owner.]] table ...

ATTRIBUTES

fieldtag = { table.column | FORMONLY.field-name [TYPE [datatype [NOT NULL] | LIKE [table.]column]]} [attrbute-list] [=...][;][=...]; . . .

datatype любой кроме SERIAL
Возможные аттрибуты: AUTONEXT COMMENTS = "Строка комментария" NOENTRY REQUIRED VERIFY требовать подтверждения DEFAULT = "CA" INCLUDE = ("CA","OR","NV","WA") INCLUDE = (1 to 50,87,90) DISPLAY LIKE table.column FORMAT = "mm/dd/yyyy" для дат FORMAT = "####.#####" для чисел PICTURE = "тел.A##-#-###(XX)" А-буква,#-цифра,X-символ WORDWRAP [COMPRESS] поле расположено в нескольких строках VALIDATE LIKE tbl.col UPSHIFT DOWNSHIFT REVERSE негатив COLOR=[цвет] [интенс] ... [WHERE условия1 на fieldtag] [,COLOR=[цвет2] [интенс2] ... WHERE условия2 на fieldtag] цвет: интенсивность: WHITE CYAN reversе YELLOW MAGENTA RED blink GREEN BLUE BLACK ипderliпе left [INSTRUCTIONS

[DELIMITERS "ab"] # по умолчанию "ab"="[]"

[SCREEN RECORD record-name [ [n] ] ( { table.* | table.col1 THRU table.col2 | table.column } [,...]) . . . ] [END]



Командный Файл Утилиты dbload Содержит:



Командный Файл Утилиты dbload Содержит:

несколько FILE операторов, описывающих формат входных файлов несколько INSERT операторов, указывающих, куда вставлять данные из файлов.
Если используется DELIMETER, то поля имеют имена f01, f02, ... разделитель число полей FILE {"file-name"} { DELIMITER "c" nfields | обозначение NULL значения ( field1 start [ - end ] [: ...] [NULL="null-str1"] , field2 start [ - end ] [: ...] [NULL="null-str2"] , . . . fieldN start [ - end ] [: ...] [NULL="null-strN"] ) }; имя поля начало поля конец поля [продолжение] INSERT INTO table-name [(column-list)] [VALUES (values-list)] ; список констант и имен полей [ . . . ]



Команды Отладчика:



Команды Отладчика:

НELP [command | ALL] используемые в ОТЛАДЧИКЕ команды.
EХIT закончить работу с ОТЛАДЧИКОМ.
Движение в Окнах ОТЛАДЧИКА.
!UNIX-command выполнить команду операционной системы.
{/|?}[шаблон] поиск по шаблону вниз/вверх. CR - повторить.
^R перерисовать экран
сохранить текущий экран в файле. (fgldbscr/fglapscr)
переключиться с экрана ОТЛАДЧИКА на Application экран
VIEW [module | function] перейти в Source окно [в конкретную 4GL функцию или модуль.]
Управление Течением Программы.
RUN [arg [arg ...]] запустить 4GL программу на выполнение
прервать выполнение программы, вернуться в Командное окно
СОNTINUE [INTERRUPT | QUIT] продолжить выполнение программы, или послать ей ^C или Quit
SТEP [n] [INTO] [NOBREAK] выполнить [n] 4GL операторов. [CALL не как один] [без остановов]
Показать Значения.
FUNCTIONS [шаблон] [>> filename] вывести имена программно-объявленых 4GL функций
VАRIABLE [variable | GLOBALS | ALL] [>> filename] показать объявления переменных
DUМP [GLOBALS | ALL] [>> filename] вывести имена и значения локальных переменных текущей функции
PRINT expression [ { >> filename | PROGRAMM = programm-name ] показать значение выражения или отправить BLOB на программу обработки
WНERE [>> filename] показать стек вызовов и активные переменные
Настройка Текущего Сеанса.
USE [[=] directory-name [, ...]] указать маршрут поиска файлов с исходным текстом.
ALIAS {name = cmd_str | *} назначить команде ОТЛАДЧИКА имя или функциональную клавишу.
АРРLICATION [DEVICE] device-name перенаправить вывод 4GL программы на второй терминал.
GROW [SOURCE 9 | COMMAND 10 ] nlines изменить размеры Командного и Source окон.
TURN {[ON | OFF]} {[AUTOTOGGLE оп ] [DISPLAYSTOPS оп ] [EXITSOURCE оп ] [PRINTDELAY оff ] [SOURCETRACE off ]} включить / выключить режимы показа терминала ОТЛАДЧИКА.
TIМEDELAY [SOURCE 1 | COMMAND 0 ] number Как часто выводить справки.
Запоминание / Восстановление Состояния Отладчика.
WRITE [BREAK] [TRACE] [DISPLAY] [ALIASES] [>>] [filename] сохранить в файле команды, устанавливающие точки останова, traсеpoints, сокращения, директории поиска, или терминальные параметры показа. Если файл не указан, то записывается в инициализирующий файл ОТЛАДЧИКА рrogramma.4db
RЕАD filename выполнить команды ОТЛАДЧИКА из файла.
Точки Останова и Прерывания.
LIST [BREAK] [TRACE] [DISPLAY] показать текущие точки останова, tracepoints, параметры показа.
[неактивная] [останов раз в count]
ВREAK [*] [(function)] ["name"] [-count]
{[module.]line-no | variable | function]} [IF condition]
[{commands}]
поставить точку останова
NOВREAK {name | refno | function | ALL} удалить точку останова.
TRАСE [*] [(function)] ["name"] {[module.]line-no | variable | function | FUNCTIONS} [{commands}] [>> filename] установить tracepoint на операторе, функции, при изменении значения переменной.
NОТRACE {name | refno | function | ALL} удалить tracepoint.
DISABLE {name | refno | function | ALL} выключить точку останова или tracepoint.
ENАВLE {name | refno | function | ALL} включить точку останова или tracepoint.
Переприсваивание Значений Переменных.
DАТАВASE database-name указывает текущую базу данных
CLEANUP [ALL] инициализация, сброс всех наработанных величин
САLL function ([arg [,...]]) выполнить функцию и показать возвращенное значение.
LЕТ variable = expression присвоить значение выражения переменной.



Конфигурирование INFORMIX-OnLinе



Конфигурирование INFORMIX-OnLinе

Описывается версия 7.11, для версии 5.0 имеются некоторые отличия. Все действия выполняются с логина INFORMIX, стоя в его домашнем каталоге /usr/informix



Краткое пособие по языку SQL.


Операторы языка SQL используются во всех инструментальных средствах разработки INFORMIX (INFORMIX-SQL, INFORMIX-4GL, INFORMIX-ESQL/C и др.). Для каждого инструмента характерны определенные особенности использования SQL, которые описаны в соответствующей документации. В этом разделе даются сведения об применении операторов SQL в среде разработки INFORMIX-4GL.



Курсоры



Курсоры

Если запрос к таблице возвращает несколько (больше одной) строк, то для их обработки используется так называемый курсор - указатель во множестве строк, выбранных оператором SELECT. Оператором DECLARE объявляется курсор для запроса, оператором OPEN этот запрос фактически выполняется и выбранные строки выделяются. Курсор устанавливается на первую из выбранных строк. С помощью оператора FETCH вы можете брать очередную строку, на которую указывает курсор, и помещать ее в свои программные переменные. Курсор после этого смещается на следующую строку.
С помощью конструкции циклической FOREACH имя_курсора ... END FOREACH можно перебрать все строки, выбранные оператором SELECT. Оператор OPEN в этом случае не нужен. DATABASE zawod DEFINE zap RECORD LIKE kadry.* DECLARE curs1 CURSOR FOR select * from kadry where datarovd>"9/25/1973"

# в цикле FOREACH выводим на экран все строки таблицы kadry, # в которых столбец datarovd содержит дату после 25 сентября # 1973 года. FOREACH curs1 INTO zap.* # Берем очередную строку и по- # мещаем ее в запись zap MESSAGE zap.* # Выводим запись zap на экран PROMPT "Еще ?" FOR CHAR c END FOREACH # Конец цикла FOREACH
В следующем примере строки выбираемые из таблицы kadry через курсор curs2 помещаются в массив z1 (но не более 100 строк). DATABASE zawod DEFINE z1 ARRAY[100] OF RECORD LIKE kadry.*, counter int

DECLARE curs2 CURSOR FOR SELECT * FROM kadry WHERE datarovd<"9/26/1973" OPEN curs2

FOR counter=1 TO 100

FETCH curs2 INTO z1[counter].* # взять очередную строку и поместить ее в следующий элемент # массива z1

IF status=NOTFOUND THEN # если выбранные сроки кончились, закончить цикл EXIT FOR END IF

END FOR

LET counter=counter-1 MESSAGE "В массив z1 прочитано ",counter, " записей"
Этот пример демонстрирует еще одно использование переменной status. Если оператор FETCH пытается взять сроку из курсора когда тот уже пуст, то значение переменной status устанавливается равным символической константе NOTFOUND, имеющей значение 100.
Поэтому можно проверять значение status после оператора FETCH и если оно равно 100, то прекратить чтение строк из опустевшего курсора.
В данном примере пользователь сам должен ввести условия, по которым будут найдены строки в таблице ceh. Он, например, может ввести: "nomerceh>15 and nomerceh<23". Программа прицепит это условие к строке, в которой записан SELECT оператор, получит строчку "SELECT * FROM ceh WHERE nomerceh>15 and nomerceh<23", изготовит из нее оператор, и для этого изготовленного оператора SELECT объявит курсор. Дальше действия аналогичны предыдущему примеру. DEFINE z2 ARRAY[100] OF RECORD LIKE ceh.*, counter int, simw char(200) PROMPT "допишите оператор SELECT * FROM ceh WHERE " FOR simw IF LENGTH(simw)=0 THEN LET simw="TRUE" END IF LET simw="SELECT * FROM ceh WHERE ", simw CLIPPED PREPARE st2 FROM simw DECLARE cs2 FOR st2

let counter=1 FOREACH cs2 INTO z2[counter].* LET counter=counter+1 IF counter>100 THEN EXIT FOREACH END IF END FOREACH LET counter=counter-1 MESSAGE "В массив z2 прочитано ",counter, " записей"


Логические выражения:



Логические выражения:

=, != или <>, <=, >=, <, > NOT , OR, AND выражение IS [NOT] NULL по умолчанию "\" string [NOT] LIKE "шаблон" [ESCAPE "escape-char"] спецсимволы шаблона % _ означают ¬ ¬! string [NOT] MATCHES "шаблон" [ESCAPE "esc-char"] спецсимволы шаблона * ? [ abH ] [^ d - z ] означают "много", "один", "любой из", "ни один из"



Манипуляция "курсором".



Манипуляция "курсором".

DECLARE cursor-name [SCROLL] CURSOR [WITH HOLD] FOR

{ SELECT-st [FOR UPDATE [OF column-list]] |

INSERT-st | statment-id }

SCROLL - фактически, создается временная таблица.

statment-id - приготовленого PREPARE

HOLD - игнорировать конец транзакции
Внимание: SCROLL cursor нельзя открывать FOR UPDATE, зато для не-SCROLL cursora можно использовать
Внимание: оператор DECLARE cursor-name должен располагаться в тексте программы выше любого использования этого курсора. OPEN cursor-name [USING список переменных]

CLOSE cursor-name

для SELECT-курсора:

FOREACH cursor-name [INTO список переменных]

. . .

[CONTINUE FOREACH]

. . .

[EXIT FOREACH]

. . .

END FOREACH

FETCH { NEXT | PREVIOUS | FIRST | LAST | CURRRENT |

RELATIVE m | ABSOLUTE n ] cursor-name

[INTO список переменных]
если cursor not SCROLL то можно только NEXT
если строки не обнаружено, то status=NOTFOUND для INSERT-курсора:

PUT cursor-name [FROM список переменных] ввести строку в буфер,

[заменив знаки ? для DECLAREd INSERT-st на список переменных]

FLUSH cursor-name вытолкнуть буфер

^^ SQL операторы ^^

Описания CREATE, DROP, DATABASE, ALTER, RENAME

Манипуляция данными DELETE, INSERT, UPDATE, LOAD, UNLOAD

Оператор SELECT

Операторы транзакции и восстановления BEGIN WORK, COMMIT WORK, ROLLBACK WORK, START DATABASE, ...



Меню, окна.



Меню, окна.

MENU "Название меню" COMMAND { KEY (key-list) | [KEY (key-list)] "kоманда меню" [" подсказка help"] [HELP help-number] } Либо key, либо первая буква, обязаны быть латинскими. statement . . . [CONTINUE MENU] . . . [EXIT MENU] . . . [NEXT OPTION "kоманда меню" # Перейти к [COMMAND . . . ] . . . END MENU

OPTIONS { По умолчанию: PROMPT LINE p | FIRST MESSAGE LINE m | FIRST + 1 FORM LINE f | FIRST + 2 COMMENT LINE c | LAST [-1] ERROR LINE e | LAST INPUT { WRAP | NO WRAP } | NO WRAP INSERT KEY key-name | Вставить F1 !! Не применять: DELETE KEY key-name | Удал. стр F2 CONTROL-A,D,H,L, NEXT KEY key-name | Страница F3 CONTROL-Q,R,X, PREVIOUS KEY key-name | Страница F4 CONTROL-C,S,Q,Z ACCEPT KEY key-name | ESC HELP FILE "help-file" | Предварительно откомпилированный HELP KEY key-name | CONTROL-W утилитой mkmessage INPUT ATTRIBUTE(список атрибутов) | DISPLAY ATTRIBUTE(список атрибутов) } [,...] атрибуты: NORMAL REVERSE FORM использовать атрибуты BOLD UNDERLINE WINDOW текущего окна INVISIBLE BLINK

OPEN WINDOW window-name AT row, column WITH { integer ROWS, integer COLUMNS | FORM "form-file" } [ATTRIBUTE(список аттрибутов)] Атрибуты: BORDER По умолчанию: нет BOLD, DIM, INVISIBLE, NORMAL NORMAL REVERSE, UNDERLINE, BLINK нет PROMPT LINE n FIRST MESSAGE LINE m FIRST + 1 FORM LINE m FIRST + 2 COMMENT LINE m LAST

CURRENT WINDOW IS { window name | SCREEN }

CLEAR {SCREEN | WINDOW window-name | FORM | список полей}

CLOSE WINDOW window-name

OPEN FORM form-name FROM "form-file" Без расширения .frm

DISPLAY FORM form-name [ATTRIBUTE(список аттрибутов)]

CLOSE FORM form-name



Mkmessage - Компиляция файла сообщений



6. mkmessage - Компиляция файла сообщений

Компилирует файлы с сообщениями, используемые в прикладных 4GL программах. mkmessage [-v] [-dMACRO] input_file output_file



Многопользовательский Режим Обработки Базы Данных.



Многопользовательский Режим Обработки Базы Данных.

Блокирование (locking), оно же запирание.

Сервер базы блокирует строки и таблицы во избежание коллизий при записи в одну и ту же строку. Строки блокируются автоматически (неявно). В блокированную строку нельзя писать, но можно смотреть. На время выполнения транзакции все измененные в ней строки блокируются. Можно заблокировать всю таблицу целиком явной командой блокировки. Таблицы можно блокировать не только от записи, но и от просмотра. Программе можно задавать режим:
ждать/ не ждать блокированных строк оператором SET LOCK MODE.

Права Доступа в Базе Данных, которые могут иметь пользователи. На уровне базы данных определены следующие уровни прав:

пользовательский право на ресурсы администратор базы данных
На уровне таблиц можно давать пользователям (и отбирать у них) следующие привилегии:

читать строки вставлять строки изменять строки уничтожать строки переопределять таблицу.



Настройка UNIX для работы с INFORMIX



Настройка UNIX для работы с INFORMIX

Если при запуске нескольких процессов INFORMIX программы начинают слетать с сообщением 1250 "Unable create a pipe", значит в вашей системе слишком мало socketов. А требуется их по 4 штуки на каждую запускаемую программу INFORMIX'а.
Корректирующие действия: создайте недостающие socketы в каталоге /dev/so , задайте им нормальные права доступа, и перегенерите систему, указав в dfile их новое количество.
Внимание! Не уничтожайте старый UNIX, пока не убедитесь, что новый грузится нормально!!!



О Настройке INFORMIX на Терминал.



О Настройке INFORMIX на Терминал.

Для настройки на терминалы UNIX использует файл termcap или базу данных terminfo, в которых собраны описания всех (или почти всех) терминалов, существующих в природе. Выяснив, какой тип терминала подключен к машине (а задается это в переменной окружения TERM (например TERM=d460 или TERM=d211)), UNIX находит описание этого терминала базе описания терминалов и настроившись по хранящейся там информации, может адекватно воспроизводить на нем информацию, подлежащую выводу.
INFORMIX имеет свой собственный termcap файл с описаниями терминалов, в нем поддерживается больше возможностей по сравнению со стандартным termcap UNIX'а. Чтобы INFORMIX пользовался им нужно присвоить его маршрутное имя в переменную окружения TERMCAP=/usr/informix/etc/termcap
Терминалы TATUNG и DASHER-460 можно настраивать в два разных режима: СТАНДАРТНЫЙ, и ANSI.
Стандартный режим задается стандартным значением переменной TERM. Для TATUNG TERM=d211, для DASHER-460 TERM=d460. В этом режиме я и рекомендую вам работать. Включается он по умолчанию.
Стандартный режим имеет следующие недостатки:

Некоторые CONTROL-ключи в нем не работают, поскольку их ASCII коды совпадают с кодами "стрелок" вправо/влево/вверх/вниз Это было бы легко пережить, если бы этими ключами не были CONTROL-W - ключ, вызывающий HELP-подсказку в среде INFORMIX и CONTROL-X - ключ "уничтожить символ".
Следует заметить, что терминалы, работающие в ANSI режиме (посылающие функциональными клавишами длинные ESC-последовательности) плохо переносят русификацию клавиатуры. Недостаток режима ANSI один: функциональные клавиши и стрелки на нем периодически сбоят.
Выглядит это так: десять раз вы нажимаете на "стрелку влево" и она срабатывает как "стрелка влево" а в одиннадцатый (или в восьмой) раз она срабатывает как целая пачка нажатых клавиш: ESC, '[', '1', 'D'. Иногда это может оказаться весьма неприятно, особенно если за терминалом сидит неопытный пользователь.
Представьте: вы находитесь в экранной форме, нажимаете стрелку чтобы сдвинуться, а вместо движения у вас срабатывает ESCAPE ("завершить ввод") а потом клавиша 'D', на которой в меню часто бывает навешано что-нибудь типа Drop или Delete.


Устанавливается ANSI режим так: установите значение переменной TERM=d211-tansi или TERM=d460-tansi соответственно. Сделать это можно и в общем профайле /config/profiles/informix.sh, и в личном профайле .profile, или непосредственно вручную с помощью команды TERM=d460-tansi export TERM
или только на время работы INFORMIX, стартовав его так: TERM=$TERM-tansi r4gl
Решать, какой режим - Стандартный с неработающими ^W и ^X, или ANSI со сбоящими клавишами - ему менее противен, имеет смысл каждому пользователю индивидуально, исходя из личных вкусов.
Список допустимых следующие значения переменной TERM для TATUNG ET10:

TERM=d211 Стандартное значение ("Простой")
TERM=d211-tansi Временный ANSI режим (ANSI)
TERM=d211-132 "Широкоэкранный" режим (132 символа в строке)
TERM=vt220 Эмуляция vt220 (vt200 в 7-ми битном режиме)

Допустимы следующие значения TERM для для DASHER D460:
TERM=d460 Стандартное значение
TERM=d460-tansi Временный ANSI режим для DASHER D460
TERM=d460-127 Не реализован

Обеспечивается также работа с другими типами терминалов. См. начало файла /usr/informix/etc/termcap


О Руссификации INFORMIX.



О Руссификации INFORMIX.

Данные типа char в INFORMIX имеют длину 8 бит на символ и поэтому могут хранить как английские, так и русские буквы.
Встроенной сортировки по русскому алфавиту INFORMIX не реализовал. Для русской сортировки пользуйтесь предварительной перекодировкой. (См. например подпрограммку koder в демонстрационной базе ZAWOD).
Во время ввода пользователь должен переключаться с русского на английский клавишей CONTROL-O, а с английского на русский клавишей CONTROL-N.
Должна быть установлена переменная окружения KEYBMAP="маршрутное имя файла с перекодировочной таблицей"
По умолчанию применяется KEYBMAP=/usr/informix/keybmap/dasher, которая устанавливает клавиатуру "ЯВЕРТЫ" под стандарт терминалов БЕСТЫ, и начальный алфавит - русский. KEYBMAP=/usr/informix/keybmap/dasherE export KEYBMAP
Такой командой устанавливают клавиатуру "ЯВЕРТЫ", и начальный алфавит - английский KEYBMAP=/usr/informix/keybmap/dasherD export KEYBMAP
Клавиатура "ЙЦУКЕН" под стандарт персонального компьютера. KEYBMAP=/usr/informix/keybmap/dasherP export KEYBMAP
Клавиатура "ЙЦУКЕН" под стандарт русской пишущей машинки.
В файле /usr/informix/keybmap/dasher лежит таблица перевода введенных с клавиатуры латинских символов в соответствующие им русские. Перекодировочная таблица соответствует "QWERTY"-английской клавиатуре. (Т.е. 'a' переводится в 'а', 'c' переводится в 'ц' и т.д.). Создается файл /usr/informix/keybmap/dasher программой, лежащей в /usr/informix/keybmap/crmap_dasher.c
Чтобы установить другое расположение русских букв на клавиатуре переделайте эту программу. Для этого переставьте в нужном вам порядке содержимое массива russmap.
В программе /usr/informix/keybmap/crmap_dasher.c статическая переменная init определяет, в каком алфавите начинается работа INFORMIX. Если init=1, то сначала устанавливается русский алфавит, если init=0, то сначала устанавливается латинский алфавит.
Переделанную программу, естественно, нужно не забыть откомпилировать и запустить на выполнение.
Интересным способом борьбы с русификацией INFORMIX, выполненной при портировании оной является полный от нее отказ и использование русского драйвера клавиатуры для UNIX.



Объекты, Используемые в INFORMIX-4GL.



Объекты, Используемые в INFORMIX-4GL.

1. Объекты SQL 2. Переменные 4GL 3. Программные

Имя базы данных простая переменная функция Имя таблицы переменная типа "запись" отчет Имя столбца массив метка Имя индекса Имя псевдотаблицы Имя синонима

( database-name простые переменные function ) ( table-name переменная типа запись report ) ( column-name массивы label ) ( index-name ) ( view-name ) ( synonim-name )

4. Имена операторов 5. Объекты экранного обмена. и курсоров window statement-id - изготовленный оператор form cursor-name - курсор screen-field screen-record screen-array

Идентификаторы INFORMIX.
Каждый объект 4GL имеет имя (идентификатор) - это слово, состоящее из букв, цифр, и знаков подчеркивания (_), начинающееся с буквы или знака (_). В INFORMIX-4GL не различаются маленькие и большие буквы. Поэтому i_Un103Tt и I_UN103TT - одно и тоже имя. Области Действия Имен Переменных:

Локальная переменная - объявлена внутри блока function, main, report. Действует внутри блока, в котором объявлена. Модульная переменная должна быть объявлена в самом начале модуля с исходным текстом вне любого блока report, function или main. Действует внутри всего модуля (за исключением блоков, в которых это имя переобъявлено и является для них локальным). Глобальные переменные - объявляются с помощью оператора GLOBALS в начале модулей. Действуют во всех модулях с исходным текстом, в которых есть соответствующее объявление этих переменных.

Область действия имен КУРСОРОВ и Изготовленных Операторов от точки их объявления (DECLARE, PREPARE) и до конца модуля. Область действия имен Окон, Форм, Функций, Отчетов - во всей программе.



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



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

DEFINE список переменных { type | LIKE table.column | RECORD {LIKE table.* | список переменных [,..] END RECORD} } [,...] где type может быть следующим: INTEGER CHAR(n) DATE SMALLINT DECIMAL(m,n) DATETIME qualif1 TO qualif2 REAL MONEY(m,n) INTERVAL qualif1 TO qualif2 FLOAT RECORD ARRAY [i,j,k] OF datatype где qualif ¬ {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}

GLOBALS { "файл с GLOBALS объявлениями" | DEFINE-st Должен лежать вне любого блока во всех . . . модулях, где эти переменные используются END GLOBALS }



Операции над строками:



Операции над строками:

string1,string2 сцепить string [m,n] подстрока string CLIPPED усечь пробелы справа string USING "формат" форматировать string WORDWRAP переносить длинную строку



Оператор OPTIONS



Оператор OPTIONS

Оператор OPTIONS может установить новые режимы для ввода вывода, если вас не устраивают заданные по умолчанию. OPTIONS MESSAGE LINE 23, HELP FILE "h4gl.txt", HELP KEY CONTROL-T, DISPLAY ATTRIBUTE(REVERSE, UNDERLINE)



Оператор PROMPT



Оператор PROMPT

Оператор PROMPT выводит на экран display-list - список значений переменных и констант, и вводит после этого с клавиатуры значение в указанную вслед за ключевым словом FOR переменную. PROMPT "Да или нет ?" FOR answer ON KEY (CONTROL-U) LET answer=wozderv() EXIT PROMPT END PROMPT
Можно включить в PROMPT контрольные блоки, выполняющиеся при нажатии заданных клавиш. Если в данном примере во время ввода пользователь нажмет клавишу CTRL-U то выполнятся операторы из ON KEY предложения: будет вызвана функция wozderv() а затем прерван оператор PROMPT, не завершив ввода.



Оператор SELECT.



Оператор SELECT.

SELECT [ALL | UNIQUE] column-expr [col-lable] [,...]

[INTO список переменных] !* Только в 4GL *!

FROM { [OUTER] table-name [tab-alias] |

OUTER (table-expr) } [,...] -проверять условие

только для этой (менее

[WHERE condition] надежной) таблицы

[GROUP BY column-list [HAVING condition] ]

[ORDER BY column-name [DESC],...]

[INTO TEMP table-name]

WHERE conditions:
связанные логическими операторами OR, AND, NOT сравнения выраж1 сравнение выраж1
где сравнение =,>,<,>=,<=,<>,!= column-name IS [NOT] NULL

выраж [NOT] BETWEEN выраж1 AND выраж2

выраж [NOT] IN (выраж1 , ... [, ...] )

по умолчанию "\"

строка [NOT] LIKE "шаблон" [ESCAPE "escape-char"]

спецсимволы шаблона % _ означают "много" "один"

строка [NOT] MATCHES "шаблон" [ESCAPE "esc-char"]

спецсимволы шаблона * ? означают "много" "один"

[abH] [^d-z] "один из" "ни один из"

выраж сравнение {ALL | [ANY | SOME]} (SELECT-оператор)

выраж [NOT] IN (SELECT-оператор) !* Обыкновенный *!

[NOT] EXISTS (SELECT-оператор) !* SQLевский *!



Операторы манипуляции данными.



Операторы манипуляции данными.

DELETE FROM table-name [WHERE {condition | CURRENT OF cursor-name}]

!* Только в 4GL *!

INSERT INTO table-name [(column-list)]

{ VALUES (value-list) | SELECT-statement }

UPDATE table-name SET {column-name ={ expression | (SELECT-st) } [,...]

| {(col-list) | [table.]*} =

{ ({ expr-list | (SELECT-st) } [,...]) | record-name.* }

[WHERE {condition | CURRENT OF cursor-name}]

!* Только в 4GL *!

LOAD FROM "file-name" [DELIMITER "?"] { INSERT INTO table

[(col-list)] | char-variable with INSERT-st }

UNLOAD TO "file" [DELIMITER "?"] SELECT-statement

формат файла по умолчанию:

столбец1|столбец2| ... столбецn|

...

значение|значение| ... значение|

OUTPUT TO {FILENAME | PIPE program} [WITHOUT HEADINGS] SELECT-st

только в INFORMIX-SQL



Операторы MENU. MESSAGE. PROMPT.



Операторы MENU. MESSAGE. PROMPT.

В результате работы фрагмента программы let sta_return=podtwervdenie(" В самом деле решили закончить? ") ... function podtwervdenie(stroka) define stroka char(38) , kod_wozwr int

open window podtwervdenie AT 11,10 WITH 4 rows, 39 columns ATTRIBUTE(border) display stroka at 4, 2 attribute (reverse)

menu " " command key("Y") " Yes " "Действительно Да." let kod_wozwr=1 exit menu command key("N",ESC) " No " "Нет, вернуться обратно." let kod_wozwr=0 exit menu command key("A") " Abort " "Отменить. И кончить." let kod_wozwr=-1 exit menu end menu close window podtwervdenie return kod_wozwr end function
на экране в текущем окне появится такое меню +---------------------------------------+ | : Yes No Abort | |Действительно Да. | | | | В самом деле решили закончить? | +---------------------------------------+



Операторы MESSAGE, ERROR



Операторы MESSAGE, ERROR

Оператор MESSAGE выводит строку значений на экран на message line. Аргументами MESSAGE могут быть переменные и константы, но не выражения. let ttmm=CURRENT message "Московское время ", ttmm

error "Данных больше нет, прочитанно ", n, " строк"
Оператор ERROR делает тоже, что и MESSAGE, только со звонком и с атрибутом REVERSE. Сообщение выводится на 24-ю строку экрана.



Операторы описания данных.



Операторы описания данных.

Операторы описания данных не откатываются ! CREATE DATABASE db-name [WITH LOG IN "pathname" [MODE ANSI]]
Стандарт ansi требует имя владельца, транзакция по умолчанию DROP DATABASE { database-name | char-variable }

DATABASE database-name [EXCLUSIVE] Сделать текущей

CLOSE DATABASE

CREATE [TEMP] TABLE table-name( column-name datatype [NOT NULL]

[UNIQUE [CONSTRAINT constr-name]] [,...] )

[UNIQUE(uniq-col-list) [CONSTRAINT constr-name] ] [,..]

[WITH NO LOG]

[IN "pathname-directory"]

где datatype может быть:

INTEGER SERIAL[(n0)] DATE

SMALLINT DECIMAL(m,n) DATETIME qualif1 TO qualif2

REAL MONEY(m,n) INTERVAL qualif1 TO qualif2

FLOAT CHAR(n)

qualifier \in {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}

ALTER TABLE table-name # Недопустим для временых таблиц

{ ADD ( new-column-name datatype [NOT NULL]

[UNIQUE [CONSTRAINT constr-name]][,...] )

[BEFORE old-column-name]

|

DROP (old-column-name[,...])

|

MODIFY (old-column-name new-datatype [NOT NULL][,...])

|

ADD CONSTRAINT UNIQUE (old-column-name[,...])

[CONSTRAINT constr-name]

|

DROP CONSTRAINT (constr-name[,...])

} [,...]

RENAME TABLE old-table-name TO new-table-name

RENAME COLUMN table.old-column-name TO new-column-name

CREATE VIEW view-name [(column-list)]

AS SELECT-statement [WITH CHECK OPTION]

CREATE [UNIQUE|DISTINCT] [CLUSTER] INDEX index-name

ON table-name (column-name [DESC], ...)

ALTER INDEX index-name TO [NOT] CLUSTER Упорядочить таблицу

CREATE SYNONYM synonym-name FOR table-name

DROP VIEW view-name

DROP TABLE table-name

DROP INDEX index-name

DROP SYNONYM synonym-name

UPDATE STATISTICS [FOR TABLE table-name] В системном каталоге

SET EXPLAIN {ON | OFF}
Выводить системные объяснения в sqlexplain.out



Операторы организации программы.



Операторы организации программы.

MAIN Главный блок (должен быть ровно один) . . . END MAIN

CALL function-name ([список аргументов]) [RETURNING возвр. знач]

FUNCTION function-name ([список аргументов]) . . . Аргументы передаются [RETURN expr-list] по значению . . . END FUNCTION

REPORT report-name(variable-list) [DEFINE-statement] . . . [OUTPUT output-statement . . .] [ORDER [EXTERNAL] BY sort-list FORMAT format-statement . . . 4gl-statement . . . END REPORT



Операторы SQL



Операторы SQL

Организация программы MAIN FUNCTION REPORT Объявления переменных DEFINE GLOBALS Присвоения LET INITIALIZE Программные CALL EXIT GOTO RETURN FOR LABLE CASE WHILE RUN IF CONTINUE SLEEP Перехват прерываний WHENEVER DEFER Динамическое создание операторов PREPARE EXECUTE FREE Манипуляция "курсором" DECLARE OPEN FOREACH PUT CLOSE FETCH FLUSH Экранный обмен MENU OPEN FORM DISPLAY ARRAY OPTIONS DISPLAY FORM SCROLL OPEN WINDOW CLOSE FORM INPUT ARRAY CURRENT WINDOW DISPLAY PROMPT CLEAR INPUT ERROR CLOSE WINDOW CONSTRUCT MESSAGE Генерация отчетов START REPORT OUTPUT TO REPORT FINISH REPORT



Операторы транзакций, восстановления данных.



Операторы транзакций, восстановления данных.

CREATE DATABASE db-name WITH LOG IN "/pathname" [MODE ANSI]]

START DATABASE db-name WITH LOG IN "/pathname" [MODE ANSI]

стартовать новый системный журнал (log-файл)

DATABASE database-name [EXCLUSIVE] Сделать текущей

ROLLFORWARD DATABASE database-name Накатить базу из копии

CLOSE DATABASE вперед по системному журналу

BEGIN WORK Начало транзакции Внимание!! Все

. . . измененные строки блокируются!!

COMMIT WORK Kонец транзакции

ROLLBACK WORK Откатить изменения к предыдущему COMMIT

CREATE AUDIT FOR table-name IN "pathname"

. . .

RECOVER TABLE table-name Восстановить таблицу

DROP AUDIT FOR table-name

VALIDATE список переменных LIKE column-list удовлетворяют ли
переменные допустимым значениям для этих столбцов (syscolval)?, если нет то status<0

Примечание: подчеркнутые операторы нельзя использовать в 4GL, а можно только в INFORMIX-SQL INFO { TABLES | { COLUMNS | INDEXES | ACCES | PRIVILEGES |

STATUS } FOR table-name }

CHECK TABLE owner.table-name Проверить индексы

REPAIR TABLE table-name Ремонт индексов



Операторы задания прав доступа (не откатываются).



Операторы задания прав доступа (не откатываются).

{DBpriv {PUBLIC право давать права

GRANT | TO | [WITH GRANT OPTION] [AS grantor]

TBpriv [,..] ON table} user-list} от имени grantor

{DBpriv

REVOKE | FROM { PUBLIC | user-list }

TBpriv [,..] ON table}

TABLE PRIVILEGES:

DATABASE PRIVILEGES: ALTER DELETE

INDEX INSERT

CONNECT работать SELECT[(cols)]

RESOURCE создавать объекты UPDATE [(cols)]

DBA все ALL [PRIVILEGES]

SET LOCK MODE TO [NOT] WAIT ждать [не ждать] освобождения

блокир. строк

LOCK TABLE table-name IN {SHARE | EXCLUSIVE} MODE

{Можно смотреть | Ничего нельзя}

UNLOCK TABLE table-name



Описание и компиляция экранных форм



Описание и компиляция экранных форм

В приведенном выше фрагменте использована экранная форма cehform.per. Ниже приведено ее описание. Это описание должно лежать в файле cehform.per и должно быть откомпилировано компилятором экранных форм INFORMIX'а form4gl.
Описание экранной формы cehform.per DATABASE zawod SCREEN { номер цех [f00] [f001 ] [f00] [f001 ] [f00] [f001 ] [f00] [f001 ] [f00] [f001 ] } TABLES ceh

ATTRIBUTES f00 = ceh.nomerceh; f001 = ceh.nameceh;

INSTRUCTIONS screen record cehscreen[5] (ceh.*) END
В секции DATABASE указана база данных; в секции SCREEN задана картинка, которая будет рисоваться на экране; В TABLES указываются таблицы, в ATRIBUTES указываются имена экранных полей, (и, возможно, их атрибуты) а в INSTRUCTIONS объявлен экранный массив cehscreen в пяти строках из двух полей (nomerceh и nameceh)
В качестве примера ниже приводится функция, реализующая простейший калькулятор. Возвращает значение вычисленного выражения. Скомпилируйте ее самостоятельно и посмотрите отладчиком, как она работает. function kalkulator() # Калькулятор define wyravenie, kalkulator char(64), kolichestwo int define stroka_kalkulatora char(200) define beep char(1) let beep=ascii 7 open window kalkulator at 2,2 with form "kalkulator" attribute(border, form line first)

input by name wyravenie, kalkulator without defaults before field kalkulator

let stroka_kalkulatora= "select count(*),",wyravenie," from systables"

whenever error continue prepare kalkulqtor_operator from stroka_kalkulatora if status<0 then display beep to kalkulator display "Неправильное выражение" to kalkulator next field wyravenie end if

declare kalkulator cursor for kalkulqtor_operator

foreach kalkulator into kolichestwo, kalkulator if status<0 then display beep to kalkulator display "Неправильное выражение" to kalkulator next field wyravenie end if end foreach whenever error stop

display kalkulator to kalkulator next field wyravenie end input

close window kalkulator return kalkulator

end function
Использованная в подпрограмме экранная форма должна быть описана в файле kalkulator.per и откомпилирована при помощи компилятора form4gl. DATABASE formonly SCREEN { Калькулятор. Чтобы закончить нажмите ESC [wyravenie ] [kalkulator ] } ATTRIBUTES wyravenie =formonly.wyravenie; kalkulator=formonly.kalkulator; END



Описание экранной формы



Описание экранной формы

Описание состоит из 5 разделов: DATABASE, SCREEN, TABLES, ATTRIBUTES, INSTRUCTIONS # база данных, с которой ведется работа DATABASE zawod

# Картинка, которая выводится на экран. # экранные поля обозначены так: [метка поля ] # метка поля используется в разделе ATTRIBUТЕ SCREEN { номер цеха [nceh ] зарплата [f002 ] фамилия [fio ] должность [dol ] Так в экранной форме рисуется рамка. Значок \g используется для входа и выхода в графический режим \gp-----------------------------q\g \g|\g Экранный массив \g|\g \g|\g [s1 ] [s2 ] \g|\g \g|\g [s1 ] [s2 ] \g|\g \g|\g [s1 ] [s2 ] \g|\g \g|\gномер цеха название цеха \g|\g \gb-----------------------------d\g в графическом режиме символы р q b d - | заменяются символами рисования рамки ¬' ¬' ¬" ¬" ¬¦ ¬  } TABLES # имена таблиц, с которыми ассоциированна форма kadry ceh ATTRIBUTES # Имена экранных полей в форме и их атрибуты. # слева от знака (=) пишется метка поля (которая фигурирует в # разделе SCREEN), справа - имя экранного поля, которое обычно, # для удобства, должно совпадать с именем какого-нибудь столбца # из таблиц, перечисленных в разделе TABLES

nceh = kadry.nomerceh; f002 = zarplata, COLOR=REVERSE WHERE f002 >500; # если в поле выведено значение больше 500, то оно будет # выделено с атрибутом REVERSЕ (негатив) fio = fio; dol = dolvn, comments="Проверьте наличие в штатном расписании"; s1 = ceh.nomerceh; s2 = ceh.nameceh; # здесь экранные поля можно INSTRUCTIONS # объединить в экранные записи screen record kad (kadry.nomerceh, dolvn, zarplata) # и описать экранные массивы screen record scr[3] (ceh.nomerceh, nameceh) END
а вот что увидит на экране пользователь, использующий эту форму: ¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' ¬  номер цеха [ ] зарплата [f002 ] ¬  ¬  фамилия [ ] ¬  ¬  должность [ ] ¬  ¬  Так в экранной форме рисуется рамка. ¬  ¬  Значок используется для входа и выхода в графический режим ¬  ¬  ¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' ¬  ¬  Экранный массив ¬  ¬  ¬  ¬  [ ] [ ] ¬  ¬  ¬  ¬  [ ] [ ] ¬  ¬  ¬  ¬  [ ] [ ] ¬  ¬  ¬  ¬  номер цеха название цеха ¬  ¬  ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬" ¬  в графическом режиме символы р q b d - | заменяются ¬  ¬  символами рисования рамки ¬' ¬' ¬" ¬" ¬¦ ¬  ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬
В этой экранной форме определены экранные поля: kadry.nomerceh, zarpllatа, fiо, dolvп, ceh.nomerceh, nameceh
А так же экранные записи: kadrу (по умолчанию), ceh (по умолчанию), kad, scr[3]



Определяемся, как зовут ленты



5. Определяемся, как зовут ленты

Для архивации самой базы нужен один стриммер, для архивации логических протоколов - другой. Для начальных упражнений с базой рекомендую и тот и другой сделать /dev/null, тогда вашей базе не грозит зависнуть посреди рабочего дня из-за переполнения логических протоколов.



Основные Объекты Реляционной Базы Данных.



Основные Объекты Реляционной Базы Данных.

(DATABASE) Реляционная База Данных: это множество прямоугольных таблиц с данными. Никаких дополнительных сведений и ссылок не хранится.

(TABLE) Таблица - прямоугольная таблица, состоящая из СТРОК и СТОЛБЦОВ. Задать таблицу - значит указать, из каких столбцов она состоит. Обращаю внимание поклонников DBase - то, что в DBase называлось базой данных, в INFORMIX называется таблицей.

(ROW) Строка - запись, состоящая из полей - столбцов. В каждом поле сидит его значение, либо значение NULL - "пусто". Строк в таблице может быть сколько угодно. Физический порядок их расположения друг относительно друга не определен.

(COLUMN) Столбец - Каждый столбец в таблице имеет собственные имя и тип.

В INFORMIX допустимы следующие типы столбцов: INTEGER SERIAL - автоматический счетчик SMALLINT CHAR(n) DATE FLOAT DECIMAL(m,n) DATETIME qualif1 TO qualif2 REAL MONEY(m,n) INTERVAL qualif1 TO qualif2
где qualif \in {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}, возможны и другие типы, в зависимости от реализаций.
Реляционная модель идейно проста - основной ее принцип - "База Данных обеспечивает хранение и выдачу информации из своих прямоугольных таблиц, и ничего не желает знать о логической структуре данных, которую на ней реализовывают." Все логические отношения и связи между разными таблицами вынесены наружу "Исполнителя База Данных" и отданы на откуп программисту. Такой подход позволяет просто и эффективно реализовывать саму базу данных, соответственно и быстродействие и мощность реляционных баз удается держать на весьма высоком уровне.
Физическую целостность базы данных обычно поддерживает сам метод доступа, сервер базы.
Но логическая (внешняя) структура пользовательской базы может быть весьма сложной. Для поддержания целостности логической структуры базы данных в реляционной базе имеется механизм транзакций. Транзакция - это объединение нескольких простых операторов манипулирования данными, которые должны быть выполнены только вместе, а если это не удается, то база вернется в состояние, предшествующее выполнению самого первого из них.



Осталось прописать автоматический старт/стоп сервера



8. Осталось прописать автоматический старт/стоп сервера

В каталог с RC командами (скорее всего в /etc/rc3.d или в /sbin/rc3.d или в файл /etc/rc.local ) поместить файл S99informix.sh такого содержания: # Запуск сервера INFORMIX-OnLine при начальной загрузке # INFORMIXDIR=/usr/informix ONCONFIG=onconfig export INFORMIXDIR ONCONFIG $INFORMIXDIR/bin/oninit ######## конец файла ##############
и K99informix.sh такого содержания: # Выключение сервера INFORMIX-OnLine при shutdown'е # INFORMIXDIR=/usr/informix ONCONFIG=onconfig export INFORMIXDIR ONCONFIG $INFORMIXDIR/bin/onmode -k -y ######## конец файла ##############



Отладчик Языка 4GL.


Пользователь постоянно видит два окна: Sourсе с исходным текстом и выделенным оператором, на котором остановилось выполнение программы и Командное с командами отладчика. Существует так же Applicatioп окно. В него можно переходить, чтобы видеть результаты работы отлаживаемой программы.



Отладчик предоставляет такие возможности:


Переходить между Командным, Source и Application окнами. Вести в них поиск по шаблону. Находясь в Командном окне вводить команды ОТЛАДЧИКА. Создавать сокращения для обозначения команд ОТЛАДЧИКА. Переключать режимы вывода на терминал информации. Выходить в операционную систему. Запускать программу на выполнение, прерывать ее выполнение, продолжить выполнение, выполнять по шагам. Сохранять состояние ОТЛАДЧИКА в файле. Выполнять его команды, записанные в файле. Расставлять, включать и выключать точки останова и трассировки. Присваивать значения переменным, вызывать функции. Выводить на экран значения программных переменных, выражений, объявления переменных, имена функций, содержащихся в программе, имена и аргументы функций, активных в данный момент. Ниже приведен формат всех команд отладчика. Жирностью выделены допустимые сокращения команд, не допускающие двусмысленности.



Пара слов про Online версии



9. Пара слов про Online версии 5.0

Делать надо практически все тоже самое, только все команды, называемые в версии 7.0 on* должны называться tb*
И вместо переменной ONCONFIG - переменная TBCONFIG переменная SQLEXEC=$INFORMIXDIR/bin/sqlturbo
И после старта сервера (во время начальной загрузки) нужно отдельно запускать INFORMIX-STAR'овский демон приема сетевых соединений sqlexecd - и значит файл S99informix.sh будет выглядеть так: # Запуск сервера INFORMIX-OnLine 5.0 при начальной загрузке # INFORMIXDIR=/usr/informix TBCONFIG=tbconfig export INFORMIXDIR TBCONFIG $INFORMIXDIR/bin/tbinit $INFORMIXDIR/bin/sqlexecd sqlturbo ######## конец файла ##############


Перехват прерываний.



Перехват прерываний.

WHENEVER { ERROR | WARNING | NOT FOUND } { GOTO [:]label | CALL function-name | CONTINUE | STOP } !!! function-name без () !!!

DEFER INTERRUPT Запретить прерывание программы клавишей ^C

DEFER QUIT Запретить прерывание программы клавишей QUIT Тогда после нажатия QUIT => quit_flag!=0, ^C => int_flag!=0



Переменные Окружения



Переменные Окружения

Для настройки INFORMIX использует переменные окружения. Вы можете изменить любое из допущений, принимаемых INFORMIX по умолчанию, установкой одной или нескольких переменных окружения, распознаваемых INFORMIX.
Например сделать так, чтобы переменные типа MONEY изображались не в формате $149.50, а в формате руб 149.50 коп можно командой DBMONEY='руб . коп' export DBMONEY
DBPATH указывает список директорий где (помимо текущей) INFORMIX ищет базы данных и связанные с ними файлы. DBPATH=/udd/iwanow:/udd/petrow export DBPATH
Заставит искать базы данных не только в текущей директории, но и в директориях Петрова и Иванова DBPATH=//hostname *OnL*
Заставит искать базы данных OnLine на удаленном компьютере.
Обычно же устанавливают переменные конкретно для вашей рабочей станции в файле /etc/profile который автоматически выполняет файл /config/profiles/informix.sh
Примерное содержание файла /config/profiles/informix.sh INFORMIXDIR=/usr/informix export INFORMIXDIR DBPRINT=pp export DBPRINT # программа печати - pp DBEDIT='rk -E' export DBEDIT # пользовательский редактор # DBDATE=DMY4. export DBDATE # формат даты 24.09.1991 # DBMONEY='. руб' export DBMONEY# совковый стандарт денег PATH=$PATH:$INFORMIXDIR/bin export PATH # выполняемые модули SQLEXEC=$INFORMIXDIR/lib/sqlexec export SQLEXEC # сервер - SE TERMCAP=$INFORMIXDIR/etc/termcap export TERMCAP case $TERM in # таблица русификации клавиатуры d460* | d211* | cham | vt* ) KEYBMAP=$INFORMIXDIR/keybmap/dasher # яверты/qwerty # KEYBMAP=$INFORMIXDIR/keybmap/dasherE # qwerty/яверты # KEYBMAP=$INFORMIXDIR/keybmap/dasherD # йцукен/qwerty IBM PC # KEYBMAP=$INFORMIXDIR/keybmap/dasherP # йцукен/qwerty пишмаш export KEYBMAP ;; esac



Подпрограммные Блоки (Функции).



Подпрограммные Блоки (Функции).

В языке 4GL при программировании функций (подпрограмм) используются операторы function. Все аргументы функции должны быть объявлены. Аргументы передаются по значению. Если функция возвращает какие-либо значения, то при вызове ее нужно воспользоваться в операторе CALL предложением RETURNING с перечислением переменных, в которые возвращается значение. Ниже приводится соответствующий фрагмент программы. FUNCTION stroka(rec) DEFINE rec RECORD i int, st char(256) END RECORD RETURN st clipped,"автопробега" END FUNCTION . . . MAIN . . . CALL stroka(rec1.*) RETURNING simw . . . LET simw=stroka(7,"Привет участникам ") # Если функция возвращает одно значение, то ее имя мож- # но использовать в выражениях. MESSAGE simw . . . END MAIN
На экране пользователь увидит: ¬¦¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-- ¬+ Привет участникам автопробега ¬+ ¬+ ¬+ ¬+ ¬+ ¬+ ¬+ ¬¬¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-¬-L



Пояснения



Пояснения

Большинство команд предложат вам с помощью "плоского" меню выбрать модуль или программу, которую будут обрабатывать. Если вы вдруг решили отказаться от выполнения команды, вместо выбора файла нажмите клавишу CTRL-C.

Modifу
Выведет вам "плоское" меню с именами существующих в вашей директории модулей на языке 4GL (файлов с расширением .4gl). С помощью стрелок выберите нужный и нажмите CR. Если нужный вам файл не лежит в текущей директории, можете ввести его маршрутное имя, завершив его клавишей CR. INFORMIX-4GL стартует текстовый редактор и вы сможете исправлять в нем файл с программой. Кончив редактировать файл (а в редакторе RK, которым вы, скорее всего, будете пользоваться, для этого нужно нажать клавиши CTRL-T CTRL-T HOME ErasePage) вы попадете в дополнительное меню MODIFY MODULЕ: Compile Save-and-exit Discard-and-exit

Compile Компилировать исправленный модуль.
Save-and-exit Запомнить внесенные изменения.
Discard-and-exit Отменить внесенные в файл изменения.

Выберите подходящую вам команду (а обычно это Compile и Savе- and-exit) и после этого вы вновь окажетесь в меню MODULE. New
Спросит, как назвать новый модуль. Введите имя модуля (без расширения .4gl). После этого стартуется текстовый редактор RK. Вы увидите сообщение: newname.4gl ? Файл не существует
Нажмите клавиши F5 F11 NewLine и попадете в пустой файл, в котором можете набивать программу. Окончание работы такое же, как и после команды Modify. Compilе
Выведет вам "плоское" меню с именами существующих в вашей директории модулей на языке 4GL. Введите имя или выберите его с помощью стрелок. Вы увидите дополнительное меню: COMPILE MODULE: Object Runable Exit

Object Компилирует до объектного модуля (с расширением .4go)
Runable Компилирует до выполнимого модуля (с расширением .4gi), используйте ее, если ваша программа состоит из одного этого модуля.
Exit Отказ от компиляции, возврат в меню MODULE.

Если при компиляции обнаружились ошибки, INFROMIX-4GL создаст специальный файл modulename.err, в котором прямо в тексте программы будут указаны синтаксические ошибки и предложит вам их исправить.


Пояснения

Modifу
Выведет вам "плоское" меню с именами существующих в вашей директории экранных форм (файлов с расширением .per). С помощью стрелок выберите нужную и нажмите CR. Если нужный вам файл не лежит в текущей директории, можете ввести его маршрутное имя, завершив его клавишей CR. INFORMIX-4GL стартует текстовый редактор и вы сможете исправлять в нем файл с описанием экранной формы. Кончив редактировать файл (а в редакторе RK, которым вы, скорее всего, будете пользоваться, для этого нужно нажать клавиши CTRL-T CTRL-T HOME ErasePage ) вы попадете в дополнительное меню MODIFY FORМ: Compile Save-and-exit Discard-and-exit

Compile Компилировать исправленную форму.
Save-and-exit Запомнить внесенные изменения.
Discard-and-exit Отменить внесенные в файл изменения.

Выберите подходящую вам команду (а обычно это Compile и Savе- and-Exit) и после этого вы окажетесь в меню FORM. Generatе
INFORMIX-4GL предложит выбрать базу данных, таблицы которой будут использоваться при генерации экранной формы.
Спросит, как назвать новую форму. Введите имя формы (без расширения .per). После этого вы должны указать таблицы, со столбцами которых будут ассоциированы поля в экранной форме. Вы выбираете таблицу, затем отвечаете на вопрос дополнительного меню: NEW FORM: Table-selection-complete Select-more-tables Exit

Table-selection-complete Закончить выбор таблиц
Select-more-tables Продолжить выбор таблиц
Exit Отменить генерацию формы

New
Спросит, как назвать новую форму. Введите имя формы (без расширения .per). После этого стартуется текстовый редактор RK. Вы увидите сообщение: new-form-name.per ? файл не существует
Нажмите клавиши F5 F11 NewLine и попадете в пустой файл, в котором можете набивать описание формы. Окончание работы такое же, как и после команды Modify.
Создавать новые экранные формы рекомендуется не командой New, а создав командой Generate стандартную форму, используя ее как заготовку исправьте и дополните ее в команде Modify. Compilе
Выведет вам "плоское" меню с именами существующих в вашей директории форм.



Пояснения

Modifу
INFORMIX-4GL предложит вам выбрать программу, описание состава которой вы желаете исправлять.
После этого вы увидите меню MODIFY PROGRAM, и экранную форму, в которой находится текущее описание программы. Поскольку меню MODIFY PROGRAM и его форма полностью совпадают с NEW PROGRAM, то далее см. пункт 2. New New
Для хранения описаний состава программ INFORMIX-4GL использует специальную базу данных syspgm4gl. Если вы в первый раз приступаете к работе с программами, INFROMIX попросит у вас разрешения эту базу создать. Ответьте yes, не отказывайте ему, иначе не сможете работать дальше.
INFORMIX-4GL запросит имя, которое вы хотите присвоить программе.
В описание программы входят:

имена исходных модулей на 4GL, имена объектных модулей (если вы не имеете исходных), имена файлов с описаниями глобальных переменных, из которых состоит ваша программа, название программы-Runner'а (ее необходимо создавать, если ваша программа использует подпрограммы, написанные на языке Си), и название самой программы.
Вы увидите меню NEW PROGRAM, и экранную форму, в которую вы занесете описание программы. ¬'¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' ¬ NEW PROGRAM: 4GL Globals Other Program_Runner Rename Exit¬  ¬ Еdit the 4GL sources list. ¬  ¬  ¬  ¬ --------------------------------------- Press CTRL-W for Help -¬  ¬  Program [prog12 ] ¬  ¬  Runner [fglgo ] Runner Path [ ] ¬  ¬  Debugger[fgldb ] Debugger Path [ ] ¬  ¬  ¬  ¬  4gl Source 4gl Source Path ¬  ¬  [modul1 ] [/udd/moshkow ] ¬  ¬  [modul2 ] [ ] ¬  ¬  [mod ] [ ] ¬  ¬  [modul3 ] [../infte4gl ] ¬  ¬  [ ] [ ] ¬  ¬  ¬  ¬  Global Source Global Source Path ¬  ¬  [ ] [ ] ¬  ¬  [ ] [ ] ¬  ¬  ¬  ¬  Other .4go Other .4go Path ¬  ¬  [ ] [ ] ¬  ¬  [ ] [ ] ¬  ¬"¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬"



Пример программы, выдающей отчет



Пример программы, выдающей отчет

DATABASE zawod MAIN DEFINE zapisx record like kadry.* DEFINE simw char (200), zapr char (300),fn char (18)

OPEN form maxprim from "maxprim" DISPLAY form maxprim # вывести экранную форму

CONSTRUCT BY NAME simw ON kadry.* # Введение критериев выбора # с экрана LET zapr="select * from kadry where ", simw clipped," order by tabnom "

MESSAGE simw PREPARE selpr FROM zapr # Изготовление запроса DECLARE qquer CURSOR FOR selpr # Объявление курсора для него

DISPLAY "Не забудьте нажать CTRL-O" AT 2,40 PROMPT "Файл, куда выводить отчет? или CR, если на экран: " FOR fn

IF length(fn)=0 then START REPORT kadryrep # на экран else START REPORT kadryrep TO fn # в файл END IF

# выполнить запрос и сбросить выбранные строки в отчет FOREACH qquer into zapisx.* # Очередную строку из курсора OUTPUT TO REPORT kadryrep(zapisx.*) # поместить в отчет END FOREACH FINISH REPORT kadryrep # Вывести результаты отчета END MAIN

REPORT kadryrep(z) DEFINE nameceh like ceh.nameceh DEFINE z record like kadry.* # nomerceh int, # номер цеха # tabnom serial, # табельн. номер # fio char(20), # фамилия # dolvn char(20), # должность # zarplata money(16,2), # зарплата # datarovd date # дата рожд. OUTPUT left margin 0 right margin 80 top margin 0 bottom margin 0 page length 23 ORDER BY z.nomerceh, z.tabnom # Упорядочить

FORMAT PAGE HEADER print "-------------------------------------------------------" print "цех|таб.ном|фио |должность |зарплата| дата рожд" print "_______________________________________________________"

ON EVERY ROW print z.nomerceh using "##", column 4,z.tabnom using "#####", column 13,z.fio clipped, column 28,z.dolvn clipped, column 43,z.zarplata using "$####.##", column 53,z.datarovd using "dd-mm-yyyy"

BEFORE GROUP OF z.nomerceh select @nameceh into nameceh from ceh where nomerceh=z.nomerceh skip to top of page skip 1 line print "Цех ",nameceh skip 1 line


AFTER GROUP OF z.nomerceh need 2 lines print " В цехе ",nameceh clipped,2 spaces, group count(*) using "#####" ," человек, " print " Средняя зарплата ", group avg(z.zarplata) using "##### руб.## коп"
PAGE TRAILER print "заполнена страница номер", pageno pause "нажмите ВВОД"
END REPORT
Вот что увидит на пользователь во время работы программы: +-------------------------------------------------------------+ |Укажите файл, куда выводить отчет, или CR, если на экран: | | Не забудьте нажать CONTROL-О| | | |---------------------------------------------- | | цех [1:4] [ ] | | таб.номер [ ] | | фамилия [*ов ] | | должность [ ] | | зарплата [>500 ] | |дата рождения [ ] | | | | | nomerceh between 1 and 4 and fio matches "*о*" and zarplata>500 | | +-------------------------------------------------------------+
---------------------------------------------------------------------------
цех|таб.ном|фио |должность |зарплата| дата рожд _______________________________________________________________
Цех дирекция
1 34 иванов директор $ 4000.00 1 35 кононов зав. по снабжению$ 4000.00 В цехе дирекция 2 человек, Средняя зарплата 4000 руб.00 коп
заполнена страница номер 1 нажмите ВВОД ---------------------------------------------------------------------------
цех|таб.ном|фио |должность |зарплата| дата рожд _______________________________________________________________
Цех литейный
2 12 окунев рабочий $ 2000.00 2 14 липко лаборант $ 2000.00 2 18 пухов мастер $ 2000.00 2 21 сухов рабочий $ 2000.00 2 24 угольков рабочий $ 2000.00 В цехе литейный 5 человек, Средняя зарплата 2000 руб.00 коп
заполнена страница номер 2 нажмите ВВОД ---------------------------------------------------------------------------
цех|таб.ном|фио |должность |зарплата| дата рожд _______________________________________________________________
Цех гараж
4 9 потруев слесарь $ 1230.00 4 12 гундосов шофер $ 2000.00 В цехе гараж 2 человек, Средняя зарплата 1615 руб.00 коп
заполнена страница номер 3 нажмите ВВОД

Пример простейшей программы



Пример простейшей программы

database zawod MAIN

MENU "Главное меню" command key("w") "Ввод" "Ввод учетных данных" call wwod() command key("p") "Просмотр" "Просмотр таблицы kadry" call prosmotr() command "одиночный просмотр" "Поиск по табельному номеру" call odin_prosmotr() command "Kонец" clear screen exit program end menu

END MAIN

FUNCTION wwod() define c char(1) , zapisx record like kadry.* # -DЭто объявление эквивалентно такому:-E # DEFINE zapisx RECORD # nomerceh INT, # номер цеха # tabnom INT, # табельный номер # fio CHAR(20), # фамилия # dolvn CHAR(20), # должность # zarplata MONEY(16,2), # зарплата # datarovd DATE # дата рождения # END RECORD

OPEN WINDOW wwod AT 4,20 WITH FORM "kadry" attribute(border) MESSAGE "Введите учетные данные, и нажмите ESC" attribute (reverse) let c="Y"

WHILE c NOT MATCHES "[nNНн]" or c is NULL # В цикле INPUT by name zapisx.* # -DВвести данные через экранную форму-E DISPLAY "Принято" AT 1 , 1

let zapisx.tabnom=0 INSERT INTO kadry values (zapisx.*) # -DВставить строку в таблицу kadry-E display SQLCA.SQLERRD[2] to tabnom# -DКакой номер получил serial столбец ?-E prompt "Принято. Вводить следующего (Да/Нет)?" for char c END WHILE

CLOSE WINDOW WWOD # -DЛиквидируем окошко-E END FUNCTION

FUNCTION prosmotr() define zapisx record like kadry.* , c char

open window prosmotr at 4,34 with form "kadry" attribute(border) declare prosmotr cursor for select * from kadry order by nomerceh, tabnom FOREACH prosmotr INTO zapisx.* # -DВ цикле для каждой строки-E DISPLAY BY NAME zapisx.* # -DВывели ее на экран-E prompt "Показывать следующего (Да/Нет)? " for char c IF c matches "[НнNn]" then exit foreach END IF # -DЕсли Нет то конец -E END foreach close window prosmotr # -DЛиквидируем окошко-E END FUNCTION

FUNCTION odin_prosmotr() define zapisx record like kadry.* , nomer int

open window odin_prosmotr at 4,4 with form "kadry" attribute(border) WHILE 1=1 # -DВ цикле-E prompt "Какой табельный номер показать: " attribute (reverse) for nomer attribute (underline) IF nomer IS NULL THEN exit while END IF # -DЕсли не ввел то конец-E

SELECT * INTO zapisx.* FROM kadry WHERE nomer=tabnom # -DЧитаем строчку-E if status = NOTFOUND then error "Нет таких" attribute (reverse) # -DЕсли не нашлось то-E continue while # -Dперейти на начало цикла-E end if

DISPLAY BY NAME zapisx.* # -DВывести ее на экран-E END WHILE close window odin_prosmotr # -DЛиквидируем окошко-E END FUNCTION



ы Использования Программных Операторов.



Примеры Использования Программных Операторов.

Оператор безусловного перехода действует в пределах модуля. GOTO metka . . . LABEL metka: . . .
Оператор выбора. CASE WHEN iscreen=1 current window is w1 WHEN iscreen=2 current window is w2 let iscreen=1 OTHERWISE current window is SCREEN END CASE

CASE (a+b) # Другой формат оператора CASE WHEN 1 message "a=",a WHEN 2 message "b=",b END CASE
Условный оператор. IF str = "завершить" OR y<0 THEN exit program # Не забывайте в конце каждого условного # оператора ставить END IF. END IF
Оператор цикла. FOR I= i1 TO 23 let a[i]=0 if b[i]=100 then EXIT FOR END IF END FOR
Цикл "пока". WHILE ff > 3 or nn="проба" PROMPT "Введите число " for n let i=n+1 message "А у меня ",i,", больше. Вы проиграли." SLEEP 5 RUN "rm *" WITHOUT WAITING END WHILE



Присвоения.



Присвоения.

INITIALIZE список переменных {LIKE column-list | TO NULL} присвоить переменным NULL или DEFAULT значения

LET переменная = выражение



Продукты INFORMIX для Обработки Баз Данных.



Продукты INFORMIX для Обработки Баз Данных.

Программное обеспечение INFORMIX содержит следующие компоненты:

Серверы Базы Данных:

INFORMIX-SE.
Сервер для многопользовательских баз данных INFORMIX, на нижнем уровне обеспечивающий работу всех программ, обращающихся к базам данных INFORMIX.

INFORMIX-NET.
Сетевое дополнение к INFORMIX-SE. Превращает его в сервер удаленных баз данных. Работает поверх сетевого протокола TCP/IP.

INFORMIX-OnLine.
Современный OLTP (On-Line-Transaction-Processing) базис баз данных. В отличие от SE взял физическое хранение данных в свои руки, отнимает у операционной системы логический раздел(ы) диска и самостоятельно работает с ними на низком уровне. В 2-4 раза быстрее SE, однако более сложен в настройке на конкретный компьютер, требует от администратора OnLine базы данных хороших познаний в операционной системе. Имеет много дополнительных возможностей по сравнению с SE, в том числе хранение таких типов данных как Binary Large Objects, текстовых и байтовых, а также символьных строк переменной длины как полей в базе данных, разделяемую буферизацию данных, буферизацию транзакций, зеркальный диск, автоматическое восстановление после системных сбоев, автоматический backup.

INFORMIX-STAR.
Сетевое дополнение к INFORMIX-OnLine. Превращает его в сервер распределенной базы данных. Разрешает одновременный доступ к данным нескольких INFORMIX-STAR систем. Работает поверх протокола TCP/IP. Естественно, в MS-DOSе отсутствует.

Диалоговая Система Поддержки и Администрирования Баз Данных для Подготовленных Пользователей.

INFORMIX-SQL.
Система управления и поддержки баз данных. Содержит 5 компонент:

интерпретатор языка SQL. экранные формы для просмотра и изменения таблиц базы данных. генератор отчетов. организация пользовательских меню. диалоговое описание структуры таблиц.

Инструментальные Средства Разработки Пользовательских Приложений.

INFORMIX-4GL.
Основное инструментальное средство для программирования баз данных и создания пользовательских приложений на языке 4GL.
Wingz.
Электронная таблица с трехмерной графикой для обработки данных большого объема (32.768 строк и столько же столбцов, до биллиона элементов). Таблица дополнена возможностями 140 встроенных функций на все случаи жизни и собственным языком HiperScript для написания прикладных программ. Может выполнять как стандартные операции над базами данных, так и строить объемные цветные иллюстрации достижений вашей деятельности. Возможно вращение и движение по графическому изображению, использование данных из баз данных INFORMIX. Позволяет в рабочей области, на одной странице разместить тексты, числа, графы и графические изображения. SmartWareII.
Интегрированная система, объединяющая базу данных, электронную таблицу с деловой графикой, текстовый процессор и сетевые возможности. Имеется собственный язык для создания пользовательских программ. Используется язык QBE для доступа к базе данных. В создании отчетов могут участвовать до 100 файлов. Текстовый процессор имеет словарь синонимов и может выполнять орфографическую проверку написания 140.000 слов, конвертирует файлы из других редакторов. Работает в операционных системах UNIX и DOS. Могут использоваться данные из баз данных INFORMIX-SQL.

Прочее.

INFORMIX-QuickStep.
Интерактивный генератор отчетов. Позволяет создавать отчет без программирования, используя систему выпадающих меню. На выходе получается отчет, а также генерится программа на 4GL, этот отчет производящая. INFORMIX-FORMS.
Генератор экранных форм и программного 4GL кода для работы с ними. Для INFORMIX-4GL. INFORMIX-Menu.
Позволяет сгенерить систему меню, объединяющую прикладные программы на уровне вызова выполнимых модулей и Shell-процедур. INFORMIX-Optical.
Пакет обеспечивает создание и работу с информационно поисковыми системами, использующими INFORMIX-Online (и его возможности по хранению изображений, звуков, и т.п. BLOBов) в качестве средства хранения, индексирования и доступа к данным, "зашиваемым" на перезаписываемых оптических WORM дисках (Write Once Read Many).



Новое поколение - графические средства разработки.

INFORMIX-GX.
Графический интерпретатор псевдокода, получаемого в результате быстрой компиляции 4GL-программ. Выполняет псевдо-код не в алфавитно-цифровом режиме, а в графическом окошке - клиенте MS-Windows 3.1 или X-Window OSF/Motif. Позволяет понизить скорость перерисовки экрана прикладной программы на SPARC-станции до уровня алфавитно-цифрового терминала. Для INFORMIX-4GL Compiler поставляется в виде библиотеки, замещающей стандартные функции библиотеки curses для рисования на АЦТ. INFORMIX-4GL for Windows.
Старый знакомый 4GL версии 4.12, только в среде MS Windows. Включает компилятор 4GL и среду-оболочку для программиста со стандартным для MS-Windows мышино-оконным интерфейсом. INFORMIX-NET/PC.
Позволяет клиентским приложениям на PC обращаться к удаленным базам данных, расположенных на Unix серверах: умеет обращаться как к SE+NET, так и к OnLine+Star. В пакеты INFORMIX for MS Windows (Hyperscript, 4GL, NewEra) включается по умолчанию. INFORMIX-HyperScript.
Система, не имеющая ничего общего с линией SQL продуктов фирмы INFORMIX. Это система для организации доступа к разнообразным данным (графическим, текстовым, мультимедиа) в виде гипертекста. Имеет собственный язык для описания/программирования приложений. Имеет графический генератор диалогов (наподобие Visual Basic). Есть версии для Unix/X-Windows, NeXT, MS/Windows, Macintosh. Является естественным развитием-продолжением пакета Wingz. Wingz включен как подмножество HyperScript INFORMIX-ViewPoint/DBA.
Нечто вроде ISQL для MS Windows. Экранные (пардон, графические) формы для работы с базой данных INFORMIX. С естественными для графических приложений прибамбасами (шрифты, картинки, мышка.) Генератор отчетов. Средство гля генерации-разработки этих самых форм. DBA - дополнительный пакет администратора базы данных, необходимый для работы ViewPoint, DBA используется, чтобы создать так называемое SuperView - этакая единая квази-таблица -структура, описывающая логику и взаимоотношения таблиц и полей базы данных.ViewPoint нужно по одному на каждого пользователя, а DBA необходимо и достаточно одного на всю локальную сеть. INFORMIX-NewEra.
Условное название - INFORMIX-4GL++. Объектно-ориентированный язык программирования. Позволяет программировать графические прикладные интерфейсы для баз данных INFORMIX. Частично совместим с 4GL (кроме операторов экранного обмена). Наконец-то INFORMIX сделал шаг в сторону разработчиков графических приложений. Имеются версии для Motif X-Windows и для MS-Windows.






Программирование Экранного Обмена.



Программирование Экранного Обмена.

В любой момент времени на экране терминала существует ТЕКУЩЕЕ окно, через которое и выполняется ввод/вывод вашей программы. С окном связаны используемые при вводе и выводе атрибуты (например, green, revers, underline и т.п.) и номера строк окна, используемых операторами MESSAGE, PROMPT и ERROR для вывода.
При открытии нового окна оно становится текущим и и весь ввод/вывод будет направляться уже в него.
В окно можно вывести экранную форму, которая, представляет собой набор экранных полей, имеющих имена, и в эти поля (из этих полей), обращаясь к ним по имени, можно выводить (вводить) данные с помощью оператора DISPLAY (INPUT). Экранные поля можно объединять в экранные записи. Описание экранных полей и самой формы располагается отдельно от программы в файле описания экранной формы.
Ниже приведен пример программы, иллюстрирующий работу с окнами. OPEN WINDOW wind1 AT 2,30 WITH 10 ROWS, 40 COLUMNS ATTRIBUTE(BORDER, REVERSE, MESSAGE LINE FIRST) # текущим окном является wind1

. . . OPEN WINDOW wind2 AT 5,15 WITH FORM "schoolp" ATTRIBUTE(GREEN,PROMPT LINE LAST, MESSAGE LINE LAST, FORM LINE FIRST) # текущим окном является wind2

CLEAR WINDOW wind1 . . .

CURRENT WINDOW IS wind1 # текущим окном является wind1

OPEN FORM form1 from "schoolp" # Инициализировать форму form1 # Взяв ее описание из файла # schoolp.frm DISPLAY FORM form1 # Вывести форму form1 в текущее окно # т.е. в wind1


В результате работы этих операторов на экране терминала появится приблизительно такая картинка: ¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' ¬ ¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' окно ¬  ¬  ¬  значение равно 8 ¬  ...¬wind1 ¬  ¬  ¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬' ¬  ¬  цех [ 2] [литейный ] ¬  ¬ ¬щ¬-¬L ¬  ¬  ¬  таб.номер [26 ] ¬  ¬  окно ¬  ¬  ¬  фамилия [Петров У.Е. ] ¬  ¬  ...¬ wind2 ¬  ¬  ¬  должность [бригадир ] ¬  ¬  ¬+ ¬  ¬  ¬  зарплата [$340 ] ¬ ¬щ¬-¬-¬-¬-¬-¬-¬-¬-¬L¬  ¬  ¬  дата рождения [31.12.1952] ¬  ¬  ¬  ¬  ¬  ¬  ¬  ¬  ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬" ¬  ¬  789 ¬  ¬  ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬" ¬  ¬  ¬  нет таких ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬"



Программные операторы.



Программные операторы.

CALL function([список аргументов]) [RETURNING список переменных] ! ! ! передача по значению

CASE CASE (выражение) WHEN логич.выраж. WHEN выраж1 . . . или . . . [EXIT CASE] [EXIT CASE] . . . . . . WHEN логич.выраж. WHEN выраж2 . . . . . . [OTHERWISE] [OTHERWISE] . . . . . . END CASE END CASE

IF логическое выражение THEN . . . [ELSE . . . ] END IF не забывайте закрывать все операторы IF !!!

FOR I= i1 TO i2 [STEP i3] statement . . . [CONTINUE FOR] . . . [EXIT FOR] . . . END FOR

CONTINUE { FOR | FOREACH | MENU | WHILE } EXIT { CASE | WHILE | FOR | FOREACH | MENU | INPUT | DISPLAY | PROGRAM[(status code for UNIX)] }

WHILE логическое выражение операторы . . . . . . [CONTINUE WHILE] . . . [EXIT WHILE] . . . END WHILE

GOTO [:] метка Двоеточие ':' для совместимости с ANSI стандартом LABEL метка: Действует только внутри блока

RUN {"командная строка UNIX"|char-variable} [RETURNING int-variable | WITHOUT WAITING]

SLEEP целое-выраж. Подождать n секунд



Простые операторы вывода на экран.



Простые операторы вывода на экран.

MESSAGE список переменных, констант [ATTRIBUTE(список атрибутов)]

ERROR список переменных, констант [ATTRIBUTE(список атрибутов)] по умолчанию REVERSE

PROMPT список переменных и констатнт [ATTRIBUTE(аттрибуты вывода)] FOR [CHAR] variable [HELP help-number] # Ввести значение в variable [ATTRIBUTE(аттрибуты ввода)] # FOR CHAR - ввести один символ [ON KEY (key-list) statement атрибуты: NORMAL REVERSE . . . BOLD UNDERLINE . . . DIM BLINK END PROMPT] INVISIBLE в ON KEY пункте нельзя напрямую пользоваться операторами PROMPT, INPUT.Для их вызова применяйте функции.



Расширения файлов, применяемые в INFORMIХ.



Расширения файлов, применяемые в INFORMIХ.

file.err листинг с ошибками компиляции программы, формы или отчета.
table.unl данные из таблицы в упакованном ascii формате.
database.dbs база данных (директория, содержащая файлы с таблицами, с файлами индексов, и системными каталогами. В директории базы данных лежат:
table.dat собственно данные таблицы.
table.idx файл с индексами таблицы.



Расширения файлов в INFORMIX-4GL.



Расширения файлов в INFORMIX-4GL.

file.4gl исходный модуль на языке 4GL.
form.per файл с описанием экранной формы 4GL.
form.frm откомпилированное описание экранной формы 4GL.
helptext.msg файл с сообщениями.
helptext.iem откомпилированный утилитой файл с сообщениями.
syspgm4gl.dbs база для хранения описания состава программ для оболочки INFORMIX-4GL
file.4gp файл с описанием состава программы для среды РК
file.4bl backup копия исходника на 4gl
form.pbr backup копия описания экранной формы

Если MODIFY не запускается, то rm *.4bl *.pbr



Расширения файлов в INFORMIX-4GL-InteractiveDebugger.

file.4db файл с командами Отладчика.



Расширения файлов в INFORMIX-4GL-Compiler.



Расширения файлов в INFORMIX-4GL-Compiler.

file.ec Си+SQL (esql). 1-й этап компиляции.
file.c Си-код. 2-й этап компиляции.
file.o объектный модуль. 3-й этап компиляции.
program.4ge загрузочный (выполнимый) модуль.



Расширения файлов в INFORMIX-4GL-RDS.



Расширения файлов в INFORMIX-4GL-RDS.

file.4go откомпилированный "объектный" модуль 4GL-RDS.
program.4gi "выполнимый" модуль 4GL-RDS.
program.4gp список файлов, составляющих программу. Для RK



Расширения файлов в INFORMIX-SQL.



Расширения файлов в INFORMIX-SQL.

file.sql исходный модуль на языке SQL.
form.per файл с описанием экранной формы SQL.
form.frm откомпилированное описание экранной формы SQL.
report.ace файл с форматами печати (отчет).
report.arc откомпилированный отчет.



Система меню в INFORMIX.


Управляющие клавиши при вводе/выводе в INFORMIХ.

ESС Закончить редактирование полей Accept kеу
CTRL-С Прерывание, Отменить ввод Interrupt kеу
CR Ввод, Перевод(Вставка) строки, перейти в следующее поле
CTRL-R Перерисовать экран
CTRL-А Режим вставка/замена
NL,<стрелка> Двигаться, перейти в следующее поле
CTRL-Н Назад, забой
CTRL-D Стереть конец строки от курсора
CTRL-Х Уничтожить символ (работает в режиме d211-tansi)
CTRL-W Вызов HELP текста (работает в режиме d211-tansi)
CTRL-N Русский алфавит
CTRL-О English alphabet



Система меню в INFORMIX. Вы можете


Линейное меню:¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦ ¬ INFORMIX-4GL: Program Module Query-language Exit ... ¬  ¬  Сreate, modify, or run individual 4GL program modules. ¬  ¬  ¬  ¬  ----------------------------------- Press CTRL-W for Help ---¬  ¬  ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦



Системная экранная форма.


Линейное меню:¬'¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦ ¬  INFORMIX-4GL: Program Module Query-language Exit ... ¬  ¬  Сreate, modify, or run individual 4GL program modules. ¬  ¬  ¬  ¬  ----------------------------------- Press CTRL-W for Help ---¬  ¬  ¬  ¬"¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦¬¦



Системные переменные:



Системные переменные:

Устанавливаются после любого оператора 4GL status { 0 | NOTFOUND | <0 } код завершения оператора quit_flag ( не 0 если было нажато QUIT ) int_flag ( не 0 если было нажато ^C )

define SQLCA record # системная запись с кодами завершения SQLCODE integer, =status SQLERRM char(71), -- SQLERRP char(8), -- SQLERRD array[8] of int,...Lсм. SQLAWARN char(8) warning или пробел end record SQLERRD[1] зарезервирован SQLERRD[2] serial значение или ISAM error cod SQLERRD[3] число обработанных строк SQLERRD[4] CPU cost запроса SQLERRD[5] offset of error into SQL-st SQLERRD[6] ROWID of last row SQLERRD[7] зарезервирован SQLERRD[8] зарезервирован



Скопировать ONCONFIG



6. Скопировать ONCONFIG

Примерный файл с образцом конфигурации лежит в $INFORMIXDIR/etc/onconfig.std . Копируем его в файл onconfig и редактируем обычным текстовым редактором. cp etc/onconfig.std etc/onconfig vi etc/onconfig



Соглашения о Языке 4GL и Начальные Понятия.



Соглашения о Языке 4GL и Начальные Понятия.

Программа на языке 4GL может состоять из нескольких файлов (модулей) с исходными текстами на 4GL. К ней так же относятся файлы с описанием используемых экранных форм, которые компилируются отдельно. Имя каждого модуля должно иметь расширение .4gl (например, module1.4gl), а имя файла с описанием экранных форм должно иметь расширение .per (например, form2.per).
Каждый модуль содержит описания переменных и несколько процедурных блоков function (подпрограммы) и report (блоки печати). В программе должен быть один блок main - главный блок, начинающийся с ключевого слова main. На него будет передаваться управление при старте программы.
Формат записи операторов 4GL свободный. Можно писать все подряд на одной строке, один оператор на нескольких строках, слова операторов можно разделять произвольным количеством пробелов и комментариев. Никакими значками (типа ;) операторы разделять не нужно. Окончание операторов определяется по контексту.
Весь набор ключевых слов языка зарезервирован, их нельзя занимать для других целей (на имена объектов и переменных 4GL).
Компилятору языка безразлично, большими или маленькими буквами пишутся операторы. Он их не различает.

Комментарии обозначаются знаками { комментарий }, или знаком # - до конца строки, или знаком -- (два знака минус) до конца строки.



Соглашения о языке SQL и начальные понятия



Соглашения о языке SQL и начальные понятия

Программа, написанная на 4GL использует предписания языка SQL (Структурного Языка Запросов) для манипуляций с базой данных.
Формат записи операторов SQL свободный. Можно писать все подряд на одной строке, один оператор на нескольких строках, слова операторов можно разделять произвольным количеством пробелов и комментариев. Никакими значками (типа ;) операторы разделять не нужно. Окончание операторов определяется по контексту.
Примечание: если вы записываете предписания SQL не в программе 4GL а в среде INFORMIX-SQL, то разделять операторы точкой с запятой (;) необходимо.

Весь набор ключевых слов языка SQL зарезервирован, их нельзя занимать для других целей (на имена объектов и переменных SQL и 4GL).
Компилятору языка безразлично, большими или маленькими буквами пишутся операторы. Он их не различает.
Комментарии обозначаются знаками { комментарий }, или знаком -- (два знака минус) до конца строки.



Создаем Chunk'и - файлы или row devices



4. Создаем Chunk'и - файлы или row devices

> /usr/informix/chunk1 chown informix /usr/informix/chunk1 chgrp informix /usr/informix/chunk1 chmod 664 /usr/informix/chunk1



SQL - Структурный Язык Запросов.



SQL - Структурный Язык Запросов.

ANSI (American National Standart Institute) разработал Структурный Язык Запросов (SQL) - Structured Query Language для определения, манипуляции и контролирования данных. Содержит 4 группы операторов.
В SQL выделяются следующие группы операторов:

Операторы описания данных: CREATE, DROP, ALTER Операторы манипуляции данными: INSERT, DELETE, SELECT, UPDATE Операторы задания прав доступа: GRANT / REVOKE , LOCK / UNLOCK , SET LOCK MODE Операторы защиты и восстановления данных, и прочие: Transaction, Audit trail, Logfile



Sqlconv - Конвертация старой базы в современную



9. sqlconv - Конвертация старой базы в современную

Генерит программу на SQL или 4GL, преобразующую не-SQL созданную INFORMIX-базу данных старой версии в SQL-совместимую базу данных новой версии INFORMIX. sqlconv [-4gl][-esql] databasename -4gl выходной файл будет программой на 4GL. -esql выходной файл будет программой на ESQL/C. если флаги не заданы, то результат будет файлом с командами SQL



Типы данных и выражения над переменными.



Типы данных и выражения над переменными.

INTEGER SERIAL[(n0)] CHAR(n) DATE SMALLINT DECIMAL(m,n) DATETIME qualif1 TO qualif2 REAL MONEY(m,n) INTERVAL qualif1 TO qualif2 FLOAT RECORD ARRAY [i,j,k] OF datatype где qualif \in {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}
Операции числовые: ** * / mod + - ( )
Все аргументы, в том числе CHAR, преобразуются к типу DECIMAL
Внимание: -7 mod 3 = -1
Внимание: mod и ** нельзя использовать в операторе SELECT
Можно пользоваться встроенными функциями 4GL (см. "Функции 4GL") и функциями на языке Си.



Типы Переменных и Операторы Описания Переменных в 4GL.



Типы Переменных и Операторы Описания Переменных в 4GL.

В языке 4GL имеются простые переменные, переменные типа запись и массивы. Простые переменные бывают следующих типов: INTEGER CHAR(n) DATE SMALLINT DECIMAL(m,n) DATETIME ед_врем1 TO ед_врем2 REAL MONEY(m,n) INTERVAL ед_врем1 TO ед_врем2 FLOAT
где ед_врем1, ед_врем2 - единицы измерения времени {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}
где FLOAT = DOUBLE PRECISSION
Переменная типа запись описывается при помощи конструкции RECORD ... END RECORD или конструкции LIKE имя_таблицы.*
Переменная типа массив имеет описатель ARRAY [i,j,k] OF type, где type - тип простой переменной, конструкция RECORD, или конструкция ARRAY.
Для описания переменных служит оператор DEFINE: DEFINE simw char (200), j,i,k INTEGER, ff FLOAT # Здесь объявлены символьная переменная simw длиной 200 байт, # целые i,j,k, и ff - восьмибайтовое с плавающей точкой

DATABASE zawod DEFINE doljno RECORD # объявляется запись doljno, состоящая из 4 простых переменных dolzn CHAR(20), # должность zarplmin LIKE kadry.zarplata, zarplmax money(16,2), # зарплата vakansii int # вакансии END RECORD # Здесь заканчивается объявление записи doljno # Переменную можно оъявить с ключевым словом LIKE column_name. # переменная zarplmin получает такой же тип, что и столбец # zarplata таблицы kadry из базы данных zawod

DEFINE rrr RECORD LIKE kadry.* # Переменную типа запись тоже можно объявить с ключевым словом # LIKE. Здесь объявлена запись rrr, содержащая элементы, имею- # щие те же самые названия и те же самые типы что и столбцы # таблицы kadry
Элементами записи могут быть массивы. Можно обьявить массив элементов типа RECORD. DEFINE zap RECORD a LIKE kadry.tabnom, b array[8] OF REAL END RECORD,

massiw ARRAY[2,15] OF RECORD kolwo INT, tip CHAR(8) END RECORD # massiw объявлен как массив записей. Каждая запись состоит # из двух простых элементов - kolwo и tip
Индексы массивов пишутся в квадратных скобках. На элементы записей можно ссылаться по его имени, если не допускается двусмысленности, иначе их необходимо уточнять именем записи, отделяя его точкой (.) от простого имени. # присвоить значение элементу массива можно так: LET massiw[1,i+2].kolwo = zap.a + LENGTH(massiw[1,i+2].tip)
Для сокращения перечисления элементов в списках можно пользоваться нотацией (*). Например, strkt.* означает все элементы записи strkt. А так же нотацией THRU: (элементы записи от и до) SELECT kadry.* INTO strkt.* FROM kadry WHERE kadry.tabnom=i+j

SELECT * INTO strukt.b THRU strkt.e FROM kadry
Глобальные переменные должны иметь одинаковые объявления GLOBALS во всех модулях программы (в которых используются). Проще всего это организуется так: заводится отдельный модуль, в котором ничего, кроме объявлений GLOBALS нет. А во всех остальных модулях программы ссылаются на этот файл. Ниже приводится пример объявления глобальных переменных в файле progrglob.4gl: DATABASE zawod GLOBALS DEFINE zap RECORD LIKE kadry.* DEFINE ext_count INT . . . END GLOBALS
Тогда в остальные модули программы, где используются эти глобальные переменные, надо включить строчку GLOBALS "progrglob" . . .



Upscol - Устанавливает атрибуты по умолчанию



7. upscol - Устанавливает атрибуты по умолчанию

Дает возможность установить атрибуты по умолчанию для экранных полей экранной формы, связанных со столбцами базы данных. А так же установить значения по умолчанию для инициализации программных переменных и экранных полей, связанных со столбцами базы данных. Работает в диалоговом режиме с использованием экранных форм. upscol



Установить переменные окружения



1. Установить переменные окружения

INFORMIXDIR=/usr/informix # необязательно ONCONFIG=onconfig # необязательно INFORMIXTERM=termcap # желательно (или terminfo, # но тогда цветов не будет) TERMCAP=$INFORMIXDIR/etc/termcap PATH=$PATH:$INFORMIXDIR/bin INFORMIXSERVER=online # your_online_system

# только если версия 7. а 4GL версии 4.12 SQLEXEC=sqlrm # если версия 5 to SQLEXEC=$INFORMIXDIR/bin/sqlturbo

export INFORMIXDIR ONCONFIG INFORMIXTERM TERMCAP PATH export INFORMIXSERVER SQLEXEC



Утилиты INFORMIX.


bcheck проверяет и восстанавливает индексные файлы.
dbload перекачивает данные из ASCII формата в базы INFORMIX
dbexport сбросить данные из базы данных в ASCII файлы.
dbimport создать базу данных из определенных ASCII файлов.
dbschema по таблице восстанавливает операторы SQL ее создающие.
dbupdate преобразует базу данных SQL 1.0 в базу данных SQL 2.0
mkmessage компилирует файлы с сообщениями.
sqlconv преобразует INFORMIX-базу в SQL-совместимую базу.
upscol устанавливает атрибуты и начальные значения по умолчанию у программных переменных и полей экранных форм, связанных со столбцами.
dblog содержание INFORMIX-SE или C-ISAM log файла.



Вписать информиксовский порт в /etc/service



2. Вписать информиксовский порт в /etc/service

Решить на каком порту сервер будет ожидать соединения и как мы этот порт назовем. Например на 1521 под именем sqlturbo. В файл /etc/services вписываем строчку sqlturbo 1521/tcp # INFORMIX-OnLine connect port



Встроенные функции 4GL. Не включать в SQL операторы.



Встроенные функции 4GL. Не включать в SQL операторы.

arg_val (n) n-й аргумент из командной строки num_args () кол-во аргументов в командной строке

infield (field-name) истина если курсор находится в поле (DISPLAY/INPUT) CALL set_count(n) сообщить 4GLю кол-во заполненных строк в массиве перед оператором DISPLAY ARRAY arr_curr() No. текущей строки массива (INPUT/DISPLAY ARRAY) scr_liпе () No. текущей строки экранного массива (INPUT/DISPLAY ARRAY) arr_count () кол-во заполненных строк в массиве (INPUT ARRAY)

err_get (status) 4GL сообщение об ошибке ¦ status CALL err_print(nn) вывести 4GL сообщение об ошибке ¦ nn CALL err_quit (nn) вывести 4GL сообщение об ошибке и кончить CALL showhelр (n) вывести 4GL help-menu и help-сообщение

CALL startlog("filename") открыть errorlog файл CALL errorlog (строка) добавить сообщение в errorlog

downshift (строка) не длиннее 512 upshift (строка)

ASCII n Преобразует число n в символ ASCII строка CLIPPED Гасит пробелы в конце строки COLUMN n Добавить пробелов, чтоб оказаться на n-ом столбце экрана

expr USING "format" Задает формат для number, MONEY, DATE выражений элементы формата чисел: *?<,.-+()$ * Заменять пробелы на * . позиция десятичной точки & Заменять пробелы на 0 - позиции знака "-" # ничего не менять + позиции знаков "+","-" < левоустановить число (((...) отрицательное число в скобки. , литерал "," $ литерал "$" элементы формата дат: dd,ddd,mм,mmм,yу,yyyу и литералы /-.() и др.

Эти функции можно использовать в операторе SELEСТ: SITENAME имя сервера(или hostname) *OnL* LENGTН (строка) длина без заканчивающих пробелов USER login-name текущего пользователя TODAY текущая дата в системном формате CURRENТ [first TО last] текущее DATETIME где first,last из {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}

Преобразование дат и времени: TIМЕ текущее время в виде "hh:mm:ss" DАТЕ текущая дата в виде "Mon Apr 1 1991" EXTEND (datetime-value [first TО last]) преобразует к DATETIME expr UNITS qualifier Возвращает INTERVAL значение=expr*qualifier где qualifier ¬ {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)} DАТЕ ([char] expr) преобразует к типу DATE MDY (nDAY, nMONTH, nYEAR) преобразует к типу DATE

DAY (дата ) выделяет номер дня в месяце из даты WEEKDAY (дата) выделяет номер дня в неделе ! Здесь дата MONTН (дата) выделяет номер месяца ! типа DATE YEAR (дата) выделяет год ! или DATETIМЕ

Встроенные агрегатные функции оператора SELEСТ. COUNТ (*) COUNТ ( DISTINCT column-name ) количество SUМ ( [DISTINCT] column-name ) AVG ( [DISTINCT] column-name ) среднее значение MIN ( [DISTINCT] column-name ) MAХ ( [DISTINCT] column-name )



Ввод/вывод через экранные формы.



Ввод/вывод через экранные формы.

Вывести в форму DISPLAY { BY NAME список переменных | список переменных TO {список полей|screen-record[[n]].*}[,..] | список переменных AT row, column } [ATTRIBUTE(список атрибутов)]

[Не стирать значений из формы перед вводом] INPUT { BY NAME список переменных [WITHOUT DEFAULTS] | список переменных [WITHOUT DEFAULTS] FROM {список полей | screen-record[[n]].*}[,...]} [ATTRIBUTE(список атрибутов)] [HELP help-number] [ { BEFORE FIELD подсписок полей по клавише ESC | AFTER { FIELD подсписок полей | INPUT } | ON KEY (key-list) } statement . . . [NEXT FIELD field-name] [EXIT INPUT] statement . . . . . . END INPUT ]

конструирует WHERE условие для QUERY BY EXAMPLE CONSTRUCT {BY NAME char-variable ON column-list | char-variable ON column-list FROM {список полей | screen-record[[n]].*}[,...]} [ATTRIBUTE(список атрибутов)]
В полях могут использоваться служебные символы:

символ: пример: назначение:
* *X произвольная строка
? X? произвольный символ
| abc|cdef или
>,<, >=,<=,<> >X
: X:YW промежуток
.. Date..Date промежуток между датами
call set_count(кол-во выводимых строк) в программном массиве DISPLAY ARRAY record-array TO screen-array.* [ATTRIBUTE(список атрибутов)] [ ON KEY (key-list) . . . [EXIT DISPLAY] . . . END DISPLAY ] | [END DISPLAY]

SCROLL {field-list | screen-record.*} [,...} Прокрутить строки {UP | DOWN} [BY int] в экранном массиве

call set_count(кол-во выводимых строк) в программном массиве INPUT ARRAY record-array [WITHOUT DEFAULTS] FROM screen-array.* [HELP help-number] [ATTRIBUTE(атр.)] [{BEFORE {ROW | INSERT | DELETE | FIELD подсписок полей}[,...] | AFTER {ROW|INSERT|DELETE|FIELD подсписок полей |INPUT}[,...] | ON KEY (key-list) } statement ... [NEXT FIELD field-name] statement... [EXIT INPUT] . . . . . . END INPUT ]
Внутри оператора DISPLAY ARRAY можно пользоваться функциями: arr_curr() номер текущей строки прогр. массива arr_count() число заполненных строки прогр. массива scr_line() номер текущей строки экр. массива CALL showhelp(helpnumber) - вывести help



Вводная лекция по INFORMIX. Конспект.



Вводная лекция по INFORMIX. Конспект.

Для начала несколько определений, которые, впрочем, всем известны и ничего не определяют. Понятие "Система Управления Базами Данных" (СУБД), она же DBMS (DataBase Managment System) может означать, по большому счету, все что угодно.
В самом общем случае это собственно база данных, которая предполагает какой либо метод сохранения информации на диске и возможности доступа и манипуляции с нею, и набор программных продуктов, предоставляющий пользователю все допустимые в базе средства работы с данными.
Набор программных средств манипуляции данными СУБД удовлетворяет свойствам полноты (консистентности). Полагаю, что коммерческие варианты СУБД стремятся быть еще и замкнутыми, т.е. самодостаточными, не требующими и не поддающимися расширению.



Выражения над датами:



Выражения над датами:

time + interval = time time - time = interval



Заполняем файл $INFORMIXDIR/etc/sqlhosts



3. Заполняем файл $INFORMIXDIR/etc/sqlhosts

Предположим ваш хост называется t01. В файл $INFORMIXDIR/etc/sqlhosts вписываем строчки # любое либо onipcshm см. файл см. файл # либо onsoctcp /etc/hosts /etc/services # либо sesoctcp # # dbname NET-type host port-service-name

online_shm onipcshm t01 sqlturbo online onsoctcp t01 sqlturbo



Запросы на поиск. Соединение таблиц. Внешнее соединение таблиц.



Запросы на поиск. Соединение таблиц. Внешнее соединение таблиц.

Представьте, что вам нужно в таблице "КАДРЫ" хранить данные о личном составе предприятия. О каждом человеке желательно помнить его фамилию, зарплату, пол, и т.д., а также название подразделения, в котором он работает. Но название подразделения длинно, самих подразделений немного, зато строк в таблице "КАДРЫ" много. Для экономии места применяется стандартный реляционный метод: в таблице "КАДРЫ" хранится не само название, а только его короткий код, и создается еще одна таблица, с помощью которой мы будем определять название подразделения по его коду. Табличку эту мы, естественно, назовем "ПОДРАЗДЕЛЕНИЯ", и будет в ней всего два столбца: столбец "КОД" и второй "название подразделения". И вот мы подошли к самому главному, что есть в реляционной базе, к "СОЕДИНЕНИЮ ТАБЛИЦ" по значению столбца (оно же соединение по ключу, по коду). Когда нам потребуются данные о человеке по фамилии Иванов, мы захотим увидеть название подразделения в котором он работает, а не малопонятный код. Значит поиск данных об Иванове нужно вести в двух таблицах. Сперва мы найдем в таблице "КАДРЫ" строчку, в которой в столбце ФАМИЛИЯ стоит значение "Иванов", мы возьмем в этой строчке значение кода подразделения, и будем искать в таблице "ПОДРАЗДЕЛЕНИЯ" строку, со значением в столбце КОД равным коду из строки с Ивановым. А найдя мы соединим данные из строки с Ивановым из первой таблицы и из строки с кодом из второй, получив одну, общую строку.

Индексация

Индекс таблицы - это вспомогательный файл, который создается для того, чтобы ускорить выполнение реляционных операций с участием этой таблицы. Индекс строится для определенного столбца (или совокупности столбцов) таблицы. Он состоит из пар вида {Значение столбца, физический адрес соответствующей строки на диске} и отсортирован по значению столбца в порядке возрастания или убывания. Для одной и той же таблицы может существовать несколько индексов.
Не следует путать индекс, построенный для совокупности нескольких столбцов таблицы, и несколько различных индексов, построенных для отдельных столбцов.
Если индекс создан, то при выполнении операций с таблицей система будет пользоваться им автоматически.
Перечислим коротко ряд рекомендаций по индексации таблиц.

Индексируют те столбцы, по которым наиболее часто производятся операции поиска, сортировки, соединения, группирования. При соединении таблиц полезнее иметь индекс для той из них, которая содержит большее число строк. Индексирование замедляет операции вставки, удаления или изменения строк, поскольку эти операции должны быть выполнены не только над таблицей, но и над ее индексами. Поэтому иногда перед массовым занесением строк в таблицу ее индексы уничтожают, а затем вновь создают.
Индексы бывают уникальные и неуникальные. Если вы создаете уникальный индекс по некоторому столбцу, то система гарантирует, что в данном столбце не будет повторяющихся значений.
Выделяется кластеризованные индексы. При построении таких индексов данные таблицы физически упорядочиваются на диске в соответствии с упорядоченностью строк индекса. Поскольку операционная система поддерживает буферизацию дискового обмена, физически упорядоченные данные оказываются в буферном кэше вместе, можно сказать, "автоматически". Следовательно, скорость обработки запросов возрастает. Для каждой таблицы может существовать только один кластеризованный индекс, что следует из его определения.

Системный Журнал (logfile), он же журнал транзакций.

Запись всех изменений, происходящих в базе данных.
Контрольные точки.
Откатка.
Транзакции.
Оператор начала транзакции.
Оператор нормального завершения транзакции.
Оператор ненормального завершения транзакции - откатка к предыдущей контрольной точке.
Базы данных в режиме ANSI.
Прогон базы данных по системному журналу из backup копии.


Запустить onmonitor и проинициализироваться



7. Запустить onmonitor и проинициализироваться

onmonitor
заходим в меню "Parameters" --> "Initialize" и аккуратненько заполняем все поля разумными значениями. ESC, ESC..., пару раз ответить "Y" - и вот "... check for space...", и "...root dbspace" прочищен, и проинициализирован начисто, и "...recovering..." и наконец "...question mode..."
затем переходим в меню "Mode" --> "OnLine" - все. Сервер запущен.