sql >> Database teknologi >  >> RDS >> Oracle

ORA-01036:ulovlig variabelnavn/nummer ved kørsel af forespørgsel gennem C#

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).



  1. Parallelisme kommer til VAKUUM

  2. Pivotering af data ved hjælp af to kolonner

  3. Kørsel af flere PostgreSQL-instanser på en enkelt vært

  4. Generering af rækkefølge i rækkefølge