Oracle SQL Developer中的Varchar2变量

时间:2019-07-05 16:26:03

标签: oracle plsql oracle11g oracle-sqldeveloper

我正在尝试在SQL Developer中运行plsql查询,并且正在使用变量。

我尝试运行以下命令以查看变量的工作原理:

define FromDate varchar2 = '02-03-2019'
select &&FromDate from dual;
-- OR
define FromDate = '02-03-2019'
select &&FromDate from dual;

这是两种情况的结果:

enter image description here

为什么结果为“ -2020”,我怎么能在这种情况下使用FromDate

select * From TABLE where test_date >= to_date(&&FromDate, 'MM-DD-YYYY')

3 个答案:

答案 0 :(得分:3)

您在这里混合了2个不同的概念。 DEFINE是一个SQLPLUS指令,采用基本形式var = text。使用SQLPLUS时,在将查询提交给sql引擎并明智地处理SQL Developer之前,会对var进行字符串替换。在您的情况下,SQL引擎只会看到

Select 02-03-2019 from dual;

您收到的结果评估为-2020。

由于替换字符串后,sql引擎会看到您提供的var,因此它不知道您的预期用途,因此需要在sql语句中进行转换。因此,您的声明应为:

从双中选择to_date(&& FromDate,'MM-DD-YYYY');

这是非常基本的,您需​​要牢记每个语句的组成部分(与之“交谈”的应用程序。
您发布为“如何使用”示例的sql语句是正确用法。

答案 1 :(得分:1)

请记住,SQL * Plus中的替换变量就是这样-它们替换为您赋予它们的任何值而没有任何标点符号。我确定您希望该语句看起来像

select '02-03-2019' from dual;

进行替换后,但这不是它的工作原理。当使用SQL * Plus进行替换时,您的SELECT语句变为

select 02-03-2019 from dual;

2减去3减去2019是-2020。

QED。

您可能希望将SQL更改为

select '&&FromDate' from dual;

好运。

答案 2 :(得分:0)

它产生一个算术表达式

02 - 03 - 2019 = -2020

如果希望将其用作TO_DATE

中的完整字符串,则应引用它们
select to_date('&&FromDate','mm-dd-yyyy') from dual;



old:select to_date('&&FromDate') from dual
new:select to_date('02-03-2019','mm-dd-yyyy') from dual

TO_DATE(
--------
03-02-19