커서Cursors

관계형 데이터베이스에서의 연산은 전체 행 집합에 적용됩니다.Operations in a relational database act on a complete set of rows. 예를 들어 SELECT 문에 의해 반환된 행 집합은 문의 WHERE 절 조건을 만족하는 모든 행으로 구성됩니다.For example, the set of rows returned by a SELECT statement consists of all the rows that satisfy the conditions in the WHERE clause of the statement. SELECT 문에 의해 반환된 전체 행 집합을 결과 집합이라고 합니다.This complete set of rows returned by the statement is known as the result set. 응용 프로그램, 특히 대화형 온라인 응용 프로그램에서는 전체 결과 집합을 한 단위로 사용하므로 항상 효과적으로 작업할 수는 없습니다.Applications, especially interactive online applications, cannot always work effectively with the entire result set as a unit. 이러한 응용 프로그램에는 한 번에 한 행이나 적은 행 블록을 사용하여 작업하는 메커니즘이 필요합니다.These applications need a mechanism to work with one row or a small block of rows at a time. 커서는 이러한 메커니즘을 제공하는 결과 집합에 대한 확장입니다.Cursors are an extension to result sets that provide that mechanism.

커서는 다음과 같이 결과 처리를 확장합니다.Cursors extend result processing by:

  • 결과 집합의 특정 행에 위치를 정할 수 있습니다.Allowing positioning at specific rows of the result set.

  • 결과 집합의 현재 위치에서 한 행 또는 행 블록을 검색합니다.Retrieving one row or block of rows from the current position in the result set.

  • 결과 집합의 현재 위치에 있는 행 데이터를 수정할 수 있습니다.Supporting data modifications to the rows at the current position in the result set.

  • 결과 집합에 나타난 데이터베이스 데이터에 대해 다른 사용자가 변경한 내용을 여러 가지 수준으로 볼 수 있습니다.Supporting different levels of visibility to changes made by other users to the database data that is presented in the result set.

  • 스크립트, 저장 프로시저 및 트리거의 Transact-SQLTransact-SQL 문에서 결과 집합의 데이터에 액세스할 수 있도록 합니다.Providing Transact-SQLTransact-SQL statements in scripts, stored procedures, and triggers access to the data in a result set.

개념Concepts

커서 구현Cursor Implementations
SQL ServerSQL Server 에서는 세 가지 커서 구현을 지원합니다. SQL ServerSQL Server supports three cursor implementations.

Transact-SQL 커서Transact-SQL cursors
DECLARE CURSOR 구문을 기반으로 하며 주로 Transact-SQLTransact-SQL 스크립트, 저장 프로시저 및 트리거에 사용됩니다.Are based on the DECLARE CURSOR syntax and are used mainly in Transact-SQLTransact-SQL scripts, stored procedures, and triggers. Transact-SQLTransact-SQL 커서는 서버에 구현되며 클라이언트가 서버로 보내는 Transact-SQLTransact-SQL 문으로 관리됩니다. statements sent from the client to the server. 또한 일괄 처리, 저장 프로시저 또는 트리거에 포함될 수 있습니다.They may also be contained in batches, stored procedures, or triggers.

API(응용 프로그래밍 인터페이스) 서버 커서Application programming interface (API) server cursors
OLE DB와 ODBC의 API 커서 함수를 지원합니다.Support the API cursor functions in OLE DB and ODBC. API 서버 커서는 서버에 구현됩니다.API server cursors are implemented on the server. 클라이언트 응용 프로그램에서 API 커서 함수를 호출할 때마다 SQL ServerSQL Server Native Client OLE DB 공급자나 ODBC 드라이버가 API 서버 커서에 대한 동작 요청을 서버에 전송합니다.Each time a client application calls an API cursor function, the SQL ServerSQL Server Native Client OLE DB provider or ODBC driver transmits the request to the server for action against the API server cursor.

