Формат операторов 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(список атрибутов)]
В полях могут использоваться служебные символы:
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 Права доступа GRANT/REVOKE, LOCK/UNLOCK TABLE, SET LOCK MODE Операторы транзакции и восстановления BEGIN WORK, COMMIT WORK, ROLLBACK WORK, START DATABASE, ...
Операторы описания данных не откатываются !
Примечание: подчеркнутые операторы нельзя использовать в 4GL, а можно только в INFORMIX-SQL
|