如何声明一个变量并在随后的查询中使用它



我正在尝试做一些在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 
v_Today Date;
Begin
Select sysdate into v_Today from dual;
Select ID From atable;
End;

这告诉我在第二个选择上需要一个Into子句。我不太明白为什么,我不是想给任何东西分配ID,我只是想选择它。我看到过一些示例,这些示例暗示了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代码块——这给了我一个消息,说它成功运行了。然后我尝试执行随后的Select v_Today from Dual, v_Today不被识别,所以很明显,我已经通过拆分执行失去了变量的值。

我觉得这应该很简单,但我显然没有理解。有人能给我指个正确的方向吗?

Edit>终于想通了。我可以在Begin和end中使用变量,但我不能在那里发出select。

PL/SQL块被BEGIN/END关键字包围。一旦离开块,就结束了PL/SQL上下文。并在PL/SQL变量未知的情况下输入纯SQL上下文。

简单来说:-)

这就是你所学到的:

  • 你需要选择值到变量
  • 变量必须在PL/SQL块
  • 的DECLARE部分声明。
  • 如果你想返回一个变量到客户端-例如,让它显示-你需要使用Oracle的包dbms_output。

:

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

在PL/SQL block之前,你不会看到任何东西:

SET SERVEROUTPUT ON

这篇博文可以提供帮助:https://blogs.oracle.com/connect/post/building-with-blocksSteve为PL/SQL初学者发布了一系列的文章。这只是第一个。

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

最新更新