클라이언트 커서Client cursors
ADO API를 구현하는 DLL과 SQL ServerSQL Server Native Client ODBC 드라이버에서 내부적으로 구현됩니다.Are implemented internally by the SQL ServerSQL Server Native Client ODBC driver and by the DLL that implements the ADO API. 클라이언트 커서는 모든 결과 집합 행을 클라이언트에 캐시하여 구현됩니다.Client cursors are implemented by caching all the result set rows on the client. 클라이언트 응용 프로그램에서 API 커서 함수를 호출할 때마다 SQL ServerSQL Server Native Client ODBC 드라이버나 ADO DLL이 클라이언트에 캐시된 결과 집합 행에 대해 커서 작업을 수행합니다.Each time a client application calls an API cursor function, the SQL ServerSQL Server Native Client ODBC driver or the ADO DLL performs the cursor operation on the result set rows cached on the client.

커서 유형Type of Cursors
정방향 전용Forward-only
정방향 전용 커서는 스크롤을 지원하지 않으며 커서의 처음부터 끝까지 순차적인 행 인출만 지원합니다.A forward-only cursor does not support scrolling; it supports only fetching the rows serially from the start to the end of the cursor. 행은 인출될 때까지 데이터베이스에서 검색되지 않습니다.The rows are not retrieved from the database until they are fetched. 현재 사용자가 만들거나 다른 사용자가 커밋하여 결과 집합의 행에 영향을 주는 모든 INSERT, UPDATE 및 DELETE 문의 결과는 행이 커서에서 인출될 때 표시됩니다.The effects of all INSERT, UPDATE, and DELETE statements made by the current user or committed by other users that affect rows in the result set are visible as the rows are fetched from the cursor.

이 커서는 뒤로 스크롤할 수 없기 때문에 행이 인출된 후 데이터베이스 행의 변경 내용은 대부분 커서를 통해 표시되지 않습니다.Because the cursor cannot be scrolled backward, most changes made to rows in the database after the row was fetched are not visible through the cursor. 클러스터형 인덱스가 적용되는 열을 업데이트하는 경우와 같이 결과 집합 내의 행 위치를 결정하는 데 사용되는 값이 수정되면 커서를 통해 수정된 값이 표시됩니다.In cases where a value used to determine the location of the row within the result set is modified, such as updating a column covered by a clustered index, the modified value is visible through the cursor.

데이터베이스 API 커서 모델에서는 정방향 전용 커서가 고유한 커서 유형으로 간주되지만 SQL ServerSQL Server 에서는 그렇지 않습니다.Although the database API cursor models consider a forward-only cursor to be a distinct type of cursor, SQL ServerSQL Server does not. SQL ServerSQL Server 에서는 정방향 전용과 스크롤이 모두 정적, 키 집합 및 동적 커서에 적용할 수 있는 옵션으로 간주됩니다. considers both forward-only and scroll as options that can be applied to static, keyset-driven, and dynamic cursors. Transact-SQLTransact-SQL 커서는 정방향 전용 정적, 키 집합 및 동적 커서를 지원합니다. cursors support forward-only static, keyset-driven, and dynamic cursors. 데이터베이스 API 커서 모델은 정적, 키 집합 및 동적 커서가 항상 스크롤 가능하다고 가정합니다.The database API cursor models assume that static, keyset-driven, and dynamic cursors are always scrollable. 데이터베이스 API 커서 특성 또는 속성을 정방향 전용으로 설정하면 SQL ServerSQL Server 가 이를 정방향 전용 동적 커서로 구현합니다.When a database API cursor attribute or property is set to forward-only, SQL ServerSQL Server implements this as a forward-only dynamic cursor.

정적Static
정적 커서의 전체 결과 집합은 커서가 열릴 때 tempdb 에 작성됩니다.The complete result set of a static cursor is built in tempdb when the cursor is opened. 정적 커서는 항상 커서가 열렸을 당시의 결과 집합을 표시합니다.A static cursor always displays the result set as it was when the cursor was opened. 정적 커서는 변경 내용을 거의 검색하지 못하는 반면 스크롤 시 리소스를 거의 소비하지 않습니다.Static cursors detect few or no changes, but consume relatively few resources while scrolling.

