web-dev-qa-db-fra.com

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

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?

75
Sathish

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_tableid 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ë.

123
mu is too short

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 .

48
Erwin Brandstetter

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, ...

16
Pavel Stehule

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: enter image description here

1
Ram Pukar

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;
0
rinku Choudhary