使用 if 语句定义变量 Oracle SQL Developer

Posted

技术标签:

【中文标题】使用 if 语句定义变量 Oracle SQL Developer【英文标题】:Defining a variable using an if statement Oracle SQL Developer 【发布时间】:2020-02-17 08:21:06 【问题描述】:

我需要根据截至 2 月的财政年度调整日期范围。

因此,在运行 2020 年 1 月报告时,需要计算从 2017/12(2018 年 2 月)到 2019/11(2020 年 1 月)的 24 个月窗口。如何获得以下动态计算?

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】:

您可以使用更简单的 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.

【讨论】:

如何在查询中调用这些变量值?当我使用通常的“&”措辞时,该值似乎不会持续存在:``` select &v_start_year as y from dual; ``` 即使我移动 END 块以包含此语句。 &SQL*Plus 替换变量,它在语句中作为替换变量名称的前缀。 SQL*Plus 预处理语句并替换变量的值。如果您有一个复杂的脚本或逻辑,那么在 SQL*Plus 中执行所有这些操作可能会很棘手。由于您使用的是条件语句,我更喜欢 PL/SQL。 如果您想同时结合 SQL*Plus 和 PL/SQL,请参阅我的更新。 感谢您提供的附加示例,但我仍在努力解决的问题是让 PL/SQL 定义的变量在代码块之外使用?此逻辑只是作为较大部分中的第一部分,其中更新开始和结束日期变量以表示后续查询中的不同时间过滤器。 有很多方法可以让变量进出 PL/SQL。最好的方法是将代码放在一个过程中并使用 IN/OUT 参数。

以上是关于使用 if 语句定义变量 Oracle SQL Developer的主要内容,如果未能解决你的问题,请参考以下文章

Oracle PL/SQL 动态 if 语句全局变量

oracle储存过程中,if条件为某变量不等于1,怎么写

SQL SERVER和ORACLE中SQL语句一样吗?

oracle 中动态sql语句,表名为变量,怎么解

在 SQL 语句中外连接绑定变量 (Oracle 11g)

oracle怎么写IF语句?