Home > Software, Webmaster > plpgsql functions nexted cycles FOR LOOP multiple IF THEN

plpgsql functions nexted cycles FOR LOOP multiple IF THEN

Come utilizzare plpgsql per ritornare set di records
Utilizzo di:  FOR var_record IN query LOOP …. END LOOP  –
IF FOUND AND condition  THEN    statements   END IF  ;

La prima query 1) richiama i records in una struttura ad albero facendo ricorso a strutture nidificate di
FOR var_record IN query LOOP …. END LOOP
La seconda query 2) interroga la prima passando due punti della struttura dell’albero e ritorna tutti records del percorso tra i due .
Utilizza oltre a:   FOR var_record IN query LOOP …. END LOOP ;
anche

1)Strutture nidificate di   FOR  var_record IN   query  LOOP   ….  END LOOP
che richiamano i records in una struttura ad albero.

CREATE OR REPLACE FUNCTION __getcatalog_ID_Q(integer)
  RETURNS SETOF catalog AS
$BODY$
 DECLARE
 _mytupla  record;   
 _mytupla1 record;  -- 1° livello record
 _mytupla2 record;  -- 2° livello record
 _mytupla3 record;  -- 3° livello record
 _mytupla4 record;  -- 4° livello record
 _searchsql text := '' ;
 _myIDC int;  -- memorizza ID temporaneo

BEGIN

-- esploriamo primo livello distinta
FOR _mytupla1 IN (select  * FROM catalog  WHERE "IDCatalog" = $1 )    
LOOP
   RETURN NEXT _mytupla1 ;
   _myIDC = _mytupla1."IDCatalog" ;  

   FOR _mytupla2 IN (select  * FROM catalog  WHERE "IDCatalogFather" = _myIDC )
   LOOP
         RETURN NEXT _mytupla2 ;
         _myIDC = _mytupla2."IDCatalog" ;   

         FOR _mytupla3 IN (select  * FROM catalog  WHERE "IDCatalogFather" = _myIDC )
         LOOP
               RETURN NEXT _mytupla3 ;
              _myIDC = _mytupla3."IDCatalog" ;   

              FOR _mytupla4 IN (select  * FROM catalog  WHERE "IDCatalogFather" = _myIDC )
              LOOP
                  RETURN NEXT _mytupla4 ;
                  _myIDC = _mytupla4."IDCatalog" ;   

              END LOOP;    
         END LOOP;                      
   END LOOP;   
END LOOP;

END ;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
  COST 100
  ROWS 1000;
ALTER FUNCTION __getcatalog_ID_Q(integer) OWNER TO postgres;

———————————————————————————————————-

2)
Strutture nidificate di
FOR var_record IN query LOOP …. END LOOP
and IF FOUND  AND _mytupla1.”IDCatalog” <> $1 THEN   END IF ;

CREATE OR REPLACE FUNCTION _get_getcatalog_id_qt(integer, integer)
  RETURNS SETOF catalog AS
$BODY$
 DECLARE
 _mytupla record;
 _mytupla1 record;
 _mytupla2 record;
 _mytupla3 record;
 _myIDC int;  
 _myIDC1 int;
BEGIN
select  * INTO _mytupla1
FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = $2 ;
-- return NEXT _mytupla1;    
IF FOUND AND _mytupla1."IDCatalog" <> $1  THEN  
   -- visualizziamo solo le row del percorso diretto         
   FOR _mytupla1 IN select *
    FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = $2  
   LOOP
    return next _mytupla1;    
    _myIDC =  _mytupla1."IDCatalogFather" ;

    -- estraiamo secondo livello
    select * INTO _mytupla2
    FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = _myIDC ;        
    IF FOUND  THEN      
           FOR _mytupla2 IN select *
              FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = _myIDC
            LOOP  
                return next _mytupla2;    
            _myIDC =  _mytupla2."IDCatalogFather" ;      

            -- estraiamo terzo livello
            SELECT * INTO _mytupla3
            FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = _myIDC;        
            IF FOUND THEN      
                   FOR _mytupla3 IN select *
                     FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = _myIDC
                   LOOP  
                       return next _mytupla3;    
                   _myIDC =  _mytupla1."IDCatalogFather" ;                             

                END LOOP ;  
                     END IF ;

        END LOOP ;  
        END IF ;

    END LOOP;
  ELSE
        select  * INTO _mytupla1
        FROM __getcatalog_id_qt($1,$2)  WHERE "IDCatalog" = $2 ;  
    return next _mytupla1;

  END IF;
END ;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
  COST 100
  ROWS 1000;
ALTER FUNCTION _get_getcatalog_id_qt(integer,integer) OWNER TO postgres;
---------------------------------------------------------------------------

Esempio di chiamata nel generatore di query
di una query che utilizza la query 2) che utilizza la query 1)

 Select * FROM _get_getcatalog_id_qt(300, 412) ;

Risorse:

Plpgsql 

Postgresql 

Creare eliminare database e tabelle

Annunci
  1. Non c'è ancora nessun commento.
  1. No trackbacks yet.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: