Den grundlæggende årsag
I Oracle har du tre slags SQL-sætninger (og derudover er der PL/SQL-blokke):
- Udsagn i Data Definiton Language (DDL). Disse udsagn ændrer strukturen af databasen. De begynder normalt med verberne "ALTER" eller "CREATE"
- Erklæringer i Data Modification Langugage (DML). Der er sætninger, der ændrer indholdet inde i tabeller, og efterlader strukturen af hver tabel uændret. Disse udsagn begynder normalt med "INSERT", "FLETT" eller "SLET".
- Udsagn i det, jeg kalder "forespørgselssprog" (der synes ikke at være noget kanonisk navn for disse). Disse udsagn starter med verbet "SELECT".
Bind-variabler i Oracle er kun tilladt nogle særlige steder i DML og forespørgselsudsagn. Du forsøger at bruge bindevariable steder, hvor de ikke er tilladt. Derfor fejlen.
Løsning
Byg dit udsagn uden bindevariabler. Byg den komplette forespørgselsstreng i stedet for ved hjælp af strengsammenkædning.
Hvis du vil rense inputtet, før du sammenkæder strengen, skal du bruge pakken DBMS_ASSERT.
Baggrund
Bind-variabler kan kun bruges, når Oracle kan bygge en forespørgselsplan uden at kende værdien af variablen. For DDL-udsagn er der ingen forespørgselsplan. Derfor er bindevariabler ikke tilladt.
I DML og forespørgselssætninger er bindevariabler kun tilladt, når de bruges inde i en tupel (med hensyn til den underliggende mængdeteori), dvs. når værdien sammenlignes med værdien i en tabel, eller når værdien indsættes i en tabel . De har ikke tilladelse til at ændre strukturen af udførelsesplanen (f.eks. at ændre måltabellen eller at ændre antallet af sammenligninger).