Especificar un tipo de cursor y seleccionar filas
A partir de la versión 1.1 del Controlador de SQL Server para PHP, puede crear un conjunto de resultados con filas a las que se puede tener acceso en cualquier orden, en función del tipo de cursor.
Tipos de cursor
Al crear un conjunto de resultados con sqlsrv_query o sqlsrv_prepare, puede especificar el tipo de cursor. De manera predeterminada, se usa un cursor de solo avance. Con un cursor de solo avance, se puede avanzar por las filas de una en una, empezando en la primera fila del conjunto de resultados y hasta llegar al final del conjunto. Era el único tipo de cursor disponible en la versión 1.0 del Controlador de SQL Server para PHP.
A partir de la versión 1.1 del Controlador de SQL Server para PHP, puede crear un conjunto de resultados con un cursor de desplazamiento, que permite tener acceso a cualquier fila del conjunto de resultados, en cualquier orden. En la siguiente tabla se muestran los valores que se pueden pasar a la opción Scrollable en sqlsrv_query o sqlsrv_prepare.
Opción | Descripción |
---|---|
SQLSRV_CURSOR_FORWARD |
Este tipo de cursor permite avanzar por las filas de una en una, empezando en la primera fila del conjunto de resultados y hasta llegar al final del conjunto. Es el tipo de cursor predeterminado. sqlsrv_num_rows devuelve un error para los conjuntos de resultados creados con este tipo de cursor. forward es la forma abreviada de SQLSRV_CURSOR_FORWARD. |
SQLSRV_CURSOR_STATIC |
Este cursor permite tener acceso a las filas en cualquier orden, pero no reflejará los cambios realizados en la base de datos. static es la forma abreviada de SQLSRV_CURSOR_STATIC. |
SQLSRV_CURSOR_DYNAMIC |
Este cursor permite tener acceso a las filas en cualquier orden y reflejará los cambios realizados en la base de datos. sqlsrv_num_rows devuelve un error para los conjuntos de resultados creados con este tipo de cursor. dynamic es la forma abreviada de SQLSRV_CURSOR_DYNAMIC. |
SQLSRV_CURSOR_KEYSET |
Este cursor permite tener acceso a las filas en cualquier orden. Con todo, un cursor de conjunto de claves no actualiza el recuento de filas si se elimina una fila de la tabla (una fila eliminada se devuelve sin valores). keyset es la forma abreviada de SQLSRV_CURSOR_KEYSET. |
Si una consulta genera varios conjuntos de resultados, la opción Scrollable se aplica a todos ellos.
Seleccionar filas de conjuntos de resultados
Después de crear un conjunto de resultados estático, dinámico o de conjunto de claves, puede usar sqlsrv_fetch, sqlsrv_fetch_array o sqlsrv_fetch_object para especificar una fila.
En la siguiente tabla se describen los valores que se pueden especificar en el parámetro row.
Parámetro | Descripción |
---|---|
SQLSRV_SCROLL_NEXT |
Fila siguiente. Es el valor predeterminado, si no se especifica el parámetro row para un conjunto de resultados de desplazamiento. |
SQLSRV_SCROLL_PRIOR |
Fila anterior a la actual. |
SQLSRV_SCROLL_FIRST |
Primera fila del conjunto de resultados. |
SQLSRV_SCROLL_LAST |
Última fila del conjunto de resultados. |
SQLSRV_SCROLL_ABSOLUTE |
Fila especificada con el parámetro offset. |
SQLSRV_SCROLL_RELATIVE |
Fila especificada con el parámetro offset a partir de la fila actual. Se admiten números negativos. |
Ejemplo
Descripción
En el siguiente ejemplo se muestra el efecto que tienen distintos cursores. En la línea 33 del ejemplo se observa la primera de tres instrucciones de consulta que especifican distintos cursores. Dos de las instrucciones de consulta tienen comentarios. Use un cursor distinto cada vez que ejecute el programa, para ver el efecto que tiene la actualización de la base de datos en la línea 47.
Código
<?php
$server = "server_name";
$conn = sqlsrv_connect( $server, array( 'Database' => 'test' ));
if ( $conn === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_query( $conn, "DROP TABLE dbo.ScrollTest" );
if ( $stmt !== false ) {
sqlsrv_free_stmt( $stmt );
}
$stmt = sqlsrv_query( $conn, "CREATE TABLE ScrollTest (id int, value char(10))" );
if ( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 1, "Row 1" ));
if ( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 2, "Row 2" ));
if ( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 3, "Row 3" ));
if ( $stmt === false ) {
die( print_r( sqlsrv_errors(), true ));
}
$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'keyset' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));
$rows = sqlsrv_has_rows( $stmt );
if ( $rows != true ) {
die( "Should have rows" );
}
$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";
$stmt2 = sqlsrv_query( $conn, "delete from ScrollTest where id = 3" );
// or
// $stmt2 = sqlsrv_query( $conn, "UPDATE ScrollTest SET id = 4 WHERE id = 3" );
if ( $stmt2 !== false ) {
sqlsrv_free_stmt( $stmt2 );
}
$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>