Oracle
 sql >> база данни >  >> RDS >> Oracle

Каква е разликата между свързващите променливи и заместващите променливи (които въвеждам с &&)?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да изброя ВСИЧКИ грантове, които е получил потребител?

  2. Вземете само дата без час в Oracle

  3. Извличане на връщани стойности на pl/sql масив в java

  4. Определете Oracle null ==null

  5. Как да разрешите ORA-29285:грешка при запис на файл