2014-09-22 68 views
0

我有以下過程。Oracle PL SQL,簡化我的程序

PROCEDURE PROC_SELECT_ORDERTBL(
    my_cursor OUT SYS_REFCURSOR, 
    p_ORDER_ID IN VARCHAR2 
    ... 
) 
BEGIN 
    IF p_ORDER_ID IS NULL THEN 
     OPEN my_cursor FOR 
     [VERY LONG SELECT STATEMENT1] 
    ELSE 
     OPEN my_cursor FOR 
     [VERY LONG SELECT STATEMENT2] 
    END IF; 

END PROC_SELECT_ORDERTBL 

select語句1和2幾乎相同。

語句2 =語句1 +其中化酶(檢查p_ORDER_ID)

我想簡化像我的下一個步驟。

PROCEDURE PROC_SELECT_ORDERTBL(
    my_cursor OUT SYS_REFCURSOR, 
    p_ORDER_ID IN VARCHAR2 
    ... 
) 
BEGIN 

    WITH viewData AS 
    [VERY LONG SELECT STATEMENT1] 

    IF p_ORDER_ID IS NULL THEN 
     OPEN my_cursor FOR 
     viewData 
    ELSE 
     OPEN my_cursor FOR 
     viewData + where clause 
    END IF; 

END PROC_SELECT_ORDERTBL 

但是這不能編譯。

----------------------這在我的整個過程代碼------------------ -

-- ORDERTBL 종이식권 주문단위로 조회 
    PROCEDURE PROC_SELECT_ORDERTBL (
    my_cursor OUT SYS_REFCURSOR, -- CURSOR 
    p_AREA_ID IN VARCHAR2, -- AREA_ID 
    p_EQP_ID IN VARCHAR2,  -- EQP_ID 
    p_ORDER_ID IN VARCHAR2, -- ORDER_ID 
    p_date_from IN VARCHAR2, -- yymmdd 조회시작일 
    p_date_to IN VARCHAR2, -- yymmdd 조회종료일 
    p_errorcode OUT NUMBER -- error code 
) AS 
    BEGIN 
    p_errorcode := 0; 

    IF p_ORDER_ID IS NULL THEN 
     OPEN my_cursor FOR 
     SELECT ORD.ORDER_DATE AS 판매일자, ORD.ORDER_TIME AS 판매시간, ORD_ID.ORDER_ID AS 주문번호, TOTAL_SALES AS 판매금액 
     FROM 
     (
      --판매일자, 판매시간, 판매금액 
      SELECT ORDER_DATE, ORDER_TIME, SUM(ORDER_FEE) AS TOTAL_SALES 
      FROM 
      (
      SELECT DISTINCT ORDER_DATE, ORDER_TIME, ORDER_FEE FROM ORDERTBL 
      WHERE AREA_ID = p_AREA_ID AND EQP_ID = p_EQP_ID AND 
      ORDER_DATE >= p_date_from AND ORDER_DATE <= p_date_to 
     ) 
      GROUP BY ORDER_DATE, ORDER_TIME 
     ) ORD 
     JOIN 
     (
      --판매일자, 판매시간, 주문번호 
      SELECT ORDER_DATE, ORDER_TIME, MIN(ORDER_ID) AS ORDER_ID 
      FROM ORDERTBL 
      WHERE AREA_ID = p_AREA_ID AND EQP_ID = p_EQP_ID AND 
      ORDER_DATE >= p_date_from AND ORDER_DATE <= p_date_to 
      GROUP BY ORDER_DATE, ORDER_TIME 
     ) ORD_ID 
     ON ORD.ORDER_DATE = ORD_ID.ORDER_DATE AND ORD.ORDER_TIME = ORD_ID.ORDER_TIME 
     ORDER BY ORD.ORDER_DATE, ORD.ORDER_TIME; 
    ELSE 
    OPEN my_cursor FOR 
     SELECT ORD.ORDER_DATE AS 판매일자, ORD.ORDER_TIME AS 판매시간, ORD_ID.ORDER_ID AS 주문번호, TOTAL_SALES AS 판매금액 
     FROM 
     (
     --판매일자, 판매시간, 판매금액 
     SELECT ORDER_DATE, ORDER_TIME, SUM(ORDER_FEE) AS TOTAL_SALES 
     FROM 
     (
      SELECT DISTINCT ORDER_DATE, ORDER_TIME, ORDER_FEE FROM ORDERTBL 
      WHERE AREA_ID = p_AREA_ID AND EQP_ID = p_EQP_ID AND 
      ORDER_DATE >= p_date_from AND ORDER_DATE <= p_date_to 
     ) 
     GROUP BY ORDER_DATE, ORDER_TIME 
    ) ORD 
     JOIN 
     (
     --판매일자, 판매시간, 주문번호 
     SELECT ORDER_DATE, ORDER_TIME, MIN(ORDER_ID) AS ORDER_ID 
     FROM ORDERTBL 
     WHERE AREA_ID = p_AREA_ID AND EQP_ID = p_EQP_ID AND 
     ORDER_DATE >= p_date_from AND ORDER_DATE <= p_date_to 
     GROUP BY ORDER_DATE, ORDER_TIME 
    ) ORD_ID 
     ON ORD.ORDER_DATE = ORD_ID.ORDER_DATE AND ORD.ORDER_TIME = ORD_ID.ORDER_TIME 
     WHERE ORD_ID.ORDER_ID = p_ORDER_ID; 
    END IF; 

    EXCEPTION 
    WHEN OTHERS THEN 
     p_errorcode := SQLCODE; 
    END PROC_SELECT_ORDERTBL; 
+1

爲什麼不能在where子句是對參數條件值(S)?所以你得到一個sql語句的效果,但在where子句中分支。我不得不看更多的查詢給予更多的細節 – 2014-09-22 02:42:27

+0

我不知道哪裏子句可以是條件。謝謝你的評論。我會找到如何去做。 – user2712734 2014-09-22 02:51:12

回答

0

您可以在where子句中使用CASE結構。邏輯與您的IF-ELSE條件類似。但是,這不是一個好的編碼習慣。

我會去NVLDECODE

更新:DECODE和NVL參數值取決於列數據類型。

如果P_ORDER_IDNUMBER然後使用:

WHERE DECODE(p_order_id, NULL, 0, ORD_ID.ORDER_ID) = NVL(p_ORDER_ID, 0)

否則,如果P_ORDER_IDVARCHAR2然後使用:

WHERE DECODE(p_order_id, NULL, '0', ORD_ID.ORDER_ID) = NVL(p_ORDER_ID, '0')

+0

我改變了你的答案一點。我得到了ORA-01722無效數字錯誤。所以我將默認值更改爲字符串類型。 WHERE DECODE(p_order_id,NULL,'0',ORD_ID.ORDER_ID)= NVL(p_ORDER_ID,'0') – user2712734 2014-09-22 05:35:43

+0

好的。我以爲'ORDER_ID'是一個'NUMBER'數據類型。讓我編輯tmy答案即興創作數據類型。 – 2014-09-22 07:09:08