i.커서 선언
이 단계에서는 요구 사항에 따라 생성되는 커서의 속성과 결과 집합을 지정해야 합니다. 커서를 지정하는 방법에는 두 가지가 있습니다.
양식 1(ANSI 92)
DECLARE 커서_이름 [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE][OF 열_목록]}]
양식 2
DECLARE 커서_이름 CURSOR
[LOCAL | {읽기 전용 | 업데이트 ][OF 열_목록]}]
INSENSITIVE 키워드는 검색된 결과 집합에 대해 임시 복사본이 생성되고 이 임시 복사본에서 향후 데이터를 얻을 것임을 나타냅니다. 후속 커서 처리 중에 원래 기본 테이블의 데이터가 변경되면 해당 데이터는 커서에 표시되지 않습니다. 이 민감하지 않은 커서는 데이터 변경을 허용하지 않습니다.
SCROLL 키워드는 커서가 어떤 방향으로든 스크롤될 수 있음을 나타냅니다. 모든 가져오기 옵션(첫 번째, 마지막, 다음, 상대, 절대)을 커서에서 사용할 수 있습니다. 이 옵션을 생략하면 커서는 앞으로(다음)만 스크롤할 수 있습니다.
Select_statement는 SQL 문으로 생성된 결과 집합을 지정합니다. Transact SQL 문 COMPUTE, COMPUTE BY, FOR BROWSE 및 INTO는 커서 선언의 select 문에서 허용되지 않습니다.
READ ONLY는 커서 결과 집합에서 데이터 수정이 허용되지 않음을 나타냅니다.
UPDATE 키워드는 커서의 결과 집합을 수정할 수 있음을 나타냅니다.
OF column_list는 수정될 수 있는 결과 집합의 열을 지정합니다. 기본적으로(UPDATE 키워드 사용) 모든 열을 수정할 수 있습니다.
LOCAL 키워드는 커서가 로컬이며 선언된 프로세스 내에서만 사용할 수 있음을 나타냅니다.
GLOBAL 키워드를 사용하면 커서가 전체 연결에 전체적으로 표시됩니다. 연결이 활성화되면 언제든지 전역 커서를 사용할 수 있습니다. 연결이 종료된 경우에만 커서를 더 이상 사용할 수 없습니다.
FORWARD_ONLY는 커서가 앞으로만 스크롤할 수 있도록 지정합니다.
STATIC 커서는 INSENSITIVE 커서와 동일합니다.
KEYSET은 선택한 행의 순서를 지정합니다. SQL Server는 결과 집합에서 임시 키워드 집합을 만듭니다. 데이터베이스의 키워드가 아닌 열을 수정하면 해당 내용이 커서에 표시됩니다. 고정된 키워드 집합이므로 키워드 열의 수정 사항이나 새로 삽입된 열은 표시되지 않습니다.
DYNAMIC은 커서가 결과 세트에 대한 모든 수정 사항을 반영하도록 지정합니다.
SCROLL_LOCK은 커서 작업의 성공을 보장하기 위해 수정 또는 삭제를 잠그는 것입니다.
OPTIMISTIC은 커서를 통한 수정 또는 삭제가 성공하지 못할 것을 지정합니다.
참고:
· SELECT 문에 DISTINCT, UNION 또는 GROUP BY 문이 사용되고 선택 항목에 집계 식이 포함되어 있는 경우 커서는 자동으로 INSENSITIVE 커서가 됩니다.
· 기본 테이블에 고유 인덱스가 없으면 커서는 INSENSITIVE 커서로 생성됩니다.
· SELECT 문에 ORDER BY가 포함되어 있고 ORDER BY 열이 고유한 행 식별자가 아닌 경우 DYNAMIC 커서가 KEYSET 커서로 변환됩니다. KEYSET 커서를 열 수 없으면 INSENSITIVE 커서로 변환됩니다. SQL ANSI-92 구문을 사용하여 정의되었지만 INSENSITIVE 키워드가 없는 커서의 경우에도 마찬가지입니다.
커서 열기
커서를 열면 결과 세트가 생성됩니다. 커서는 DECLARE 문을 통해 정의되지만 실제 실행은 OPEN 문을 통해 이루어집니다. 구문은 다음과 같습니다.
OPEN { { [GLOBAL] 커서_이름 } | 커서_변수_이름}
GLOBAL은 전역 커서를 지정합니다.
Cursor_name은 열린 커서의 이름입니다.
Cursor_variable_name은 참조되는 커서의 변수 이름입니다. 변수는 커서 유형이어야 합니다.
커서가 열린 후 시스템 변수 @@cursor_rows를 사용하여 결과 집합의 행 수를 감지할 수 있습니다. @@cursor_rows가 음수이면 커서가 비동기적으로 마이그레이션된다는 의미이며, 절대값(@@cursor_rows가 -5인 경우 절대값은 5)은 현재 결과 집합의 행 수입니다. 비동기 커서를 사용하면 커서가 완전히 마이그레이션되는 동안에도 사용자는 커서 결과에 계속 액세스할 수 있습니다.
III.커서에서 값을 가져옵니다
커서에서 값을 가져오는 과정에서 결과집중의 각 줄에서 앞뒤로 이동하여 처리할 수 있습니다. 커서가 스크롤 가능하도록 정의된 경우(선언 시 SCROLL 키워드 사용) 결과 집합의 모든 행을 언제든지 검색할 수 있습니다. 비스크롤 커서의 경우 인출 작업은 현재 행 옆의 행에서만 수행할 수 있습니다. 결과 세트는 지역 변수에서 검색할 수 있습니다. Fetch 명령의 구문은 다음과 같습니다.
FETCH [NEXT | FIRST | LAST | RELATIVE {n | @nvar}]
FROM [GLOBAL] 커서_이름 }
[INTO @variable_name ][,...n]]
NEXT는 현재 행의 다음 행에서 값을 가져오도록 지정합니다.
PRIOR는 현재 행의 이전 행에서 값을 가져오도록 지정합니다.
FIRST는 결과 집합의 첫 번째 행입니다.
LAST는 결과 집합의 마지막 행입니다.
ABSOLUTE n은 결과 집합의 n번째 행을 나타냅니다. 행 번호는 지역 변수를 통해 전파될 수도 있습니다. 줄 번호는 0부터 시작하므로 n이 0이면 줄을 가져올 수 없습니다.
RELATIVE n은 가져올 행이 현재 행 앞의 n 행 또는 뒤의 n 행임을 의미합니다. 값이 양수이면 가져올 행은 현재 행보다 n 행 앞에 위치합니다. 값이 음수이면 현재 행 다음의 행이 반환됩니다.
INTO @cursor_variable_name은 커서 컬럼 값이 저장되는 변수 목록을 나타냅니다. 이 목록의 변수 수는 DECLARE 문의 select 문에서 사용하는 변수 수와 동일해야 합니다. 변수의 데이터 유형도 선택한 열의 데이터 유형과 동일해야 합니다. 변수의 값은 다음에 FETCH 문이 사용될 때까지 유지됩니다.
각 FETCH 실행은 시스템 변수 @@fetch_status에 저장됩니다. FETCH가 성공하면 @@fetch_status가 0으로 설정됩니다. -1의 @@fetch_status는 결과 집합의 일부에 도달했음을 나타냅니다(예: 커서가 열린 후 기본 테이블의 행이 삭제됨). @@fetch_status를 사용하여 커서 처리 루프를 구성할 수 있습니다.
예:
DECLARE @iname char(20), @fname char(20)
OPEN Author_cur
author_cur에서 먼저 가져오기 INTO @iname, @fname
WHILE @@fetch_status = 0
BEGIN
IF @fname = 'Albert'
“Albert Ringer를 찾았습니다”
ELSE
“Other Ringer”를 인쇄
author_cur에서 NEXT FROM INTO @iname, @fname
끝
~ . 커서가 닫힌 후에는 FETCH 작업을 수행할 수 없습니다. 여전히 FETCH 문을 사용해야 하는 경우 커서를 다시 열어야 합니다. 구문은 다음과 같습니다.
CLOSE [GLOBAL] 커서_이름 | 커서_변수_이름
v. > v. DEALLOCATE 문은 데이터 구조 및 커서에 대한 잠금을 해제합니다. 구문은 다음과 같습니다.
DEALLOCATE [GLOBAL] 커서_이름 | 커서_변수_이름
커서의 전체 예는 다음과 같습니다.
USE master
GO
CREATE PROCEDURE sp_BuildIndexes
AS
DECLARE @TableName sysname, @msg varchar(100), @cmd varchar(100)
DECLARE table_cur CURSOR FOR
SELECT name FROM sysobjects WHERE type='u'
OPEN table_cur
table_cur INTO @TableName
WHILE @@fetch_status = 0
BEGIN
IF @@fetch_status = -2
계속
선택 @msg = “ 테이블에 대한 인덱스 작성”+@TableName+”…”
PRINT @msg
SELECT @cmd = “DBCC DBREINDEX ('”+@TableName+”')”
EXEC (@cmd)
PRINT “ “
FETCH NEXT FROM table_cur INTO @TableName
END
DEALLOCATE table_cur
GO
다음 스크립트는 PUBS 데이터베이스 USE pubs
GO
EXEC ap_BuildIndexes에 대해 sp_BuildIndexes
를 실행합니다.
참고: 위의 내용은 사용자 정의 시스템 저장 프로시저를 생성하는 예이기도 합니다.
임시테이블 이용
임시 테이블은 TempDB에서 생성된 테이블입니다. 임시 테이블의 이름은 모두 "#"으로 시작합니다. 임시 테이블의 범위는 임시 테이블을 생성한 연결입니다. 임시 테이블은 두 연결 간에 공유될 수 없으므로 연결이 닫히면 임시 테이블은 삭제됩니다. 저장 프로시저 내에서 임시 테이블이 생성된 경우 임시 테이블의 범위는 저장 프로시저 또는 저장 프로시저에서 호출한 모든 저장 프로시저 내에 있습니다. 연결 간에 임시 테이블을 공유해야 하는 경우 전역 임시 테이블을 사용해야 합니다. 전역 임시 테이블은 "##" 기호로 시작하며 SQL Server를 다시 시작할 때까지 데이터베이스에 존재합니다. 이러한 임시 테이블이 생성되면 모든 사용자가 해당 테이블에 액세스할 수 있습니다. 임시 테이블에는 권한을 명시적으로 지정할 수 없습니다. 임시 테이블은 중간 결과를 저장하는 기능을 제공합니다. 때로는 임시 테이블이 복잡한 쿼리를 두 개의 쿼리로 나누어 성능을 향상시킬 수도 있습니다. 이는 먼저 첫 번째 쿼리의 결과를 임시 테이블에 저장한 다음 두 번째 쿼리에서 임시 테이블을 사용하여 달성할 수 있습니다. 기존 절차 중에 큰 테이블의 하위 집합이 여러 번 사용되는 경우 임시 테이블을 사용하는 것이 좋습니다. 이 경우 후속 조인에 사용하기 위해 데이터의 하위 집합을 임시 테이블에 보관하면 성능이 크게 향상될 수 있습니다. 임시 테이블에도 인덱스를 생성할 수 있습니다.
위 내용은 SQL Server 7.0 시작하기(7) 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!