Изглежда имате известно объркване относно разликите между свързващите променливи в 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
.