Cambiar filas con operaciones por posición

Los cursores actualizables admiten instrucciones de modificación de datos que actualizan filas a través del cursor. Cuando se sitúe en una fila de un cursor actualizable, se podrán realizar operaciones de actualización o eliminación que empleen las filas de la tabla base utilizadas para generar la fila actual en el cursor. Reciben el nombre de actualizaciones posicionadas.

Las actualizaciones posicionadas se realizan en la misma conexión que abrió el cursor. Esto permite que las modificaciones de datos compartan el mismo espacio de transacción que el cursor y evita que las actualizaciones se bloqueen con los bloqueos que mantiene el cursor.

Existen dos métodos para realizar actualizaciones posicionadas en un cursor:

  • La cláusula WHERE CURRENT OF de Transact-SQL en una instrucción UPDATE o DELETE.

  • Una función o método de actualización por posición de la API de base de datos como la función SQLSetPos de ODBC.

Realizar actualizaciones posicionadas con Transact-SQL

La cláusula WHERE CURRENT OF de Transact-SQL se utiliza normalmente en procedimientos almacenados, desencadenadores y scripts de Transact-SQL cuando es preciso realizar modificaciones basadas en filas específicas de un cursor. El procedimiento almacenado, el desencadenador o el script realizará las acciones siguientes:

  • Declarar (DECLARE) y abrir (OPEN) un cursor.

  • Utilizar instrucciones FETCH para situarse en una fila del cursor.

  • Ejecutar una instrucción UPDATE o DELETE con la cláusula WHERE CURRENT OF. Utilizar el cursor_name de la instrucción DECLARE como cursor_name en la cláusula WHERE CURRENT OF.

Realizar actualizaciones posicionadas con las API

Los cursores creados mediante las funciones y métodos OLE DB y ADO no se utilizan en las cláusulas WHERE CURRENT OF porque no tienen nombre. Sin embargo, ODBC admite la obtención de un nombre para un cursor de servidor de la API con la función SQLGetCursorName. Tras configurar los atributos del cursor y abrir un cursor mediante la ejecución de una instrucción de Transact-SQL, utilice la función SQLGetCursorName para obtener un nombre para el cursor. Tras situarse en el cursor, ejecute una instrucción UPDATE o DELETE con la cláusula WHERE CURRENT OF que haga referencia al nombre que devuelve SQLGetCursorName. No se recomienda este método. Es mejor utilizar las funciones de actualización posicionada de la API de ODBC.

Las API de bases de datos admiten dos métodos diferentes para realizar operaciones posicionadas en cursores de servidor de la API. ODBC admite un modelo, OLE DB y ADO el otro.

En ODBC, enlace las columnas del cursor con variables de programa y, a continuación, sitúese en una fila específica de un cursor. Si realiza una actualización posicionada, cambie los valores de los datos de las variables de programa por los valores nuevos. Llame a la función SQLSetPos para realizar la operación posicionada.

Estas funciones tienen las siguientes opciones:

  • SQLSetPos(SQL_POSITION)
    Sólo en ODBC, sitúa el cursor de ODBC en una fila específica del conjunto de filas actual.

  • SQLSetPos(SQL_REFRESH)
    Actualiza las variables de programa enlazadas a las columnas del conjunto de resultados mediante los valores de la fila en la que está situado el cursor actualmente.

  • SQLSetPos(SQL_UPDATE)
    Actualiza la fila actual del cursor mediante los valores almacenados en las variables de programa que están enlazadas a las columnas del conjunto de resultados.

  • SQLSetPos(SQL_DELETE)
    Elimina la fila actual del cursor.

OLE DB y ADO utilizan un modelo diferente para admitir las actualizaciones posicionadas.

En OLE DB, una vez situado en una fila del conjunto de filas, llame a los métodos IRowsetChange::SetData o IRowsetChange::DeleteRows para realizar actualizaciones posicionadas. Si el proveedor OLE DB admite IRowsetUpdate::Update, los cambios realizados con los métodos IRowsetChange se guardan en la caché hasta que se llama a IRowsetUpdate::Update. Si el proveedor OLE DB no admite IRowsetUpdate::Update, los cambios realizados con los métodos IRowsetChange se efectúan inmediatamente.

En ADO, una vez situado en una fila del conjunto de registros, llame a los métodos Update o Delete del objeto Recordset para llevar a cabo actualizaciones posicionadas. Si el proveedor OLE DB admite IRowsetUpdate::Update, los cambios realizados con los métodos Update o Delete del objeto Recordset se almacenan en la caché hasta que se llama al método UpdateBatch del objeto Recordset. Si el proveedor OLE DB no admite IRowsetUpdate::Update, los cambios realizados con los métodos Update o Delete del objeto Recordset se efectúan inmediatamente.