Формат операторов 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-SQL

INFO  { TABLES | { COLUMNS | INDEXES | ACCES | PRIVILEGES |
                         STATUS }          FOR table-name }
CHECK  TABLE owner.table-name         Проверить индексы
REPAIR  TABLE table-name               Ремонт индексов

Назад || Оглавление || Вперед


Copyright © CIT