Główna przyczyna
W Oracle masz trzy rodzaje instrukcji SQL (a dodatkowo istnieją bloki PL/SQL):
- Oświadczenia w języku definicji danych (DDL). Instrukcje te modyfikują strukturę bazy danych. Zwykle zaczynają się od czasowników „ALTER” lub „CREATE”
- Oświadczenia w języku modyfikacji danych (DML). Te instrukcje modyfikują zawartość wewnątrz tabel, pozostawiając strukturę każdej tabeli niezmienioną. Wypowiedzi te zwykle zaczynają się od „INSERT”, „MERGE” lub „DELETE”.
- Wypowiedzi w tym, co nazywam „językiem zapytań” (wydaje się, że nie ma dla nich nazwy kanonicznej). Te stwierdzenia zaczynają się od czasownika „SELECT”.
Zmienne wiązania w Oracle są dozwolone tylko w niektórych specjalnych miejscach w instrukcjach DML i zapytaniach. Próbujesz użyć zmiennych wiążących w miejscach, w których nie są one dozwolone. Stąd błąd.
Rozwiązanie
Zbuduj swoje oświadczenie bez zmiennych wiążących. Zamiast tego zbuduj pełny ciąg zapytania, używając konkatenacji ciągów.
Jeśli chcesz oczyścić dane wejściowe przed połączeniem ciągu, użyj pakietu DBMS_ASSERT.
Tło
Zmiennych wiązania można używać tylko wtedy, gdy Oracle może zbudować plan zapytania bez znajomości wartości zmiennej. W przypadku instrukcji DDL nie ma planu kwerend. Dlatego zmienne wiązania nie są dozwolone.
W instrukcjach DML i zapytaniach zmienne wiązania są dozwolone tylko wtedy, gdy są używane wewnątrz krotki (zgodnie z podstawową teorią zbiorów), tj. gdy wartość zostanie porównana z wartością w tabeli lub gdy wartość zostanie wstawiona do tabeli . Nie mogą zmieniać struktury planu wykonania (np. zmieniać tabeli docelowej lub zmieniać liczby porównań).