В чем разница между переменными связывания и переменной, которую я ввожу с помощью &&? - PullRequest
6 голосов
/ 16 октября 2011

В чем разница между этими двумя объявлениями переменных?

1: num number:='&&num';
2: variable num1 number;

Поскольку в обоих случаях я могу ссылаться на num, используя&num или &&num также в других файлах, а в случае переменных связывания :num1.

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

1: variable num1 number;
2:var num1 number;

1 Ответ

29 голосов
/ 16 октября 2011

У вас, кажется, есть некоторая путаница относительно различий между переменными связывания в Oracle и переменными подстановки в SQL * Plus.

Давайте начнем с переменных подстановки.Переменные подстановки уникальны для SQL * Plus и не являются частью базы данных.Например, они не будут работать, если вы попытаетесь использовать их с JDBC.

Переменные подстановки могут содержать только фрагмент текста.Если SQL * Plus встречает переменную подстановки в строке ввода, он заменяет переменную ее текстовым содержимым:

SQL> define subvar=X
SQL> select * from dual where dummy = &subvar;
old   1: select * from dual where dummy = &subvar
new   1: select * from dual where dummy = X
select * from dual where dummy = X
                                 *
ERROR at line 1:
ORA-00904: "X": invalid identifier

Обратите внимание, что SQL * Plus заменил нашу переменную подстановки ее текстовым значением, не обращая внимания надал ли он нам действительный SQL.В приведенном выше примере мы опускали одинарные кавычки вокруг &subvar, и это дало нам недопустимый SQL, поэтому мы получили ошибку.

Строки, начинающиеся old и new, показывают нам строку, которую мы ввели ранееа после SQL * Plus применены переменные подстановки.Строка new - это строка, которую база данных пыталась запустить.

Вы можете включить или отключить отображение строк old и new, используя SET VERIFY ON и SET VERIFY OFF.Вы также можете включить или выключить замену переменных подстановки, используя SET DEFINE ON и SET DEFINE OFF.

Если мы хотим выполнить вышеуказанный запрос с помощью переменной подстановки, мы должны заключить его в кавычки:

SQL> select * from dual where dummy = '&subvar';
old   1: select * from dual where dummy = '&subvar'
new   1: select * from dual where dummy = 'X'

D
-
X

Если &subvar содержит строку, которая была допустимым числом (например, 5), тогда мы можем уйти без использования кавычек, но это только потому, что вынуть текст &subvar изамена его текстом 5 дает нам действительный SQL.

Например, предположим, что у нас есть таблица с именем test со следующими данными:

         A
----------
         1
         2
         3
         4
         5

Тогдамы можем сделать

SQL> define subvar=5
SQL> select * from test where a = &subvar;
old   1: select * from test where a = &subvar
new   1: select * from test where a = 5

         A
----------
         5

Переменные связывания, с другой стороны, имеют типы.Это не простые текстовые значения.Их значения отправляются в базу данных, и база данных также может устанавливать их значения.

SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';

PL/SQL procedure successfully completed.

Вы не ставите кавычки вокруг переменной связывания, когда хотите ее использовать:

SQL> select * from dual where dummy = :bindvar;

D
-
X

SQL> select * from dual where dummy = ':bindvar';

no rows selected

Во втором примере, приведенном выше, мы не получили возвращенных строк, поскольку в таблице DUAL нет строк со столбцом DUMMY, содержащим текст :bindvar.

Вы получите ошибку, если попытаетесьЧтобы присвоить значение неверного типа переменной привязки:

SQL> variable bindvar number;
SQL> exec :bindvar := 'X';
BEGIN :bindvar := 'X'; END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1

Переменные связывания являются стандартной частью базы данных, и вы можете использовать их с JDBC или любым другим способом подключения к базе данных, которую вы выберете.


Наконец, variable num1 number и var num1 number означают одно и то же.Они оба определяют переменную связывания num1 типа number.var - это просто сокращение от variable.

...