ALTER PROCEDURE [dbo].[USP_ORDER_BASKET_RECOVER]
@SEQ INT = 0
,@CAMPUS_ID VARCHAR(4) = ''
,@ITEM_CD VARCHAR(4) = ''
,@ORIGINAL_STOCK INT = 0
,@ORDER_QUANT INT = 0
,@BASKET_QUANT INT = 0
,@ETC_QUANT INT = 0
,@ORDER_NO VARCHAR(20) = ''
,@TYPE VARCHAR(1) = ''
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET NOCOUNT ON
IF @TYPE = '1'
--이미 바구니에 해당 책이 담겨있으면.
IF EXISTS (SELECT F_ITEM_CD FROM T_ORDER_BASKET WHERE F_CAMPUS_ID = @CAMPUS_ID AND F_ITEM_CD = @ITEM_CD)
BEGIN
SELECT @BASKET_QUANT = F_ORDER_QUANT FROM T_ORDER_BASKET WHERE F_CAMPUS_ID = @CAMPUS_ID AND F_ITEM_CD = @ITEM_CD
SELECT @SEQ = F_SEQ FROM T_ORDER_BASKET WHERE F_CAMPUS_ID = @CAMPUS_ID AND F_ITEM_CD = @ITEM_CD
--현재 책코드의 갯수와 이미 담겨있는 바구니 의 책 갯수를 더해 100 넘어가면 100으로 강제고정시켜 업데이트
--남은 권 수는 T_ITEM에 +시켜준다.
IF @BASKET_QUANT + @ORDER_QUANT > 100
BEGIN
SET @ETC_QUANT = (@BASKET_QUANT + @ORDER_QUANT) - 100
--현재 재고량을 갖고옴.
SELECT @ORIGINAL_STOCK = F_STOCK FROM T_ITEM WHERE F_ITEM_CD = @ITEM_CD
UPDATE T_ORDER_BASKET
SET
F_ORDER_QUANT = 100
,F_INS_DT = GETDATE()
WHERE F_SEQ = @SEQ
--T_ITEM 테이블 업데이트.
UPDATE T_ITEM
SET F_STOCK = @ORIGINAL_STOCK + @ETC_QUANT
WHERE F_ITEM_CD = @ITEM_CD
END
END
ELSE
BEGIN
DECLARE CUR CURSOR FOR
SELECT F_CAMPUS_ID, F_ITEM_CD,F_ORDER_QUANT FROM T_ORDER_DET WHERE F_ORDER_NO = @ORDER_NO
OPEN CUR
FETCH NEXT FROM CUR INTO @CAMPUS_ID, @ITEM_CD, @ORDER_QUANT
WHILE @@FETCH_STATUS = 0
BEGIN
--꽁짜 교재 리스트에 해당 아이템 코드가 있으면.
IF EXISTS (SELECT F_ITEM_CD FROM T_ITEM_FREE WHERE F_ITEM_CD = @ITEM_CD AND F_DEL = 'N')
BEGIN
INSERT INTO T_ORDER_BASKET
(F_CAMPUS_ID,F_ITEM_CD,F_ORDER_QUANT,F_INS_DT,F_TYPE)
VALUES
(
@CAMPUS_ID
,@ITEM_CD
,@ORDER_QUANT
,GETDATE()
,'F'
)
END
ELSE
--꽁짜 교재가 아니면.
BEGIN
INSERT INTO T_ORDER_BASKET
(F_CAMPUS_ID,F_ITEM_CD,F_ORDER_QUANT,F_INS_DT,F_TYPE)
VALUES
(
@CAMPUS_ID
,@ITEM_CD
,@ORDER_QUANT
,GETDATE()
,'N'
)
END
END
CLOSE CUR
DEALLOCATE CUR
FETCH NEXT FROM CUR INTO @CAMPUS_ID, @ITEM_CD, @ORDER_QUANT
END
ELSE IF @TYPE = '2'
BEGIN
DELETE FROM T_ORDER_MST WHERE F_ORDER_NO = @ORDER_NO
DELETE FROM T_ORDER_DET WHERE F_ORDER_NO = @ORDER_NO
END
SET NOCOUNT OFF
주문완료된 상태에서 수정하기 버튼을 누르면 주문테이블에 있는 데이터를 바구니 테이블로 옮기는 프로시져인데요
커서문 집어넣은 뒤부터 이상하게..안됩니다.
어디가 잘못됐는지 모르겠어용..고수님들 도와주세요~~~
Comment 2
-
건우아빠
2013.09.13 13:11
-
여우비™
2013.09.13 16:57
굳이 커서를 사용한 이유가 있나요?
INSERT INTO T_ORDER_BASKET
SELECT F_CAMPUS_ID, F_ITEM_CD,F_ORDER_QUANT, GETDATE()
, CASE WHEN F_DEL = 'N' THEN 'F' ELSE 'N' END
FROM T_ORDER_DET
WHERE F_ORDER_NO = @ORDER_NO이와 같이 CASE문을 이용하면 커서 없이 충분히 처리할 수 있을것 같습니다.
커서는 리커시브콜에 의해 자원관리와 단위처리에 의한 성능 저하가 있어서 가능한 집합적 사고로 접근하여 사용을 자제하는 것이 대용량데이터 처리에도 유리합니다.
이상하게 안된다는 의미가 ? 질문자만 아시는 내용임.. 아무도 모르죠...
어떻게 되어야 하는데 이렇게 된다는 어떻게가 나와야 이렇게가 나오겠죠...
처리 절차상 이해가 안되는게 좀 되네요...
책을 주문하고 수정을 하는데 바구니에 있는걸 체크해 재고관련을 수정을 하고 없으면 수정을 안하는게
바구니에 들어 갈때 재고의 처리가 된다는것인지 ?
그럼 있다면을 보면
T_ORDER_BASKET 에 이 내용이 있는데 insert 루틴만 있는게... 그럼 이건 주문과 바구니는 같은 상품이여도 다른 내용으로 봐야 하는게 아닐지.. 재고 처리도 같이 들어가야 할듯... T_ORDER_BASKET의 key ? 중복문제가 있는지 ?
바구니에서 주문으로 넘어갈때는 재고 내용을 보면 받드시 지워지거나 주문처리가 되었다는 구분이 있어야 할듯 한데.. 이 부분은 다른 프로시저에서 어떻게 되는지 ? 지워진다면 또는 체크 구분이 있다면 재고 부분에 이 부분의 루틴이 가만 되어야 하는데 없는듯..
프로시저의 문제 보다는 절차 부분의 정리가 정확히 정의 되어야 프로시저의 문제를 알수 있을듯하네여...