SELECT ..
INTO ..
utilisée dans un terminal psql, serve à créer une nouvelle table et non à initialiser une variable.
En effet nous aurions aimé pouvoir exécuter quelque chose comme
SELECT code_u
INTO :code
FROM utilisations
WHERE signification = 'Santé';
et ensuite
SELECT *
FROM dépenses
WHERE code_u = :'code';
Mais cela ne fonctionne pas.
Une façon simple de contourner le problème consiste à envoyer l'instruction
SELECT code_u
FROM utilisations
WHERE signification = 'Santé'
vers le serveur avec la méta-commande gset et non avec un point-virgule.
La requête ne doit retourner qu'une rangée et chaque colonne de cette rangée sera stockée dans une variable portant le nom de la colonne.
Testons:
Il nous est loisible de donner à la variable un nom différent de celui prévu par défaut en modifiant l'instruction envoyée comme ceci:
SELECT code_u AS code
FROM utilisations
WHERE signification = 'Santé'
Testons:
Rappelons une autre solution présentée dans un billet précédent.
Il s'agit de créer une fonction avec
CREATE FUNCTION fdépenses(text)
RETURNS SETOF dépenses
AS $$
DECLARE
code dépenses.code_u%TYPE;
usage alias for $1;
BEGIN
SELECT code_u
INTO code
FROM utilisations
WHERE signification = usage;
RETURN QUERY SELECT *
FROM dépenses a WHERE code_u = code ORDER BY référence;
END;
$$ LANGUAGE 'plpgsql';
RETURNS SETOF dépenses
AS $$
DECLARE
code dépenses.code_u%TYPE;
usage alias for $1;
BEGIN
SELECT code_u
INTO code
FROM utilisations
WHERE signification = usage;
RETURN QUERY SELECT *
FROM dépenses a WHERE code_u = code ORDER BY référence;
END;
$$ LANGUAGE 'plpgsql';
dont l'utilisation conduit au même résultat: