9. transact – sql 고급

38
1 9. Transact – SQL 고고 고고고고 (DECLARE) DBMS 가 가가가 가가 가가가가가 가가가 가 가가 가가가 DECLARE 가가 DECLARE {{@local_variable data_type} | {@cursor_variable_name CURSOR} | {table_type_definition} }[,....n] < table_type_definition > ::= TABLE({<coloume_definition> | < table_constranit >} [,...n]) < column_definition > ::= column_name scalar_data_type [ COLLATE collation_name ] [[ DEFAULT constant_expression ] | IDENTITY[ ( seed, increment)]] [ ROWGUIDCOL ] [ < column_constraint> ]

Upload: ryu

Post on 10-Feb-2016

76 views

Category:

Documents


1 download

DESCRIPTION

9. Transact – SQL 고급. 변수선언 (DECLARE) DBMS 가 가지고 있는 로컬변수를 선언할 때 쓰는 키워드 DECLARE 구문 DECLARE {{@local_variable data_type} | {@cursor_variable_name CURSOR} | {table_type_definition} }[,....n] < table_type_definition > ::= - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 9. Transact  –  SQL  고급

1

9. Transact – SQL 고급 변수선언 (DECLARE)

DBMS 가 가지고 있는 로컬변수를 선언할 때 쓰는 키워드 DECLARE 구문

DECLARE {{@local_variable data_type}

| {@cursor_variable_name CURSOR} | {table_type_definition}

}[,....n] < table_type_definition > ::= TABLE({<coloume_definition> | < table_constranit >}[,...n]) < column_definition > ::= column_name scalar_data_type [ COLLATE collation_name ] [[ DEFAULT constant_expression ] | IDENTITY[ ( seed, increment)]] [ ROWGUIDCOL ] [ < column_constraint> ]

Page 2: 9. Transact  –  SQL  고급

2

9. Transact – SQL 고급 (cont) 변수선언 (DECLARE) <cont>

DECLARE 구문 (cont) < column_constraint > ::= {[ NULL | NOT NULL ] |[ PRIMARY KEY | UNIQUE ] | CHECK ( logical_expression ) } < table_constraint > ::= {{ PRIMARY KEY | UNIQUE } ( column_name [,...n]) | CHECK ( serch_condition) } 일반적으로 DECLARE @local_variable 을 사용 로컬변수 정의시 ‘@’를 사용 , T-SQL 에서 ‘@’가 붙은 단어는 변수로 분류 . VARCHAR 타입의 CustomerName 변수를 길이 20 으로 선언하는 예

DECLARE @CustomerName varchar(20)

Page 3: 9. Transact  –  SQL  고급

3

9. Transact – SQL 고급 (cont) 변수선언 (DECLARE) <cont>

예제 ( Northwind 데이터베이스 이용 ) 선언되 변수는 SET 또는 SELECT 를 이용하여 초기화 앞의 예 ‘ DECLARE @CustomerName varchar(20) ’는 다음과 같이 초기화

SET @CustomerName = ‘ByungJik Kim’SELECT @CustomerName = ‘ByungJik Kim’

myCount 라는 변수를 선언하고 Orders 테이블의 데이터의 개수를 세는 예 USE Northwind GO

DECLARE @myCount intSET @mycount = 0SELECT @mycount = count(*) FROM ordersSELECT @mycount

-- 결과----------- 830(1 row(s) affected)

Page 4: 9. Transact  –  SQL  고급

4

9. Transact – SQL 고급 (cont) 변수선언 (DECLARE) <cont>

예제 (cont) 1998 년 5 월 5 일 Order 된 내용이 어떤 제품을 주문했는가를 찾아주는 예 . DECLARE @ordDate smalldatetime

SET @ordDate = '1998-05-05'SELECT orderID FROM OrdersWHERE OrderDate = @ordDate

Page 5: 9. Transact  –  SQL  고급

5

9. Transact – SQL 고급 (cont) SET

현재 연결 세션의 특정정보를 처리하는 데 사용 .

