Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Problemas con una Select

Estas en el tema de Problemas con una Select en el foro de Oracle en Foros del Web. Hola Foreros, tenía una consulta a ver si me podíais ayudar que necesito hacer una cosa y no hay manera. Según ciertos criterios,necesito crear un ...
  #1 (permalink)  
Antiguo 16/04/2007, 06:07
 
Fecha de Ingreso: febrero-2002
Ubicación: Valladolid
Mensajes: 83
Antigüedad: 22 años, 3 meses
Puntos: 1
Pregunta Problemas con una Select

Hola Foreros, tenía una consulta a ver si me podíais ayudar que necesito hacer una cosa y no hay manera.


Según ciertos criterios,necesito crear un procedimiento que ejecute una select creada de forma dinámica. Es decir, antes de crear la select, voy metiendo en una variable el where y luego al final lo concateno con el resto de la select. Más o menos esto:



var := 'SELECT d_usuario from tabla_personal where id_personal=11';

select count(*) into n_resp from tabla_responsable where id_personal=11;
if n_resp > 0 then
var := var || ' AND id_organizacion in (select id_organizacion from tabla_organizaciones where id_personal=11))';
end if;


de tal manera que al final en la variable var tengo la select completa a ejecutar.


¿A alguien se le ocurre la manera de ejecutar el contenido de la variable de tal manera que me devuelva todos los registros que contiene?


Muchas gracias anticipadas.
Un saludo a todos.
  #2 (permalink)  
Antiguo 17/04/2007, 04:49
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 3 meses
Puntos: 0
Re: Problemas con una Select

Hola, lo que deberías hacer sería buscar información sobre cursores, una vez definas tu cursor tendras que utilizar la siguiente estructura para tratar tus datos en un procedure...

open mi_cursor for var;
loop
fetch mi_cursor into mi_RegistroCursor;
exit when mi_cursor%notfound;
-- proceso que quieras realizar con cada registro del cursor
end loop;

Espero que te sirva la ayuda :)

Un saludo
  #3 (permalink)  
Antiguo 17/04/2007, 04:59
 
Fecha de Ingreso: febrero-2002
Ubicación: Valladolid
Mensajes: 83
Antigüedad: 22 años, 3 meses
Puntos: 1
Re: Problemas con una Select

Muchas gracias, voy a buscar información.

Yo siempre he utilizado los cursores así:

cursor nom_cursor is select sysdate from dual;

y luego lo que hago es abrir el cursor nom_cursor pero no sabía que se podía abrir refiriendote a una variable de texto donde introducias previamente la sentencia SQL.

Muchas gracias de nuevo.
  #4 (permalink)  
Antiguo 17/04/2007, 08:56
 
Fecha de Ingreso: febrero-2002
Ubicación: Valladolid
Mensajes: 83
Antigüedad: 22 años, 3 meses
Puntos: 1
Pregunta Re: Problemas con una Select

Lo siento mucho, pero no veo manera de que el cursor me devuelva todos los registros que quiero mostrar.
De la manera que te muestro a continuacion, me los imprimer bien, pero quiero que me los devuelva en forma de consulta ya que quiero hacer en una consulta aparte un selec * from tabla where id_personal in (y aquí la consulta del cursor).

¿entiendes lo que quiero hacer? La consulta del in es la que quiero crear de manera dinámica ya que dependiendo unos casos u otros debe de ser diferente.


Código:
declare

 TYPE t_ClassesRooms IS REF CURSOR;
 v_CursorVar t_ClassesRooms;
 
 mi_RegistroCursor number;

 var varchar2(1000);

begin

    var := 'select id_personal from tabla_personal';
     
    OPEN v_CursorVar for var;
  
  
    loop
    fetch v_CursorVar into mi_RegistroCursor;
    exit when v_CursorVar%notfound;
    -- proceso que quieras realizar con cada registro del cursor
    
     dbms_output.put_line(mi_RegistroCursor);
    end loop; 


  CLOSE v_CursorVar;
end;


Un saludo.
  #5 (permalink)  
Antiguo 17/04/2007, 11:05
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 3 meses
Puntos: 0
Re: Problemas con una Select

has declarado bien el "mi_cursor" como una referencia, con lo que quieres hacer también has declarado bién mi_RegistroCursor (solo quieres un campo).
Pero te recomiendo que utilices lo siguiente para los casos en los que te interesen varios campos.

type mi_RegistroCursor is record(
id t_tabla.id_tablal%type,
text t_tabla.descripcion%type );

Llamé a esa "variable" mi_RegistroCursor porque pensaba que usarías varios campos, vamos un "registro" o fila completa de la consulta realizada por el cursor.

No se si he entendido correctamente lo que quieres hacer. Tal vez la solución la podrías tener creando una variable res_subconsulta de tipo varchar2 y en vez de hacer un dbms_output haz algo así como

res_subconsulta := res_subconsulta || mi_RegistroCursor || ',';

cuando salgas del loop solo tienes que quitarle la última ',' a la variable y usarla dentro de los paréntesis de tu siguiente consulta.

rtrim(res_subconsulta,','); te servirá para quitar la última coma.

