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

Comment atsortingbuer 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; 

au name de la variable.

Comment traiter cela?

Je pense que vous cherchez SELECT INTO :

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

Cela tirera le name de test_tableid est l’argument de votre fonction et le laisse dans la variable name . Ne laissez pas de côté le préfixe du nom de la table sur test_table.name ou vous obtiendrez des plaintes concernant une référence ambiguë.

Tant que vous assignez une seule variable, vous pouvez également utiliser l’affectation simple dans une fonction plpgsql:

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

Ou utilisez SELECT INTO comme @mu déjà fourni .

Cela fonctionne aussi:

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

Mais mieux vaut utiliser l’une des deux premières méthodes, plus claires, comme l’a commenté @Pavel.

J’ai raccourci la syntaxe avec un alias de table en plus.
Mise à jour: J’ai supprimé mon exemple de code et suggéré d’utiliser IF EXISTS() place, comme fourni par @Pavel .

Le schéma habituel est 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, …

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 un 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émo: entrer la description de l'image ici