我正在尝试在SQL Developer中运行plsql查询,并且正在使用变量。
我尝试运行以下命令以查看变量的工作原理:
define FromDate varchar2 = '02-03-2019'
select &&FromDate from dual;
-- OR
define FromDate = '02-03-2019'
select &&FromDate from dual;
这是两种情况的结果:
为什么结果为“ -2020”,我怎么能在这种情况下使用FromDate
?
select * From TABLE where test_date >= to_date(&&FromDate, 'MM-DD-YYYY')
答案 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