我有这个程序:

 PROCEDURE P_LOAD_EXPIRED_ACCOUNT
  (
  pDayDiff IN NUMBER,
  ExpiredCur OUT MEGAGREEN_CUR
  )
  IS
  BEGIN
  OPEN ExpiredCur FOR
  SELECT 
  ACCOUNT_NAME, SERVICE_TYPE, 
      CASE 
      WHEN SERVICE_TYPE = 1 THEN ADD_MONTHS(ACTIVATED_DATE,3)
      WHEN SERVICE_TYPE = 2 THEN ADD_MONTHS(ACTIVATED_DATE,6)
      WHEN SERVICE_TYPE = 3 THEN ADD_MONTHS(ACTIVATED_DATE,12)        
       END 
       AS EXPIRED_DATE
  FROM SUBSCRIBERS
  WHERE (EXPIRED_DATE - CURRENT_DATE) < pDayDiff;
  END;

但 SQL Developer 生成此错误:

错误(20,10):PL/SQL:ORA-00904:“EXPIRED_DATE”:不合法的识别符

我相信 PLSQL 允许我在 Where 子句中使用 Alias,但是我忘记了什么吗?

提前致谢。

有帮助吗?

解决方案

您不能在 WHERE 子句中引用列别名 - 您的选项是:

  • 复制 WHERE 子句中的 CASE 语句
  • 使用子查询:

    PROCEDURE P_LOAD_EXPIRED_ACCOUNT(pDayDiff NUMBER,
                                     ExpiredCur OUT MEGAGREEN_CUR)
    IS
    BEGIN
    
    
       OPEN ExpiredCur FOR
       SELECT x.account_name,
              x.service_type, 
              x.expired_date
         FROM (SELECT s.account_name,
                      s.service_type, 
                      CASE 
                         WHEN s.service_type = 1 THEN ADD_MONTHS(ACTIVATED_DATE,3)
                         WHEN s.service_type = 2 THEN ADD_MONTHS(ACTIVATED_DATE,6)
                         WHEN s.service_type = 3 THEN ADD_MONTHS(ACTIVATED_DATE,12)        
                      END AS EXPIRED_DATE
                 FROM SUBSCRIBERS s) x
        WHERE x.expired_date - CURRENT_DATE < pDayDiff;
    
    
    END;
    

    甲骨文9i+

    WITH summary AS (
      SELECT s.account_name,
             s.service_type, 
             CASE 
                WHEN s.service_type = 1 THEN ADD_MONTHS(ACTIVATED_DATE,3)
                WHEN s.service_type = 2 THEN ADD_MONTHS(ACTIVATED_DATE,6)
                WHEN s.service_type = 3 THEN ADD_MONTHS(ACTIVATED_DATE,12)        
             END AS EXPIRED_DATE
        FROM SUBSCRIBERS s)
       SELECT x.account_name,
              x.service_type, 
              x.expired_date
         FROM summary x
        WHERE x.expired_date - CURRENT_DATE < pDayDiff;
    
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top