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_table
où id
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: