【问题标题】:ORACLE 11GPL/SQL cursor with dynamic when clause带有动态 when 子句的 ORACLE 11GPL/SQL 游标
【发布时间】:2021-02-21 06:04:25
【问题描述】:

我想在 PL/SQL 过程中使用以下游标(在 Oracle 11g 上运行):

SELECT
        dateagregation as DATEAGREG,
        SUM(TRAITE3MOIS) as col1,
        SUM(TRAITE)      as col2
        FROM ttabdbordrescrit where dateagregation = P_AGREGATION_N
        AND directionid = P_DIRECTIONID
        AND celluleid = P_CELLULEID
        AND libelletabdbordrescritid IN (CASE
                        WHEN (YEAR(P_AGREGATION_N) >= 2020)
                        THEN
                          2, 26, 27
                        ELSE 
                           2
                     END)

但我在 SQLDEVELOPPER 上遇到 ORA 00905 错误,第 2、26、27 行是红色的! (P_AGREGATION_N 是一个 PL_SQL 有效参数) 怎么了?

还有其他方法可以构建动态查询吗?

提前感谢您的回答。

【问题讨论】:

  • Oracle中没有year()函数

标签: oracle plsql oracle11g


【解决方案1】:

没有year 函数,除非您创建了一个函数,并且您不能从case 语句中返回类似的列表。假设 p_agregation_n 是一个 date 参数,你想要类似的东西

AND (   (    p_agregation_n >= date '2020-01-01'
         and libelletabdbordrescritid in (2, 26, 27))
     or (    p_agregation_n <  date '2020-01-01' 
         and libelletabdbordrescritid = 2))

【讨论】:

    【解决方案2】:

    不是参数,而是这个:

    WHEN (YEAR(P_AGREGATION_N) >= 2020)
    

    Oracle 中没有 YEAR 函数。如果P_AGREGATION_NDATE(数据类型),你可以

    when extract(year from p_agregation_n) >= 2020
    

    如果是字符串,使用SUBSTR函数。

    【讨论】:

      猜你喜欢
      • 2014-03-08
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      相关资源
      最近更新 更多