SET 문으로 설정하는 SQL Server 의 시스템 정보 . 날짜 및 시간 데이터 처리에 대한 설정 잠금 (LOCK) 에 대한 정보 설정 SQL Server 2000 의 기타 기능에 대한 설정 쿼리 실행 및 처리에 대한 설정 SQL-92 기본 설정을 사용하도록 하는 설정 통계 정보 표시에 대한 설정 SQL Server 2000 트랜잭션 (Transaction) 처리에 대한 설정

Page 6: 9. Transact  –  SQL  고급

6

9. Transact – SQL 고급 (cont) SET (cont)

SQL Server 2000 에서 SET 문과 함께 설정될 수 있는 옵션들 .

SET 옵션 설명

날짜 및 시간 설정 .DATEFIRST 일주일의 첫 번째 요일을 숫자로 설정 . 1 이 월요일 , 7 이 일요일이다 .

DATEFORMAT Datetime, smalldatetime 의 결과에 대한 날짜의 순서를 결정 .LOCK 과 관련되 구문

DEADLOCK_PRIORITY

교착상태 (Deadlock) 에 있을 때 , 세션의 반응방법을 설정

LOCK_TIMEOUT 하나의 세션에 잠금 (Lock) 이 발생했을 때 잠금이 해제될 때까지의 시간을 설정

기타

IDENTITY_INSERT 일반적으로 Identity 로 설정된 열에는 값을 삽입할 수 없다

LANGUAGE 세션에 대한 언어환경을 설정 . Datetime 등에 대한 날짜 형식에 영향을 미침 .

QUOTED_IDENTIFIER

SQL Server 를 리터럴과 식별자에 대해 SQL-92 표준을 따른다 .

Page 7: 9. Transact  –  SQL  고급

7

9. Transact – SQL 고급 (cont) SET (cont)

쿼리 실행과 관련된 구문

NOCOUNT 쿼리 분석기에서 쿼리를 수행하면 , ‘몇 행이 적용됨’이라는 메시지가 나타남 .NOEXEC 컴파일만 되고 수행되지 않는다 .

PARSEONLY 구문은 컴파일 전에 Parse 를 먼저 수행 . 이 옵션이 ON 되면 Parse 만을 수행 .

ROWCOUNT 쿼리 분석기 등에서 쿼리를 수행할 때 적용받을 행의 수를 제한 .TEXTSIZE SELECT 수행 후 반환되는 text 또는 ntext 의 크기를 제한 .

SQL-92 설정과 관련된 구문

ANSI_NULL_DFLT_OFF

ANSI NULL 기본값 옵션을 OFF 로 설정 .

ANSI_NULL_DFLT_ON ANSI_NULL_DFLT_OFF 와 반대동작 .ANSI_NULLS 쿼리에서 SELECT 문을 수행할 때 , NULL 비교에 대해 설정 .

ANSI_PADDING 컬럼에 데이터를 저장할 때 , 컬럼 길이보다 짧은 값이 입력되면 후행 공백을 어떻게 처리할지 지정 .

ANSI_WARNINGS 발생할 수 있는 여러 가지 오류에 대하 SQL-92 표준에 따를지를 지정 .

Page 8: 9. Transact  –  SQL  고급

8

9. Transact – SQL 고급 (cont) SET (cont)

통계와 관련되 구문

SHOWPLAN_ALL 쿼리가 어떤 수행계획에 따라 동작할 것인지를 보여주는 옵션

SHOWPLAN_TEXT 쿼리가 직접 수행되지 않고 , 어떨게 결과를 출력할 것인지에 대한 수행계획만 보임

STATISTICS IO 생성한 디스트 I/O 양에 대한 정보를 보임

STATISTICS TIME 각 Transact-SQL 문을 분석 , 컴파일하는 데 필요한 시간을 밀리 초 단위로 보임 .

트랜잭션과 관련된 구문

IMPLICIT_TRANSACTIONS

현재의 연결에 대해 암시적인 트래잭션 모드를 설정

TANSACTION ISOLATIONLEVEL

현재 연결에 대해 어떤 트랜잭션 격리 수준을 사용할 것인지를 지정 .

