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

ORA-01036:nome/numero variabile non valido durante l'esecuzione di query tramite C#

La causa principale

In Oracle hai tre tipi di istruzioni SQL (e inoltre ci sono blocchi PL/SQL):

  • Dichiarazioni nel Data Definiton Language (DDL). Queste istruzioni modificano la struttura del database. Di solito iniziano con i verbi "ALTER" o "CREATE"
  • Dichiarazioni nel linguaggio di modifica dei dati (DML). Le istruzioni modificano il contenuto all'interno delle tabelle, lasciando inalterata la struttura di ciascuna tabella. Queste istruzioni di solito iniziano con "INSERT", "MERGE" o "DELETE".
  • Dichiarazioni in quello che chiamo "linguaggio di query" (sembra che non ci sia un nome canonico per questi). Queste affermazioni iniziano con il verbo "SELECT".

Le variabili di associazione in Oracle sono consentite solo in alcune posizioni speciali in DML e nelle istruzioni di query. Stai tentando di utilizzare le variabili di collegamento in un punto in cui non sono consentite. Da qui l'errore.

Soluzione

Costruisci la tua dichiarazione senza vincolare le variabili. Crea la stringa di query completa utilizzando invece la concatenazione di stringhe.

Se vuoi disinfettare l'input prima di concatenare la stringa, usa il pacchetto DBMS_ASSERT.

Sfondo

Le variabili di associazione possono essere utilizzate solo quando Oracle può creare un piano di query senza conoscere il valore della variabile. Per le istruzioni DDL, non esiste un piano di query. Quindi le variabili di binding non sono consentite.

Nelle istruzioni DML e query, le variabili bind sono consentite solo quando vengono utilizzate all'interno di una tupla (per quanto riguarda la teoria degli insiemi sottostante), ovvero quando il valore verrà confrontato con il valore in una tabella o quando il valore verrà inserito in una tabella . Non sono autorizzati a modificare la struttura del piano di esecuzione (ad es. per modificare la tabella di destinazione o per modificare il numero di confronti).