Позиционированное обновление (ODBC)
Применимо: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure azure Synapse Analytics Analytics Platform System (PDW)
ODBC поддерживает два метода выполнения позиционированных обновлений в курсоре:
SQLSetPos
предложение WHERE CURRENT OF.
Более распространенный подход — использовать SQLSetPos. Она имеет следующие параметры.
SQL_POSITION
Позиционирует курсор в определенной строке в текущем наборе строк.
SQL_REFRESH
Обновляет программные переменные, привязанные к столбцам результирующего набора, присваивая им новые значения из строки, в которой в настоящий момент позиционирован курсор.
SQL_UPDATE
Обновляет текущую строку в курсоре значениями, хранимыми в программных переменных, которые привязаны к столбцам результирующего набора.
SQL_DELETE
Удаляет текущую строку в курсоре.
SQLSetPos можно использовать с любым результирующий набор инструкций, когда атрибуты курсора обработки инструкции задаются для использования курсоров сервера. Столбцы результирующего набора должны быть привязаны к переменным программы. Как только приложение извлекло строку, которая вызывает SQLSetPos(SQL_POSTION), чтобы разместить курсор в строке. Затем приложение может вызвать функцию SQLSetPos(SQL_DELETE) для удаления текущей строки или изменить значения привязанных переменных программы и вызвать функцию SQLSetPos(SQL_UPDATE) для обновления текущей строки.
Приложения могут обновлять или удалять любую строку в наборе строк с помощью SQLSetPos. Вызов SQLSetPos — это удобная альтернатива созданию и выполнению инструкции SQL. SQLSetPos работает с текущим набором строк и может использоваться только после вызова SQLFetchScroll.
Размер набора строк задается вызовом SQLSetStmtAttr с аргументом атрибута SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos использует новый размер набора строк, но только после вызова SQLFetch или SQLFetchScroll. Например, если размер набора строк изменен, вызывается SQLSetPos, а затем вызывается SQLFetch или SQLFetchScroll. Вызов SQLSetPos использует старый размер набора строк, но SQLFetch или SQLFetchScroll использует новый размер набора строк.
Первая строка в наборе строк имеет номер 1. Аргумент RowNumber в SQLSetPos должен определять строку в наборе строк. То есть его значение должно находиться в диапазоне от 1 до количества последних извлекаемых строк. Оно может быть меньше размера набора строк. Если аргумент RowNumber имеет значение 0, то операция применяется к каждой строке набора строк.
Операция удаления SQLSetPos делает источник данных удаленным одной или несколькими выбранными строками таблицы. Чтобы удалить строки с помощью SQLSetPos, приложение вызывает SQLSetPos с набором операций, чтобы SQL_DELETE и RowNumber, задайте количество строк для удаления. Если аргумент RowNumber имеет значение 0, то из набора строк удаляются все строки.
После возврата SQLSetPos удаленная строка является текущей строкой, а ее состояние SQL_ROW_DELETED. Строка не может использоваться в любых дополнительных операциях, таких как вызовы SQLGetData или SQLSetPos.
При удалении всех строк набора строк (RowNumber равно 0), приложение может запретить драйверу удалять определенные строки с помощью массива операций строк так же, как для операции обновления SQLSetPos.
Каждая удаляемая строка должна существовать в результирующем наборе. Если буферы приложения заполняются выборкой, а массив состояния строк сохраняется, то значения каждой из этих позиций строк не должны иметь значение SQL_ROW_DELETED, SQL_ROW_ERROR, или SQL_ROW_NOROW.
Позиционированные обновления также можно выполнить с помощью предложения WHERE CURRENT OF инструкций UPDATE, DELETE и INSERT. WHERE CURRENT OF требует имя курсора, которое ODBC будет создавать при вызове функции SQLGetCursorName или которое можно указать путем вызова SQLSetCursorName. Для обновления с помощью предложения WHERE CURRENT OF в предложении ODBC используются следующие основные шаги.
Вызовите SQLSetCursorName , чтобы установить имя курсора для дескриптора инструкции.
Создайте инструкцию SELECT с предложением FOR UPDATE OF и выполните ее.
Вызовите SQLFetchScroll , чтобы получить набор строк или SQLFetch , чтобы получить строку.
Вызовите SQLSetPos (SQL_POSITION), чтобы разместить курсор в строке.
Создайте и выполните инструкцию UPDATE с предложением WHERE CURRENT OF, используя набор имен курсора с SQLSetCursorName.
Кроме того, можно вызвать SQLGetCursorName после выполнения инструкции SELECT вместо вызова SQLSetCursorName перед выполнением инструкции SELECT. SQLGetCursorName возвращает имя курсора по умолчанию, назначенное ODBC, если имя курсора не задано с помощью SQLSetCursorName.
SQLSetPos предпочтительнее, чем WHERE CURRENT OF при использовании курсоров сервера. Если используется статический обновляемый курсор с библиотекой курсоров ODBC, то данная библиотека реализует обновления предложения WHERE CURRENT OF путем добавления предложения WHERE с ключевыми значениями базовой таблицы. Это может вызвать непреднамеренные обновления, если ключи в таблице не являются уникальными.