ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



         W1E         ORACLE
                    Programmatic
                     Interfaces
                      Addendum
                   VERSION 1.2 W0
                                        Дополнение
                                 К Описанию Интерфейсов
                                 Среды ORACLE с Языками
                                      Высокого уровня
                                        версия 1.2  F
          ORACLE Programmatic Interfaces Addendum
          Version 1.2
          Part No.624-V1.2 January 1988
          Contributing Author: Ken Rudin
        Перевод на русский язык выполнен кооперативом МЕКОМП в 1989 г.
   Oracle Corporation (а следовательно,и кооператив МЕКОМП) не гарантирует,
что эта документация не содержит ошибок.

+                         W1EСодержаниеFW2

EГлава 1F             Примечания к версии 1.2 ........
                    Раздельные вызовы ...........
                    Новые возможности ...........
                    Изменения в препроцессорах  ......
                    Замеченные ошибки ...........
                    Исправления ..............
                    Разное  ................
EГлава 2F             Примечания к версиям 1.0 и 1.1  ....
                    Примечания,касающиеся всех препроцессоров.
                    Примечания,касающиеся препроцессора Pro*COBOL ..
                    Примечания,касающиеся препроцессора Pro*FORTRAN  ..
                    Примечания,касающиеся препроцессора Pro*PL/I ...
                    Примечания,касающиеся препроцессора Pro*Pascal ..
                    Примечания,касающиеся препроцессора Pro*Ada  ...
                    Примечания,касающиеся ORACLE Call
                    Interface (ранее HLI) .........

                         Примечания к Версии 1.2
   Версия 1.2 интерфейсов среды ORACLE с языками высокого уровня (ORACLE
Pro* Programmatic Interfaces) содержит ряд функциональных улучшений и попра-
вок версии 1.1,а также новый препроцессор Pro* Ada.Кроме того интерфейсы с
различными языками программирования теперь вызываются своими наборами команд
для каждого языка.Настоящее пособие является дополнением к руководствам по-
льзователя препроцессоров версии 1.1.В первой части этого дополнения описаны
изменения ORACLE Pro*Programmatic Interfaces,сделанные в версии 1.2.Вторая
часть этого дополнения содержит примечания к версиям 1.0 и 1.1,которые отсу-
тствуют во всех руководствах пользователя препроцессоров.

                           E Раздельные ВызовыF
   Команда PCC,которая использовалась раньше для запуска препроцессоров,была
заменена множеством команд вида PROxxx,вызывающих препроцессоры для каждого
языка программирования.Информацию об имеющихся в вашем распоряжении языках и
об установке программных продуктов Pro* в вашей операционной среде,Вы можете
почерпнуть в Руководстве по Установке (Installation Guide) и Руководстве По-
льзователя (User's Guide).В следующей таблице приведены команды,используемые
для запуска препроцессоров и редакторов связей Pro*,а также командных файлов
для обработки файлов препроцессором,компиляции и редактирования связей (PCL):

                    Язык      Препроцессор   Редактор     PCL
                    -1                       связей             -0
                    ADA       PROADA         LNPROADA     PCLADA
                    C         PROC           LNPROC       PCLC
                    COBOL     PROCOB         LNPROCOB     PCLCOB
                    FORTRAN   PROFOR         LNPROFOR     PCLFOR
                    PASCAL    PROPAS         LNPROPAS     PCLPAS
                    PL/I      PROPLI         LNPROPLI     PCLPLI

Примечание: Команда LOUTIL была заменена специфическими для каждого языка
            командами для запуска редакторов связей.Впрочем,редактором свя-
            зей LOUTIL все еще можно пользоваться,хотя рекомендуется исполь-
            зовать команды вида LNPROxxx,поскольку их синтаксис гораздо проще.


              EСинтаксис команд для запуска препроцессоровF
    Ниже приведена общая форма команд для запуска препроцессоров:

                        <имя_препроцессора> INAME=<имя_файла>
                              [HOST=<язык>] [INCLUDE=библиотека]
                              [<параметр>=<значение> ...]

  (В имя_файла может входить и соответствующая траектория движения по дереву
каталогов).Список параметров можно посмотреть в Руководстве Пользователя
(User's Guide)соответствующего препроцессора.
      Пример:     PROFOR INAME=myfile.pfo


+             E1-2   Приложение к Описанию ИнтерфейсовF
    Обратите внимание,что параметр INCLUDE= (ВКЛЮЧИТЬ) обязательно должен
присутствовать в командной строке,если Ваша программа содержит директиву
EXEC SQL INCLUDE ...,где файл,который надо включить находится не в текущем
каталоге и его точное местонахождение не указано.
   Параметр HOST= не обязателен,если Вы используете соответствующее стандар-
тное расширение файла:
            -1к      Стандартое расширение-0
                    ADA                 .PAD
                    C                   .PC
                    COBOL               .PCO
                    FORTRAN             .PFO
                    PASCAL              .PPA
                    PL/I                .PPL


              EСинтаксис команд для редактирования связейF
   Ниже приведен синтаксис команд для запуска редакторов связей:

                    <имя_ред._связей> <имя_загруз._модуля>
                                                    [<параметры>]

    Редакторы связей автоматически строят shared link (список с распределен-
ным доступом).Обратите внимание,что если Вы указываете какие-либо параметры,
то за именем загрузочного модуля должно следовать имя объектного модуля,по-
даваемого на вход редактора связей.А параметры можно использовать такие:
 - M (чтобы создать карту памяти) и
 - D (чтобы строить загрузочный модуль,включая в него отладочные блоки).
                    Пример:   LNPROC datatest datatest.obj MD

             EСинтаксис команд для запуска командных файлов PCLF
    Ниже приведен общий синтаксис вызова командных файлов,запускающих после-
довательно препроцессор,компилятор и редактор связей (PCL) (осуществляя та-
ким образом построение загрузочного модуля из исходного файла):

                        <имя_файла_PCL> <имя_исх._файла>
                                                    [<параметры>]

  При вызове этих командных файлов автоматически устанавливаются параметры:
 iname,oname,host и include (его значение sys$oracle).Пользователь может ус-
тановить параметры C (только компиляция без редактирования связей) и D (ком-
пиляция и редактирование связей с включением в загрузочный модуль отладочных
блоков).
                    Пример:   PCLCOB myfile D
Примечание: Командные файлы PCLxxx не поддерживают формат TERMINAL для
            COBOL'а и FORTRAN'а.
                   Дальнейшую информацию о синтаксисе команд для  запуска
продуктов Pro* Вы можете почерпнуть в Руководстве по Установке (Installation
Guide) и Руководстве Пользователя (User's Guide).

                                Новые возможности
   В обрабатываемых препроцессором программах на языках ADA,СOBOL и PL/I мо-
жно использовать составные имена для обозначения элементов структур.Такие
имена можно ставить в любом месте,где может стоять host variable (перемен-
ная/ которая может содержать значение из столбца таблицы).
    Во всех этих языках составное имя,определяющее элемент структуры,имеет
вид:
                        имя_структуры.имя_элемента

    Однако,использовать структуру целиком,а не поэлементно,не разрешается,
поэтому следующее выражение недопустимо (предположим,что emploee_rec (данные
о служащем) это структура,элементы которой соответствуют столбцам таблицы
EMP):
                        SELECT * INTO :emploee_rec FROM EMP
                               WHERE EMPNO = 1234;

                               EДля языка COBOLF
   Ниже приведен пример использования отдельных элементов структуры в
COBOL'е:
                        EXEC SQL BEGIN DECLARE SECTION END-EXEC.
                        01  EMP_RECORD.
                        05  PENAME PIC X(12)       VALUE SPACES.
                        05  PEMPNO PIC S9(9) COMP VALUE 0.
                        ...
                        EXEC SQL END DECLARE SECTION END-EXEC.
                        EXEC SQL INSERT INTO EMP
                          VALUES (:EMP_REC.PENAME,
                                            :EMP_REC.PEMPNO,...)
                        END-EXEC.

Обратите внимание,что синтаксис составного имени для обозначения отдельного
элемента структуры отличается от стандартного синтаксиса COBOL'а.
    Показанная ниже форма записи также допустима,если,конечно,не нарушается
однозначность (т.е.нет других переменных,имеющих те же имена,что и элементы
структуры).
                        EXEC SQL INSERT INTO EMP
                              VALUES (:PENAME,:PEMPNO,...)
                        END-EXEC.

                              EДля языка PL/IF
Ниже приведен пример использования отдельных элементов структуры в PL/I:

                        EXEC SQL BEGIN DECLARE SECTION;
                        DECLARE 1 emp_rec,
                                   2 name,
                                      3 first   char(20) varying,
                                      3 middle  char(20) varying,
                                      3 last    char(20) varying;
                        ...
                        EXEC SQL END DECLARE SECTION;

                        EXEC SQL SELECT ENAME INTO
                                              :emp_rec.name.last
                              FROM emp WHERE EMPNO = 1234;

Вместо :emp_rec.name.last можно использовать просто :last,если при этом не
нарушается однозначность (т.е.нет другой переменной с именем last).

                               EДля языка ADAF
Ниже приведен пример использования отдельных элементов структуры в ADA:

                        type DEPT is
                         record
                                DEPTNAME : STRING(1..14);
                                LOCATION : STRING(1..13);
                         end record;
                        ...
                        EXEC SQL SELECT DNAME,LOC
                              INTO :DEPT.DEPTNAME,:DEPT.LOCATION
                              FROM DEPT
                              WHERE DEPTNO = 20;

Кроме доступа к отдельным элементам структуры,Pro*Ada позволяет использовать
любое разрешенное в Ada обозначение переменной при присваивании значения пе-
ременной,используемой в операциях с БД (host variable),и любое разрешенное в
Ada выражение при ссылке на host variable.
 Например:          EXEC SQL SELECT sal * :(percent_raise + 1)
                              INTO :my_array(index + 1)
                              FROM emp
                              WHERE empno = 1234;

Дальнейшую информацию см.в Руководстве Пользователя Pro*Ada (Pro*Ada User's
Guide).

                          Изменения в препроцессорах
Следующие изменения были сделаны в версии 1.2 интерфейсов среды ORACLE с
языками высокого уровня (ORACLE Pro* Programmatic Interfaces).
EПараметрыF           Начиная с версии 1.2 действие параметров
EHOLD_CURSORF         HOLD_CURSOR и RELEASE_CURSOR определено более
E(ЗАДЕРЖАТЬ_КУРСОР)F  четко.
E      иF             Эти параметры влияют на три вида объектов
ERELEASE_CURSORF      СУБД ORACLE: явно и неявно определенные
E(ОТПУСТИТЬ_КУРСОР)F  курсоры (каждый из которых связан с оператором языка
                        манипулирования данными (ЯМД) SQL),область кэширова-
                        ния курсора и контекстную область ORACLE.
    Когда выполняется любой оператор ЯМД SQL,соответствующий ему курсор свя-
зывается с некоторым элементом области кэширования независимо от того,как он
был описан - явно или неявно.Этот элемент области кэширования в свою очередь
связывается с контекстной областью ORACLE,где хранится информация,необходи-
мая для обработки оператора,такая как,например,результат синтаксического
разбора оператора.
     Параметры HOLD_CURSOR и RELEASE_CURSOR определяют,что происходит с эти-
ми связями после закрытия курсора,которое означает,что использование курсора
завершено.

EЯвно и неявно опи-F  Существуют два способа закрытия курсора.
Eсанные курсорыF      Первый касается операторов SELECT,INSERT,UPDATE,DE-
                        LETE и EXECUTE IMMEDIATE.Когда выполняется какой-ли-
                        бо из этих операторов,неявно определяется и открыва-
                        ется соответствующий ему курсор.Как только действие,
                        определенное оператором,выполнено (например,после
                        того,как удалены определенные оператором DELETE ст-
                        роки таблицы),использование этого неявного курсора
                        считается законченным и он неявно закрывается.
    Второй способ касается таких операторов,как PREPARE,OPEN и FETCH,которые
требуют явного определения и открытия курсора пользователем.Использование
курсоров,соответствующих таким операторам считается незавершенным до тех пор,
пока не будет выполнена команда,явно указывающая,что использование курсора
закончено.Такой командой м.б.,например,команда CLOSE.После выполнения соот-
ветствующей команды курсор закрывается.
    Дальнейшее повествование относится ко всем препроцессорам кроме Pro*Ada.
Использование HOLD_CURSOR и RELEASE_CURSOR с Pro*Ada влияет только на курсо-
ры,определенные неявно (см.Руководство Пользователя Pro*Ada).

ERELEASE_CURSORF      Параметр RELEASE_CURSOR определяет,что происходит со
                   связью между областью кэширования курсора и контекстной
                   областью ORACLE после закрытия курсора.Если RELEASE_CUR-
                   SOR=yes (=да),то эта связь удаляется после закрытия кур-
                   сора.При этом освобождается память,выделенная под контек-
                   стную область и read-consistent image (согласующимся по
                   чтению образом) соответствующих таблиц,находящихся в фай-
                   ле BI (ORACLE Before Image File).При этом также удаляются
                   блокировки,которые ORACLE автоматически накладывает на
                   таблицы после грамматического разбора оператора.После то-
                   го как эти блокировки сняты к таблицам снова можно приме-
                   нять операции ALTER и DROP.
    Если RELEASE_CURSOR=no (=нет),то связь между областью кэширования курсо-
ра и контекстной областью ORACLE сохраняется после закрытия курсора.Это поз-
воляет сократить время выполнения данного оператора в дальнейшем,т.к.когда
снова потребуется его выполнить,не нужно будет снова проводить синтаксичес-
кий разбор и выделять память под контекстную область.
    По умолчанию RELEASE_CURSOR=no.

EHOLD_CURSORF         Параметр HOLD_CURSOR определяет,что происходит со
                связью между курсором,соответствующим данному оператору ЯМД
                SQL и областью кэширования курсора.Если HOLD_CURSOR=no
                (=нет),то после закрытия курсора эта связь сохраняется лишь
                до тех пор,пока место,которое занимает соответствующий ей
                элемент области кэширования курсора,не понадобится для чего-
                нибудь еще.
   Если HOLD_CURSOR=yes (=да),то связь между курсором,соответствующим опера-
тору ЯМД SQL и областью кэширования курсора становится постоянной.Как и в
случае RELEASE_CURSOR=no,это сократит время выполнения данного оператора в
дальнейшем,поскольку элемент области кэширования,содержащий информацию об
этом операторе,уже существует.По умолчанию HOLD_CURSOR=no.

EПримечания кF        Следует         заметить,что     если
EиспользованиюF       RELEASE_CURSOR=yes,то независимо от значения
EHOLD_CURSOR иF       параметра HOLD_CURSOR,связь между курсором и
ERELEASE_CURSORF      областью кэширования не будет сделана постоянной.
                                    Если HOLD_CURSOR=no и место,занимаемое
                   элементом области кэширования курсора,потребуется для но-
                   вого оператора SQL,то,кроме места в области кэширования
                   курсора,новый оператор использует и память,выделенную под
                   контекстную область,а также связь между областью кэширо-
                   вания и контекстной областью.
    Существует одно исключение при использовании параметров HOLD_CURSOR и
RELEASE_CURSOR.Независимо от того,какие значения принимают оба эти парамет-
ра,оператор PREPARE,за которым следует EXECUTE,не принимает их в расчет.Пос-
кольку в этом случае нет команды,позволившей бы пользователю указать,что
использование курсора,к которому был применен оператор PREPARE,завершено,ку-
рсор должен все время оставаться активным.Поэтому независимо от действитель-
ных значений параметров,все происходит так,как будто HOLD_CURSOR=yes и RELE-
ASE_CURSOR=no,и после рименения к нему оператора PREPARE курсор остается
постоянным.

                           EЗамеченные ошибкиF
ECF Пример соединения через SQL*Net,показанный Руководстве Пользователя
Pro*C версии 1.1 (Pro*C User's Guide Version 1.1),должен выглядеть следующим
образом:               EXEC SQL BEGIN DECLARE SECTION;
                              VARCHAR usr[20];
                              VARCHAR pwd[20];
                              char host1[] = " d:BOSTON";
                              char host2[] = " d:CHICAGO";
                        EXEC SQL END DECLARE SECTION;
                        ...
                         /*подсоединиться к местной базе данных*/
                        EXEC SQL CONNECT :usr IDENTIFIED BY :pwd;
                         /*подсоединиться к двум другим удаленным базам*/
                        EXEC SQL DECLARE ORA1 DATABASE;
                        EXEC SQL DECLARE ORA2 DATABASE;
                        EXEC SQL CONNECT :usr IDENTIFIED BY :pwd
                              AT ORA1 USING :host1;
                        EXEC SQL CONNECT :usr IDENTIFIED BY :pwd
                              AT ORA2 USING :host2;

    В Руководстве Пользователя Pro*C версии 1.1 (Pro*C User's Guide Version
1.1) ошибочно утверждается,что ORACLE автоматически завершит все транзакции
после успешного завершения программы.На самом деле этого не произойдет,если
явно не выполнен оператор COMMIT.

                                EFORTRANF
Употребление одной и той же переменной (host variable) более одного раза с
одним и тем же курсором может повлечь за собой ошибку.
                    Например:

                        C     ЭТО МОЖЕТ НЕ РАБОТАТЬ
                        C
                          EXEC SQL DECLARE EMP_CUR CURSOR FOR
                                   SELECT ENAME,SAL FROM EMP
                                   WHERE COMM < :my_value AND
                                        SAL > :my_value

   Эту ситуацию можно обойти следующим образом.Надо использовать разные иде-
нтификаторы для обозначения одной и той же переменной внутри определения ку-
рсора,а перед открытием курсора приравнять их друг к другу.Например:
                        C     ЭТО БУДЕТ РАБОТАТЬ
                        C
                           EXEC SQL DECLARE EMP_CUR CURSOR FOR
                              SELECT ENAME,SAL FROM EMP
                              WHERE COMM < :var1 AND SAL > :var2
                           ...
                           var2=var1
                           EXEC SQL OPEN EMP_CUR
                           ...

                             EИсправленияF
                          EЯзыки PASCAL и ADAF
Теперь препроцессоры PROPAS и PROADA правильно генерируют ошибку,если испо-
льзуется оператор
                        WHENEVER ...STOP;

Такой оператор является недопустимым,т.к.в Pascal'е и в Ada нет эквивалентов
конструкции
                    STOP.

                                EЯзык PL/IF
   Теперь препроцессор PROPLI поддерживает комментарии,выходящие за 80-ую
позицию в исходном файле.Устанавливая параметры командной строки IRECLEN и
ORECLEN,Вы можете ставить комментарии в любой позиции.Обратите внимание,что
входная строка будет оборвана в позиции,определяемой значением параметра
IRECLEN.Все символы после этой позиции будут отброшены без предупреждения.

                               EЯзык COBOLF
    Препроцессор PRECOB теперь поддерживает использование типа данных вида
PIC XX.... Так,например,PIC X(4) м.б. теперь также записан как PIC XXXX.

                              EОбщие замечанияF
    При попытке закрыть неоткрытый курсор теперь возвращается ошибка "ORA-
1001:Invalid cursor."
    Теперь,работая с динамическим SQL,можно снова открыть курсор,основанный
на операторе PREPARE (ПОДГОТОВИТЬ),который уже один раз был открыт и закрыт.
Для этого пользователь должен снова подготовить курсор,затем открыть его.Ес-
ли курсор не будет снова подготовлен перед повторным открытием,то возникнет
ошибка "ORA-1001:Invalid cursor."
     Интерфейс EXEC IAF GET/PUT между программой,обработанной препроцессо-
ром,и формой был сделан более устойчивым.
 - Если встречаются какие-либо неверные обращения к полям формы,такие как
   обращения к несуществующим или неоднозначно определенным полям,возникает
   новая ошибка "ORA-1057:Invalid or ambiguous block.field reference in user
   exit".Оператор EXEC SQL WHENEVER SQLERROR ...среагирует в этой ситуации.
   Эта ошибка появится в версии 1.2.10 препроцессоров и текст соответствую-
   щего сообщения будет иметься в версии 5.1.22 СУБД ORACLE.
     Примечание: Чтобы избежать неоднозначности при обращении к полю формы,
                 можно предварить имя поля именем соответствующего блока.По-
                 лучится составное поле вида block.field (блок.поле).
 - Если данные требуется усечь,чтобы уместить в поле,то это не повлияет на
   возвращаемый SQL CODE.Однако,при этом выставляются предупреждающие флаги
   0 (глобальный предупреждающий флаг) и 1 (предупреждающий флаг отсечения).
   Оператор EXEC SQL WHENEVER SQLWARNING ...уловит эту ситуацию.
 - При попытке осуществить неверное или неподдерживаемое преобразование дан-
   ных теперь возвращается ошибка "ORA-1460:Unimplemented or unresonable
   conversion requested." Оператор EXEC SQL WHENEVER SQLERROR ...уловит эту
   ситуацию.

                                  EРазноеF
   Обратите внимание,что длины переменных типа VARCHAR м.б. округлены.Это
делается специально,т.к.в некоторых компьютерах и некоторых языках требует-
ся,чтобы структуры занимали целое число слов (т.е.их длина в байтах д.б.
кратна определенному числу).

                               +Eг л а в а 2
                         Примечания к Версиям 1.0 и 1.1F
    С выпуском версий 1.0 и 1.1 препроцессоры претерпели много изменений,
большинство которых было описано в Руководствах Пользователя каждого препро-
цессора,однако,некоторые из этих изменений не попали ни в одно из руководс-
тв.В этом раздле настоящего приложения описаны изменения,о которых не сказа-
но ни в одном руководстве.

               EПримечания,касающиеся всех препроцессоровF
    Следующие примечания относятся ко всем препроцессорам.

EИспользованиеF       В некоторых руководствах по пользованию
Eоператора SELECTF    c    препороцессорами ошибочно говорится,что
EоператорамиF         оператор SELECT может использоваться как
EPREPARE и EXECUTEF   часть операторов PREPARE и EXECUTE.Однако,хотя сооб-
                     щения об ошибке при этом не возникает,оператор SELECT
                     нельзя использовать с операторами PREPARE и EXECUTE.Это
                     невозможно потому,что в этой форме динамического SQL
                     нет способа указать переменную (host variable),в кото-
                     рой должны храниться промежуточные данные.

EНовое поведениеF     Начиная с версии 1.1 интерфейсов среды ORACLE
Eоператора DESCRIBEF  с языками высокого уровня (ORACLE Pro*Programmatic
                     Interfaces),поведение оператора DESCRIBE стало в боль-
                     шей степени совместимо с СУБД DB2.
    Основные изменения: DESCRIBE возвращает точность и масштаб для данных
типа NUMBER,а также возвращает признак допустимости пустых данных.Если зна-
чение этого признака NULL,значит в данном столбце таблицы не допускается
пропуск данных,если NOT NULL - в данном столбце допускаются пустые данные.
    Точность и масштаб возвращаются в слове "длины" описателя (дескриптора)
выбора,имя которого зависит от используемого языка.Масштаб - это число со
знаком,находящееся в младшем байте этого слова.Точность - число без знака,
находящееся в старшем байте этого слова.В языке C слово "длины" определено в
SQLDA.H как переменная типа int.Однако,оно рассматривается как 2-хбайтовый
объект,чтобы легче было извлекать масштаб и точность.
    Извлечь точность и масштаб можно специальной утилитой находящейся в биб-
лиотеке SQLLIB в VMS.Ниже показан пример ее использования на языке C,однако
такой же подход можно применить в любом другом языке:

                     SQLDA         *sdp;  /* описатель выбора */
                     unsigned char prec;  /* точность (1 байт) */
                     char          scale; /* масштаб  (1 байт) */

                     extern VOID sqlprc(); /*Извлекает точность*/
                                           /* и масштаб        */

                     sqlprc( &(sdp->L[i]),&prec,&scale);

    Обратите внимание,что первым аргументом этой функции является фактичес-
кий адрес длины i-той переменной в списке выбора.В качестве всех параметров
передаются соответствующие адреса.
    Признак допустимости пустых данных NULL/NOT NULL возвращается в слове
"типа" описателя списка выбора,которое определяется как переменная типа
short (2 байта).Если в данном поле таблицы допускаются пустые данные,то выс-
тавляется бит 2^15 (самый старший бит старшего байта); в противном случае он
сбрасывается.
    В ORACLE Programmatic Interfaces Runtime Library (библиотеке стандартных
программ) есть также утилита,которая проверяет,допускаются ли пустые данные
для описанного объекта:

  SQLDA          *sdp    /*описатель выбора*/
  unsigned char  dty;    /* тип данных без признака допустимости пустых */
                        /* данных         */
  unsigned char  nullok; /* 1 - пустые данные допускаются*/
                         /* 2 - не допускаются       */
  extern VOID sqlnul();  /* Извлекает тип данных и признак допустимости    */
                         /*пустых данных   */
  sqlnul( &(sdp->T[i]),&dty,&nullok);
    if (nullok)
      {
          /* Пустые данные допускаются */
       }
  Тут все параметры тоже передаются через соответствующие адреса.

     Следующим способом можно сбросить бит признака допустимости:

                    sqlnul( &(sdp->T[i]),&(sdp->T[i]),&nullok);

     По-видимому,существующие программы,которые используют оператор DESCRI-
BE,д.б. изменены,ввиду того,что:
 - Теперь DESCRIBE может возвращать любые типы данных среды ORACLE (в отли-
   чие от предыдущих версий,где возвращались только типы CHAR и NUMBER).
 - Из-за того,что к возвращаемому типу данных добавлен бит признака допусти-
   мости пустых данных (NULL/NOT NULL),в программах могут не пройти проверки
   на определенные типы данных.
 - Столбцы типа NUMBER д.б. приведены к какому-нибудь типу данных; лучше
   всего (надежней) использовать типы CHAR или VARCHAR.Это надо делать пото-
   му,что внутреннее представление данных типа NUMBER таково,что пользовате-
   ль не может непосредственно манипулировать ими.
 - Если Вы приводите столбцы к типу CHAR,чтобы можно было вывести их на эк-
   ран,то,поскольку слово "длины" возвращается теперь в другом виде,чтобы
   узнать сколько надо выделить байтов под число надо вычислить его длину
   через точность и масштаб.Это можно сделать например так:

    len = prec;
    if ( prec == 0 )
     {
      /* Имеем NUMBER (т.е.без точности и масштаба).Используем умолчание  */
    len = 40; /* 40 - макс.поддерживаемая длина        */
     }
       else if ( scale < 0 )
     {
      /* Имеем отрицательный масштаб.Надо учесть нули в конце      */
    len = len + (-scale);
      }
    len = len + 2;   /* +2 на возможный знак и десятичную точку      */

                 Пожалуйста,обратите внимание на следующее:
 - Если вы приводите столбцы типа DATE (ДАТА) к типу CHAR,чтобы можно было
   выводить их на экран,Вы должны отвести 9 символов под стандартный формат
   даты вида ---МЕС-ГГ.
 - Для столбцов типов LONG и LONG RAW возвращаемая длина равна 0.Чтобы не
   пришлось выделять память под максимально возможную длину,Вы можете опре-
   делить настоящую длину такого поля,поместив соответствующий столбец в
   переменную (host variable) типа VARCHAR c помощью оператора FETCH.Для
   этого прежде чем выполнить OPEN,установите T-поле в SQLDA равным 9 (для
   VARCHAR).L-поле должно равняться максимальной длине переменной типа
   VARCHAR (т.е. 65К),а в V должен находиться адрес Вашей переменной.
 - Когда Вы помещаете оператором FETCH столбцы типа LONG или LONGRAW в пере-
   менной (host variable) типа VARCHAR,в поле длины VARCHAR будет правильная
   длина.Заметим,что это не сработает для LONG RAW при работе SQL*Net на ге-
   терогенных машинах,которые производят преобразование кодов символов (на-
   пр.,ASCII в/из EBCDIC).Пока не понятно как обойти эту проблему.
       В следующей таблице для всех типов столбцов приведены возвращаемый
тип (SQLTYPE),длина в двоичном виде (определенная оператором DESCRIBE) (гра-
фа DSCLEN)и длина при выводе на экран (т.е.после приведения к типу CHAR)
 (графа DSPLEN).

                    -1ТИП СТОЛБЦА    SQLTYPE  DSCLEN  DSPLEN-0
                    CHAR            1        A*      A*
                    NUMBER          2        C*      C*
                    ZERO TERMINATED
                     STRING         5        A*      E*
                    LONG            8        0       B*
                    VARCHAR         9        A*      F*
                    ROWID           11       13      18
                    DATE            12       7       9
                    DATE(D*)        13       7       9
                    RAW             23       A*      A*
                    LONG RAW        24       0       B*
                    * См.примечания
 Примечания:
            A.DSCLEN и DSPLEN равны SYSCOLUMNS.WIDTH
            B.DSPLEN для всех столбцов типа LONG различна,т.к.каждый раз при
              извлечении столбца LONG получается различная длина (своя для
              каждой строки).Максимально допустимая длина такого столбца за-
              висит от OC (например,в VMS 64К).См.также примечание A.
            C.Cм.замечания относительно точности и масштаба на стр.2-2 и за-
              мечание на стр. 2-4 касательно требования,чтобы тип NUMBER
              приводился к какому-нибудь типу.
            D.Иногда DESCRIBE может неверно возвращать тип 13 (внутренняя
              дата).Он д.б. приведен к какому-нибуть типу,имеющему смысл
              (обычно DATE или CHAR).
            E.Используйте функцию для определения длины цепочки символов,
              чтобы найти DSPLEN
            F.Длину можно найти в поле длины структуры VARCHAR.
 Примечание: Прежде чем использовать возвращенный тип в каких-то операторах
             (напр.,OPEN,FETCH и т.д.),надо сбросить бит признака допустимо-
             сти пустых данных.Ни при каких обстоятельствах не выставляйте
             этот бит - возникнет ошибка.

EРасширение SQL:F     Начиная с версии 1.1,ORACLE Programmatic
EвыражениеF           Interfaces поддерживает выражение
ECURRENT OF CURSORF   CURRENT OF <имя_курсора>.
E(текущее строкаF     Значением этого выражения является последняя
Eкурсора)F            извлеченная (оперетором FETCH) строка из одного кур-
                    сора для операций обновления (update) и удаления (dele-
                    te) c использованием другого курсора.
                                      CURRENT OF CURSOR заменяет неявное
использование ROWID в операторе SELECT FOR UPDATE.Например:

                       EXEC SQL DECLARE EMP_CUR CURSOR FOR
                                SELECT ENAME,SAL
                                FROM   EMP
                                WHERE  EMPNO = :empno
                                FOR UPDATE OF SAL;

                       EXEC SQL OPEN EMP_CUR;

                       EXEC SQL FETCH EMP_CUR INTO :ename,:sal;

                       EXEC SQL UPDATE EMP
                                SET SAL = :new_sal
                                WHERE CURRENT OF EMP_CUR;

    Выражение CURRENT OF CURSOR можно использовать только после того,как был
выполнен оператор FETCH.Это то же самое,что запомнить ROWID и потом исполь-
зовать его.

EОператор EXECF       В версии 1.0 интерфейсов среды ORACLE с
EORACLE OPTIONSF      языками высокого уровня (ORACLE Pro*
E(параметры интер-F   Programmatic Interfaces) был введен оператор:
Eфейса)F
                       EXEC ORACLE OPTION (параметр=значение); ,

который позволяет установить прямо в исходном тексте программы параметры,
которые раньше можно было установить только в командной строке при запуске
препроцессора.Это следующие параметры:

                       - AREASIZE
                       - ERRORS
                       - HOLD_CURSOR
                       - INCLUDE
                       - LITDELIM
                       - MAXLITERAL
                       - MAXOPENCURSORS
                       - REBIND
                       - RELEASE_CURSOR
                       - SELECT_ERROR
                       - XREF

    Оператор EXEC ORACLE OPTIONS особенно полезен для установки различных
значений параметров для разных участков програмы.Так в следующем примере на
языке C параметр AREASIZE разный для разных курсоров:

                       EXEC ORACLE OPTION ( AREASIZE=4 )

                       EXEC SQL SELECT ENAME
                                INTO :ename
                                FROM EMP;

                       EXEC SQL DECLARE C1 CURSOR FOR
                                         SELECT ENAME FROM EMP;

                       EXEC ORACLE OPTION ( AREASIZE=8 )

                       EXEC SQL OPEN C1; ...

    В этом примере размер курсора для первого оператора выбора 4К,а для вто-
рого - 8К.
    Этот новый оператор также помогает бороться с трудностями,связанными с
ограниченной длиной командной строки в некоторых OC,т.к. многие параметры
можно оределить в самом тексте программы.
    Значения параметров,определенные в тексте программы,заменят их значения,
установленные в командной строке.Можно также поместить операторы EXEC ORACLE
OPTIONS в отдельный файл и,используя директиву EXEC SQL INCLUDE,включать их
в нужное место исходного текста программы.

EORACA - расширениеF  Пользователи препроцессоров изъявили желание
ESQLCAF               иметь больше информации о среде препроцессора,чем
                     имеется в области связи SQL (SQL communications area
                     (SQLCA)).Т.к. SQLCA хотелось бы сохранить в виде "стан-
                     дартном для SQL",то в версии 1.0 была добавлена область
                     связи ORACLE,ORACA (ORACLE Communications Area).

                           Как использовать ORACA
    По умолчанию ORACA не доступен Вашей программе.Чтобы использовать ORACA,
Вы должны включить ее в программу.Для этого надо:
 1.Либо поставить в командную строку выражение ORACA=yes,либо в исходный те-
   кст программы поставить оператор
                       EXEC ORACLE OPTION ( INCLUDE=ORACA )

 2.Добавить следующую строку в Вашу программу,используя подходящий для Ваше-
   го языка синтаксис:
                       EXEC SQL INCLUDE ORACA

 3.Установить желаемые флаги в ORACA (см.ниже).

                       Информация,находящаяся в ORACA
    ORACA содержит следующую информацию (посмотреть ее структуру и имена ее
элементов можно в файлах ORACA,которые распространяет Oracle Corporation).

                          EТекущий оператор SQLF
    Вы можете извлечь текст оператора,который обрабатывает СУБД ORACLE.Эту
возможность можно использовать,когда возникают какие-нибудь ошибки.Тексты
операторов,которые обрабатывает препроцессор (такие как CONNECT,FETCH и COM-
MIT),не попадают в ORACA.В ORACA попадают не более 70 первых символов текста
оператора SQL.Они хранятся в том же формате,что и сообщения об ошибках в
SQLCA.

                         EФайл,содержащий ошибкуF
    Если препроцессор обрабатывает программу,исходный текст которой находит-
ся в нескольких файлах,то в случае возникновения ошибки,имя файла,в котором
она возникла,будет занесено в ORACA.

                       EСтрока,содержащая ошибкуF
    Содержит номер строки файла,в которой возникла ошибка.

                                  Флаги ORACA
    ORACA также содержит следующие флаги,которые можно использовать для пе-
редачи некоторых параметров интерфейсам ORACLE (ORACLE Programmatic Inter-
faces):
                    EЗаписывать оператор SQL,если ...F
    Вы можете задать условия,при которых оператор будет записываться,присво-
ив этому флагу значение:
 0  По умолчанию; не записывать оператор никогда.
 1  Записывать оператор,только если SQLERROR.
 2  Записывать оператор,если SQLERROR или SQLWARN.
 3  Всегда записывать оператор.Оператор будет заноситься в элемент SQLCA,
    содержащий текст текущего оператора.

                             EОтладочный режимF
    Этот флаг может принимать значения 0 и 1.1 - отладочный режим включен;
0 - отключен.По умолчанию отладочный режим отключен (0).

                    EПроверка кэширования курсораF
    Если этот флаг выставлен (т.е.равен 1) и флаг отладочного режима (см.вы-
ше) тоже выставлен,то перед каждой операцией с курсором в загрузочный модуль
будет вставлена проверка на непротиворечивость его кэширования.Если будет
обнаружена ошибка,то она будет выдана как одна из ошибок вида OER(21xx).По
умолчанию этот флаг сброшен.

                        Новое в ORACA в версии 1.1
    В версии 1.1 в ORACA было введено несколько новых переменных.Чтобы прог-
раммы под версию 1.0,которые работают с ORACA,могли их использовать,они дол-
жны быть заново скомпилированы.

   EORAHCHF (Флаг проверки непротиворечивости структуры типа Heap (куча))F
    Если этот флаг выставлен (т.е.имеет ненулевое значение),то генерируются
проверки непротиворечивости всех динамических выделений памяти,принадлежащей
PCC.Это полезно,при поиске ошибок,из-за которых портятся какие-либо области
памяти.При этом д.б. выставлен флаг отладочного режима.

                    EСтатистика кэширования курсораF
    Если выставлены флаги отладочного режима и проверки кэширования курсора,
то будут определены следующие переменные:
 - ORAHOC   Наивысшее заказанное значение максимального количества одновре-
            менно открытых курсоров ORACLE.
 - ORAMOC   Максимальное количество курсоров,потребовавшееся в действитель-
            ности.
 - ORACOC   Текущее количество курсоров Oracle.
 - ORANOR   Количество переназначений кэширования (Number of cursor cache
            reassignments).
 - ORANPR   Количество "синтаксических разборов" операторов SQL.
 - ORANEX   Количество "выполнений" операторов SQL.

     Эти переменные выставляются в процессе выполнения программы при каждом
встречании операторов COMMIT или ROLLBACK.Для каждой подсоединенной операто-
ром CONNECT БД определяется свой набор этих переменных.Текущие их значения в
ORACA соответствуют базе,к которой был применен последний COMMIT/ROLLBACK.

                            EОператор DECLAREF
     В версии 1.0 появился новый оператор,похожий на DECLARE CURSOR:

                      EXEC SQL DECLARE <имя_оператора> STATEMENT;

     Этот оператор позволяет объявить оператороы,испоьзуемые с PREPARE.Нап-
ример,следующий сегмент программы на C был бы недопустимым в предыдущих вер-
сиях препроцессоров:
                     main()
                     {
                      init();
                      execute();
                     }

                     execute()
                     {
                      EXEC SQL EXECUTE S;
                     }

                     init()
                     {
                      EXEC SQL PREPARE S FROM
                      "INSERT INTO EMP (ENAME) VALUES ('WILMA')";
                     }

    Этот текст был бы недопустимым,т.к.S не было определено к моменту выпол-
нения оператора EXECUTE S.Используя препроцессоры ORACLE,Вы можете вставить
следующий оператор в функцию main() этой программы,и она будет работать пра-
вильно:
                       EXEC SQL DECLARE S STATEMENT;

    Оператор DECLARE нельзя использовать в глобальных областях,чтобы сделать
курсоры известными во всех компилируемых модулях.

              EПримечания,касающиеся препроцессора Pro*COBOLF

EИзменения в LexicalF В предыдущих версиях PCC и Pro*COBOL  препро-
EScanner (лексичес-F  цессор игнорировал опечатки,которые не мог
Eкий анализатор)F     понять.Например Вы могли набрать в своей програме
                        что-нибудь,вроде:
                                               01 A PIC S9(4).
                    и не получить сообщения об ошибке.Начиная с версии 1.0,
                    приведенное выше выражение породит ошибку неподдерживае-
                    мого типа,т.к. правильное выражение выглядит так:

                       01 A PIC S9(4) COMP.

    Результат этого,заметный большинству пользователей,будет заключаться в
том,что компиляция некоторых программ уже не будет заканчиваться без ошибок,
подобных описанной выше.Эта дополнительная информация,по-видимому,будет по-
лезна большинству программистов.

EНовое описаниеF      Если Вы используете тип VARCHAR с препроцес-
Eтипа VARCHARF        сором COBOL'а и версией 4 ORACLE,то старая
                        его форма д.б. заменена новой.Для оператора:

                       EXEC SQL SELECT ENAME INTO :A FROM EMP
                                                        WHERE ...

                    старый формат описания переменной A типа VARCHAR был:

                       01 A.
                          02 A-LEN PIC S9(4).
                          02 A-ARR PIC X(20).

                    новый же формат вглядит так:

                       01 A PIC X(20) VARYING.

и порождает переменные A-LEN и A-ARR,которые содержат длину и данные соотве-
тственно.

              EПримечания,касающиеся препроцессора Pro*FORTRANF
    Обратите внимание,что каждую подпрограмму надо компилировать отдельно.
Планируется убрать это ограничение в последующих версиях.
    Компилируя программу Pro*FORTRAN'а,используйте параметр /NOOPTIMIZE.
    Заметим,что у Pro*FORTRAN'а нет SQLDA.SQLDA - это описатель типа для
языков,в которых есть описания типов (такие как C,Pascal,Ada).Показанный в
Руководстве Пользователя Pro*FORTRAN'а SQLDA - является шаблоном.В каждом
конкретном случае программист должен заполнить имена фактически используемых
переменных.

                EПримечания,касающиеся препроцессора Pro*PL/IF
     Начиная с версии 1.1.9,Pro*PL/I поддерживает параметры LMARGIN и RMAR-
GIN,которые позволяют указать левое и правое поле для исходного текста.Их
использование позволяет поддерживать входной формат,необходимый некоторым
компиляторам.По умолчанию левое и правое поле для всех систем фирмы IBM рав-
ны 2 и 75 позициям соответственно.Для всех не IBM'овских систем левое поле
по умолчанию - 1-ая позиция,первое поле - длина записи входного файла.Чтобы
изменить установленные по умолчанию поля,укажите значения параметров LMARGIN
и RMARGIN в командной строке.Например так:
                                            LMARGIN=5 RMARGIN=75

             EПримечания,касающиеся препроцессора Pro*PascalF
     Обратите внимание,что все программы Pro*Pascal'я должны содержать опре-
деление типа ORATYPE.
     Если Вы используете переменную типа PACKED ARRAY,Вы должны описать ее
как FIXEDCHAR[n] в разделе описания типов VAR,но в программе обращаться к
ней как к переменной типа PACKED ARRAY of [n].В примерах программ,приведен-
ных в Руководстве Пользователя Pro*Pascal'я эти переменные ошибочно описыва-
ются в разделе VAR как PACKED ARRAY.Но на дистрибутивной ленте все примеры
правильны.
     Заметим также,что после всех операторов,используемых в условном преком-
пилировании,надо ставить точку с запятой:
                                            EXEC SQL IFDEF <символ>;

     Это сделано в соответствии с требованием,чтобы после каждого оператора
SQL стояла точка с запятой.

                EПримечания,касающиеся препроцессора Pro*AdaF

EОрганизация прохож-F Важно понимать соотношение между обращениями
Eдения заданийF       к ORACLE и огранизацией прохождения различных
                    заданий в ADA.Если некоторая функция прерывает работу
                    ORACLE и затем порождает еще одно задание,которое тоже
                    обращается к ORACLE,то результаты этого обращения непре-
                    дсказуемы.Такое возможно,только если обращения к ORACLE
                    осуществляются из заданий с разным приоритетом или из
                    заданий с одинаковым приоритетом,но при разрешенном
                    квантовании времени.
     Самый надежный способ избежать этой ситуации - обращаться к ORACLE то-
лько из заданий с одинаковым приоритетом и не разрешать квантования времени,
если обращения к ORACLE осуществляются более чем из одного задания.
     Можно решить эту проблему по-другому,написав специальную программу,ко-
торая не позволит обратиться к ORACLE,пока не будет завершено предыдущее об-
ращение.
     Эта связанная с разделением времени потенци альная проблема не влияет
на способность ORACLE выполнять параллельные операции с различными курсорами.

        EПримечания,касающиеся ORACLE Call Interface (ранееHLI)F
    Такой интерфейс на уровне вызовов имеется у Pro*C,Pro*COBOL,Pro*FORTRAN
и Pro*ADA.Все вызовы подробно описаны в соответствующих руководствах версии
1.1.

EПараметр OPEN_CUR-F  Пользователи 4-той версии HLI должны замети-
ESOR файла INIT.ORAF  ть,что параметр OPEN_CURSORS устанавливает
                    максимальное число курсоров,которое процесс может откры-
                    ть.Первоначально значение этого параметра равно 50,поэ-
                    тому пользователи,чьи программы открывают больше 50-ти
                    курсоров,должны,прежде чем запустить их,изменить значе-
                    ние параметра OPEN_CURSORS и сделать  warmstart.

                     EПримечания,касающиеся Ada OCIF
                                Компиляция
    Программа на Ada,которая будет обращаться к ORACLE,д.б. связана с паке-
том ORACLE_OCI с помощью оператора WITH.В качестве примера см.демонстрацион-
ные программы.

                           Наименования параметров
    Имена параметров,использованные в предыдущих версиях HLI для других язы-
ков,были сохранены как формальные параметры ADA или как типы ADA для описа-
ния формальных параметров.

                         EИспользование параметровF
    ORACLE обменивается данными с программой пользователя,используя прямой
доступ к ним.Вызовы OBIND и ODEFIN обеспечивают ORACLE адресами и прочей ин-
формацией,описывающей данные или области данных.Это позволяет ORACLE считы-
вать и записывать эти данные.
    Следовательно,при выполнении функций OEXEC и OFETCH ORACLE должен полу-
чить фактический адрес используемых данных.Отсюда возникает проблема,связан-
ная с реализацией языка Ada,т.к. в нем,при вызове подпрограммы,создаются
временные копии данных (чтобы защитить их),а результаты записываются при вы-
ходе из подпрограммы.Поэтому Ada OCI имеет следующие особенности:
 - OBIND и ODEFIN должны иметь специальные типы.Это необходимо,чтобы гаран-
   тировать,что в ORACLE передаются действительные адреса данных.
 -  Могут нарушаться правила видимости ADA.Так как операции извлечения и за-
    несения данных могут встречаться вне области видимости этих данных,ADA
    не в состоянии обеспечить выполнение правил видимости.

              EТипы данных,используемые в вызовах OBIND и ODEFINF
    Все скалярные объекты представляются как записи,состоящие из одного ска-
лярного элемента.Это гарантирует,что ORACLE получит фактический адрес дан-
ных.Например,тип для представления коротких целых чисел (short integer),ис-
пользуемых ORACLE в операциях с БД,определяется так:

                       type o_si is record
                          int : short_integer;
                       end record;

    Примерно так выглядит типичная последовательность действий в программе:

  cur : cursor;      --определение курсора
  a   : o_si;        --определение выходной переменной
     ...
  odefin(cur,1,a);   --связать курсор с опертором SQL
     ...
  oexec(cur);        --извлечь результат (из первой строки)
  ofetch(cur);       --занести данные в переменную  a

    Составное имя A.INT будет обозначать возвращенное значение.

                           Правила видимости
    Если вызов OFETCH выполняется вне блока,в котором определен объект A,то
результаты будут непредсказуемы,т.к. при этом нарушаются правила видимости
Ada.

KOAP Open Portal 2000



Яндекс цитирования