繁体   English   中英

Oracle PL SQL,简化我的程序

[英]Oracle PL SQL, Simplifying my procedure

我有以下步骤。

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

选择语句1和2几乎相同。

statement2 = statement1 +其中clase(检查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;

您可以在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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM