我正在Oracle的存储过程中尝试比较两个数字(都从具有DATE
函数的EXTRACT
中提取)与另外两个数字(与EXTRACT
一起提取),并且我我想检查我是否已经有相同月份和年份的行,但是无论我做什么,我总是会发现一行,即使月份和年份都不一样!
这是我在存储过程之外进行测试的以下代码,DBMS_OUTPUT
总是打印出在SELECT COUNT(*)
中发现的1种情况:
DECLARE
VAR_COUNTER NUMBER;
VAR_MONTH NUMBER;
VAR_YEAR NUMBER;
BEGIN
SELECT EXTRACT(MONTH FROM TO_DATE('10/12/2019','DD/MM/YYYY')),EXTRACT(YEAR FROM TO_DATE('10/12/2019','DD/MM/YYYY'))
INTO VAR_MONTH,VAR_YEAR FROM DUAL;
SELECT COUNT(*)
INTO VAR_COUNTER
FROM FATTURATO_RISTORANTI
WHERE FATTURATO_RISTORANTI.ID_RISTORANTE = 3
AND FATTURATO_RISTORANTI.MESE= VAR_MONTH
AND FATTURATO_RISTORANTI.ANNO = VAR_YEAR;
DBMS_OUTPUT.PUT_LINE(VAR_MONTH || ' ' || VAR_YEAR || ' ' || VAR_COUNTER);
END;
P.S。 :mese是提取的MONTH
,而anno是提取的YEAR
;
答案 0 :(得分:1)
如果只需要一次这些值,则也可以编写
DECLARE
contatore NUMBER;
BEGIN
SELECT COUNT(*)
INTO contatore
FROM FATTURATO_RISTORANTI
WHERE FATTURATO_RISTORANTI.ID_RISTORANTE = 3
AND FATTURATO_RISTORANTI.MESE = EXTRACT(MONTH FROM DATE '2019-12-10')
AND FATTURATO_RISTORANTI.ANNO = EXTRACT(YEAR FROM DATE '2019-12-10');
DBMS_OUTPUT.PUT_LINE(contatore);
END;
或使用
vMese := EXTRACT(MONTH FROM TO_DATE('10/12/2019', 'DD/MM/YYYY'));
vAnno := EXTRACT(YEAR FROM TO_DATE('10/12/2019', 'DD/MM/YYYY'));
FATTURATO_RISTORANTI.ID_RISTORANTE = 3
等于3 = FATTURATO_RISTORANTI.ID_RISTORANTE
,但更具“可读性”。
答案 1 :(得分:0)
这应该像:
DECLARE
contatore NUMBER;
vMese NUMBER;
vAnno NUMBER;
BEGIN
SELECT EXTRACT(MONTH FROM TO_DATE('10/12/2019', 'DD/MM/YYYY')), EXTRACT(YEAR FROM TO_DATE('10/12/2019', 'DD/MM/YYYY'))
INTO vMese, vAnno
FROM DUAL;
SELECT COUNT(*)
INTO contatore
FROM FATTURATO_RISTORANTI
WHERE 3 = FATTURATO_RISTORANTI.ID_RISTORANTE
AND FATTURATO_RISTORANTI.MESE = vMese
AND FATTURATO_RISTORANTI.ANNO = vAnno;
DBMS_OUTPUT.PUT_LINE(vMese || ' ' || vAnno || ' ' || contatore);
END;
答案 2 :(得分:0)
我显然通过不使用变量解决了我的问题,而不是使用mese和anno,我只是给了表所需的参数,我仍然不知道为什么它如此工作,我需要研究! >