본문 바로가기
DataBase/PostgreSQL

Oracle -> PostgreSQL 변경 #3. Oracle BULK COLLECT 문법 변환

by 쏜스 2025. 4. 22.
반응형

1. Oracle 사용

DECLARE

    TYPE DCT_STOCK_FIFO IS TABLE OF PT_STOCK_FIFO_MONTH%ROWTYPE;
    RC_STOCK_FIFO DCT_STOCK_FIFO     := DCT_STOCK_FIFO();

    V_MONS            VARCHAR(1000) := '200911';
    V_SHOP_CD         VARCHAR(1000) := 'DM30101';
    V_PART_NO         VARCHAR(1000) := '0415231090';
BEGIN
        SELECT * BULK COLLECT
          INTO RC_STOCK_FIFO
          FROM PT_STOCK_FIFO_MONTH
         WHERE MONS            = V_MONS
           AND SHOP_CD         = V_SHOP_CD
           AND PART_NO         = V_PART_NO
           AND STOCK_QTY       > 0
         ORDER BY STOCK_PRICE_APPLY_TO_DT, LINE_NO;

      IF (RC_STOCK_FIFO.COUNT = 0) THEN
          RAISE_APPLICATION_ERROR(-20011,'NO DATA!!!');
      END IF;

    FOR I IN RC_STOCK_FIFO.FIRST..RC_STOCK_FIFO.LAST LOOP
        DBMS_OUTPUT.PUT_LINE('RC_STOCK_FIFO[' || I || '] : ' || RC_STOCK_FIFO(I).MONS);
    end loop;
end;

2. PostgreSQL 사용

DO $$
    DECLARE
        RC_STOCK_FIFO          PT_STOCK_FIFO_MONTH[];
        RC_STOCK_FIFO_CNT      INT;

        V_MONS VARCHAR(1000) := '200911';
        V_SHOP_CD VARCHAR(1000) := 'DM30101';
        V_PART_NO VARCHAR(1000) := '0415231090';
    BEGIN

        SELECT COUNT(*) INTO RC_STOCK_FIFO_CNT
        FROM PT_STOCK_FIFO_MONTH
         WHERE MONS            = V_MONS
           AND SHOP_CD         = V_SHOP_CD
           AND PART_NO         = V_PART_NO
           AND STOCK_QTY       > 0;

        IF RC_STOCK_FIFO_CNT = 0 THEN
            RAISE EXCEPTION 'NO DATA!!!';
        end if;

        SELECT ARRAY(
            SELECT ROW(A.*)
            FROM PT_STOCK_FIFO_MONTH A
             WHERE MONS            = V_MONS
               AND SHOP_CD         = V_SHOP_CD
               AND PART_NO         = V_PART_NO
               AND STOCK_QTY       > 0
             ORDER BY STOCK_PRICE_APPLY_TO_DT, LINE_NO
        ) INTO RC_STOCK_FIFO;

        FOR I IN 1..ARRAY_LENGTH(RC_STOCK_FIFO, 1) LOOP

            RAISE NOTICE 'RC_STOCK_FIFO[%] : %', I ,RC_STOCK_FIFO[I].mons;

        end loop;
    end;
$$

 

Oralce에서 PostgreSQL 로 변환 시 주의사항

 

1. Oracle 의 타입 테이블 선언

TYPE DCT_STOCK_FIFO IS TABLE OF PT_STOCK_FIFO_MONTH%ROWTYPE;
RC_STOCK_FIFO DCT_STOCK_FIFO := DCT_STOCK_FIFO();
PostgreSQL 에서 테이블 배열로 선언하여 대체 가능합니다.
RC_STOCK_FIFO PT_STOCK_FIFO_MONTH[];
2. Oracle SELECT * BULK COLLECT 사용
 
PostgreSQL 에서는 지원하지 않아 RECORD 또는 배열로 대체합니다.
(간단한 경우에는 RECORD 를 사용하나 배열에 있는 값 가공 및 사용시에는 배열로 대체합니다)

 

반응형