удаление двойных амперсандов;они используются в тех случаях, когда у вас одинаковый разброс переменных по всему запросу, чтобы вам не приходилось вводить одно и то же значение снова и снова.
Если вы используете его один раз, тогда будет только один амперсандused.
Сравните!
SQL> select &deptno --> 1st
2 from dept
3 where deptno = &deptno or &deptno is null; --> 2nd and 3rd
Enter value for deptno: 10 --> asked 1st time
old 1: select &deptno
new 1: select 10
Enter value for deptno: 10 --> asked 2nd time
Enter value for deptno: 10 --> asked 3rd time
old 3: where deptno = &deptno or &deptno is null
new 3: where deptno = 10 or 10 is null
10
----------
10
против
SQL> select &deptno --> 1st
2 from dept
3 where deptno = &&deptno or &&deptno is null; --> 2nd and 3rd
Enter value for deptno: 10
old 1: select &&deptno --> asked only once
new 1: select 10
old 3: where deptno = &&deptno or &&deptno is null --> reused here, without asking
new 3: where deptno = 10 or 10 is null
10
----------
10
SQL>
Как только вы закончите, вам нужно undefine
переменную (и), иначето же самое значение будет использоваться при повторном выполнении запроса.
Я не думаю, что вы можете делать то, что вы хотите - вас спросят только один раз (что и делает &&
) без необходимости undefine
эти переменные. Обходной путь? Переключитесь на хранимую процедуру, которая будет принимать два параметра.
[EDIT]
Hm, как насчет объявления переменной ? Это поможет? Смотрите пример:
SQL> var par_deptno number
SQL> exec :par_deptno := 10;
PL/SQL procedure successfully completed.
SQL> select :par_deptno, substr(:par_deptno, 1, 1) sub
2 from dept
3 where deptno = :par_deptno or :par_deptno is null;
:PAR_DEPTNO S
----------- -
10 1
SQL>
Если вам понадобится другое значение, вам нужно будет снова
SQL> exec :par_deptno := 30;