Die eigentliche Ursache
In Oracle gibt es drei Arten von SQL-Anweisungen (und zusätzlich gibt es PL/SQL-Blöcke):
- Anweisungen in der Data Definiton Language (DDL). Diese Anweisungen ändern die Struktur der Datenbank. Sie beginnen normalerweise mit den Verben „ALTER“ oder „CREATE“
- Anweisungen in der Data Modification Language (DML). There-Anweisungen ändern den Inhalt von Tabellen und lassen die Struktur jeder Tabelle unverändert. Diese Anweisungen beginnen normalerweise mit "INSERT", "MERGE" oder "DELETE".
- Anweisungen in dem, was ich "Abfragesprache" nenne (es scheint keinen kanonischen Namen dafür zu geben). Diese Anweisungen beginnen mit dem Verb "SELECT".
Bind-Variablen in Oracle sind nur an einigen speziellen Stellen in DML- und Abfrageanweisungen zulässig. Sie versuchen, Bind-Variablen an Orten zu verwenden, an denen sie nicht erlaubt sind. Daher der Fehler.
Lösung
Erstellen Sie Ihre Anweisung ohne Bind-Variablen. Erstellen Sie stattdessen die vollständige Abfragezeichenfolge mithilfe der Zeichenfolgenverkettung.
Wenn Sie die Eingabe bereinigen möchten, bevor Sie die Zeichenfolge verketten, verwenden Sie das Paket DBMS_ASSERT.
Hintergrund
Bindevariablen können nur verwendet werden, wenn Oracle einen Abfrageplan erstellen kann, ohne den Wert der Variablen zu kennen. Für DDL-Anweisungen gibt es keinen Abfrageplan. Daher sind Bind-Variablen nicht erlaubt.
In DML- und Abfrageanweisungen sind Bind-Variablen nur dann erlaubt, wenn sie innerhalb eines Tupels verwendet werden (in Bezug auf die zugrunde liegende Mengenlehre), dh wenn der Wert mit dem Wert in einer Tabelle verglichen wird oder wenn der Wert in eine Tabelle eingefügt wird . Sie dürfen die Struktur des Ausführungsplans nicht ändern (z. B. die Zieltabelle ändern oder die Anzahl der Vergleiche ändern).