Valor de Variable en Oracle

Me podría ayudar por favor. Tengo una variable con el nombre de una tabla (el nombre puede variar) y quiero hacer una consulta según el valor que tenga dicha variable. Por ejemplo:
Declare
  a varchar2(10);
begin
a:= 'cliente';
select * from a;
end;
No es el caso pero es un ejemplo, y necesito que en la consulta sea tomado el valor de a y no el nombre de la variable. Así como está, me sale el error de que la tabla 'a' no existe.
Si podría ayudarme se lo agradeceré.

1 respuesta

Respuesta
1
Para ello necesitaría saber como mínimo la version de Oracle donde quiere ejecutar el ejemplo 'similar al que me manda'.
De todas formas, aún colocanto por escrito el nombre 'cliente' seguiría fallando!
Ya que la consulta devuelve resultados y debe de existir sintácticamente un 'INTO' donde guardarlos.
Lo que usted desea hacer se puede realizar de forma dinámica, pero a partir de una determinada version.
Y es mediante la utilización de : EXECUTE IMMEDIATE 'sentencia';
Donde 'sentencia' es una variable o texto construido donde puede indicar cualquier tipo de sentencia DML como DDL.
El problema puede darse posteriormente, cuando tenga que eindicar sobre que tipo de estructura quiere recibir los datos. Ya que en función de la tabla las variables o grupos de ellas cambiaran.
Indíqueme o especifiqueme más el problema e intentaré darle una solución final más acotada a su petición.
Parece que no me entendió bien, le explico más a detalle entonces:
Estoy haciendo un procedimiento almacenado, y usando un cursor, tengo que barrer las filas de una consulta y hacer ciertas operaciones. La consulta debe acceder a una 4 diferentes tablas dependiendo del mes, por lo que en una variable almaceno el nombre de la tabla (luego de preguntar que tabla corresponde ese mes.) Y el select que llena el cursor saca de esa tabla (el nombre lo tiene la variable).
Por eso es que necesito hacer mención al nombre de la tabla que contiene la variable y no al nombre de la variable.
Si pudiera ayudarme se lo agradecería.
Gracias.
Perdona, pero el que ahora no te entiendo soy yo ...
¿Podrías hacer una cosa? Enviame el código (con una pequeña explicación) en forma de 'Comunicación Privada'.
Ya que como te indicaba y entendía ... lo que querías hacer es 'sql dinámico' donde especificabas distintos nombres de tabla en función de unos condicionantes y construías la sentencia de consulta sql a partir del nombre de tabla guardado en la variable 'a'.
Con EXECUTE IMMEDIATE o OPEN CURSOR FOR podrias hacerlo, el problema estaba en que si los tipos de datos que devuelven las tablas son distintos, las variables donde guardas los resultados de la consulta variarán (que es el problema a resolver) el 'INTO'.
Respecto a poner una tabla en la variable 'a' y ejecutar la consulta ... eso no es ningún problema.
Hola. Si, me entendió más o menos, solo que no es un 'select into' porque el contenido lo estoy almacenando en un cursor y ese no era mi problema. Mi problema en realidad era que al poner el nombre de la variable (select * from a) me daba el error que el objeto 'a' no existía, obviamente. Lo que quería y quiero saber es como hacer mención al valor de la variable y no a su nombre. Respecto a las tablas, son idénticas en estructura solo que almacenan datos de meses diferentes. El problema lo he resuelto haciendo varios procedimientos almacenados que acceden cada uno a una de las tablas y son llamados por un procedimiento principal según la fecha. Pero aún quisiera saber como hacer mención en un select a el valor de una variable y no a su nombre, ya que la solución que dí al problema tal vez no sea la mejor. Si Ud. supiera se lo agradecería mucho. De todas formas gracias por su prestación a ayudarme.
A ver, partes con que en función de una situación consulta una columna tipo mes (varchar2) de una tabla determinada y la función te retorna un cursor (con lo cual no tienes la asignación a ningún tipo de estructura o variable de ningún tipo.
Contando que esas sean las premisas te mostraré un ejemplo a ver si te sirve como modelo :
- Primero tienes que definir :
CREATE OR REPLACE PACKAGE Types AS
TYPE cursor_type IS REF CURSOR;
END Types;
/
- Que es lo que vas a retornar como parámetro de salida del procedimiento :
CREATE OR REPLACE PROCEDURE Lee_tabla (condicion IN varchar2, p_recordset OUT Types.cursor_type) AS
Tabla VARCHAR2(20);
--
BEGIN
--
If Condicion = 'C' then
   tabla := 'CLIENTES';
elsif Condicion = 'E' then
   tabla := 'EMPLEADOS';
else
   tabla := 'PERSONAL';
End if;
--
OPEN p_recordset FOR
SELECT * FROM ||tabla||' WHERE 1 = 1 ORDER BY 1';
END Lee_tabla;
/
Esta es una de las formas de crear y ejecutar sql dinámico (cosa que no es muy recomendable para el gestor de BB. DD. Pero que todo el mundo lo hace).
Si recoges el cursor en un lenguaje NO PL/SQL ten muy en cuenta de cerrarlo bien, sino tendrás problemas de cursores abiertos y la instancia siempre tiene un límite para ello en la variable OPEN_CURSORS y si superas su valor te dará errores. Así que ciérralos bien!
También se podría haber hecho como te dije con 'EXECUTE INMEDIATE ...'.
El ejemplo que te he puesto es para lecturas y asociarlas a una variable tipo CURSOR REF. Realmente la sentencia de consulta podría formarse por :
OPEN CURSOR p_recordset for Variable;
Pero te he creeado un ejemplo para que veas que no solo puedes definir la tabla, sino las columnas, restricciones y si quieres ordenar (y todas la cualidades de una consulta SQL'.
Espero que ahora nos hayamos entendido.
Si ves que tienes algún problema al respecto, no dudes en volver a contactar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas