Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Формат операторов Informix-4GL

01.01.2007

Формат операторов 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               Ремонт индексов