Я пытаюсь создать и выполнить динамический оператор c SQL (используя Oracle PL / SQL), и когда что-то не работает, я сжал его до следующих двух фрагментов кода:
Насколько я понимаю, следующие два оператора будут эквивалентны (table_name, row_name и row_value - все строки VARCHAR2):
query_statement VARCHAR2(1000);
-- variant a:
query_statement := 'select * from ' || table_name || ' where ' || row_name || ' = ' || row_value;
dbms_output.put_line('query="' || query_statement || '"');
execute immediate (query_statement);
-- variant b:
query_statement := 'select * from :table where :row = :value';
dbms_output.put_line('query="' || query_statement || '"');
execute immediate (query_statement) using table_name, row_name, row_value;
Но не так! Первый вариант работает нормально, второй всегда дает сбой с ошибкой:
** Обнаружена ошибка: -903 ORA-00903: неверное имя таблицы
Из с точки зрения читабельности Я бы предпочел вариант b, но я не понимаю, почему этот второй вариант дает сбой и почему имя_таблицы помечено как неправильное. Ведь это же имя, очевидно, работает в варианте а. Отправленные запросы также выглядят одинаково для меня - конечно, по модулю тот факт, что вторая строка все еще содержит заполнители только в то время, как первая строка уже содержит конкретные значения.
Может ли какая-то добрая душа пролить свет на это? Почему вариант b не работает? Чего мне не хватает?