Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Postgresql] problema con una funzione pg

    Ciao a tutti,
    per motivi di lavoro sto continuando il progetto di un mio ex-collega, il problema è che questo progetto utilizza Postgresql e io non ho conoscenze in merito.

    In particolare dovrei modificare una funzione che ha scritto lui ma i miei tentativi non stanno portando a nessuna conclusione, mi potete aiutare?

    Questo è il codice scritto dal mio ex-collega
    codice:
    -- Function: menu.get_nav_menu(integer)
    
    -- DROP FUNCTION menu.get_nav_menu(integer);
    
    CREATE OR REPLACE FUNCTION menu.get_nav_menu(menu_id integer)
      RETURNS SETOF menu.v_vocimenu AS
    $BODY$
    
    
    DECLARE
           id_padre integer;
    	   
           qry text;
    	   
           r menu.v_vociMenu%rowtype;
    
    BEGIN
    
         FOR r in select * from menu.v_vociMenu
    	 
         where id_menu = $1 
    	 
         LOOP
    	 
         RETURN QUERY SELECT * FROM menu.get_nav_menu(r.padre);
    	 
             IF r.padre = 0 THEN
    		 
                RETURN NEXT r;
    			
                EXIT;
    			
             END IF;
    		 
              RETURN NEXT r;
    		  
         END LOOP;
    	 
         RETURN;
    
    END;
    
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100
      ROWS 1000;
    ALTER FUNCTION menu.get_nav_menu(integer) OWNER TO postgres;
    Mi sono accorto che l'errore si genera perchè fa il controllo in un unico campo nella where quindi la query è sbagliata, ho provato a modificarlo in questo modo
    codice:
    -- Function: menu.get_nav_menu(integer, integer)
    
    -- DROP FUNCTION menu.get_nav_menu(integer, integer);
    
    CREATE OR REPLACE FUNCTION menu.get_nav_menu(id_utente integer, menu_id integer)
      RETURNS SETOF menu.v_vocimenu AS
    $BODY$
    
    
    
    DECLARE
           id_padre integer;
    	   
           qry text;
    	   
           r menu.v_vociMenu%rowtype;
    
    BEGIN
    
         FOR r in select * from menu.v_vociMenu
    	 
         where id_utente = $1 and id_menu = $2 
    	 
         LOOP
    	 
         RETURN QUERY SELECT * FROM menu.get_nav_menu(r.padre);
    	 
             IF r.padre = 0 THEN
    		 
                RETURN NEXT r;
    			
                EXIT;
    			
             END IF;
    		 
              RETURN NEXT r;
    		  
         END LOOP;
    	 
         RETURN;
    
    END;
    
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100
      ROWS 1000;
    ALTER FUNCTION menu.get_nav_menu(integer, integer) OWNER TO postgres;
    ora però mi restituisce questo errore
    codice:
    ERROR: sql error DETAIL: ERROR: la funzione menu.get_nav_menu(integer) non esiste LINE 1: SELECT * FROM menu.get_nav_menu( $1 ) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT * FROM menu.get_nav_menu( $1 ) CONTEXT: PL/pgSQL function "get_nav_menu" line 32 at RETURN QUERY CONTEXT: funzione SQL "f_get_nav_menu" istruzione 1
    sono 2 giorni che ci sbatto la testa mi potete aiutare?

    ciao e grazie
    Se la felicità è dietro l'angolo allora la mia vita è un cerchio. (Mario Muraro)

  2. #2
    scusami, ma mi pare abbastanza evidente l'errore

    se rileggi con attenzione il messaggio d'errore che hai postato ti viene scritto il perché del problema

    ERROR: sql error DETAIL: ERROR: la funzione menu.get_nav_menu(integer) non esiste LINE 1: SELECT * FROM menu.get_nav_menu( $1 ) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT * FROM menu.get_nav_menu( $1 ) CONTEXT: PL/pgSQL function "get_nav_menu" line 32 at RETURN QUERY CONTEXT: funzione SQL "f_get_nav_menu" istruzione 1
    Tu richiami la stored procedure passando un solo argomento, ma dopo la tua modifica va richiamata con 2 argomenti
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #3
    la stored procedure viene chiamata da un altra stored procedure su un altro db, penso di averla modificata ma non sono sicuro che sia il modo corretto

    Codice ex-collega - il blocco dove passa le variabili è " menu.get_nav_menu "
    codice:
    inner join dblink(sistema.stringa_conn($1), 
      'select * from menu.get_nav_menu('|| $4 ||')')
       as menu(id_menu int, padre int, parametro character varying(255), 
                   id_classe_metodo int, id_utente int, id_label int, nascosto int, 
                   livello int, id_menu_tipo int)
    io l'ho modificata in questo modo, ma non so se è corretto perchè non conosco Postgresql
    codice:
    inner join dblink(sistema.stringa_conn($1), 
      'select * from menu.get_nav_menu('|| $2 || ',' || $4 ||')')
       as menu(id_menu int, padre int, parametro character varying(255), 
                   id_classe_metodo int, id_utente int, id_label int, nascosto int, 
                   livello int, id_menu_tipo int)
    Se la felicità è dietro l'angolo allora la mia vita è un cerchio. (Mario Muraro)

  4. #4
    nemmeno io conosco postgresql, ma l'errore parlava abbastanza chiaro

    fai qualche prova
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.