如何声明变量并在后续查询中使用它

How do I declare a variable and use it in a subsequent query

我正在尝试在 TSQL 中做一些非常简单的事情,但我完全无法在 PlSQL 中做同样的事情。

我想做类似的事情:-

declare @Today Date = GetDate();

declare @FirstDate Date;
declare @LastDate Date;

with cteStartDates as
(
    Select START_DATE
    From TABLE1
    

Union All

Select START_DATE
From TABLE2

)
Select @FirstDate = MIN(START_DATE),
        @LastDate = DateAdd(Day, 1, @Today)
From cteStartDates;

基本上,我正在尝试获取开始日期和结束日期,其中开始日期是两个表之一中第一条记录的日期,结束日期是明天。然后我需要在一大堆后续查询中使用@FirstDate 和@LastDate 作为参数。

我遇到了 PLSQL 的第一个障碍。我什至不知道该怎么做:-

declare @Today Date = GetDate();

我试过阅读 Oracle 变量,但我并没有真正理解它。我不明白 DEFINE、DECLARE 和 VARIABLE 之间的区别,无论我尝试哪一个,我似乎都无法让它工作,并且不断遇到我并不真正理解的问题。

例如(基于 Declare,但我也尝试过使用 Define 和 Variable 进行以下所有操作),我将其作为实验进行了尝试(为变量分配一个值,然后发出一个有效的查询,但该查询不甚至不使用变量):-

Declare 
    v_Today Date;
Begin
    Select sysdate into v_Today from dual;
    Select ID From atable;
End;

这告诉我我需要在第二个 select 上有一个 Into 子句。我真的不明白为什么,我不是想给任何东西分配 ID,我只是想 select 它。我已经看到一些例子暗示 into 将定义列名(虽然我不确定我是否理解正确)。好的,我试过了:-

Declare 
    v_Today Date;
Begin
    Select sysdate into v_Today from dual;
    Select ID into IDColumn From atable;
End;

这给了我一个错误,指出标识符 IDColumn 必须如此清楚地声明 into 不能简单地命名列。

从例子中我得到的印象是,也许开始和结束围绕着一个块,在这个块中变量被赋值,然后可以在脚本中使用这些值。所以我尝试了这个:-

Declare 
    v_Today Date;
Begin
    Select sysdate into v_Today from dual;
End;
Select v_Today from Dual;

这告诉我它遇到了关键字 Select,所以我似乎不能简单地用查询跟进声明开始和结束块。

一些示例似乎表明您可以分配一个变量,执行然后使用该变量。所以我尝试自己执行 Declare/Begin/End 块 - 这给了我消息说 运行 成功。然后我尝试从 Dual 执行后续的 Select v_Today,v_Today 无法识别,所以很明显我通过拆分执行丢失了变量的值。

我觉得这应该很容易,但我显然不明白。有人能指出我正确的方向吗?

Edit> 啊,终于想通了。我可以在开始和结束中使用变量,但我不能只在其中发出 select。

Declare 部分中的变量可以在 Begin 和 End 块中使用

PL/SQL 块包含在 BEGIN/END 关键字中。离开块后,您将结束 PL/SQL 上下文。并输入 SQL 上下文,其中 PL/SQL 变量未知。

简单来说:-)

你学到的是正确的:

  • 你需要select将值转化为变量
  • 变量必须在 PL/SQL 块的 DECLARE 部分声明
  • 如果您想 return 给客户端一个变量 - 例如让它显示 - 你需要使用 Oracle 的包 dbms_output.

像这样:

Declare
    v_Today Date;
Begin
    Select sysdate into v_Today from dual;
    dbms_output.put_line(v_Today);
End;

在 PL/SQL 块之前发布之前,您将看不到任何东西:

SET SERVEROUTPUT ON

此博客post 可以帮助:https://blogs.oracle.com/connect/post/building-with-blocks 史蒂夫为 PL/SQL 初学者出版了整个 post 系列。这只是第一个。