XACT_ABORT Transact-SQL 이 실행될 때 오류가 발생하면 트랜잭션을 자동으로 Rollback 할지 설정 .

Page 9: 9. Transact  –  SQL  고급

9

9. Transact – SQL 고급 (cont) SET (cont)

SET 문으로 설정하는 SQL Server 의 시스템 정보 예제 .

USE northwindGOSELECT orderid, customerid, employeeid from orders

위 예제를 실행한 결과와 . SET ROWCOUNT 3

GOSELECT Orderid, customerid, employeeid from orders

SET 문으로 ROWCOUNT 를 제한한 쿼리의 결과 비교 . SET 문 사용 후 반드시 이전 상태로 되돌려 주는 것이 좋다 .

SET ROWCOUNT 0GO

Page 10: 9. Transact  –  SQL  고급

10

9. Transact – SQL 고급 (cont) SET (cont)

IDENTITY 속성 테이블 정의시 특정 컬럼에 IDENTITY 속성을 부 , seed( 초기값 )

로부터 increment( 증분 ) 씩 증가 . 구문

IDENTITY[ (seed,increment ) ] 테이블 정의에서 idcol 은 seed 가 1 이고 매번 데이터가 insert 될

때마다 2 씩 증가하여 값이 채워지게 하는 예 USE test

GOCREATE TABLE idtest( idcol int IDENTITY(1,2), IDName varchar(20))insert idtest values(' 첫번째 ID')insert idtest values(' 두번째 ID')goSELECT * FROM idtest

Page 11: 9. Transact  –  SQL  고급

11

9. Transact – SQL 고급 (cont) SET (cont)

IDENTITY 속성 결과

idcol IDName ----------- ----1 첫번째 ID3 두번째 ID

IDENTITY 속성의 열에는 명시적인 값을 사용하여 INSERT 할 수 없다 .

INSERT 나 UPDATE 를 IDENTITY 속성에 대해 명시적으로 표현하기 위해서는 SET 문을 사용하여 IDENTITY_INSERT 를 ON 시킨다 .

SET IDENTITY_INSERT ONGOINSERT idtest VALUES (2,' 테스트 ID')

Page 12: 9. Transact  –  SQL  고급

12

9. Transact – SQL 고급 (cont) 일괄처리 (GO)

GO 키워드와 함께 쓰인 SQL 구문은 GO 키워드가 쓰인 곳까지 일괄 처리를 수행 .

예제 다음의 두 예를 비교 .

USE testGOCREATE TABLE batchtest1(

col1 int)insert batchtest1 VALUES(1) --validinsert batchtest1 VALUES(2,3) --invalidGOselect * from batchtest1

결과col1 ----------- (0 row(s) affected)

Page 13: 9. Transact  –  SQL  고급

13

9. Transact – SQL 고급 (cont) 일괄처리 (cont)

예제 (cont) 위 예제에 이어 . 다음을 실행 .

insert batchtest1 values (1)goinsert batchtest1 values (2,3)go

결과 col1

----------- 1(1 row(s) affected)

첫 번째 예제는 두 개의 insert 문장을 일괄처리 , 두 번쨰 문장이 실패함으로 두 개의 insert 문장 모두 롤백 .

다음 예제는 하나의 문장씩 일괄처리 .

Page 14: 9. Transact  –  SQL  고급

14

9. Transact – SQL 고급 (cont) 일괄처리 (cont)

일괄처리의 규칙 --northwind 데이터베이스로 바꾼다 .

USE northwindGO-- view 를 생성CREATE VIEW testviewASSELECT customerID, companyName, contactname FROM customersWHERE contacttitle = 'owner'--GO <- 잠시 주석처리 .--GO 키워드 없이 바로 View 를 select 한다 .SELECT * FROM testviewGO

결과 Server: Msg 156, Level 15, State 1, Procedure testview, Line 8Incorrect syntax near the keyword 'SELECT'.

Page 15: 9. Transact  –  SQL  고급

15

9. Transact – SQL 고급 (cont) 일괄처리 (cont)

일괄처리의 규칙 (cont) 위 예제에서 중간의 GO 키워드가 없을때는 에러가 난다 . 위 예제로 돌아가 GO 키워드의 주석을 풀고 실행

