database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 3806 게시물 읽기
No. 3806
PROC에서 CURSOR 이용중 궁금한점이..도와주세요^^;;
작성자
최장군(gospeler)
작성일
2007-10-16 17:46
조회수
4,481

아래와 같이 프로시저를 작성했습니다.
TEST1_CUR 하나만 실행할때는 별 문제 없는것을 확인했는데요..
TEST2_CUR 두번째 커서를 얻어서 같이 사용하는 방법을 찾고 있습니다.

TEST_TBL1 테이블에서 값을 읽어 처리하는게 주 목적이고요.
이 데이타중 TEST_TBL2 테이블에 존재하면 TEST_TBL2에 들어있는 필드값으로 특정처리를 해야 합니다.
없으면 그냥 간단한 산식을 적용후 TEST_TBL3이라는 테이블에다 넣는것이지요.

특정한 날의 데이터를 테이블1에서 검색해서 필드1, 필드2를 계산해서 테이블3에 넣는데,
테이블2에 있는 데이터이면 테이블2의 곱하기/나누기 구분값과 수치를 읽어서 곱하기/나누기를 한 다음
테이블3에 넣는것입니다.

어찌하면 좋을까요? 고수님들 도움을....^^;;

--- TEST_PROC

--CREATE PROC TEST_PROC AS
ALTER PROC TEST_PROC AS

DECLARE TEST1_CUR CURSOR READ_ONLY FOR
 SELECT equip_code FROM TEST_TBL
 WHERE reg_date = CONVERT(CHAR(8), DATEADD(MONTH, -3, GETDATE()), 112) + SUBSTRING(CONVERT(CHAR(2), DATEADD(HOUR, -2, GETDATE()), 108), 1, 2)

DECLARE TEST2_CUR CURSOR READ_ONLY FOR
 SELECT equip_code, modulus_operation1, modulus1, modulus_operation2, modulus2 FROM TEST_TBL2

DECLARE @ERGCD CHAR(11)
DECLARE @EQUIPCD CHAR(11)

OPEN TEST1_CUR
 
FETCH NEXT FROM TEST1_CUR INTO @ERGCD, @EQUIPCD
WHILE(@@fetch_status <> -1)
BEGIN

 IF(@@fetch_status <> -2)
 BEGIN

  PRINT @ERGCD + @EQUIPCD

 END
 FETCH NEXT FROM TEST1_CUR INTO @ERGCD, @EQUIPCD
END

CLOSE TEST1_CUR
DEALLOCATE TEST1_CUR

이 글에 대한 댓글이 총 2건 있습니다.

우선 GOSPELER님의 CURSOR구문은 문법적으로 오류가 있습니다. 

아래 테스트 구문을 드릴테니 테스트를 해보시고 어떤게 문제가 있는지 수정해보십시오. 
그리고 제가 보기엔 두테이블, 세테이블이라 하더라도 
JOINING등이 된다면 SELECT를 하여 계산하고 그 결과를 바로 INSERT하는 방법을 
선택할듯합니다. 


SET NOCOUNT ON
/*****************
CREATE OBJECT
*****************/
IF OBJECT_ID('TESTA') IS NOT NULL
 DROP TABLE TESTA

IF OBJECT_ID('TESTB') IS NOT NULL
 DROP TABLE TESTB

CREATE TABLE TESTA
 (A INT IDENTITY(1,1))

CREATE TABLE TESTB
 (B INT IDENTITY(11, 1))

/*****************
INSERT SAMPLE DATA
*****************/
DECLARE @INTLOOP INT
SET @INTLOOP = 1
WHILE (@INTLOOP <= 10) BEGIN
 INSERT INTO TESTA DEFAULT VALUES
 INSERT INTO TESTB DEFAULT VALUES
 SET @INTLOOP = @INTLOOP + 1
END


/*****************
EXAMPLE DOUBLE CURSOR
*****************/
DECLARE @A INT, @B INT

DECLARE TEST1_CUR CURSOR FOR
 SELECT A FROM TESTA
  
 OPEN TEST1_CUR
 FETCH NEXT FROM TEST1_CUR INTO @A
 WHILE(@@FETCH_STATUS = 0) BEGIN
  DECLARE TEST2_CUR CURSOR FOR
  SELECT B FROM TESTB  
  OPEN TEST2_CUR
  FETCH NEXT FROM TEST2_CUR INTO @B
  WHILE(@@FETCH_STATUS = 0) BEGIN
   PRINT CAST(@A AS VARCHAR) + ':' + CAST(@B AS VARCHAR)
   FETCH NEXT FROM TEST2_CUR INTO @B
  END
  CLOSE TEST2_CUR
  DEALLOCATE TEST2_CUR  
  FETCH NEXT FROM TEST1_CUR INTO @A
 END
CLOSE TEST1_CUR
DEALLOCATE TEST1_CUR

SET NOCOUNT OFF

.님이 2007-10-17 11:55에 작성한 댓글입니다. Edit

먼저 쩜(.)님 답변 감사합니다.

제 문법이 잘못되었다고 하는데....
두번째 커서부분은 완성이 안되어 있는 부분입니다.
제가 헷갈린 부분을 말씀드리자면, 
@@FETCH_STATUS = 0 부분이 중첩되면서 문제가 발생되지 않나 하는것이였습니다.
이것이 OPEN CURSOR별로 인식을 한다면 중첩은 문제가 없겠지요...
상세한걸 안알려드리고 간단한 서술로만 원한 답을 구할려고 했던것 같네요.
JOIN이 되는 부분이 있고, 안되는 부분이 있습니다.. ㅎ_ㅎ;
일단 방법을 알려주셔서 감사합니다.
많은 도움이 되었습니다^^ (이제 해보러 갑니다...)

DECLARE @A INT, @B INT

DECLARE TEST1_CUR CURSOR FOR
 SELECT A FROM TESTA
  
 OPEN TEST1_CUR
 FETCH NEXT FROM TEST1_CUR INTO @A
 WHILE(@@FETCH_STATUS = 0) BEGIN
  DECLARE TEST2_CUR CURSOR FOR
  SELECT B FROM TESTB  
  OPEN TEST2_CUR
  FETCH NEXT FROM TEST2_CUR INTO @B
  WHILE(@@FETCH_STATUS = 0) BEGIN
   PRINT CAST(@A AS VARCHAR) + ':' + CAST(@B AS VARCHAR)
   FETCH NEXT FROM TEST2_CUR INTO @B
  END
  CLOSE TEST2_CUR
  DEALLOCATE TEST2_CUR  
  FETCH NEXT FROM TEST1_CUR INTO @A
 END
CLOSE TEST1_CUR
DEALLOCATE TEST1_CUR

SET NOCOUNT OFF

최장군(gospeler)님이 2007-10-17 13:14에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
3809데이터검색 명령문 좀알려주세요 [4]
이우혁
2007-10-17
2713
3808엔터프라이즈 메니져에서 입력한 값을 볼려면 어떻게 하나요.
초보
2007-10-17
2245
3807테이블생성 질문 [1]
가리
2007-10-17
2839
3806PROC에서 CURSOR 이용중 궁금한점이..도와주세요^^;; [2]
최장군
2007-10-16
4481
3805Order By 에서 질문요... [2]
불님
2007-10-16
2847
3804프로시져 DYNAMIC SQL ?? [1]
이재영
2007-10-13
3048
3803쿼리문좀 봐주세요...ㅠㅠ [1]
슬프다
2007-10-12
4392
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다