首页 > 解决方案 > 需要知道&&在这个查询中的作用

问题描述

谁能提供以下查询的解释以及为什么&&在此查询中有用法?这个查询的输出是什么?

SELECT 
    ((TRUNC(SYSDATE - (&&days)) - TO_DATE('01-JAN-1970')) * 86400000) - 7200000 AS ts, 
    to_char(SYSDATE - (&&days), 'YYYYMMDD') || '_pt.txt' as pt_filenm from dual;

标签: sqloraclesqlplus

解决方案


它是关于 Oracle 的 SQL*Plus 替换变量的。

  • 如果使用&,每次都会提示输入变量值
  • 如果使用&&,则不会提示您使用已输入值的变量

这是一个例子。我正在设置默认日期格式并选择今天的日期:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> select trunc(sysdate) l_today from dual;

L_TODAY
----------
13.01.2019

现在,我们为什么在这里。首先,我只使用了一个&,系统会提示两次输入我从今天的日期中减去的天数:

SQL> select trunc(sysdate - &days) l_one,
  2         to_char(trunc(sysdate - &days), 'yyyy-mm-dd') l_two
  3  from dual;
Enter value for days: 5
old   1: select trunc(sysdate - &days) l_one,
new   1: select trunc(sysdate - 5) l_one,
Enter value for days: 5
old   2:        to_char(trunc(sysdate - &days), 'yyyy-mm-dd') l_two
new   2:        to_char(trunc(sysdate - 5), 'yyyy-mm-dd') l_two

L_ONE      L_TWO
---------- ----------
08.01.2019 2019-01-08

但是,如果我使用&&,我只会被提示一次:

SQL> select trunc(sysdate - &&days) l_one,
  2         to_char(trunc(sysdate - &&days), 'yyyy-mm-dd') l_two
  3  from dual;
Enter value for days: 10
old   1: select trunc(sysdate - &&days) l_one,
new   1: select trunc(sysdate - 10) l_one,
old   2:        to_char(trunc(sysdate - &&days), 'yyyy-mm-dd') l_two
new   2:        to_char(trunc(sysdate - 10), 'yyyy-mm-dd') l_two

L_ONE      L_TWO
---------- ----------
03.01.2019 2019-01-03

SQL>

因此,它可以为您节省一些时间并减少错误的可能性。


请注意 - 如果您&&再次使用并运行相同的代码,则不会提示您输入变量的值 - 它将自动被重新使用:

SQL> /
old   1: select trunc(sysdate - &&days) l_one,
new   1: select trunc(sysdate - 10) l_one,
old   2:        to_char(trunc(sysdate - &&days), 'yyyy-mm-dd') l_two
new   2:        to_char(trunc(sysdate - 10), 'yyyy-mm-dd') l_two

L_ONE      L_TWO
---------- ----------
03.01.2019 2019-01-03

如果要更改其值,请先取消定义

SQL> undefine days
SQL> /
Enter value for days:

推荐阅读