제 가 올릴 글 은 ASP 와 SQL Server 7 . 0 ( SQL Server 2000 ) 에서 의 stored Procedure ( 이하 sp ) 의 활용 입니다 . sp 는 알 고 계시 죠 ? 간단히 말 하 자면 pre - compiled procedure 입니다 . 서버 에 미리 컴파일 이 되 어 있 으니까 물론 속도 면 에서 는 차이 가 나 겠 죠 ? 그러면 일단 소스 를 먼저 보여 드리 고 말씀 드리 겠 습니다 . 모두 sql 쿼리 분석기 를 열 어 주 세요 . sp 의 구문 은 다음 과 같 습니다 . CREATE PROC [ EDURE ] procedure _ name [ ; number ] [ { @ parameter data _ type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ , ... n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql _ statement [ ... n ] 뭐 가 이리 복잡 하 냐구요 ? ?? 쪼금 만 기다리 세요 . . 예제 를 한번 보 시 면 아 ~~~ 그거 구나 . .. 하 실 거 예요 . 백견 이 불 여일 타 ! !! 그럼 예제 들어갑니다 . 쿼리 분석기 에서 다음 의 소스 를 코딩 하 시 고 실행 을 해 보 세요 . 참고 로 실행 하 는 방법 은 실행 을 할 소스 부분 을 선택 을 하 시 고 , F 5 또는 Alt - X 또는 Ctrl - E 를 누르 시 면 됩니다 . sp _ print _ name ( 요건 작성 하 지 마세요 ) create proc sp _ print _ name @ strName varchar ( 20 ) As Begin print @ strName Set @ strName = ' Hello World ! !!' print @ strName End 보 시 는 대로 sp _ print _ name 이 라는 이름 으로 sp 를 만들 었 습니다 . 하나 씩 설명 을 해 볼까요 ? ? create proc sp _ print _ name --> sp _ print _ name 이 라는 이름 으로 sp 를 만들 어라 @ strName varchar ( 20 ) --> @ strName 은 변수 이름 입니다 . M $ SQL 에서 는 변수 에다가 는 앞 에 @ 을 붙여 줘서 테이블 컬럼 과 의 구분 을 하 게 되 죠 . 참고 로 이 변수 는 parameter 입니다 . As --> sp 의 시작 을 알 립니 다 . > Begin --> M $ SQL 에서 는 블럭 처리 를 begin ~ end 로 처리 합니다 . 참고 로 C 언어 의 경우 는 { ~ }, ASP 는 블럭 이 없 죠 ? print @ strName --> 결과 를 화면 에 찍 어라 ASP 로 생각 을 하 시 면 Response . Write strName 정도 가 되 겠 죠 ? Set @ strName = ' Hello World ! !!' --> 변수 에 어떤 값 을 넣 어 줄 때 는 Set 또는 Select 를 사용 합니다 . print @ strName End 그리고 , 쿼리 분석기 ( 즉 , Query Analyzer 에서 다음 처럼 실행 해 보 세요 ) sp _ print _ name ' 깜찍이 ' 라고 실행 을 시켜 보 세요 . . 그럼 어떻게 나옵니까 ? ? 깜찍이 Hello World ! !! 그렇 습니다 . 위 와 같이 나옵니다 . 어떻 습니까 ? 간단 하 죠 ? 아니 라구요 ? ? 그럼 이해 를 쉽 게 하 기 위해서 위 의 소스 를 ASP 로 변환 해서 보 겠 습니다 . sp _ Hello . asp <% Option Explicit Sub PrintName ( strName ) Response . Write strName & "< BR >" strName = " Hello World ! !!" Response . Write strName End Sub PrintName " 깜찍이 " %> 어떻 습니까 ? 결과 는 똑같이 나오 죠 ? 제 가 이렇게 굳이 ASP 와 결부 를 시키 는 것 은 이 글 을 읽 으시 는 분 들 이 ASP 에 익숙 하 신 분 들 이 라 판단 이 들 어서 입니다 . 이 정도 라면 첫 번 째 예제 로 충분 하 리라고 생각 됩니다 . 아니 라구요 ? 너무 쉽 다구요 ? ? 이런 . .. ㅠ . ㅠ 그렇 습니다 . 제 가 여러분 의 실력 을 너무 낮 게 본 게 아닌가 생각 됩니다 . . 죄송 합니다 . 전 지금 반성 하 는 기분 으로 두 손 다 들 고 치 고 있 습니다 . 간단 한 sp 를 작성 해 봤 는데요 . . 이제 두 번 째 sp 를 만들 어 보 죠 . . 어떤 언어 를 하 던지 단계 가 있 잖아요 . 첨 에 는 hello world , 글구 두 번 째 는 ~~~ 음 ~~~ 머 더라 ? ? 기억 이 안 나 는 관계 로 전 그냥 구구단 을 하 겠 습니다 . ^^ 제 가 C 언어 할 때 아마 처음 쯤 으로 기억 이 되 거든요 . . 소스 는 다음 과 같 습니다 . ( 참고 로 다시 한 번 말씀 드립니다 . sp 는 SQL Server 에서 쿼리 분석기 에서 실행 하 시 고 , asp 는 말씀 안 드려도 아 시 죠 ? ?) Create proc sp _ gugudan as Begin Declare @ intI int , @ intJ int Set @ intI = 1 Set @ intJ = 1 While ( @ intI < 10 ) Begin While ( @ intJ < 10 ) Begin print convert ( char ( 2 ) , @ intI ) + '* ' + cast ( @ intJ as char ( 2 ) ) + ' = ' + convert ( char ( 2 ) , @ intI * @ intJ ) Set @ intJ = @ intJ + 1 End Set @ intI = @ intI + 1 Set @ intJ = 1 End End 자 , 다 코딩 하 셨 습니까 ? ? 그럼 다음 에 해야 할 일 은 ? ? 물론 실행 을 해서 확인 을 해 보 셔야죠 . .. Exec sp _ gugudan 자 , 결과 가 어떻 습니까 ? 그 옛날 손바닥 맞 아 가 면서 외운 구구단 이 주 우욱 나오 지 않 습니까 ? ? 신기 하 지 않 습니까 ? ? 아니 라구요 ? ? 쩝 . .. 전 첨 에 했 을 때 신기 했 는데 . .. 자 그럼 소스 를 설명 해 보 지요 . . create proc sp _ gugudan as Begin Declare @ intI int , --> 변수 를 선언 하 는 부분 입니다 . 변수 는 다음 과 같이 declare 를 이용 해서 선언 합니다 . @ intJ int 1 회 에 했 던 내용 은 parameter 로 받 는 부분 이 어서 decare 를 사용 하 지 않 았 구요 . . Set @ intI = 1 --> 변수 를 초기 화 합니다 . 제 가 처음 에 언어 를 배울 때 초기 화 안 해서 많이 고생 했었 어요 . . Set @ intJ = 1 버릇 을 단단히 들이 면 좋 더라고요 . . 참고 로 C # 을 하 시 려면 이것 은 꼭 필요 합니다 . While ( @ intI < 10 ) --> while Loop 입니다 . 괄호 안 의 값 이 참 일 동안 계속 진행 된다는 것 . . 알 고 계시 죠 ? Begin While ( @ intJ < 10 ) Begin print convert ( char ( 2 ) , @ intI ) + '* ' + cast ( @ intJ as char ( 2 ) ) + ' = ' + convert ( char ( 2 ) , @ intI * @ intJ ) --> convert 와 cast 는 동일 한 기능 을 하 는 함수 입니다 . 그런데 이것 을 같이 쓴 이유 는 ? ? 맞 습니다 . 여러분 이 원 하 는 걸로 골라서 쓰 세요 . . 골라 쓰 는 재미 가 있 습니다 . Set @ intJ = @ intJ + 1 --> 한 번 계산 했 으니까 1 을 증가 시켜야 구구단 이 되 겠 죠 ? End Set @ intI = @ intI + 1 --> 한 번 계산 했 으니까 1 을 증가 시켜야 구구단 이 되 겠 죠 ? Set @ intJ = 1 --> 다음 단 에서 는 1 부터 구구단 을 해야 하 니까 다시 1 로 맞춰 주 는 것 이 죠 . . End End 간단 한 설명 인데 이 정도 면 되 겠 지요 ? 그럼 이걸 저번 회 처럼 ASP 로 변환 해 볼까요 ? <% Option Explicit Sub GuGudan Dim intI Dim intJ intI = 1 intJ = 1 Do While ( intI < 10 ) Do While ( intJ < 10 ) Response . Write intI & " * " & intJ & " = " & intI * intJ & "< br >" intJ = intJ + 1 Loop intI = intI + 1 intJ = 1 Loop End Sub GuGudan %> 어떻 습니까 ? 똑같 은 결과 가 나오 죠 ? 이렇게 해서 기초 적 인 sp 를 다루 었 습니다 . 그럼 이제 본격 적 으로 sp 를 들어가 겠 습니다 . sp 를 왜 사용 하 겠 습니까 ? 굳이 이것 처럼 글자 만 찍 으려고 sp 를 사용 하 려 한다면 저 같 아도 안 합니다 . 역시 sp 를 하 는 이유 는 DB 안 에서 복잡 한 DB 작업 을 할 수 있 기 때문 이 죠 . 물론 transaction 처리 까지 말 이 죠 . 우선 사용 할 테이블 부터 만듭니다 . Create Table Address ( idx int identity ( 1 , 1 ) primary key Not Null , -- identity ( x , y ) 라는 함수 는 x 부터 y 씩 증가 하 면서 자동 으로 값 을 넣 어 준다는 것 입니다 . name varchar ( 20 ) Not Null , tel varchar ( 15 ) Not Null , email varchar ( 50 ) Null , regid varchar ( 15 ) Not Null , sex tinyInt Not Null -- 남자 일 경우 는 0 , 여자 일 경우 는 1 ) 그리고 다음 과 같이 sp 를 만들 어 보 세요 . Create Proc sp _ Insert _ Address @ strName varchar ( 20 ) , @ strTel varchar ( 15 ) , @ strEmail varchar ( 50 ) , @ strRegID varchar ( 15 ) , @ intIdx int output As Begin Declare @ intSex tinyInt Begin Tran If ( subString ( @ strRegID , 8 , 1 ) = ' 1 ' ) Set @ intSex = 0 else Set @ intSex = 1 Insert Into Address ( name , tel , email , regid , sex ) values ( @ strName , @ strTel , @ strEmail , @ strRegID , @ intSex ) Set @ intIdx = @@ identity If ( @@ error <> 0 ) RollBack Tran else Commit Tran End 위 의 sp 는 입력 된 값 을 DB 에 반영 시키 는 sp 입니다 . 그럼 또 설명 해 볼까요 ? ? Create Proc sp _ Insert _ Address @ strName varchar ( 20 ) , @ strTel varchar ( 15 ) , @ strEmail varchar ( 50 ) , @ strRegID varchar ( 15 ) , --> 여기 까지 는 아 시 겠 죠 ? @ intIdx int output --> 요놈 은 처음 보 네요 . . 하지만 걱정 하 지 마세요 . .. 제 가 있 잖습니까 ? 요놈 은 output 이 라는 놈 으로 다 실행 하 고 난 다음 에 이 값 을 리턴 해 주 죠 . 여러 개 도 쓸 수 있 걸랑요 . 전 사실 요놈 이 좋 아서 이걸 자주 쓴 답니다 . 만일 100 개 의 게시판 의 게시물 숫자 를 구하 려면 . .. ASP 에서 레코드 셋 을 백 번 열 어서 확인 해야 하 죠 ? ? 하지만 여기 에서 는 output 을 사용 해서 한 번 에 다 받 을 수 있 죠 . .. As Begin Declare @ intSex tinyInt --> 전 에 했 던 변수 선언 입니다 . Begin Tran --> 엇 ? 첨 보 는 놈 이 죠 ? ? 여러분 Transaction 이 라고 들 어 보 셨 죠 ? 예제 로 많이 쓰 는 것 이 은행 에서 돈 뽑 을 때 를 예 로 많이 들 죠 . . 만일 제 가 돈 을 뽑 는데 처리 가 거의 끝 났 습니다 . 돈 이 나와야 할 순간 . .. 앗 ? ? 이런 정전 이 되 어 버렸 네 . .. 이런 띠 바 . .. ㅠ . ㅠ 이럴 경우 어떻 게 합니까 ? DB 에서 는 돈 이 나간 걸로 처리 되 어 있 는데 . .. 걱정 마세요 . . 이럴 때 있 는 것 이 transaction 이 랍니다 . transaction 은 모든 과정 이 제대로 끝나 지 않 고 에러 가 발생 할 경우 는 처음 상태 로 모든 것 일 되돌려 놓 는답니다 . ( RollBack ) 그렇 지 않 고 제대로 끝난다면 모든 것 을 처리 하 죠 . ( Commit ) If ( subString ( @ strRegID , 8 , 1 ) = ' 1 ' ) --> substring ( a , b , c ) : a 의 문자 의 b 부터 c 까지 뽑 아 와라 . . 예 를 들 면 subString ( ' abcdef ', 2 , 2 ) == > ' bc ' 이렇게 된답니다 . Set @ intSex = 0 else Set @ intSex = 1 Insert Into Address ( name , tel , email , regid , sex ) values ( @ strName , @ strTel , @ strEmail , @ strRegID , @ intSex ) Set @ intIdx = @@ identity --> 아까 identity 를 한 것 기억나 시 죠 ? ? 그것 은 아무 값 을 안 넣 어도 숫자 가 자동 으로 증가 되 어서 들어간다고 말씀 드렸 죠 ? 그런데 그 값 을 어떻게 압 니까 ? 그건 @@ identity 라는 전역 번수 에 들어갑니다 . 물론 휘발 성 입니다 . 계속 바뀐다는 말 이 죠 . 참고 로 @ 1 개 면 지역 변수 , @ 2 개 면 전역 변수 입니다 . If ( @@ error <> 0 ) RollBack Tran else Commit Tran --> 아까 말씀 드린 RollBack 과 Commit 입니다 . @ 2 개 면 뭔지 기억나 시 죠 ? 맞 습니다 . 전역 변수 입니다 . 이 @@ error 에 는 어떤 값 이 저장 되 느냐 . .. 에러 번호 가 저장 됩니다 . 에러 번호 가 0 이 라면 정상 적 으로 처리 된 것 이 고 , 그것 이 아니 라면 어떤 좋 지 않 은 일 이 발생 한 것 이 겠 죠 ? End Exec sp _ Insert _ Address ' 이름 ', ' 전화 번호 ', ' 이메일 ', ' 주민 등록 번호 ', 0 위 의 값 을 넣 어 보 시 고 실행 해 보 세요 . 주민 등록 번호 는 자신 의 번호 를 넣 어서 실행 하 세요 . 안 그러 면 에러 납니다