2016-04-18 4 views
1

У меня есть требование для запроса. Он должен выбрать каждое число из списка, который НЕ присутствует в столбце. В настоящее время я работаю нормально. Этот запрос возвращает каждое число между 1833 и 2000, которое нет в таблице ATTR.Использование временной переменной один раз в Oracle SQL Developer

SELECT LEVEL + 1833 
FROM DUAL 
CONNECT BY LEVEL <= (2000 - 1833) 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN 1834 AND 2000; 

Что я хочу сделать, сделайте это как можно более удобным. Для этого я могу ввести две переменные: STARTING_ID и LIST_LENGTH. Теперь мой запрос выглядит так.

SELECT LEVEL + &STARTING_ID 
FROM DUAL 
CONNECT BY LEVEL <= &LIST_LENGTH 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN &STARTING_ID AND &STARTING_ID + &LIST_LENGTH; 

Сначала я использовал &&, но тогда я мог бы использовать этот запрос один раз. UNDEFINE не может быть помещен в блок кода и в любом случае не очищал мои переменные. Теперь моя проблема заключается в том, что она считает, что каждая переменная & различна, поэтому она вводит в себя 5 переменных вместо 2.

Как это сделать, где я все еще использую временные переменные (с или без всплывающего окна введите переменную), но человек, выполняющий запрос, должен ввести только два значения: 1833 и 67?

+0

Не знаю, как задать вопрос, не задавая вопрос, поэтому я задам вопрос = P. Но без вопросительного знака! Какой инструмент вы используете? = P –

ответ

1

Как насчет использования: как подскажите?

SELECT LEVEL + :STARTING_ID 
FROM DUAL 
CONNECT BY LEVEL <= :LIST_LENGTH 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN :STARTING_ID AND :STARTING_ID + :LIST_LENGTH; 

В нем используется понятие переменных связывания. Таким образом, пользователь может ввести необходимые значения и продолжить.

enter image description here

enter image description here

+0

Спасибо, Бэтмен. Это делает то, что мне нужно. Я искал способ поместить переменные в сам запрос, но так как всплывающее окно «вводит связывание» сохраняет переменные, но все еще изменчиво, оно достаточно удобное для пользователя для того, что мне нужно. –

0

Попробуйте использовать '& &' вместо одного '&'.

Если один префикс амперсанда используется с неопределенной переменной, значение, которое вы вводите в приглашении, не сохраняется. Так как после замены alue переменная отбрасывается и остается неопределенной. Если переменная ссылается дважды, даже в том же самом заявлении, то вам будет предложено дважды.

Если вы используете '& &', значение сохраняется и, следовательно, вам будет предложено только одно.

2

Немного выдумки, но если вы хотите, чтобы запрос на замещение переменных, то вы можете использовать переменные связывания, но только заполнить их с помощью замены переменных, как это:

(Запустите его как скрипт, используя F5, а не как оператор с использованием Ctrl + Enter)

VARIABLE list_length NUMBER; 
VARIABLE start_value NUMBER; 

BEGIN 
    :list_length := &ll; 
    :start_value := &sv; 
END; 
/

SELECT LEVEL + :start_value 
FROM DUAL 
CONNECT BY LEVEL <= :list_length 
MINUS 
SELECT ID_TX 
FROM ATTR 
WHERE ID_TX BETWEEN :start_value + 1 AND :start_value + :list_length; 

В противном случае просто используйте переменные связывания (т. запрос в нижней части скрипта).

Смежные вопросы