MSSQL SERVER 2000 을 현재사용하고 있는데 오라클 9i(또는 그 이상)로 DB 를 변경할려고 검토 중 입니다.
그런데 한가지 문제점이 있어서 도움을 요청합니다.
***** 문제점 ***
현재의 모든 프로그램에서는 조회(QUERY)하는 방법을 다음과 같은 함수를 먼저 DB서버에 만들어서 프로그램에서는 단순한 SELECT 문장만을 작업을 하였습니다.
예) 함수
ALTER FUNCTION UF_SQL_MTSUBL_ITEM_DD
( @MTITEM VARCHAR (6), -- 자재코드
@STRDAT DATETIME, -- 시작일자
@ENDDAT DATETIME -- 종료일자
) RETURNS @RS TABLE (
ROWNUM INT IDENTITY(1,1),
MTITEM VARCHAR (6),
SUBLDT DATETIME,
EWOLQT NUMERIC (12,2), -- 전일재고
IBGOQT0 NUMERIC (12,2), -- 정상입고(구매)
IBGOQT1 NUMERIC (12,2), -- 구매반품(구매)
CHGOQT0 NUMERIC (12,2), -- 공정출고
CHGOQT1 NUMERIC (12,2), -- 외주출고
CHGOQT2 NUMERIC (12,2), -- 폐기출고
CHGOQT3 NUMERIC (12,2), -- 조정출고
CHGOQT4 NUMERIC (12,2), -- 기타
JEGOQT NUMERIC (12,2) -- 당일재고
) AS
--
BEGIN
--
DECLARE
@LN_EWOLQT NUMERIC(12,2),
@LN_ADDQTY NUMERIC(12,2),
--
@SUBLDT DATETIME,
@IBGOQT0 NUMERIC(12,2),
@IBGOQT1 NUMERIC(12,2),
@CHGOQT0 NUMERIC(12,2),
@CHGOQT1 NUMERIC(12,2),
@CHGOQT2 NUMERIC(12,2),
@CHGOQT3 NUMERIC(12,2),
@CHGOQT4 NUMERIC(12,2)
-- 기초재고
SET @LN_EWOLQT = DBO.UF_MTJEGO(@STRDAT,@MTITEM)
-- 일일 입출고 수불명세서
DECLARE C_CUR CURSOR LOCAL FAST_FORWARD FOR
SELECT A.SUBLDT,
SUM(A.IBGOQT0) AS IBGOQT0,
SUM(A.IBGOQT1) AS IBGOQT1,
SUM(A.CHGOQT0) AS CHGOQT0,
SUM(A.CHGOQT1) AS CHGOQT1,
SUM(A.CHGOQT2) AS CHGOQT2,
SUM(A.CHGOQT3) AS CHGOQT3,
SUM(A.CHGOQT4) AS CHGOQT4
FROM (
SELECT @STRDAT AS SUBLDT,
0 AS IBGOQT0,
0 AS IBGOQT1,
0 AS CHGOQT0,
0 AS CHGOQT1,
0 AS CHGOQT2,
0 AS CHGOQT3,
0 AS CHGOQT4
FROM DUAL
WHERE @LN_EWOLQT <> 0
UNION ALL
-- 입고
SELECT IBGODT AS SUBLDT,
CASE IBGOGB WHEN '4' THEN 0 ELSE IBGOQT END AS IBGOQT0,
CASE IBGOGB WHEN '4' THEN IBGOQT ELSE 0 END AS IBGOQT1,
0 AS CHGOQT0,
0 AS CHGOQT1,
0 AS CHGOQT2,
0 AS CHGOQT3,
0 AS CHGOQT4
FROM MTIBGOD
WHERE MTITEM = @MTITEM
AND IBGODT BETWEEN @STRDAT AND @ENDDAT
UNION ALL
-- 출고
SELECT CHGODT AS SUBLDT,
0 AS IBGOQT0,
0 AS IBGOQT1,
CASE WHEN CHGOGB IN ('1','2') THEN CHGOQT ELSE 0 END AS CHGOQT0,
CASE WHEN CHGOGB = ('3') THEN CHGOQT ELSE 0 END AS CHGOQT1,
CASE WHEN CHGOGB = ('7') THEN CHGOQT ELSE 0 END AS CHGOQT2,
CASE WHEN CHGOGB = ('6') THEN CHGOQT ELSE 0 END AS CHGOQT3,
CASE WHEN CHGOGB IN ('8','9') THEN CHGOQT ELSE 0 END AS CHGOQT4
FROM MTCHGO
WHERE MTITEM = @MTITEM
AND CHGODT BETWEEN @STRDAT AND @ENDDAT
) A
GROUP BY A.SUBLDT
ORDER BY A.SUBLDT
--
OPEN C_CUR
FETCH NEXT FROM C_CUR INTO @SUBLDT, @IBGOQT0, @IBGOQT1, @CHGOQT0, @CHGOQT1, @CHGOQT2, @CHGOQT3, @CHGOQT4
--
WHILE @@FETCH_STATUS = 0
BEGIN
-- 일재고수량
SET @LN_ADDQTY = @LN_EWOLQT + (@IBGOQT0 + @IBGOQT1 - @CHGOQT0 - @CHGOQT1 - @CHGOQT2 - @CHGOQT3 - @CHGOQT4)
--
INSERT INTO @RS (MTITEM, SUBLDT, EWOLQT, IBGOQT0, IBGOQT1,
CHGOQT0, CHGOQT1, CHGOQT2, CHGOQT3, CHGOQT4,
JEGOQT
)
VALUES (@MTITEM, @SUBLDT, @LN_EWOLQT, @IBGOQT0, @IBGOQT1,
@CHGOQT0, @CHGOQT1, @CHGOQT2, @CHGOQT3, @CHGOQT4,
@LN_ADDQTY
)
--
SET @LN_EWOLQT = @LN_ADDQTY
--
FETCH NEXT FROM C_CUR INTO @SUBLDT, @IBGOQT0, @IBGOQT1, @CHGOQT0, @CHGOQT1, @CHGOQT2, @CHGOQT3, @CHGOQT4
END
--
CLOSE C_CUR
DEALLOCATE C_CUR
--
RETURN
--
END
--
GO
실행방법
SELECT * FROM UF_SQL_MTSUBL_ITEM_DD('110011','2005-01-01','2005-01-20')
결과)
ROWNUM MTITEM SUBLDT EWOLQT IBGOQT0 IBGOQT1 CHGOQT0 CHGOQT1 CHGOQT2 CHGOQT3 CHGOQT4 JEGOQT
------ -------- ------ -------- -------- -------- -------- ------- -------- --------- -------- -------
내용들
위와같은 하는 이유)
1. 아무리 복잡한 결과를 얻기위한 QUERY라도 함수안에서 로직처리를 하면 원하는 결과를 일반적인 SELECT 문으로 구할 수있다.
2. 입력 파라메타를 이용해서 필요한 결과를 구할 수 있다.
3. 원쿼리(ONE QUERY)를 구현해서 하기힘든 경우 일단적으로 VIEW 나 일반함수, 프로시저를 이용한 임시테이블 생성후 쿼리,
테이블 설계변경 등 복잡한 방법을 이용하나 MS SQL의 함수는 입력파라메타가 있는 VIEW 테이블 처럼 동작이 되며,
프로시저를 실행하듯이 필요한 로직을 구현하여 최종적으로 TABLE 형 RETURN 값을 돌려준다.
4. 또한 다른 테이블 또는 함수와도 JOIN 이 가능하다.
사실상 VIEW 와도 매우 유사하다 즉 멀티레코드(멀리ROW)를 리턴하는 함수라고도 할 수 있다.
5. 유지보수나 쿼리 튜닝작업이 매우 용이하다.
그런데 오라클로 변경할려고 하니 매우어렵다.
ONE QUERY로 안되는 위와 같은 함수처리방식을 구현할려고 하면 임시테이블을 만들거나 테이블 설계를 변경하거나 해야
되는데 그것은 매우 불가능하고 일이 많아지게 된다.
오라클에서 할 수 있는 방안이 없는지 도움을 바랍니다.