설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


Powered by EnterpriseDB
총 게시물 130건, 최근 0 건
 

oracle 쿼리문인데 postgresql 쿼리문으로 변경하고 싶습니다. 너무 어렵네요

글쓴이 : 열심히하는… 날짜 : 2018-09-19 (수) 14:02 조회 : 60
안녕하세요 postgresql 시작한지 얼마 안됐습니다.

tpc-c 관련해서 프로시저를 하나 만들고 있는데 생각보다 작업이 어렵네요

CREATE OR REPLACE PROCEDURE Delivery
(
    IN_mW_ID          IN  INTEGER,
    IN_mO_CARRIER_ID  IN  INTEGER,
    OUT_Result        OUT VARCHAR(4000),
    OUT_mSuccess      OUT NATIVE_INTEGER
)
IS
    sNativeError    INTEGER;

    DV_w_id          INTEGER;
    DV_o_carrier_id  INTEGER;
    DV_d_id          INTEGER;
    DV_c_id          INTEGER;
    DV_no_o_id      INTEGER;
    DV_o_total      NUMERIC(15,2);

    sBuffer          VARCHAR(4000);

    PROCEDURE SETERR
    IS
    BEGIN
        sNativeError := SQLCODE;
    END;
BEGIN

    ---------------------------------------------
    -- INPUT ARGS, Initialize Variable
    ---------------------------------------------
    DV_w_id        := IN_mW_ID;
    DV_o_carrier_id := IN_mO_CARRIER_ID;

    << RAMP_RETRY >>

    sNativeError    := 0;
    sBuffer        := '';

    ---------------------------------------------
    -- GET OUTPUT
    ---------------------------------------------
    FOR DV_d_id IN 1 .. 10
    LOOP
        BEGIN
            SELECT no_o_id INTO DV_no_o_id
            FROM new_order
            WHERE no_w_id = DV_w_id AND
                  no_d_id = DV_d_id
            ORDER BY no_o_id
            FETCH 1 ;
        EXCEPTION WHEN NO_DATA_FOUND THEN sBuffer := sBuffer || -1 || '|' || DV_d_id || '|';
                                          CONTINUE;
                  WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        BEGIN
            DELETE FROM new_order
            WHERE no_o_id = DV_no_o_id AND
                  no_d_id = DV_d_id AND
                  no_w_id = DV_w_id;
        EXCEPTION WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        BEGIN
            SELECT o_c_id INTO DV_c_id
            FROM orders
            WHERE o_id  = DV_no_o_id AND
                  o_d_id = DV_d_id AND
                  o_w_id = DV_w_id;
        EXCEPTION WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        BEGIN
            UPDATE orders
            SET o_carrier_id = DV_o_carrier_id
            WHERE o_id  = DV_no_o_id AND
                  o_d_id = DV_d_id AND
                  o_w_id = DV_w_id ;
        EXCEPTION WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        BEGIN
            UPDATE order_line
            SET ol_delivery_d = sysdate
            WHERE ol_o_id = DV_no_o_id AND
                  ol_d_id = DV_d_id AND
                  ol_w_id = DV_w_id;
        EXCEPTION WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        BEGIN
            SELECT SUM(ol_amount) INTO DV_o_total
            FROM order_line
            WHERE ol_o_id = DV_no_o_id AND
                  ol_d_id = DV_d_id AND
                  ol_w_id = DV_w_id;
        EXCEPTION WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        BEGIN
            UPDATE customer
            SET c_balance = c_balance + DV_o_total,
                c_delivery_cnt = c_delivery_cnt + 1
            WHERE c_id  = DV_c_id AND
                  c_d_id = DV_d_id AND
                  c_w_id = DV_w_id;
        EXCEPTION WHEN OTHERS THEN SETERR;goto SQL_FINISH;
        END;

        -------------------------------------------
        -- Make Output-String
        -------------------------------------------
        sBuffer := sBuffer || DV_no_o_id || '|' || DV_d_id || '|';
    END LOOP;


    -------------------------------------------
    -- Output Param
    -------------------------------------------
    OUT_Result  := sBuffer;
    OUT_mSuccess := 1;

    COMMIT;

    goto END_STEP;

    << SQL_FINISH >>

    ROLLBACK;

    IF ( (sNativeError = -14007) OR (sNativeError = -14032) )
    THEN
        goto RAMP_RETRY;
    END IF;

    OUT_mSuccess := 0;

    << END_STEP >>
    NULL;
END;
/


오라클 프로시저문인데 postgresql로 변경하고 싶은데 잘 안되네요 혹시 잘 아시는분 있으면

팁같은거 부탁드리겠습니다.

PostgresDBA 2018-09-20 (목) 13:13
댓글주소
열심히하는… 2018-09-21 (금) 12:08
위 쿼리문같이 begin-end문이 여러번 들어가는데, postgres에서도 마찬가지로 begin-end; language plpgsql; 로 마무리 지으면 되는건가요?
댓글주소
 

postgresdba.com