Oracle PL SQL,简化了我的过程

Oracle PL SQL,简化了我的过程,sql,oracle,stored-procedures,Sql,Oracle,Stored Procedures,我有以下程序 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 [V

我有以下程序

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几乎相同

statement2=statement1+where clasechecking 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条件。但是,这不是一个好的编码实践

我会使用NVL进行解码

更新:DECODE和NVL参数值取决于列数据类型

如果订单ID为编号,则使用:

在哪里 DECODEp\u order\u id,NULL,0,order\u id.order\u id=NVLp\u order\u id,0

否则,如果p_ORDER_ID为VARCHAR2,则使用:

在哪里
DECODEp\u order\u id,NULL,'0',order\u id.order\u id=NVLp\u order\u id,'0'

为什么where子句不能以参数值为条件?因此,您得到了一条sql语句的效果,但在where子句中进行了分支。我必须看到更多的查询才能提供更多的细节,因为我不知道where子句可以是conditional。谢谢你的评论。我会找到办法的。我稍微改变了你的答案。我得到ORA-01722无效号码错误。所以我将默认值改为字符串类型。其中Decodepp\u order\u id,NULL,'0',order\u id.order\u id=NVLp\u order\u id,'0'确定。我认为ORDER_ID是一种数字数据类型。让我编辑一下tmy的答案,即兴修改一下数据类型。