Надлежащее использование переменных связывания - PullRequest
0 голосов
/ 04 июля 2018

В следующем блоке 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, как в первом примере?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Вы можете связать в свой оператор 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.
0 голосов
/ 04 июля 2018

Bind Variables - это только передаваемые значения.

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

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

...