Формат операторов Informix-4GL
Формат операторов INFORMIX-4GL.
Типы данных и выражения над переменными.
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") и функциями на языке Си.
Операции над строками:
string1,string2 сцепить
string [m,n] подстрока
string CLIPPED усечь пробелы справа
string USING "формат" форматировать
string WORDWRAP переносить длинную строку
Выражения над датами:
time + interval = time
time - time = interval
Логические выражения:
=, != или <>, <=,>=, <,>
NOT , OR, AND
выражение IS [NOT] NULL
по умолчанию "\"
string [NOT] LIKE "шаблон" [ESCAPE "escape-char"]
спецсимволы шаблона % _ означают ¦ §!
string [NOT] MATCHES "шаблон" [ESCAPE "esc-char"]
спецсимволы шаблона * ? [ abH ] [^ d - z ]
означают "много", "один", "любой из", "ни один из"
Системные переменные:
Устанавливаются после любого оператора 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,...„см. 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] зарезервирован
Операторы организации программы.
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
Генерация отчетов.
START REPORT report-name
[TO {file-name | PRINTER | PIPE program}]
OUTPUT TO REPORT report-name (выражение, выражение [, ...])
FINISH REPORT report-name
Объявления переменных.
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 }
Присвоения.
INITIALIZE список переменных {LIKE column-list | TO NULL}
присвоить переменным NULL или DEFAULT значения
LET переменная = выражение
Перехват прерываний.
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
Программные операторы.
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 секунд
Меню, окна.
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
Простые операторы вывода на экран.
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.Для их вызова применяйте функции.
Ввод/вывод через экранные формы.
Вывести в форму
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
Динамическое создание операторов.
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 }
Манипуляция "курсором".
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
Права доступа GRANT/REVOKE, LOCK/UNLOCK TABLE, SET LOCK MODE
Операторы транзакции и восстановления BEGIN WORK, COMMIT WORK, ROLLBACK WORK, START DATABASE, ...
Операторы описания данных.
Операторы описания данных не откатываются !
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
Операторы манипуляции данными.
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
Оператор 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евский *!
Операторы задания прав доступа (не откатываются).
{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
Операторы транзакций, восстановления данных.
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-SQLINFO { TABLES | { COLUMNS | INDEXES | ACCES | PRIVILEGES |
STATUS } FOR table-name }
CHECK TABLE owner.table-name Проверить индексы
REPAIR TABLE table-name Ремонт индексов