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:

Mensaje de error http://web1.twitpic.com/img /12831839-06a3ea536df5d5a0a839eb83d9e59d25.4a3936b8-scaled.jpg

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.

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top