【问题标题】:Stored Procedure in Oracle with CASE-WHEN in clause WHEREOracle 中的存储过程,子句 WHERE 中带有 CASE-WHEN
【发布时间】:2019-04-03 11:11:16
【问题描述】:

我在 Oracle 工作,正在尝试为 GET 数据执行存储过程。

我想在 WHERE 内插入一个案例,但它没有编译我,并且以下错误返回给我:

  • 错误 (11.5): PL / SQL: SQL 语句被忽略
  • 错误 (22.37): PL / SQL: ORA-00905: 缺少关键字

这是程序:

create or replace PROCEDURE SP_S_DETTAGLIOLOTTI
(
    DATAINIZIO      IN VARCHAR2,
    DATAFINE        IN VARCHAR2,
    CODICEPROFILO   IN NUMBER,
    dett_lotti  OUT SYS_REFCURSOR
)
AS 
BEGIN
    OPEN dett_lotti FOR
    SELECT A.IDLOTTO as IDLOTTO, B.S_DENOMINAZIONE as PROFILOLOTTO, A.TOTRKD as TOTALERECORD,
        CASE WHEN A.DATRPAPSA IS NULL 
             THEN 'NO'  
             ELSE 'SI' 
        END AS ELABORATO  
    FROM DLTOPST A 
    INNER JOIN REQUISITI B 
        ON A.COD_REQUISITO = B.COD_REQUISITI

      WHERE 
        CASE WHEN DATAINIZIO IS NOT NULL AND CODICEPROFILO IS NULL 
             THEN DATA_INVIO_POSTEL BETWEEN TO_DATE(DATAINIZIO, 'DD/MM/YYYY HH24.MI.SS') 
                 AND TO_DATE(DATAFINE, 'DD/MM/YYYY HH24.MI.SS')
             WHEN DATAINIZIO IS NOT NULL AND CODICEPROFILO IS NOT NULL
             THEN DATA_INVIO_POSTEL BETWEEN TO_DATE(DATAINIZIO, 'DD/MM/YYYY HH24.MI.SS') 
                 AND TO_DATE(DATAFINE, 'DD/MM/YYYY HH24.MI.SS') AND COD_REQUISITO = CODICEPROFILO
             ELSE COD_REQUISITO = CODICEPROFILO
        END ;

END SP_S_DETTAGLIOLOTTI;

我哪里错了?

【问题讨论】:

  • “我哪里错了?”你不能在 where 子句中插入大小写
  • 使用如果?如果我必须在 where 子句中这样做,有办法吗?
  • 两者都不是,您可以使用and or、子查询等查看文档中的选择语法docs.oracle.com/cd/B19306_01/server.102/b14200/…

标签: oracle stored-procedures plsql case where-clause


【解决方案1】:

您可以将WHERE 子句重写为:

WHERE 
    (DATAINIZIO IS NOT NULL AND CODICEPROFILO IS NULL AND
         DATA_INVIO_POSTEL BETWEEN TO_DATE(DATAINIZIO, 'DD/MM/YYYY HH24.MI.SS') AND
                                   TO_DATE(DATAFINE, 'DD/MM/YYYY HH24.MI.SS')) OR
    (DATAINIZIO IS NOT NULL AND CODICEPROFILO IS NOT NULL AND
         DATA_INVIO_POSTEL BETWEEN TO_DATE(DATAINIZIO, 'DD/MM/YYYY HH24.MI.SS') AND
                                   TO_DATE(DATAFINE, 'DD/MM/YYYY HH24.MI.SS') AND
         COD_REQUISITO = CODICEPROFILO) OR
    COD_REQUISITO = CODICEPROFILO

您当前方法的问题是CASE 表达式的谓词(即THENELSE 之后的内容)必须是文字,而不是逻辑表达式。我上面写的是一种重构逻辑的方法,它应该适用于 Oracle。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-05-05
    • 1970-01-01
    • 2023-01-21
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多