결과customerID companyName contactname ---------- ---------------------------------------- ANATR Ana Trujillo Emparedados y helados Ana TrujilloANTON Antonio Moreno Taquería Antonio Moreno…..(17 row(s) affected)

Page 16: 9. Transact  –  SQL  고급

16

9. Transact – SQL 고급 (cont) 일괄처리 (cont)

일괄처리의 규칙 (cont)1. 다음에 나열하는 몇 개의 CREATE 문은 일괄처리 부분이 될 수 없다 . 대상은

CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER 및 CREATE VIEW 문이며 , 이 문장과 다른 문장은 일괄처리로 묶일 수 없다 .

2. 동일한 일괄처리 내에서 테이블을 변경 (ALTER TABLE) 한 다음 새 열을 참조할 수 없다 .

3. 일과처리의 첫 문이 EXECUTE 문이면 EXECUTE 키워드는 필요 없다 . 저장 프로시져를 수행시킬 때 흔이 일어나며 , ‘EXEC SP_NAME’과 ‘ SP_NAME’은 똑같이 저장 프로시져를 실행

Page 17: 9. Transact  –  SQL  고급

17

9. Transact – SQL 고급 (cont) 일괄처리 (cont)

일괄처리의 규칙 (cont) 변수의 선언은 일괄처리의 일부분이 될 수 없음을 보여주는 예

-- 경우 1DECLARE @myvar varchar(20)SET @myvar = 'rattc'SELECT CustomerID, CompanyName, ContactName FROM CustomersWHERE CustomerID = @myvarGO

-- 결과CustomerID CompanyName ContactName ---------- ---------------------------------------- RATTC Rattlesnake Canyon Grocery Paula Wilson(1 row(s) affected)

Page 18: 9. Transact  –  SQL  고급

18

9. Transact – SQL 고급 (cont) 일괄처리 (cont)

일괄처리의 규칙 (cont) 변수의 선언은 일괄처리의 일부분이 될 수 없음을 보여주는 예 -- 경우 2

DECLARE @myvar varchar(20)GO SET @myvar = 'rattc'SELECT CustomerID, CompanyName, ContactName FROM CustomersWHERE CustomerID = @myvarGO-- 결과Server: Msg 137, Level 15, State 1, Line 2Must declare the variable '@myvar'.Server: Msg 137, Level 15, State 1, Line 3Must declare the variable '@myvar'.

Page 19: 9. Transact  –  SQL  고급

19

9. Transact – SQL 고급 (cont) Transact-SQL 제어문

BEGIN – END 블록 BEGIN – END 블록내의 T-SQL 문은 일괄처리의 대상이 됨 . 예제 .

USE NorthwindGODECLARE @condition intDECLARE @cid varchar(20)SET @CID = ? -- 입력받는 값SELECT @condition=contacttitle FROM CustomersWHERE CustomerID = @cidIF @condition = 'sales representative'BEGIN UPDATE Orders SET Freight = Freight*0.9 WHERE CustomerID = @cidEND

Page 20: 9. Transact  –  SQL  고급

20

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

IF 문 IF 문이 구문 정의

IF Boolean_expression { sql_statement | statement_block }[ ELSE{ sql_statement | statement_block } ]

SQL Server 에서 개체들이 이미 존재하는지의 여부를 알아보고 존재하면 DROP한 뒤 다시 생성하는 예제 .

IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA, TABLES WHERE TABLE_NAME = 'OurtestTable') DROP TABLE Ourtesttable GO CREATE TABLE Ourtesttable ( column_definition_list ... ) GO

Page 21: 9. Transact  –  SQL  고급

21

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

IF 문 ( 계속 )

DECLARE @point INT, @credit NCHAR(1) SET @point = 77 IF @point >= 90

SET @credit = ‘A’ ELSE

IF @point >= 80SET @credit = ‘B’

ELSE IF @point >= 70 SET @credit = ‘C’ELSE SET @credit = ‘D’

PRINT ‘취득점수 ==> ‘ + CAST(@point AS NCHAR(3)) PRINT ‘학점 ==> ‘ + @credit

