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中的IIF语句

如何避免 Oracle SQL Developer 中的变量替换

为啥 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异?

Oracle SQL Developer 中的 Varchar2 变量

oracle kill所有plsql developer进程

为啥 APEX 和 Oracle SQL Developer 中的日期格式不同?