Un saludo.
  #6 (permalink)  
Antiguo 18/04/2007, 01:18
 
Fecha de Ingreso: febrero-2002
Ubicación: Valladolid
Mensajes: 83
Antigüedad: 22 años, 3 meses
Puntos: 1
Re: Problemas con una Select

ya se lo que me quieres decir, eso ya lo había intentado pero ..... corrigeme si me equivoco:


Del procedimiento que me has dicho, el resultado final sería este

variable := '12,56,58,46,8,789';

eso significa que es varchar2, por lo que si llamo al procedimiento desde una consulta externa:

select d_usuario from tabla_personal where id_personal in (procedimiento)

por lo que devolvería....

select d_usuario from tabla_personal where id_personal in ('12,56,58,46,8,789')


entonces, si no me equivoco esta consulta fallaría porque estoy igualando el id_personal a una cadena de texto, sobrarían las comillas para que funcionara la clausula in.


Se que la consulta que te estroy mostrando es muy facil, pero la que tengo que hacer en realidad es mucho más compleja pero vamos, que el concepto es este

Si se te ocurre alguna otra cosa para que pueda efectuar la consulta......

Muchas gracias por las molestias que te estás tomando.

Un Saludo
  #7 (permalink)  
Antiguo 18/04/2007, 02:53
Avatar de MACGREGOR  
Fecha de Ingreso: enero-2005
Mensajes: 89
Antigüedad: 19 años, 3 meses
Puntos: 0
De acuerdo Re: Problemas con una Select

Hola de nuevo.
Técnicamente lo que has dicho es cierto, las comillas simples molestan dentro de los paréntesis.
Pero esa técnica (por llamarla de alguna manera) la he utilizado en muchas ocasiones.
Lo cierto es que no la he usado en plsql, hasta hace poco programaba en Perl y conectaba con la DB Oracle para lanzar las consultas desde el propio perl.

Pero en plsql debería ser igual. Quiero decir que en realidad las comillas simples no existen.
Intentaré explicarme.

Técnicamente estás poniendo una variable varchar2 dentro del paréntesis con el resultado de tu consulta, esa cadena de texto empieza y acaba implicitamente por comillas simples, pero en realidad no las has puesto.

Si muestras tu variable por pantalla no muestra las comillas!

Si en dentro de una clausula where haces algo como var_texto = 'hola'
comprueba que tu variable de texto sea igual a hola las comillas indican que lo que hay a la derecha de la igualdad es de tipo texto, no que las contenga.

Por otro lado cuando tu haces tu consulta
Select *
from tabla t
where t.id_tabla in (1,2,3,4,....)

Todo es texto ;) Oracle antes de ejecutar la consulta comprovará que es correcta y mirará que cada valor de dentro de los paréntesis es del mismo tipo y que además coincide con el tipo del campo t.id_tabla.

Con todo este rollo quería decirte que no veo porqué no debería funcionar la idea de los mensajes anteriores.
Si no te funciona manda otro mensaje para dejarlo claro a todos los que lean este tema en el foro :)

Se me ocurre que, en caso de no funcionar, crees tu consulta en una variable del estilo
v_select:='select * from tabla t where t.id_tabla in (##lista_ids##)';

y luego hagas un
replace (v_select,'##lista_ids##',res_subconsulta);

res_subconsulta es la misma variable usada en mi mensaje anterior para el resultado de tratar la subconsulta

Ahora tendrás tu consulta con la subconsulta en una variable de texto y podrás ejecutarla.

Espero haberte ayudado :]

PD: si te funciona sin usar el replace también estaría bien que lo comentes.

Un saludo.
  #8 (permalink)  
Antiguo 18/04/2007, 03:37
 
Fecha de Ingreso: febrero-2002
Ubicación: Valladolid
Mensajes: 83
Antigüedad: 22 años, 3 meses
Puntos: 1
Sonrisa Re: Problemas con una Select

Después de probar mucho... no funciona. Cuando intentas igualar una variable numerica a una variable de texto da el error ORA-01722: número no valido, cuando se ejecuta...

select d_usuario from tabla_personal where id_personal in ('12,56,58...')

aunque no pongas las comillas estás intentando igualar numerico con texto y casca, y si se combierte el id_personal a char tampoco funciona xq tiene que ser la cadena exactamente igual y no que contenga algo.



He estado probando de otra manera y lo he conseguido.


select d_usuario from tabla_personal where (',1,2,3,4,5,6,') like ('%,'||id_personal||',%')

* ',1,2,3,4,5,6,' es el valor que devuelve la función creada.

De esta manera estoy comprobando que una cadena existe en la otra, pongo una coma al principio y al final para que cuando busco por ejemplo el id 5434 no me muestre ni el 54, ni el 43, ni el 34, solo me mostrara el 5434 xq estoy comparando con ,5434,.



Es la única manera que he encontrado, es un poco rebuscada pero funciona.

Si con esto podemos ayudar a alquien que esté en la misma situación que la mía me alegro muchisimo.


Muchas gracias MACGREGOR por todo, me has ayudado mucho.

Un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:22.