Типы курсоров (драйвер PDO_SQLSRV)
Драйвер PDO_SQLSRV позволяет создавать прокручиваемые результаты с помощью одного из нескольких курсоров.
Сведения об указании курсоров для драйвера PDO_SQLSRV и примеры кода вы найдете в описании PDO::prepare.
PDO_SQLSRV и курсоры на стороне сервера
До версии 3.0 драйверов Майкрософт для PHP для SQL Server драйвер PDO_SQLSRV позволил создать результирующий набор с серверным или статическим курсором. Начиная с версии 3.0 драйверов Майкрософт для PHP для SQL Server, набор ключей и динамические курсоры также доступны.
Тип курсора на стороне сервера вы можете указать с помощью PDO::prepare из следующего списка типов:
PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY
PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
Чтобы запросить динамический, статический курсор или курсор с набором ключей, укажите PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
и передайте соответствующее значение в PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
. Для курсоров на стороне сервера в PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE
можно передать следующие значения:
PDO::SQLSRV_CURSOR_DYNAMIC
PDO::SQLSRV_CURSOR_STATIC
PDO::SQLSRV_CURSOR_KEYSET
PDO_SQLSRV и курсоры на стороне клиента
Курсоры на стороне клиента были добавлены в версии 3.0 драйверов Майкрософт для PHP для SQL Server и позволяют кэшировать весь результирующий набор в памяти. Одним из их преимуществ является то, что после выполнения запроса доступно количество строк.
Курсоры на стороне клиента следует использовать только для малых и средних результирующих наборов. Для больших результирующих наборов следует использовать курсоры на стороне сервера.
При использовании курсора на стороне клиента запрос будет возвращать значение false, если буфер недостаточно велик для хранения полного результирующего набора. Вы можете увеличить размер этого буфера вплоть до максимального объема памяти PHP.
Размер буфера для результирующего набора можно увеличить с помощью атрибута PDO::SQLSRV_ATTR_CLIENT_BUFFER_MAX_KB_SIZE
в PDO::setAttribute или PDOStatement::setAttribute. Также максимальный размер буфера можно задать в файле php.ini параметром pdo_sqlsrv.client_buffer_max_kb_size (например, pdo_sqlsrv.client_buffer_max_kb_size = 1024).
Вы можете запросить курсор на стороне клиента с помощью PDO::prepare, указав тип курсора PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL
, а затем указать PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED
.
Пример
В следующем примере показано, как указать буферизованный курсор.
<?php
$database = "AdventureWorks";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server ; Database = $database", "", "");
$query = "select * from Person.ContactType";
$stmt = $conn->prepare( $query, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL, PDO::SQLSRV_ATTR_CURSOR_SCROLL_TYPE => PDO::SQLSRV_CURSOR_BUFFERED));
$stmt->execute();
print $stmt->rowCount();
echo "\n";
while ( $row = $stmt->fetch( PDO::FETCH_ASSOC ) ){
print "$row[Name]\n";
}
echo "\n..\n";
$row = $stmt->fetch( PDO::FETCH_BOTH, PDO::FETCH_ORI_FIRST );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_ASSOC, PDO::FETCH_ORI_REL, 1 );
print "$row[Name]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT );
print "$row[1]\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR );
print "$row[1]..\n";
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, 0 );
print_r($row);
$row = $stmt->fetch( PDO::FETCH_NUM, PDO::FETCH_ORI_LAST );
print_r($row);
?>