Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Инструкция OPEN

Инструкция OPEN является одной из четырех команд, применяемых при работе с курсором, наряду с DECLARE, FETCH и CLOSE. Курсоры позволяют обрабатывать данные по одной строке, а не весь набор сразу. Инструкция OPEN открывает существующий на сервере курсор, который был создан при помощи инструкции DECLARE CURSOR.

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


Синтаксис SQL 2003

OPEN имя_курсора


Ключевые слова

OPEN имя_курсора

Находится и открывается уже готовый курсор, созданный при помощи инструкции DECLARE CURSOR.


Общие правила

На самом общем уровне курсор должен быть:

  • создан при помощи инструкции DECLARE;
  • открыт при помощи инструкции OPEN;
  • работа с ним должна вестись при помощи инструкции FETCH;
  • закрыт при помощи инструкции CLOSE.
  • Выполняя эти шаги, вы можете создать результирующий набор данных, сходный с результатом работы инструкции SELECT, за исключением того, что вы можете работать с каждой строкой результирующего набора отдельно. Предположим, например, что вы создали и открыли в базе данных DB2 курсор с именем employee_cursor, который содержит три столбца.

    DECLARE CURSOR employee_cursor FOR
    SELECT lname, fname, emp_id
    FROM employee
    WHERE hire_date >= ‘FEB-14-2004’;

    Создав курсор, вы можете теперь его открыть и отобрать данные в несколько хост-переменных.

    OPEN employee_cursor;
    FETCH NEXT FROM employee_cursor
    INTO :emp_last_name, ;emp_first_name, :emp_id

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

    В следующем характерном примере кода SQL курсор открывается и производится выборка всех значений имен (first name, fname) и фамилий (last name, lname) авторов из таблицы authors.

    DECLARE employee_cursor CURSOR FOR
    SELECT au_lname, au_fname
    FROM pubs.dbo.authors
    WHERE lname LIKE ‘K%’
    OPEN employee_cursor
    FETCH NEXT FROM employee_cursor
    BEGIN
    FETCH NEXT FROM employee_Cursor END
    CLOSE employee_cursor


    Советы и хитрости программирования

    Наиболее распространенная ошибка при работе с инструкцией OPEN- это отсутствие правильного закрытия курсора. Хотя инструкция OPEN описывается здесь изолированно, она должна всегда составлять группу с инструкциями DECLARE, FETCH и CLOSE. Хотя, забыв закрыть курсор, вы не получите сообщения об ошибке, курсор будет продолжать занимать память, другие ресурсы сервера и осуществлять блокировку до тех пор, пока он будет открыт. Например, если вы забудете закрыть курсоры, вы можете столкнуться с такой проблемой, как утечка памяти, — каждый открытый курсор занимает память до тех пор, пока не будет закрыт. Даже если вы не используете курсор, он все равно будет занимать место, которое база данных могла бы использовать как-то иначе. Так что потратьте немного времени и убедитесь, что все объявленные и открытые курсоры в конце концов закрываются.

    Курсоры часто используются в хранимых процедурах и пакетах процедурного кода. Они полезны, если вам нужно выполнить действия над отдельными строками, а не над всем набором данных сразу. Тем не менее из-за того, что курсоры работают с отдельными строками, а не с наборами данных, они часто работают медленнее, чем другие способы доступа к данным. Обязательно проведите серьезный анализ своего подхода. Используя вместо курсоров хорошо составленные предложения WHERE и JOIN, можно избежать многих проблем, таких, как запутанные операции DELETE и очень сложные инструкции UPDATE.


    DB2

    Платформа DB2 поддерживает для инструкции OPEN стандарт ANSI с парой дополнений.

    OPEN имя_курсора [USING {имя_переменной1 [, …] | DESCRIPTOR имя_дескриптора}]

    Специфические для DB2 синтаксические элементы следующие.

    USING {имя_переменной1 [, …] | DESCRIPTOR имя_дескриптора}

    Указывается список переменных для всех параметров подготовленной инструкции SELECT. Если в инструкции DECLARE CURSOR подготовленная инструкция SELECT использовалась с переменными, предложение USING использовать нельзя. (Если вы используете предложение USING, а параметров нет, предложение USING игнорируется.) Элементы предложения USING следующие.

    имя_переменной! [, …]

    Указывается одна или несколько хост-переменных. Как можно предполагать, каждая переменная соответствует параметру, стоящему на том же порядковом месте. Помимо хост-переменных допустимо использование переменных-локаторов DB2 и переменных-файловых ссылок. Хост-переменные используются для статического кода SQL.

    DESCRIPTOR имя Дескриптора

    Указывается область дескриптора (SQLDA), в которой содержится правильно составленное описание динамической переменной (переменных) SQL. Переменные дескриптора используются для динамического кода SQL.

    Например, в следующем коде для DB2 объявляются несколько хост-переменных (с именами типа hostvarxxx) и динамических переменных (объявляются при помощи инструкции PREPARE), которые затем используются в курсоре с именем dynamic_cursor.

    EXEC SQL BEGIN DECLARE SECTION;

    static short hostvar_int;
    char hostvar_vchar64[65];
    char statement_str[200];

    EXEC SQL END DECLARE SECTION;
    EXEC SQL PREPARE statement_name FROM :statement_str;
    EXEC SQL DECLARE dynamic_cursor CURSOR FOR statement_name;
    EXEC SQL OPEN dynamic_cursor USING :hostvar_int, :hostvar_vchar64;


    MySQL

    He поддерживается.


    Oracle

    Платформа Oracle полностью поддерживает стандарт ANSI, к тому же Oracle позволяет передавать параметры прямо в курсор при его открытии. Делается это при помощи следующего формата.

    OPEN имя_курсора параметр1 [, …]


    PostgreSQL

    В PostgreSQL нет инструкции OPEN CURSOR. PostgreSQL неявно открывает курсор при его создании инструкцией DECLARE.


    SQL Server

    Наряду со стандартной инструкцией OPEN SQL Server позволяет использовать глобальные курсоры, для чего применяется следующий синтаксис.

    OPEN [GLOBAL] имя_курсора

    Где:

    имя курсора

    Указывается имя курсора или строковая переменная, содержащая имя курсора, созданного ранее при помощи инструкции DECLARE CURSOR.

    GLOBAL

    Позволяет ссылаться на курсор многим пользователям, даже если им явным образом не присвоены права доступа к курсору. Без указания этой опции курсор будет локальным.

    Платформа SQL Server позволяет объявлять курсоры нескольких разных типов. Если курсор объявлен как INSENSITIVE или STATIC, то инструкция OPEN создает временную таблицу для хранения результирующего набора данных курсора. Также если курсор объявлен с опцией KEYSET, то автоматически создается временная таблица для хранения набора ключей.

    Источник