다음을 통해 공유


커서 유형 지정 및 행 선택

SQL Server Driver for PHP 1.1 버전부터는 커서 유형에 따라 어떤 순서로도 액세스할 수 있는 행을 가진 결과 집합을 생성할 수 있습니다.

커서 유형

sqlsrv_query 또는 sqlsrv_prepare를 사용하여 결과 집합을 생성할 경우 커서 유형을 지정할 수 있습니다. 기본적으로 정방향 전용 커서가 사용됩니다. 정방향 전용 커서를 사용하면 결과 집합의 첫 행부터 시작해서 결과 집합의 끝에 도달할 때까지 한 번에 하나의 행을 이동할 수 있습니다. SQL Server Driver for PHP 1.0 버전에서는 이 커서 유형만 사용할 수 있었습니다.

SQL Server Driver for PHP 1.1 버전부터는 스크롤할 수 있는 커서를 사용하여 결과 집합을 생성할 수 있으므로 결과 집합의 행을 어떤 순서로도 액세스할 수 있습니다. 다음 표에서는 sqlsrv_query 또는 sqlsrv_prepare에서 Scrollable 옵션으로 전달할 수 있는 값을 나열합니다.

옵션 설명

SQLSRV_CURSOR_FORWARD

이 커서 유형을 사용하면 결과 집합의 첫 행부터 시작해서 결과 집합의 끝에 도달할 때까지 한 번에 하나의 행을 이동할 수 있습니다.

기본 커서 유형입니다.

sqlsrv_num_rows는 이 커서 유형을 사용하여 생성된 결과 집합에 대해 오류를 반환합니다.

forward는 SQLSRV_CURSOR_FORWARD의 약식 형태입니다.

SQLSRV_CURSOR_STATIC

이 커서를 사용하면 행을 어떤 순서로도 액세스할 수 있지만 데이터베이스의 변경 사항이 반영되지 않습니다.

static은 SQLSRV_CURSOR_STATIC의 약식 형태입니다.

SQLSRV_CURSOR_DYNAMIC

이 커서를 사용하면 행을 어떤 순서로도 액세스할 수 있으며 데이터베이스의 변경 사항이 반영됩니다.

sqlsrv_num_rows는 이 커서 유형을 사용하여 생성된 결과 집합에 대해 오류를 반환합니다.

dynamic은 SQLSRV_CURSOR_DYNAMIC의 약식 형태입니다.

SQLSRV_CURSOR_KEYSET

이 커서를 사용하면 어떤 순서로도 행을 액세스할 수 있습니다. 하지만 테이블에서 행이 삭제될 경우 키 집합 커서가 행 수를 업데이트하지 않으며 삭제된 행은 값 없이 반환됩니다.

keyset은 SQLSRV_CURSOR_KEYSET의 약식 형태입니다.

쿼리에서 여러 개의 결과 집합을 생성할 경우 Scrollable 옵션이 모든 결과 집합에 적용됩니다.

결과 집합에서 행 선택

정적, 동적, 또는 키 집합 결과 집합을 만들 경우 sqlsrv_fetch, sqlsrv_fetch_array 또는 sqlsrv_fetch_object를 사용하여 행을 지정할 수 있습니다.

다음 표에서는 row 매개 변수에 지정할 수 있는 값을 설명합니다.

매개 변수 설명

SQLSRV_SCROLL_NEXT

다음 행입니다. 스크롤할 수 있는 결과 집합에 대해 row 매개 변수를 지정하지 않을 경우 기본적으로 이 값이 사용됩니다.

SQLSRV_SCROLL_PRIOR

현재 행 앞에 있는 행입니다.

SQLSRV_SCROLL_FIRST

결과 집합의 첫 번째 행입니다.

SQLSRV_SCROLL_LAST

결과 집합의 마지막 행입니다.

SQLSRV_SCROLL_ABSOLUTE

offset 매개 변수로 지정된 행입니다.

SQLSRV_SCROLL_RELATIVE

현재 행에서 offset 매개 변수로 지정된 행입니다. 음수로도 지정할 수 있습니다.

설명

다음 예에서는 다양한 커서의 결과를 보여 줍니다. 예의 33번째 줄에는 서로 다른 커서를 지정하는 세 개의 쿼리 문 중 첫 번째 쿼리 문이 있습니다. 나머지 두 개의 쿼리 문은 주석으로 처리되어 있습니다. 프로그램을 실행할 때마다 서로 다른 커서 유형을 사용하여 47번째 줄에서 데이터베이스 업데이트가 어떻게 적용되는지 확인하십시오.

코드

<?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 );
?>

참고 항목

관련 자료

데이터 검색