380 likes | 564 Views
9. Transact – SQL 고급. 변수선언 (DECLARE) DBMS 가 가지고 있는 로컬변수를 선언할 때 쓰는 키워드 DECLARE 구문 DECLARE {{@local_variable data_type} | {@cursor_variable_name CURSOR} | {table_type_definition} }[,....n] < table_type_definition > ::=
E N D
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> ]
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)
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 int SET @mycount = 0 SELECT @mycount = count(*) FROM orders SELECT @mycount --결과 ----------- 830 (1 row(s) affected)
9. Transact – SQL 고급(cont) • 변수선언(DECLARE) <cont> • 예제(cont) • 1998년 5월 5일 Order된 내용이 어떤 제품을 주문했는가를 찾아주는 예. • DECLARE @ordDate smalldatetime SET @ordDate = '1998-05-05' SELECT orderID FROM Orders WHERE OrderDate = @ordDate
9. Transact – SQL 고급(cont) • SET • 현재 연결 세션의 특정정보를 처리하는 데 사용. • SET문으로 설정하는 SQL Server의 시스템 정보. • 날짜 및 시간 데이터 처리에 대한 설정 • 잠금(LOCK)에 대한 정보 설정 • SQL Server 2000의 기타 기능에 대한 설정 • 쿼리 실행 및 처리에 대한 설정 • SQL-92 기본 설정을 사용하도록 하는 설정 • 통계 정보 표시에 대한 설정 • SQL Server 2000 트랜잭션(Transaction) 처리에 대한 설정
9. Transact – SQL 고급(cont) • SET (cont) • SQL Server 2000에서 SET문과 함께 설정될 수 있는 옵션들.
9. Transact – SQL 고급(cont) • SET (cont)
9. Transact – SQL 고급(cont) • SET (cont)
9. Transact – SQL 고급(cont) • SET (cont) • SET문으로 설정하는 SQL Server의 시스템 정보 • 예제. • USE northwind GO SELECT orderid, customerid, employeeid from orders • 위 예제를 실행한 결과와. • SET ROWCOUNT 3 GO SELECT Orderid, customerid, employeeid from orders • SET문으로 ROWCOUNT를 제한한 쿼리의 결과 비교. • SET문 사용 후 반드시 이전 상태로 되돌려 주는 것이 좋다. • SET ROWCOUNT 0 GO
9. Transact – SQL 고급(cont) • SET (cont) • IDENTITY 속성 • 테이블 정의시 특정 컬럼에 IDENTITY 속성을 부, seed(초기값)로부터 increment(증분)씩 증가. • 구문 • IDENTITY[ (seed,increment ) ] • 테이블 정의에서 idcol은 seed가 1이고 매번 데이터가 insert될 때마다 2씩 증가하여 값이 채워지게 하는 예 • USE test GO CREATE TABLE idtest ( idcol int IDENTITY(1,2), IDName varchar(20) ) insert idtest values('첫번째 ID') insert idtest values('두번째 ID') go SELECT * FROM idtest
9. Transact – SQL 고급(cont) • SET (cont) • IDENTITY 속성 • 결과 • idcol IDName ----------- ---- 1 첫번째 ID 3 두번째 ID • IDENTITY 속성의 열에는 명시적인 값을 사용하여 INSERT할 수 없다. • INSERT나 UPDATE를 IDENTITY 속성에 대해 명시적으로 표현하기 위해서는 SET문을 사용하여 IDENTITY_INSERT를 ON시킨다. • SET IDENTITY_INSERT ON GO INSERT idtest VALUES (2,'테스트 ID')
9. Transact – SQL 고급(cont) • 일괄처리(GO) • GO 키워드와 함께 쓰인 SQL 구문은 GO 키워드가 쓰인 곳까지 일괄 처리를 수행. • 예제 • 다음의 두 예를 비교. • USE test GO CREATE TABLE batchtest1 ( col1 int ) insert batchtest1 VALUES(1) --valid insert batchtest1 VALUES(2,3) --invalid GO select * from batchtest1 • 결과 col1 ----------- (0 row(s) affected)
9. Transact – SQL 고급(cont) • 일괄처리 (cont) • 예제(cont) • 위 예제에 이어. 다음을 실행. • insert batchtest1 values (1) go insert batchtest1 values (2,3) go • 결과 • col1 ----------- 1 (1 row(s) affected) • 첫 번째 예제는 두 개의 insert문장을 일괄처리, 두 번쨰 문장이 실패함으로 두 개의 insert 문장 모두 롤백. • 다음 예제는 하나의 문장씩 일괄처리.
9. Transact – SQL 고급(cont) • 일괄처리 (cont) • 일괄처리의 규칙 • --northwind 데이터베이스로 바꾼다. USE northwind GO -- view를 생성 CREATE VIEW testview AS SELECT customerID, companyName, contactname FROM customers WHERE contacttitle = 'owner' --GO <-잠시 주석처리. --GO 키워드 없이 바로 View를 select한다. SELECT * FROM testview GO • 결과 Server: Msg 156, Level 15, State 1, Procedure testview, Line 8 Incorrect syntax near the keyword 'SELECT'.
9. Transact – SQL 고급(cont) • 일괄처리 (cont) • 일괄처리의 규칙 (cont) • 위 예제에서 중간의 GO키워드가 없을때는 에러가 난다. • 위 예제로 돌아가 GO 키워드의 주석을 풀고 실행 • 결과 customerID companyName contactname ---------- ---------------------------------------- ANATR Ana Trujillo Emparedados y helados Ana Trujillo ANTON Antonio Moreno Taquería Antonio Moreno ….. (17 row(s) affected)
9. Transact – SQL 고급(cont) • 일괄처리 (cont) • 일괄처리의 규칙 (cont) • 다음에 나열하는 몇 개의 CREATE문은 일괄처리 부분이 될 수 없다. 대상은 CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER 및 CREATE VIEW문이며, 이 문장과 다른 문장은 일괄처리로 묶일 수 없다. • 동일한 일괄처리 내에서 테이블을 변경(ALTER TABLE)한 다음 새 열을 참조할 수 없다. • 일과처리의 첫 문이 EXECUTE 문이면 EXECUTE 키워드는 필요 없다. 저장 프로시져를 수행시킬 때 흔이 일어나며, ‘EXEC SP_NAME’과 ‘SP_NAME’은 똑같이 저장 프로시져를 실행
9. Transact – SQL 고급(cont) • 일괄처리 (cont) • 일괄처리의 규칙 (cont) • 변수의 선언은 일괄처리의 일부분이 될 수 없음을 보여주는 예 • --경우1 DECLARE @myvar varchar(20) SET @myvar = 'rattc' SELECT CustomerID, CompanyName, ContactName FROM Customers WHERE CustomerID = @myvar GO --결과 CustomerID CompanyName ContactName ---------- ---------------------------------------- RATTC Rattlesnake Canyon Grocery Paula Wilson (1 row(s) affected)
9. Transact – SQL 고급(cont) • 일괄처리 (cont) • 일괄처리의 규칙 (cont) • 변수의 선언은 일괄처리의 일부분이 될 수 없음을 보여주는 예 • --경우2 DECLARE @myvar varchar(20) GO SET @myvar = 'rattc' SELECT CustomerID, CompanyName, ContactName FROM Customers WHERE CustomerID = @myvar GO --결과 Server: Msg 137, Level 15, State 1, Line 2 Must declare the variable '@myvar'. Server: Msg 137, Level 15, State 1, Line 3 Must declare the variable '@myvar'.
9. Transact – SQL 고급(cont) • Transact-SQL 제어문 • BEGIN – END 블록 • BEGIN – END 블록내의 T-SQL문은 일괄처리의 대상이 됨. • 예제. • USE Northwind GO DECLARE @condition int DECLARE @cid varchar(20) SET @CID = ? --입력받는 값 SELECT @condition=contacttitle FROM Customers WHERE CustomerID = @cid IF @condition = 'sales representative' BEGIN UPDATE Orders SET Freight = Freight*0.9 WHERE CustomerID = @cid END
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
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 >= 80 SET @credit = ‘B’ ELSE IF @point >= 70 SET @credit = ‘C’ ELSE SET @credit = ‘D’ PRINT ‘취득점수==> ‘ + CAST(@point AS NCHAR(3)) PRINT ‘학점 ==>‘ + @credit
9. Transact – SQL 고급(cont) • Transact-SQL 제어문(cont) • CASE-WHEN 문 • 어떤 조건의 경우를 따져 각기 다른 명령을 수행 • CASE-WHEN문의 구조 • CASE input_expression WHEN 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
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
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' END FROM Employees -- 결과 EmployeeID empName salaryupratio ----------- ------------------------------ 1 DavolioNancy not yet defined 2 FullerAndrew not yet defined … (9 row(s) affected)
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
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 test GO CREATE TABLE whiletest ( testid int, testdate smalldatetime default getdate() ) GO
9. Transact – SQL 고급(cont) • Transact-SQL 제어문(cont) • WHILE 문 (cont) • 테이블을 생성하고 100건의 데이터를 insert하는 예 (cont) • --100건의 데이터를 INSERT한다. DECLARE @increment int SET @increment = 1 WHILE (@increment <= 100) BEGIN INSERT Whiletest VALUES(@increment, default) SET @increment = @increment + 1 END GO --데이터를 확인 SELECT * FROM whiletest GO
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 + 1 END PRINT @hap
9. Transact – SQL 고급(cont) • Transact-SQL 제어문(cont) • GOTO 문 …. …. SET @hap = @hap + @i IF (@hap > 1000) GOTO endprint SET @i = @i + 1 END endprint: PRINT ‘합계 = ‘ + CAST(@hap AS NCHAR(10))
9. Transact – SQL 고급(cont) • Transact-SQL 제어문(cont) • TRY, CATCH 문 • 오류를 처리는데 편리. Visual C++, C#에 있는 기능과 유사 • 구문 형식 • BEGIN TRY 원래 사용하려는 SQL 문장들 END TRY BEGIN CATCH 만약 BEGIN … TRY에서 오류가 발생하면 처리할 일들 END CATCH • USE sqlDB BEGIN TRY INSERT INTO userTbl VALUES(‘AJH’, ‘우주희’, 1988, ‘서울’, 170) PRINT N’정상적으로 입력되었다.’ END TRY BEGIN CATCH PRINT N’오류가 발생했다.’ END CATCH
9. Transact – SQL 고급(cont) • Transact-SQL 제어문(cont) • BREAK문, CONTINUE문 • RETURN문 • T-SQL의 즉각 종료를 명령하는 구문. • RETURN문에 상태코드를 함께 사용하는 경우의 예. • USE northwind GO CREATE PROCEDURE GetStatusCode @customerID varchar(5) AS IF (SELECT contacttitle FROM customers WHERE customerid = @customerid) = 'owner' RETURN 1 --OWNER이면 1을 RETURN ELSE RETURN 2 --아니면 2를 RETURN GO DECLARE @return_code int EXEC @return_code = getstatuscode 'anton' SELECT @return_code
커서의 선언(DECLARE) 커서 열기(OPEN) 커서에서 데이터 가져오기(FETCH) WHILE 문으로 모든 행이 처리될 때까지 반복 데이터 처리 커서 닫기(CLOSE) 커서의 해제(DEALLOCATE) 9. Transact – SQL 고급(cont) • 커서[Cursor] • 테이블에서 여러 개의 행을 검색한 결과로 얻은 투플 집합을 한 투플씩 처리하기 위해 사용하는 메커니즘 • 결과 투플 집합에 대한 포인터 역할. • 커서의 처리 순서
9. Transact – SQL 고급(cont) • 커서 사용의 예 : 고객의 평균 키를 계산 • USE sqlDB GO DECLARE userTbl_cursor CURSOR GLOBAL FOR SELECT height FROM userTbl; OPEN userTbl_cursor; DECLARE @height INT DECLARE @cnt INT DECLARE @totalHeight INT SET @totalHeight = 0 SET @cnt = 0 FETCHNEXT FROM userTbl_cursor INTO @height WHILE @@FETCH_STATUS = 0 BEGIN SET @cnt = @cnt + 1 SET @totalHeight = @totalHeight + @height FETCHNEXT FROM userTbl_cursor INTO @height END CLOSE userTbl_cursor; DEALLOCATE userTbl_cursor;
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 ] FORselect_statement [ FOR UPDATE [OF column_name [, . . . N ] ] ]
9. Transact – SQL 고급(cont) • 커서의 종류 • 커서의 구현 방법에 따른 분류.
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 }
9. Transact – SQL 고급(cont) • 커서[Cursor] (cont) • FETCH의 옵션. • NEXT : 이 옵션은 FETCH를 이용하여 행을 검색하는데 사용되는 기본 옵션. 결과 집합에서 바로 다음 행을 검색. • ABSOLUTE : 이 옵션은 ABSOLUTE{n}의 형식으로 사용되는데 n의 양수인 경우 결과집합의 맨 처음부터 n번째에 있는 행을 반환한다. 반대로 n이 음수인 경우는 맨 뒤부터 n번째에 있는 행을 반환. • RELATIVE : 이 옵션은 ABSOLUTE와 마찬가지 형식을 취하며, n이 양수인 경우 현재행으로 부터 n번째 뒤로 있는 행을 반환하다. 반대로 n이 음수인 경우는 현재 위치로부터 n번째 앞에 있는 행을 반환.
9. Transact – SQL 고급(cont) • 커서 사용 예 : • Northwind사에서 물건을 주문한 고객 중 합계가 5000 이상인 고객에게 좀더 빠른 Delivery를 제공하기 위해 Shipping을 DHL_Express를 이용하도록 업데이트 하는 예. • USE northWind GO DECLARE @Orderid int DECLARE 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.orderid OPEN Use_DHL_Express_Cursor FETCHNEXT FROM Use_DHL_Express_Cursor INTO @Orderid WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Orders SET shipVia = 4 WHERE OrderID = @OrderID FETCHNEXT FROM Use_DHL_Express_Cursor INTO @OrderID END