Page 22: 9. Transact  –  SQL  고급

22

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

CASE-WHEN 문 어떤 조건의 경우를 따져 각기 다른 명령을 수행 CASE-WHEN 문의 구조

CASE input_expressionWHEN when_expression THEN result_expression […n][

ELSE else_result_expression]END

Bool 표현을 사용하는 구조 . CASE

WHEN Boolean_expression THEN result_expression […n][

ELSE else_result_expression]END

Page 23: 9. Transact  –  SQL  고급

23

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

CASE 문

DECLARE @point INT, @credit NCHAR(1) SET @point = 77

SET @credit = CASE

WHEN (@point >= 90) THEN ‘A’WHEN (@point >= 90) THEN ‘B’WHEN (@point >= 90) THEN ‘C’WHEN (@point >= 90) THEN ‘D’ELSE ‘F’ END

PRINT ‘취득점수 ==> ‘ + CAST(@point AS NCHAR(3)) PRINT ‘학점 ==> ‘ + @credit

Page 24: 9. Transact  –  SQL  고급

24

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

CASE-WHEN 문 (cont) Northwind 사의 사원들 급여를 직급에 맞게 조정하는 예 .

SELECT EmployeeID, Lastname + '' +Firstname empName,salaryupratio =CASE Title

WHEN 'S ales representative' THEN '20% UP'WHEN 'Vice Presidentm, sales' THEN '10%

DOWN'WHEN 'Sales manager' THEN '10% UP'ELSE 'not yet defined'

ENDFROM Employees

-- 결과EmployeeID empName salaryupratio ----------- ------------------------------ 1 DavolioNancy not yet defined2 FullerAndrew not yet defined…(9 row(s) affected)

Page 25: 9. Transact  –  SQL  고급

25

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

CASE-WHEN 문 (cont) Northwind 사의 고객 중 얼마만큼의 액수를 구매했느냐에 따라 고객을

Normal, Special, Vip 로 구분하는데 사용되는 예 . SELECT o.customerid, contactname,sum(UnitPrice * quantity)

totalprice, 'customercategory' = case when sum(UnitPrice * quantity) < 5000 THEN

'Normal' when sum(UnitPrice * quantity) between 5001 and

50000 THEN 'Special' when sum(UnitPrice * quantity) > 50001 THEN

'VIP' end FROM Orders o join [order details] od on o.orderid = od.orderid left outer join customers c on o.customerid = c.customerid group by o.customerid, contactname

Page 26: 9. Transact  –  SQL  고급

26

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

WHILE 문 T-SQL 의 루핑 (Looping) 을 위한 구문 WHILE 문의 구조

WHILE Boolean_expression{ sql_statement | statement_block }[break]{ sql_statement | statement_block }[CONTINUE]

테이블을 생성하고 100 건의 데이터를 insert 하는 예 -- 우선 test 데이터베이스에 Whiletest 라는 테이블을 만든다 .

USE testGOCREATE TABLE whiletest(testid int,testdate smalldatetime default getdate())GO

Page 27: 9. Transact  –  SQL  고급

27

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

WHILE 문 (cont) 테이블을 생성하고 100 건의 데이터를 insert 하는 예 (cont)

--100 건의 데이터를 INSERT 한다 .DECLARE @increment intSET @increment = 1

WHILE (@increment <= 100)BEGIN

INSERT Whiletest VALUES(@increment, default) SET @increment = @increment + 1END

GO-- 데이터를 확인SELECT * FROM whiletestGO

Page 28: 9. Transact  –  SQL  고급

28

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

WHILE 문 (cont) 1 부터 100 까지의 합을 구하는 프로그램

DECLARE @i INT DECLARE @hap INT

SET @i = 1 SET @hap = 0

WHILE (@i <= 100)BEGIN

SET @hap = @hap + @i SET @i = @i + 1END

PRINT @hap

Page 29: 9. Transact  –  SQL  고급

29

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

GOTO 문

…. ….

SET @hap = @hap + @iIF (@hap > 1000) GOTO endprintSET @i = @i + 1

END

