From: | "Carlos A(dot) Silva" <casxxi(at)yahoo(dot)com(dot)ar> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: connect by para postgres??? |
Date: | 2007-10-17 12:41:21 |
Message-ID: | 471602F1.80300@yahoo.com.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Miguel Rodríguez Penabad escribió:
> El 17/10/07, Osvaldo Rivas <spadons(at)gmail(dot)com> escribió:
>
>> select * form depositos where nivel = 1; --En la aplicacion lista todos los
>> depositos nivel uno y cuando el usuario selecciona uno aparece otra lista
>> abajo donde
>>
>
> "caso base"
>
>
>> select * from depositos where deposito padre = deposito_seleccionado_arriba;
>> En la aplicacion aparecen todos los subdepositos del deposito seleccionado
>> en el bloque anterior y así sucesivamente...
>>
>
> Y "caso recursivo". Vamos, que lo que quieres hacer es una consulta
> recursiva (el cierre transitivo), y eso Oracle lo maneja mal o bien
> con el connect by. Hasta donde yo se en postgres no hay nada parecido,
> por lo que tendrías que hacerlo "manualmente", tal vez una función
> PL/pgSQL
>
>
Tengo un caso parecido con rubros,subrubros , sub-subrubros, etc. sólo
que en este caso me devuelve la "ruta" de un id dado, puede servirte
como guia ...
Lo resolví con una función recursiva:
CREATE FUNCTION zcategory_rute(integer, integer) RETURNS character varying
AS '
declare v_category_id alias for $1;
declare v_mode alias for $2;
declare tmp_record record;
declare tmp_id varchar;
declare tmp_code varchar;
begin
tmp_code:='''';
select into tmp_record * from rub where rub_id=v_category_id;
if not found then
return ''0''::varchar;
end if;
if tmp_record.rub_id=0 then
return ''0''::varchar;
end if;
if tmp_record.rub_id <> tmp_record.rub_idant then
tmp_id:=zcategory_rute(tmp_record.rub_idant, v_mode);
else
tmp_id:=''0''::varchar;
raise notice ''ATENCION ERROR:RUB_IDANT = RUB_ID'';
end if;
if tmp_record.rub_id<>0 then
if v_mode = 0 then
tmp_code:=tmp_id::varchar || lpad(ascii(tmp_record.rub_codigo), 3,
''0'');
else
tmp_code:=tmp_id::varchar || ''.'' || tmp_record.rub_codigo::varchar;
end if;
end if;
return tmp_code;
end;
'
LANGUAGE plpgsql;
Carlos
From | Date | Subject | |
---|---|---|---|
Next Message | Osvaldo Rivas | 2007-10-17 13:19:15 | Re: connect by para postgres??? |
Previous Message | Miguel Rodríguez Penabad | 2007-10-17 08:37:46 | Re: connect by para postgres??? |