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 (см.
=, != или <>, <=, >=, <, >
NOT , OR, AND
выражение IS [NOT] NULL
по умолчанию "\"
string [NOT] LIKE "шаблон" [ESCAPE "escape-char"]
спецсимволы шаблона % _ означают ¦ §!
string [NOT] MATCHES "шаблон" [ESCAPE "esc-char"]
спецсимволы шаблона * ? [ abH ] [^ d - z ]
означают "много", "один", "любой из", "ни один из"
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 }
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
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 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
Оператор 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евский *!
Операторы транзакций, восстановления данных.
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 Ремонт индексов