Определение переменной с помощью оператора if Oracle SQL Developer - PullRequest
1 голос
/ 17 февраля 2020

Мне нужно адаптировать диапазон дат на основе финансового года, заканчивающегося в феврале.

Поэтому, когда запускается отчет за январь-2020, необходимо рассчитать 24-месячное окно, чтобы начать с 2017/12 (февраль -2018) до 2019/11 (январь-2020). Как мне получить ниже рассчитать динамически?

define v_report_month = 1
define v_report_year = 2020

define v_start_year = if &v_report_month > 1 then &v_report_year - 2  else &v_report_year - 3 end if
define v_start_monthno = if &v_report_month > 1 then &v_report_month - 1  else &v_report_month + 11 end if 
define v_end_year = if v_report_monthno > 2 then v_report_year else v_report_year - 1 end if
define v_end_monthno = if v_report_monthno > 2 then v_report_month - 2 else v_report_monthno + 10 end if

Когда я пытаюсь выполнить следующее ниже, просто получите - "ORA-00933: SQL команда не завершена должным образом"

select
&v_start_year as y
,&v_start_monthno as m
from dual;

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете использовать PL / SQL анонимный блок, который был бы проще:

SET SERVEROUTPUT ON

DECLARE
    v_report_month   NUMBER := 1;
    v_report_year    NUMBER := 2020;
    v_start_year     NUMBER;
BEGIN
    v_start_year :=
        CASE
            WHEN v_report_month > 1 THEN
                v_report_year - 2
            ELSE v_report_year - 3
        END;
    dbms_output.put_line('Start year: '||v_start_year);
END;
/

Start year: 2017


PL/SQL procedure successfully completed.

То же самое выражение CASE может быть написано с использованием IF-THEN-ELSE :

IF v_report_month > 1 THEN
    v_start_year := v_report_year - 2;
ELSE
    v_start_year := v_report_year - 3;
END IF;

Если вы хотите оставить переменные, которые вы определили в SQL* Plus, то вы можете сделать это следующим образом:

define v_report_month = 1
define v_report_year = 2020

set serveroutput on
DECLARE
    v_report_year   NUMBER;
    v_start_year    NUMBER;
BEGIN
    v_start_year :=
        CASE
            WHEN &v_report_month > 1 THEN
                &v_report_year - 2
            ELSE &v_report_year - 3
        END;
    dbms_output.put_line(v_start_year);
END;

2017


PL/SQL procedure successfully completed.
...