Смекни!
smekni.com

Базы данных SQL (стр. 3 из 3)

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>).

Из этого совместно с гарантированным сериализуемым выполнением транзакций следует воспроизводимость всех операций чтения внутри транзакции, если не учитывать следующего:

Влияния изменений базы данных и ее содержимого, явно производимых самой транзакцией.

Влияния изменений значений параметров, поставляемых процедурам, которые открывают курсоры, на последующие выборки через эти курсоры.