В чем разница между переменными 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
.