endprint: PRINT ‘합계 = ‘ + CAST(@hap AS NCHAR(10))

Page 30: 9. Transact  –  SQL  고급

30

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

TRY, CATCH 문 오류를 처리는데 편리 . Visual C++, C# 에 있는 기능과 유사 구문 형식

BEGIN TRY 원래 사용하려는 SQL 문장들END TRYBEGIN CATCH

만약 BEGIN … TRY 에서 오류가 발생하면 처리할 일들END CATCH

USE sqlDBBEGIN TRYINSERT INTO userTbl VALUES(‘AJH’, ‘우주희’ , 1988, ‘서울’ , 170)PRINT N’정상적으로 입력되었다 .’END TRY

BEGIN CATCHPRINT N’오류가 발생했다 .’END CATCH

Page 31: 9. Transact  –  SQL  고급

31

9. Transact – SQL 고급 (cont) Transact-SQL 제어문 (cont)

BREAK 문 , CONTINUE 문 RETURN 문

T-SQL 의 즉각 종료를 명령하는 구문 . RETURN 문에 상태코드를 함께 사용하는 경우의 예 .

USE northwindGOCREATE PROCEDURE GetStatusCode@customerID varchar(5)ASIF (SELECT contacttitle FROM customers WHERE customerid = @customerid) = 'owner' RETURN 1 --OWNER 이면 1 을 RETURNELSE RETURN 2 -- 아니면 2 를 RETURNGODECLARE @return_code intEXEC @return_code = getstatuscode 'anton'SELECT @return_code

Page 32: 9. Transact  –  SQL  고급

32

9. Transact – SQL 고급 (cont) 커서 [Cursor]

테이블에서 여러 개의 행을 검색한 결과로 얻은 투플 집합을 한 투플씩 처리하기 위해 사용하는 메커니즘

결과 투플 집합에 대한 포인터 역할 . 커서의 처리 순서

커서의 선언 (DECLARE)

커서 열기 (OPEN)

커서에서 데이터 가져오기 (FETCH)

데이터 처리

커서 닫기 (CLOSE)

커서의 해제 (DEALLOCATE)

WHILE 문으로 모든 행이 처리될 때까지 반복

Page 33: 9. Transact  –  SQL  고급

33

9. Transact – SQL 고급 (cont) 커서 사용의 예 : 고객의 평균 키를 계산

USE sqlDBGODECLARE userTbl_cursor CURSOR GLOBAL FOR SELECT height FROM userTbl;

OPEN userTbl_cursor; DECLARE @height INT

DECLARE @cnt INTDECLARE @totalHeight INTSET @totalHeight = 0SET @cnt = 0

FETCH NEXT FROM userTbl_cursor INTO @heightWHILE @@FETCH_STATUS = 0BEGINSET @cnt = @cnt + 1SET @totalHeight = @totalHeight + @heightFETCH NEXT FROM userTbl_cursor INTO @heightEND

CLOSE userTbl_cursor;DEALLOCATE userTbl_cursor;

Page 34: 9. Transact  –  SQL  고급

34

9. Transact – SQL 고급 (cont) 커서문의 사용 방법

DECLARE 로 커서를 선언 . OPEN 으로 커서를 불러온다 . FETCH 로 레코드 집합을 읽는다 . WHILE 또는 IF 등의 제어문으로 필요한 구문을 조건가 함께 실행 CLOSE 로 커서를 닫는다 . DEALLOCATE 로 커서 참조를 제거 .

커서 선언문의 구문형식DECLARE cursor_name CURSOR [LOCAL | GLOBAL ]

[ FORWARD_ONLY | SCROLL ][ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ][ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ][ TYPE_WARNING ]FOR select_statement[ FOR UPDATE [OF column_name [, . . . N ] ] ]

Page 35: 9. Transact  –  SQL  고급

35

9. Transact – SQL 고급 (cont) 커서의 종류

커서의 구현 방법에 따른 분류 .

종류 설명

T-SQL 커서 Transact-SQL 을 사용하여 저장 프로시저 또는 단독으로 구현될 수 있는 , 우리가 흔히 커서라고 부르는 것 . DECLARE CURSOR 로 선언되고 사용

