我在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
(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
表达式的谓词(即THEN
或ELSE
后面的内容(必须是文字值而不是逻辑表达式。 我上面写的是一种重构逻辑的方法,应该在 Oracle 上工作。