Основната причина
В Oracle имате три вида SQL изрази (и освен това има PL/SQL блокове):
- Изявления на езика за дефиниране на данни (DDL). Тези изрази променят структурата на базата данни. Те обикновено започват с глаголите "ALTER" или "CREATE"
- Изявления в езика за промяна на данните (DML). Там операторите променят съдържанието вътре в таблиците, оставяйки структурата на всяка таблица непроменена. Тези изрази обикновено започват с „INSERT“, „MERGE“ или „DELETE“.
- Изявления на това, което наричам „език на заявките“ (изглежда, че няма канонично име за тях). Тези изявления започват с глагола "SELECT".
Променливите за свързване в Oracle са разрешени само на някои специални места в DML и изрази за заявка. Опитвате се да използвате свързващи променливи на места, където те не са разрешени. Оттук и грешката.
Решение
Изградете своето изявление без обвързващи променливи. Създайте пълния низ на заявката, вместо да използвате конкатенация на низове.
Ако искате да дезинфекцирате входа, преди да конкатенирате низа, използвайте пакета DBMS_ASSERT.
Фон
Променливите за свързване могат да се използват само когато Oracle може да изгради план за заявка, без да знае стойността на променливата. За DDL изрази няма план за заявка. Следователно свързващите променливи не са разрешени.
В DML и изрази за заявка променливите за свързване са разрешени само когато се използват в кортеж (по отношение на основната теория на множеството), т.е. когато стойността ще бъде сравнена със стойността в таблица или когато стойността ще бъде вмъкната в таблица . Не им е разрешено да променят структурата на плана за изпълнение (например да променят целевата таблица или да променят броя на сравненията).