В чем разница между переменными bind и переменной, которую я ввожу с помощью &&?

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

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

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

1: variable num1 number;
Два: var num1 number;

1 ответов


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

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

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.

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

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

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


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