MSSQL 의 사용자함수처럼 오라클에 같은 방법(기능)이??? 0 0 2,378

by 정재홍 [2006.01.26 17:53:55]


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로 안되는 위와 같은 함수처리방식을 구현할려고 하면 임시테이블을 만들거나 테이블 설계를 변경하거나 해야
되는데 그것은 매우 불가능하고 일이 많아지게 된다.

오라클에서 할 수 있는 방안이 없는지 도움을 바랍니다.

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