Re: connect by para postgres???

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

In response to

Browse pgsql-es-ayuda by date

  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???