2014-09-22 62 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