EJECUTAR INMEDIATAMENTE con la cláusula USING dando errores
-
06-07-2019 - |
Pregunta
Todos,
Soy muy nuevo en los procedimientos almacenados en general, pero estoy luchando especialmente con los de Oracle. He creado un ejemplo muy simple de lo que estoy tratando de lograr y todavía recibo el mismo error con esta versión simplificada.
El procedimiento almacenado de ejemplo es el siguiente:
CREATE OR REPLACE PROCEDURE ashish_test
AUTHID CURRENT_USER IS
BEGIN
DECLARE
v_tab VARCHAR2(50);
v_strSQL VARCHAR2(50);
BEGIN
v_strSQL := 'SELECT * FROM :1';
v_tab := 'ex.emp';
EXECUTE IMMEDIATE v_strSQL USING v_tab;
END;
END;
Cuando llamo al procedimiento almacenado anterior usando CALL ashish_test ()
, obtengo:
Basado en este artículo (Busque el ejemplo 7-1), la palabra clave USING
debe reemplazar el marcador de posición numerado (: 1
) dentro de v_strSQL
con el valor almacenado en v_tab
. Sin embargo, sigo recibiendo errores de tabla no válidos. Supongo que es porque EJECUTAR INMEDIATO
no puede reemplazar el marcador de posición con el valor por alguna razón, pero no estoy seguro de por qué. ¿Alguien sabe si estoy haciendo algo estúpido aquí?
Estoy ejecutando esto en la base de datos Oracle 10g & amp; utilizando PL / SQL Developer.
Solución
La cláusula USING es solo para variables de enlace (es decir, donde usaría nombres de columna en una instrucción select), no nombres de tabla. El uso típico se vería así:
Select col1 from table1 where col2 = :a
Si desea usar nombres de tablas variables, use algo como esto:
v_tab := 'ex.emp';
v_strSQL := 'SELECT * FROM ' || v_tab;
EXECUTE IMMEDIATE v_strSQL;