首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle中带有CASE-WHEN子句的存储过程

Oracle中带有CASE-WHEN子句的存储过程
EN

Stack Overflow用户
提问于 2019-04-03 11:11:16
回答 1查看 1K关注 0票数 1

我在Oracle工作,我试图为获取数据做一个存储过程。

我想在WHERE内部插入一个大小写,但是它没有编译我,下面的错误返回给我:

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

,这是一个过程:

代码语言:javascript
复制
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;

我哪里错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-03 11:18:53

您可以将WHERE子句重写为:

代码语言:javascript
复制
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上工作的方式重构您的逻辑的一种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55493758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档