한가지 더 질문 드립니다!! 0 7 2,560

by 람짱 [Oracle Tuning] [2011.04.29 14:17:41]


CREATE OR REPLACE PROCEDURE PRO_재고이월_품번
(YYYYMM   IN   CHAR
,변_품번 IN   VARCHAR2
,변_사이즈   IN   VARCHAR2
,변_색상 IN   VARCHAR2
,변_매장코드 IN   VARCHAR2
,변_매장존   IN   VARCHAR2   
)
IS
   BEFORE_INV   NUMBER  (12,2) := NULL;
   AFTER_INV    NUMBER  (12,2) := NULL;
   사용자정의에러  EXCEPTION;  
BEGIN

    BEGIN
  MERGE INTO (SELECT *
   FROM 영업매장월계
  WHERE 발생일자 = TO_CHAR(ADD_MONTHS(TO_DATE(YYYYMM||'01'), 1),'YYYYMM') 
    AND 품번 = 변_품번
    AND 사이즈   = 변_사이즈
    AND 색상 = 변_색상
    AND 매장코드 = 변_매장코드
    AND 매장존   = 변_매장존
  ) 월계

  USING (SELECT *
   FROM 영업매장월계
  WHERE 발생일자 = YYYYMM
    AND 품번 = 변_품번
    AND 사이즈   = 변_사이즈
    AND 색상 = 변_색상
    AND 매장코드 = 변_매장코드
    AND 매장존   = 변_매장존
    ) MON

  ON (   월계.품번 = MON.품번
AND 월계.사이즈   = MON.사이즈
AND 월계.색상 = MON.색상
AND 월계.매장코드 = MON.매장코드
AND 월계.매장존   = MON.매장존)

  WHEN MATCHED THEN
    UPDATE
   SET 월계.기초재고미착 = MON.기말재고미착,
   월계.기말재고미착 = MON.기말재고미착 + 월계.미착입점량
    + 월계.미착반품량
    + 월계.미착이동반입량

  WHEN NOT MATCHED THEN
    INSERT(발생일자,   매장코드, 매장존,     품번, 색상, 사이즈,
   기초재고,   기초재고미착, 기말재고,   기말재고미착, 기초재고금액, 기말재고금액)
    VALUES(TO_CHAR(ADD_MONTHS(TO_DATE(YYYYMM||'01'), 1),'YYYYMM')
   ,   MON.매장코드, MON.매장존,   MON.품번,   MON.색상, MON.사이즈,
   MON.기말재고,   MON.기말재고미착, MON.기말재고, MON.기말재고미착,  MON.기말재고금액, MON.기말재고금액);

    END;

위의 프로시저는 문제 없이 돌아갑니다.......


CREATE OR REPLACE PROCEDURE PRO_재고이월_품번
(YYYYMM IN CHAR
,변_품번 IN VARCHAR2
,변_사이즈 IN VARCHAR2
,변_색상 IN VARCHAR2
,변_매장코드 IN VARCHAR2
,변_매장존 IN VARCHAR2
)
IS
NEXT_YYYYMM CHAR   (6) := NULL;
BEFORE_INV NUMBER (12,2) := NULL;
AFTER_INV NUMBER (12,2) := NULL;
사용자정의에러 EXCEPTION;
BEGIN

BEGIN

SELECT
    TO_CHAR(ADD_MONTHS(TO_DATE(YYYYMM||'01'), 1),'YYYYMM')
    INTO NEXT_YYYYMM
    FROM DUAL;

MERGE INTO (SELECT *
FROM 영업매장월계
WHERE 발생일자 = NEXT_YYYYMM
AND 품번 = 변_품번
AND 사이즈 = 변_사이즈
AND 색상 = 변_색상
AND 매장코드 = 변_매장코드
AND 매장존 = 변_매장존
) 월계

USING (SELECT *
FROM 영업매장월계
WHERE 발생일자 = YYYYMM
AND 품번 = 변_품번
AND 사이즈 = 변_사이즈
AND 색상 = 변_색상
AND 매장코드 = 변_매장코드
AND 매장존 = 변_매장존
) MON

ON ( 월계.품번 = MON.품번
AND 월계.사이즈 = MON.사이즈
AND 월계.색상 = MON.색상
AND 월계.매장코드 = MON.매장코드
AND 월계.매장존 = MON.매장존)

WHEN MATCHED THEN
UPDATE
SET 월계.기초재고미착 = MON.기말재고미착,
월계.기말재고미착 = MON.기말재고미착 + 월계.미착입점량
+ 월계.미착반품량
+ 월계.미착이동반입량

WHEN NOT MATCHED THEN
INSERT(발생일자, 매장코드, 매장존, 품번, 색상, 사이즈,
기초재고, 기초재고미착, 기말재고, 기말재고미착, 기초재고금액, 기말재고금액)
VALUES(NEXT_YYYYMM
, MON.매장코드, MON.매장존, MON.품번, MON.색상, MON.사이즈,
MON.기말재고, MON.기말재고미착, MON.기말재고, MON.기말재고미착, MON.기말재고금액, MON.기말재고금액);

END;


이 프로시저는 ORA-00600 : INTERNAL ERROR CODE, ARGUMENTS:[qcsfbdnp:1],[],[],.. 오류를 뱉습니다..

이유가 뭘까요??

제가 아무리 봐도 NEXT_YYYYMM을 변수로 받아오기, MERGE문에서 NEXT_YYYYMM 구하기..
이 차이 뿐이 없는거 같거든요;; 제가.. 바보인가요;;

by 知音 [2011.04.29 14:30:36]
NEXT_YYYYMM 가 Merge 문의 select 절에 없는 항목이여서 그런거 아닌가요.

by 람짱 [2011.04.29 14:35:47]
NEXT_YYYYMM은 변수일뿐.
그와 대응하는 발생일자는 존재하는 값이거든요..
흠.. 이상타;;


by 마농 [2011.04.29 14:44:28]
버그와는 무관하겠지만 코딩습관 하나 바로잡아드립니다.
TO_DATE(YYYYMM||'01') 은 잘못된 사용법입니다.
TO_DATE(YYYYMM||'01', 'yyyymmdd') 로 사용하셔야 합니다.
또는 TO_DATE(YYYYMM, 'yyyymm') 로 사용하셔야 합니다.
날짜 변환함수 사용시엔 항상 포멧을 정확하게 기술해 주세요.

by 람짱 [2011.04.29 14:47:07]
넵 알겠습니다^^

by 임군 [2011.04.29 17:49:28]
value 값 넣는 곳에 함수는 호출할수 있으나
프로시저는 안된다고 하던데요..
한번 확인해보세요..
윗글 보니 프로시저인저 같던데요..

제가 DB쪽을 공부하는게 아니라
SI하면서 공부 좀 하려고 들오는 녀석이라..
물론 초보구요.. 정확하지는 않지만요..

혹시 모르니 확인해보세요.. 함수로 해서 호출하면 가능해도
프로시저는 value값에 넣을수 없다네요

by 임군 [2011.04.29 17:52:20]
아.. 잘못봤네요.. 변수로 들어간거네요..

역시 초보라.. 죄송요.. 헷갈리게 만들뻔 했네요..

by 임군 [2011.04.29 18:03:05]
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입