Надлежащее использование переменных связывания

В следующем блоке PL/SQL переменная связывания используется в предложении WHERE:

declare
symbol varchar2(6) := 'EPIC';
begin
execute immediate 'delete from stock where symbol = :symbol'
using symbol;
end;
/

Этот блок выполняется успешно, однако что-то вроде следующего завершится ошибкой:

declare
symbol varchar2(15) := 'employees';
begin 
execute immediate 'delete from :symbol where last_name = ''Kochar'''
using symbol
end;
/

Мой вопрос: можем ли мы использовать переменные связывания в любом другом контексте, кроме передачи значения в предложение WHERE, как в первом примере?


person JTruant    schedule 04.07.2018    source источник


Ответы (2)


Вы можете привязать к оператору SQL только те выражения (литералы, переменные, сложные выражения), которые заменяют заполнители для значений данных внутри динамической строки. вы не можете связывать имена элементов схемы (таблицы, столбцы и т. д.) или фрагменты записи оператора SQL. Для этих частей вашей строки вы должны использовать конкатенацию (оператор)

Так что используйте, как в следующем:

SQL> create table employees(empid int,last_name varchar2(50));

Table created

SQL> insert into employees values(111,'Kochar');

1 row inserted

SQL> select * from employees;

EMPID LAST_NAME
----- ----------
  111 Kochar

SQL> 
SQL> declare
  2    symbol varchar2(15) := 'employees';
  3  begin
  4    execute immediate 'delete '||symbol||' where last_name = ''Kochar''';
  5  end;
  6  /

PL/SQL procedure successfully completed

SQL> select * from employees;

EMPID LAST_NAME
----- ----------
-- i.e. no row(s) returned.
person Barbaros Özhan    schedule 04.07.2018

Bind Variables - это только передача значений.

Это позволяет повторно использовать один и тот же запрос, но с другими значениями.

Имя таблицы не является значением.

person EchoMike444    schedule 04.07.2018