커서는 결과 집합의 멤버 자격이나 결과 집합을 구성하는 행의 열 값 변경에 영향을 주는 데이터베이스 변경 내용을 반영하지 않습니다.The cursor does not reflect any changes made in the database that affect either the membership of the result set or changes to the values in the columns of the rows that make up the result set. 정적 커서는 커서가 열린 후 데이터베이스에 삽입된 새 행이 커서 SELECT 문의 검색 조건과 일치하는 경우에도 이러한 행을 표시하지 않습니다.A static cursor does not display new rows inserted in the database after the cursor was opened, even if they match the search conditions of the cursor SELECT statement. 또한 결과 집합을 구성하는 행을 다른 사용자가 업데이트할 경우 새 데이터 값이 정적 커서에 표시되지 않습니다.If rows making up the result set are updated by other users, the new data values are not displayed in the static cursor. 정적 커서는 커서가 열린 후 데이터베이스에서 삭제된 행을 표시합니다.The static cursor displays rows deleted from the database after the cursor was opened. 커서를 닫았다가 다시 열지 않는 한 UPDATE, INSERT 또는 DELETE 작업은 정적 커서에 반영되지 않으며 이는 커서를 연 동일한 연결을 사용하여 수정한 경우에도 마찬가지입니다.No UPDATE, INSERT, or DELETE operations are reflected in a static cursor (unless the cursor is closed and reopened), not even modifications made using the same connection that opened the cursor.

SQL ServerSQL Server 정적 커서는 항상 읽기 전용입니다. static cursors are always read-only.

정적 커서의 결과 집합은 tempdb의 작업 테이블에 저장되므로 결과 집합의 행 크기가 SQL ServerSQL Server 테이블의 최대 행 크기를 초과할 수 없습니다.Because the result set of a static cursor is stored in a work table in tempdb, the size of the rows in the result set cannot exceed the maximum row size for a SQL ServerSQL Server table.

Transact-SQLTransact-SQL 에서는 정적 커서와 무관한 용어를 사용합니다. uses the term insensitive for static cursors. 일부 데이터베이스 API에서는 정적 커서를 스냅숏 커서로 식별합니다.Some database APIs identify them as snapshot cursors.

KeysetKeyset
키 집합 커서의 멤버 자격과 행 순서는 커서가 열릴 때 고정됩니다.The membership and order of rows in a keyset-driven cursor are fixed when the cursor is opened. 키 집합 커서는 키 집합이라는 고유 식별자 집합으로 제어되며Keyset-driven cursors are controlled by a set of unique identifiers, keys, known as the keyset. 키는 결과 집합에서 행을 고유하게 식별하는 열 집합으로 작성됩니다.The keys are built from a set of columns that uniquely identify the rows in the result set. 키 집합은 커서가 열려 있을 때 SELECT 문의 조건에 맞는 모든 행의 키 값 집합입니다.The keyset is the set of the key values from all the rows that qualified for the SELECT statement at the time the cursor was opened. 키 집합 커서의 키 집합은 커서가 열려 있을 때 tempdb 에 작성됩니다.The keyset for a keyset-driven cursor is built in tempdb when the cursor is opened.

DynamicDynamic
동적 커서는 정적 커서의 반대 개념입니다.Dynamic cursors are the opposite of static cursors. 커서를 통해 스크롤할 때 동적 커서는 행의 모든 변경 내용을 결과 집합에 반영합니다.Dynamic cursors reflect all changes made to the rows in their result set when scrolling through the cursor. 따라서 인출할 때마다 결과 집합에서 행의 데이터 값, 순서 및 멤버 자격이 변경될 수 있습니다.The data values, order, and membership of the rows in the result set can change on each fetch. 모든 사용자가 실행한 모든 UPDATE, INSERT 및 DELETE 문은 커서를 통해 볼 수 있습니다.All UPDATE, INSERT, and DELETE statements made by all users are visible through the cursor. SQLSetPos 와 같은 API 함수 또는 Transact-SQLTransact-SQL WHERE CURRENT OF 절을 사용하여 커서를 통해 업데이트한 경우 즉시 그 결과를 볼 수 있습니다.Updates are visible immediately if they are made through the cursor using either an API function such as SQLSetPos or the Transact-SQLTransact-SQL WHERE CURRENT OF clause. 커서 트랜잭션 격리 수준을 커밋되지 않은 읽기로 설정한 경우를 제외하고는 커서 외부에서 수행된 업데이트는 커밋될 때까지 볼 수 없습니다.Updates made outside the cursor are not visible until they are committed, unless the cursor transaction isolation level is set to read uncommitted. 동적 커서 계획은 공간 인덱스를 사용하지 않습니다.Dynamic cursor plans never use spatial indexes.