API 서버 커서 OLEDB 공급자에 의해 제공되는 , 서버측에서 운영되는 커서 .클라이언트 커서 ODBC 에 의해 제공되는 , 클라이언트 측에서 운영되는 커서 , 가장 속도가 느릴수

있다 .

종류 설명

전진 전용(Forward Only)커서

스크롤 할 수 없는 커서 , 결과집합에서 앞에서 뒤로 순차적인 행 검색만 지원 .빠른 전진 전용 커서 옵션 , DECLARE CURSOR 에서 FAST_FORWARD 옵션으로 설정 .

정적 (Static) 커서 커서가 OPEN 으로 열릴 때 , tempdb 에 결과집합을 저장 . 이 저장된 결과집합은 커서가 열려있는 동안에는 본래의 데이터베이스에 어떠한 변화가 가해져도 변경된 데이터를 적용하지 않는다 .

키집합 (Keyset) 커서

결과집합이 키집합이라고 하는 결과집합을 나타내는 고유 식별자에 의해서 구분 . 이 키집합의 경우 행을 고유하게 식별하는 고유 식별자 .

동적 (Dynamic) 커서

정적 커서와는 반대개념 . 커서가 OPEN 되어 있는 상태에서도 변경된 데이터를 바로 반영 . 다른 커서 정의에 비해서 로드 (LOAD) 가 늘어난다 .

Page 36: 9. Transact  –  SQL  고급

36

9. Transact – SQL 고급 (cont) 커서문의 사용 방법 ( 계속 )

커서 OPEN 문의 구조 OPEN { { [ GLOBAL ] cursor_name } |

cursor_variable_name }

FETCH 문의 구조 FETCH [ [ NEXT | PRIOR | FIRST | LAST

| ABSOLUTE {n | @nvar} | RELATIVE {n | @nvar} ]

FROM ]

{{ [GLOBAL] cursor_name } | @cursor_variable_name}[ INTO @variable_name [,...n] ]

커서 CLOSE 문의 구조 CLOSE { { [ GLOBAL ] cursor_name } |

cursor_variable_name }

Page 37: 9. Transact  –  SQL  고급

37

9. Transact – SQL 고급 (cont) 커서 [Cursor] (cont)

FETCH 의 옵션 . NEXT : 이 옵션은 FETCH 를 이용하여 행을 검색하는데 사용되는 기본 옵션 .

결과 집합에서 바로 다음 행을 검색 . ABSOLUTE : 이 옵션은 ABSOLUTE{n} 의 형식으로 사용되는데 n 의 양수인

경우 결과집합의 맨 처음부터 n 번째에 있는 행을 반환한다 . 반대로 n 이 음수인 경우는 맨 뒤부터 n 번째에 있는 행을 반환 .

RELATIVE : 이 옵션은 ABSOLUTE 와 마찬가지 형식을 취하며 , n 이 양수인 경우 현재행으로 부터 n 번째 뒤로 있는 행을 반환하다 . 반대로 n 이 음수인 경우는 현재 위치로부터 n 번째 앞에 있는 행을 반환 .

Page 38: 9. Transact  –  SQL  고급

38

9. Transact – SQL 고급 (cont) 커서 사용 예 :

Northwind 사에서 물건을 주문한 고객 중 합계가 5000 이상인 고객에게 좀더 빠른 Delivery 를 제공하기 위해 Shipping 을 DHL_Express 를 이용하도록 업데이트 하는 예 .

USE northWindGODECLARE @Orderid intDECLARE Use_DHL_Express_Cursor CURSOR FOR SELECT distinct(o.orderid) orderid from orders o, [order details] od WHERE od.UnitPrice*od.quantity > 5000 AND o.orderid = od.orderidOPEN Use_DHL_Express_CursorFETCH NEXT FROM Use_DHL_Express_Cursor INTO @OrderidWHILE @@FETCH_STATUS = 0BEGINUPDATE OrdersSET shipVia = 4WHERE OrderID = @OrderIDFETCH NEXT FROM Use_DHL_Express_Cursor INTO @OrderIDEND