Формат операторов 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), ­- sqler

Операторы организации программы.



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

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

Используются технологии uCoz