167 votes

Stocker le résultat d'une requête dans une variable en utilisant PL/pgSQL

Comment assigner le résultat d'une requête à une variable en PL/pgSQL, le langage procédural de PostgreSQL ?

J'ai une fonction :

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

Dans la fonction ci-dessus, je dois stocker le résultat de cette requête :

'SELECT name FROM test_table where id='||x;

à la variable name .

Comment traiter cela ?

248voto

mu is too short Points 205090

Je pense que vous cherchez SELECT select_expressions INTO :

select test_table.name into name from test_table where id = x;

Cela va tirer le name de test_tableid est l'argument de votre fonction et laissez-le dans le champ name variable. N'omettez pas le préfixe du nom de la table sur test_table.name ou vous recevrez des plaintes au sujet d'une référence ambiguë.

109voto

Erwin Brandstetter Points 110228

Pour attribuer un variable unique vous pouvez également utiliser simple affectation dans un bloc de code PL/pgSQL, avec un sous-requête scalaire à droite :

name := (SELECT t.name from test_table t where t.id = x);

Effectivement, c'est la même chose que SELECT INTO comme @mu a déjà fourni avec des différences subtiles :

  • SELECT INTO est légèrement plus rapide dans mes tests sur Postgres 14.
    (Assignation pure et simple d'une constante, sans impliquer SELECT est tout de même 10 fois plus rapide).
  • SELECT INTO définit également le variable spéciale FOUND alors que l'affectation simple ne le fait pas. Vous pouvez vouloir l'un ou l'autre.
  • SELECT INTO peut également attribuer variables multiples en même temps. Voir :

Notamment, cela fonctionne aussi :

name := t.name from test_table t where t.id = x;

A SELECT sans le début SELECT . Mais je voudrais pas utiliser cet hybride. Mieux vaut utiliser l'une des deux premières méthodes, plus claires et documentées, comme l'a commenté @Pavel.

20voto

Pavel Stehule Points 8337

Le schéma habituel est le suivant EXISTS(subselect) :

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

Ce modèle est utilisé dans PL/SQL, PL/pgSQL, SQL/PSM, ...

3voto

Ram Pukar Points 386

Créer une table d'apprentissage :

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

Insérer le tableau d'apprentissage des données :

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

Étape : 01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

Étape : 02

SELECT * FROM get_all('Google AI-01');

Étape : 03

DROP FUNCTION get_all();

Démonstration : enter image description here

0voto

Edward Brey Points 8771

Par Exécution d'une requête avec un résultat à une seule ligne utilisez cette syntaxe :

SELECT select_expressions INTO [STRICT] target FROM ...

donde target peut être une variable d'enregistrement, une variable de ligne, ou une liste de variables simples et de champs d'enregistrement/de ligne séparés par des virgules.

Contrairement à la SELECT INTO , SELECT select_expressions INTO ne crée pas de table.

Dans votre exemple, vous avez une seule variable simple name donc l'instruction de sélection serait :

SELECT test_table.name INTO name FROM test_table WHERE test_table.id = x;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X