sql - usar - pasar el nombre de la tabla y la columna de forma dinámica utilizando variables de vinculación
usar variable como nombre de tabla sql (2)
¿Hay alguna manera de pasar dinámicamente los nombres de columnas y tablas a una consulta que utiliza variables de vinculación? Esto podría hacerse utilizando un operador de concatenación simple ||
, pero me gustaría un enfoque diferente por el cual esto pueda lograrse.
EDITAR
OPEN abc_cur FOR ''Select :column_name
from :table_name''
USING column_name,table_name;
En este ejemplo, estoy pasando empno,ename
como empno,ename
y table_name
como emp
Pero este enfoque no funciona para mí. ¿Es posible tener un enfoque diferente al otro que el enfoque tradicional de concatenación?
Los nombres de tabla y columna no se pueden pasar como variables de vinculación, no. El punto principal de las variables de vinculación es que Oracle puede generar un plan de consulta una vez para la declaración y luego ejecutarlo muchas veces con diferentes valores de variable de vinculación. Si el optimizador no sabe a qué tabla se está accediendo o qué columnas se están seleccionando y filtrando, no puede generar un plan de consulta.
Si su preocupación se relaciona con ataques de inyección SQL, y suponiendo que SQL dinámico es realmente necesario (la mayoría de las veces, la necesidad de recurrir a SQL dinámico implica problemas con el modelo de datos), puede usar el paquete DBMS_ASSERT
para validar que los nombres de la tabla y los nombres de columna no contienen SQL incorporado.
No, no puedes. Cambiar los nombres de tabla o columna en una consulta cambia la semántica de esa consulta, es decir, se convierte en una consulta diferente .
Las variables de vinculación tienen que ver con pasar diferentes valores a la misma consulta. El optimizador puede reutilizar la consulta con diferentes valores sin tener que volver a analizarla y optimizarla.