La causa raíz
En Oracle tiene tres tipos de sentencias SQL (y además hay bloques PL/SQL):
- Declaraciones en el lenguaje de definición de datos (DDL). Estas sentencias modifican la estructura de la base de datos. Por lo general, comienzan con los verbos "ALTERAR" o "CREAR"
- Declaraciones en el lenguaje de modificación de datos (DML). Estas declaraciones modifican el contenido dentro de las tablas, dejando la estructura de cada tabla sin modificar. Estas declaraciones generalmente comienzan con "INSERT", "MERGE" o "DELETE".
- Declaraciones en lo que llamo "lenguaje de consulta" (parece que no hay un nombre canónico para estas). Estas declaraciones comienzan con el verbo "SELECCIONAR".
Las variables de vinculación en Oracle solo se permiten en algunos lugares especiales en DML y declaraciones de consulta. Está intentando utilizar variables de vinculación en lugares donde no están permitidas. De ahí el error.
Solución
Cree su declaración sin vincular variables. Cree la cadena de consulta completa en lugar de utilizar la concatenación de cadenas.
Si desea desinfectar la entrada antes de concatenar la cadena, use el paquete DBMS_ASSERT.
Antecedentes
Las variables de vinculación solo se pueden usar cuando Oracle puede crear un plan de consulta sin conocer el valor de la variable. Para declaraciones DDL, no hay un plan de consulta. Por lo tanto, las variables vinculadas no están permitidas.
En DML y declaraciones de consulta, las variables de vinculación solo se permiten cuando se usan dentro de una tupla (con respecto a la teoría de conjuntos subyacente), es decir, cuando el valor se comparará con el valor en una tabla o cuando el valor se insertará en una tabla . No se les permite cambiar la estructura del plan de ejecución (por ejemplo, cambiar la tabla de destino o cambiar el número de comparaciones).