Oracle SQL Developer 中的 Varchar2 变量
Posted
技术标签:
【中文标题】Oracle SQL Developer 中的 Varchar2 变量【英文标题】:Varchar2 variables in Oracle SQL Developer 【发布时间】:2019-07-05 16:26:03 【问题描述】:我正在尝试在 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')
【问题讨论】:
【参考方案1】:您在这里混合了 2 个不同的概念。 DEFINE 是一个 SQLPLUS 指令,它采用基本形式 var=text。使用时,SQLPLUS 在将查询提交给 sql 引擎和处理明智的 SQL Developer 模拟 SQLPLUS 之前对 var 进行字符串替换。在您的情况下,sql引擎只能看到
Select 02-03-2019 from dual;
计算结果为 -2020,即您收到的结果。
由于您提供的 var 在字符串替换后被 sql 引擎看到,因此它不知道您的预期用途,您需要在 sql 语句中进行转换。所以你的陈述应该是:
select to_date(&&FromDate, 'MM-DD-YYYY') from dual;
这是非常基本的,您需要记住每个语句的组件(应用程序)。 您发布为“如何使用”示例的 sql 语句是正确用法。
【讨论】:
【参考方案2】:请记住,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;
【讨论】:
【参考方案3】:这是一个算术表达式
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
【讨论】:
以上是关于Oracle SQL Developer 中的 Varchar2 变量的主要内容,如果未能解决你的问题,请参考以下文章
如何避免 Oracle SQL Developer 中的变量替换
为啥 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异?
Oracle SQL Developer 中的 Varchar2 变量