2010-11-30 9 views
0

J'ai une instruction select qui est générée dynamiquement en fonction du paramètre fourni. Le problème est que postgresql dit toujours:Substitution de variables en PL/pgSQL

argument of WHERE must be type boolean, not type character varying quel que soit le paramètre. Ai-je manqué quelque chose?

CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$ 
    DECLARE 
     statement varchar; 
     uid integer; 
    BEGIN 
     IF ($1 = '') THEN 
      statement := 'TRUE'; 
      statement := CAST(statement AS BOOLEAN); 
     ELSE 
      statement := 'users.keywords ILIKE''' || '%' || $1 || '%'''; 
     END IF; 
     SELECT INTO uid id FROM users WHERE "statement"; 
     RETURN uid; 
    END; 
$$ LANGUAGE plpgsql 

Répondre

2

Vous avez besoin de EXECUTE si vous souhaitez générer des commandes dynamiques dans une fonction. Vous pouvez également utiliser deux sections différentes:

CREATE OR REPLACE FUNCTION getuid(name character varying) RETURNS integer AS $$ 
    DECLARE 
     statement varchar; 
     uid integer; 
    BEGIN 
     IF ($1 = '' OR $1 IS NULL) THEN -- section 1 
      SELECT id INTO uid FROM users; 
     ELSE -- section 2 
      SELECT id INTO uid FROM users WHERE users.keywords ILIKE '%' || $1 || '%'; 
     END IF; 

     RETURN uid; 
    END; 
$$ LANGUAGE plpgsql;