У вас, кажется, есть некоторая путаница относительно различий между переменными связывания в 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
.