커서 요청Requesting a Cursor

SQL ServerSQL Server 에서는 두 가지 방법으로 커서를 요청할 수 있습니다. supports two methods for requesting a cursor:

  • Transact-SQLTransact-SQL

    Transact-SQLTransact-SQL 언어는 ISO 커서 구문을 본뜬 커서 사용 구문을 지원합니다.The Transact-SQLTransact-SQL language supports a syntax for using cursors modeled after the ISO cursor syntax.

  • 데이터베이스 API(응용 프로그래밍 인터페이스) 커서 함수Database application programming interface (API) cursor functions

    SQL ServerSQL Server 에서는 다음과 같은 데이터베이스 API의 커서 기능을 지원합니다. supports the cursor functionality of these database APIs:

    • ADO( MicrosoftMicrosoft ActiveX Data Object)ADO ( MicrosoftMicrosoft ActiveX Data Object)

    • OLE DBOLE DB

    • ODBC(Open Database Connectivity)ODBC (Open Database Connectivity)

    응용 프로그램에서 이러한 두 가지 커서 요청 방법을 혼합하여 사용할 수 없습니다.An application should never mix these two methods of requesting a cursor. API를 사용하여 커서 동작을 지정한 응용 프로그램은 또한 Transact-SQLTransact-SQL DECLARE CURSOR 문을 실행하여 Transact-SQLTransact-SQL 커서를 요청할 수 없습니다.An application that has used the API to specify cursor behaviors should not then execute a Transact-SQLTransact-SQL DECLARE CURSOR statement to also request a Transact-SQLTransact-SQL cursor. 모든 API 커서 특성을 기본값으로 설정한 경우에만 DECLARE CURSOR를 실행해야 합니다.An application should only execute DECLARE CURSOR if it has set all the API cursor attributes back to their defaults.

    Transact-SQLTransact-SQL 및 API 커서 모두 요청되지 않은 경우 SQL ServerSQL Server 는 기본적으로 기본 결과 집합이라고 하는 전체 결과 집합을 응용 프로그램에 반환합니다.If neither a Transact-SQLTransact-SQL nor API cursor has been requested, SQL ServerSQL Server defaults to returning a complete result set, known as a default result set, to the application.

커서 프로세스Cursor Process

Transact-SQLTransact-SQL 커서와 API 커서는 구문이 서로 다르지만 모든 SQL ServerSQL Server 커서에 대해 다음과 같은 일반 프로세스를 사용합니다. cursors:

  1. 커서와 Transact-SQLTransact-SQL 문의 결과 집합을 연결하고 커서 행의 업데이트 가능 여부 등 커서의 특성을 정의합니다.Associate a cursor with the result set of a Transact-SQLTransact-SQL statement, and define characteristics of the cursor, such as whether the rows in the cursor can be updated.

  2. Transact-SQLTransact-SQL 문을 실행하여 커서를 채웁니다.Execute the Transact-SQLTransact-SQL statement to populate the cursor.

  3. 보려는 커서의 행을 검색합니다.Retrieve the rows in the cursor you want to see. 커서에서 한 행이나 한 행 블록을 검색하는 작업을 인출이라고 합니다.The operation to retrieve one row or one block of rows from a cursor is called a fetch. 일련의 인출 작업을 수행하여 행을 앞으로 또는 뒤로 검색하는 것을 스크롤이라고 합니다.Performing a series of fetches to retrieve rows in either a forward or backward direction is called scrolling.

  4. 또는 커서의 현재 위치에 있는 행에 대해 수정 작업(업데이트 또는 삭제)을 수행합니다.Optionally, perform modification operations (update or delete) on the row at the current position in the cursor.

  5. 커서를 닫습니다.Close the cursor.

Cursor Behaviors How Cursors Are ImplementedCursor Behaviors How Cursors Are Implemented

참고 항목See Also

DECLARE CURSOR(Transact-SQL) DECLARE CURSOR (Transact-SQL)
커서(Transact-SQL) Cursors (Transact-SQL)
커서 함수(Transact-SQL) Cursor Functions (Transact-SQL)
커서 저장 프로시저(Transact-SQL) Cursor Stored Procedures (Transact-SQL)