Нужно знать роль && в этом запросе - PullRequest
0 голосов
/ 13 января 2019

Может ли кто-нибудь дать объяснение нижеследующего запроса и почему в этом запросе используется &&? Каким будет результат этого запроса?

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;

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Речь идет о переменных подстановки Oracle * SQL.

  • если вы используете &, вам будет предложено каждый раз вводить значение переменной
  • если вы используете &&, вам не будет предложено использовать переменную, значение которой уже введено

Вот пример. Я устанавливаю формат даты по умолчанию и выбираю сегодняшнюю дату:

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

Если вы хотите изменить его значение, undefine сначала:

SQL> undefine days
SQL> /
Enter value for days:
0 голосов
/ 13 января 2019

Двойные амперсанды "" используются для вставки литеральных значений ("литералов") в оператор SQL в SqlPlus. Где-то в вашем скрипте должно быть утверждение, определяющее буквальные дни. Что-то вроде

DEFINE days = &1

или

ACCEPT days DEFAULT 0 PROMPT Enter the number of days you forgot to start this script (Default 0):

Если вы введете действительное число, оно будет вычтено из фактической даты. Вместо числа можно также использовать допустимое выражение SQL, которое приводит к числу.

0 голосов
/ 13 января 2019

В часовом коде & & означает, что средний день этой даты должен приходить, иначе никогда не выбирайте дату, как правило, «&&» является логическим оператором, используемым как AND.

...