반응형
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 를 사용하나 배열에 있는 값 가공 및 사용시에는 배열로 대체합니다)
반응형