Comment assigner le résultat d'une requête à une variable de 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, j'ai besoin de stocker le résultat de cette requête:
'SELECT name FROM test_table where id='||x;
à la variable name
.
Comment traiter cela?
Je pense que vous cherchez SELECT INTO
:
select test_table.name into name from test_table where id = x;
Cela va tirer la name
de test_table
où id
est l'argument de votre fonction et le laisser dans la variable name
. Ne laissez pas le préfixe du nom de la table sur test_table.name
, sinon vous aurez des plaintes au sujet d'une référence ambiguë.
Tant que vous affectez une seule variable, vous pouvez également utiliser une 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 il vaut mieux 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ère d'utiliser IF EXISTS()
à la place de fourni par @Pavel .
Le modèle 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();
Vous pouvez utiliser l'exemple suivant pour stocker un résultat de requête dans une variable à l'aide de PL/pgSQL:
select * into demo from maintenanceactivitytrack ;
raise notice'p_maintenanceid:%',demo;