Базы данных SQL
(<authorization identifier>), определенным для этой схемы.Замечание: В реализации могут обеспечиваться средства (такие, как DROP TABLE, DROP VIEW, ALTER TABLE и REVOKE), которые позволяют создавать, уничтожать и модифицировать определения таблиц, представлений и привилегий для данного <идентификатора полномочий> (<authorization identifier>) в разные моменты времени. Однако в этом стандарте рассматриваются только <схемы> (<schema>), представляющие определения, которые известны системе в данный момент времени.
4.7 База данныхБаза данных есть набор всех данных, определенных <схемами> (<schema>) в среде. Понятие среды является определяемым реализацией.
4.8 Модули<Модуль> (<module>) есть долговременно хранимый объект, определенный на языке модулей. <Модуль> (<module>) состоит из необязательного <имя модуля> (<module name>), <раздела языка> (<language clause>), <раздела полномочий модуля> (<module authorization clause>), ноля или более курсоров, определенных через <объявление курсора> (<declare cursor>) и одной или более <процедур> (<procedure>).
Прикладная программа есть сегмент выполняемого кода, содержащий, возможно, несколько подпрограмм. Единственный <модуль> (<module>) ассоциируется с прикладной программой в течение ее выполнения. Прикладная программа должна быть ассоциирована с самое большее одним <модулем> (<module>). Способ установления этой ассоциации, включающий возможное требование выполнения некоторого определенного в реализации оператора, определяется в реализации.
4.9 Процедуры<Процедура> (<procedure>) состоит из <имени процедуры> (<procedure name>), последовательности <объявлений параметров> (<parameter declaration>) и одного <оператора SQL> (<SQL statement>).
Прикладная программа, ассоциированная с <модулем> (<module>), может обращаться к <процедурам> (<procedure>) этого <модуля> (<module>) через оператор "call", в котором определяется <имя процедуры> (<procedure name>) этой <процедуры> (<procedure>) и задается последовательность значений параметров, число и <тип данных> (<data type>) которых соответствует <объявлениям параметров> (<parameter declaration>) этой <процедуры> (<procedure>). Вызов <процедуры> (<procedure>) приводит к выполнению содержащегося в ней <предложения SQL> (<SQL statement>).
4.10 ПараметрыПараметр объявляется в <процедуре> (<procedure>) через <объявление параметра> (<parameter declaration>). <Объявление параметра> (<parameter declaration>) определяет <тип данных> (<data type>) своего значения. Параметр либо принимает, либо поставляет значение соответствующего аргумента в вызове этой <процедуры> (<procedure>).
4.10.1 Параметр SQLCODEПараметр SQLCODE - это специальный целый параметр. Его значение устанавливается равным коду состояния, который либо означает, что вызов <процедуры> (<procedure>) завершился успешно, либо, что в течение выполнения <процедуры> (<procedure>) возникла исключительная ситуация.
4.10.2 Параметр-индикаторПараметр-индикатор - это целый параметр, который указывается после другого параметра. Его основное назначение - показывать, может ли значение другого параметра (принимаемого или поставляемого) быть неопределенным значением.
4.11 Стандартные языки программированияСтандарт определяет действия <процедур> (<procedure>) в <модулях> (<module>), когда эти <процедуры> (<procedure>) вызываются программами, соответствующими определенным стандартным языкам программирования. Термины "стандартная программа на языке COBOL", "стандартная программа на языке FORTRAN", "стандартная программа на языке Pascal" и "стандартная программа на языке PL/1" относятся к программам, отвечающим критериям соответствия стандартов, перечисленных в разделе 2, "Ссылки" .
4.12 КурсорыКурсор определяется через <объявление курсора> (<declare cursor>). Для каждого <объявления курсора> (<declare cursor>) в <модуле> (<module>) курсор фактически cоздается тогда, когда образуется транзакция (см. 4.16, "Транзакции"), ссылающаяся на этот <модуль> (<module>), и уничтожается, когда эта транзакция завершается.
Курсор находится либо в открытом состоянии, либо в закрытом состоянии. Начальное состояние курсора - закрытое. Курсор переходит в открытое состояние через <оператор открытия> (<open statement>) и возвращается в закрытое состояние через <оператор закрытия> (<close statement>), <оператор фиксации> (<commit statement>) или <оператор отката> (<rollback statement>).
Курсор в открытом состоянии определяет таблицу, порядок строк в этой таблице и позицию относительно этого порядка. Если <объявление курсора> (<declare cursor>) не включает <раздел упорядочивания> (<order by clause>) или включает <раздел упорядочивания> (<order by clause>), не полностью определяющий порядок строк, то строки в таблице имеют порядок, полностью или частично определенный в реализации.
Внутри одной транзакции, если порядок строк не определен или не полностью определен через <раздел упорядочивания> (<order by clause>), относительная позиция двух строк будет в общем случае одна и та же при каждом открытии курсора. Порядок может изменяться от одного раза к другому, если меняются значения базы данных или значения параметров, указанных в <спецификации запроса> (<query specification>) в <объявлении курсора> (<declare cursor>).
В разных транзакциях, даже когда значения базы данных и значения параметров, указанных в <спецификации запроса> (<query specification>), одинаковы, порядок строк, определяемый одинаковыми <спецификациейкурсора>(<cursor specification>) и <оператором открытия> (<open statement>), может быть различным.
Позиция курсора в открытом состоянии может быть перед определенной строкой, на определенной строке или после последней строки. Если курсор установлен на строку, то эта строка является текущей строкой курсора. Курсор может быть установлен перед первой строкой или после последней строки, даже если таблица пуста.
<Оператор чтения> (<fetch statement>) продвигает позицию открытого курсора на следующую строку в порядке этого курсора и выбирает значения столбцов этой строки. <Оператор модификации: позиционный> (<update statement: positioned>) изменяет текущую строку курсора. <Оператор удаления: позиционный> (<delete statement: positioned> удаляет текущую строку курсора.
Если курсор установлен перед некоторой строкой, и новая строка заносится в эту позицию, то оказываемое этим возможное влияние на позицию курсора, если и есть, определяется в реализации.
Если курсор установлен на некоторую строку или перед некоторой строкой, и эта строка удаляется, то курсор устанавливается перед строкой, непосредственно следующей за позицией удаленной строки. Если такая строка не существует, то курсор устанавливается после последней строки.
Если при выполнении <оператора SQL> (<SQL statement>), ссылающегося на открытый курсор, возникает ошибка, то возможное действие этого на позицию или состояние курсора определяется в реализации.
Рабочая таблица - это таблица, возникающая вследствие открытия курсора. Приводит ли открытие курсора к созданию рабочей базовой таблицы или рабочей представляемой таблицы, определяется в реализации.
Каждая строка рабочей представляемой таблицы порождается только тогда, когда курсор позиционируется на эту строку.
Рабочая базовая таблица создается при открытии курсора и уничтожается при закрытии курсора.
4.13 Операторы<Оператор SQL> (<SQL statement>) определяет операцию над базой данных или операцию над курсором. <Оператор выборки> (<select statement>) читает значения из таблицы. <Оператор занесения> (<insert statement>) заносит строки в таблицу. <Оператор модификации: поисковый> (<update statement: searched>) или <оператор модификации: позиционный> (<update statement: positioned>) изменяет значения строк таблицы. <Оператор удаления: поисковый> (<delete statement: searched>) или <оператор модификации: позиционный> (<delete statement: positioned>) удаляет строки из таблицы.
4.14 Синтаксис встраивания<Программа со встроенным SQL> (<embedded SQL host program>) (<программа на языке COBOL со встроенным SQL> (<embedded SQL COBOL program>), <программа на языке FORTRAN со встроенным SQL> (<embedded SQL FORTRAN program>), <программа на языке Pascal со встроенным SQL> (<embedded SQL Pascal program>) или <программа на языке PL/1 со встроенным SQL> (<embedded SQL PL/1 program>)) - это прикладная программа, которая содержит текст на языке программирования и текст на языке SQL. Текст на языке программирования должен удовлетворять требованиям конкретного стандарта языка программирования. Текст на языке SQL должен состоять из одного или более <встроенных операторов SQL> (<embedded SQL statement>) и (необязательно) из одной или более <встроеных секций объявлений SQL> (<embedded SQL declare section>). Это позволяет представлять приложения базы данных в гибридной форме, в которой <операторы SQL> (<SQL statement>) прямо встроены в прикладную программу. Такая гибридная прикладная программа по определению должна быть эквивалентна стандартной прикладной программе, в которой <операторы SQL> (<SQL statement>) заменены на вызовы <процедур> (<procedure>) SQL в отдельном <модуле> (<module>) SQL.
4.15 ПривилегииПривилегия разрешаетвыполнить данную категорию <действий> (<action>) над указанной таблицей или представлением на основе указанного <идентификатора полномочий> (<authorization identifier>).Допустимыми<действиями> (<action>) являются INSERT, DELETE, SELECT, UPDATE и REFERENCES.
<Идентификатор полномочий> (<authorization identifier>) определяется для каждой <схемы> (<schema>) и <модуля> (<module>).
<Идентификатор полномочий> (<authorization identifier>), определенный для <схемы> (<schema>), должен отличаться от <идентификатора полномочий> (<authorization identifier>) любой другой <схемы> (<schema>) в той же среде. <Идентификатор полномочий> (<authorization identifier>) для <схемы> (<schema>) является "владельцем" всех таблиц и представлений, определенных в этой <схеме> (<schema>).
Таблицы и представления обозначаются <именами таблиц> (<table name>). <Имя таблицы> (<table name>) состоит из <идентификатора полномочий> (<authorization identifier>) и <идентификатора> (<identifier>). <Идентификатор полномочий> (<authorization identifier>) идентифицирует <схему> (<schema>), в которой были определены таблица или представле- ние, обозначаемые <именем таблицы> (<table name>). Таблицы и представления, определенные в различных <схемах> (<schema>), могут иметь одинаковые <идентификаторы> (<identifier>).
Если ссылка на <имя таблицы> (<table name>) не содержит явно <идентификатор полномочий> (<authorization identifier>), то по умолчанию указывается <идентификатор полномочий> (<authorization identifier>) содержащих <схемы> (<schema>) или <модуля> (<module>).
<Идентификатор полномочий> (<authorization identifier>) для <схемы> (<schema>) обладает всеми привилегиями по отношению к таблицам и представлениям, определенным в этой <схеме> (<schema>).
<Схема> (<schema>) с данным <идентификатором полномочий> (<authorization identifier>) может содержать <определения привилегий> (<privilege definition>), которые передают привилегии другим <идентификаторам полномочий> (<authorization identifier>). Переданные привилегии могут относиться к таблицам и представлениям, определенным в текущей <схеме> (<schema>), или могут быть привилегиями, которые были переданы данному <идентификатору полномочий> (<authorization identifier>) другой <схемой> (<schema>). Раздел WITH GRANT OPTION <определения привилегии> (<privilege definition>) определяет, может ли получатель привилегии передавать ее другим.
<Модуль> (<module>) специфицирует <идентификатор полномочий> <authorization identifier>, <идентификатор полномочий модуля> (<module authorization identifier>), который должен обладать привилегиями, достаточными для выполнения каждого <оператора SQL> (<SQL statement>) в <модуле> (<module>).
4.16 ТранзакцииТранзакция есть последовательность операций, включающая операции над базой данных, атомарная по отношению к восстановлению и асинхронности. Транзакция начинается, когда вызывается процедура и никакая транзакция в данный момент не активна. Транзакция заканчивается при выполнении <оператора фиксации> (<commit statement>) или <оператора отката> (<rollback statement>). Если транзакция завершается выполнением <оператора фиксации> (<commit statement>), все изменения, внесенные в базу данных этой транзакцией делаются доступными для всех асинхронно выполняемых транзакций. Если транзакция завершается выполнением <оператора отката> (<rollback statement>), все изменения, внесенные в базу данных этой транзакцией, аннулируются. Зафиксированные изменения не могут быть аннулированы. Изменения, внесенные в базу данных транзакцией, могут восприниматься этой транзакцией, но до тех пор, пока транзакция не завершится выполнением <оператора фиксации> (<commit statement>), они не могут восприниматься другими транзакциями.
Гарантируется сериализуемость выполнения асинхронных транзакций. Сериализуемое выполнение определяется как выполнение операций асинхронно выполняемых транзакций, которое производит то же самое действие, что и некоторое последовательное выполнение тех же самых транзакций. Последовательное выполнение - это такое выполнение, при котором каждая транзакция полностью завершается перед началом выполнения следующей транзакции.
Выполнение <оператора SQL> (<SQL statement>) внутри транзакции не оказывает никаких воздействий на базу данных кроме тех, которые установлены Общими правилами для этого <оператора SQL> (<SQL statement>).
Из этого совместно с гарантированным сериализуемым выполнением транзакций следует воспроизводимость всех операций чтения внутри транзакции, если не учитывать следующего:
Влияния изменений базы данных и ее содержимого, явно производимых самой транзакцией.
Влияния изменений значений параметров, поставляемых процедурам, которые открывают курсоры, на последующие выборки через эти курсоры.