Memorizza il risultato della query in una variabile usando in PL / pgSQL


130

Come assegnare il risultato di una query a una variabile in PL / pgSQL, il linguaggio procedurale di PostgreSQL?

Ho una funzione:

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

Nella funzione sopra ho bisogno di memorizzare il risultato di questa query:

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

alla variabile name.

Come processarlo?

Risposte:


198

Penso che tu stia cercando SELECT INTO:

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

Ciò tirerà nameda test_tabledove si idtrova l'argomento della tua funzione e lo lascerà nella namevariabile. Non tralasciare il prefisso del nome della tabella test_table.nameo riceverai lamentele su un riferimento ambiguo.


2
E se avessi bisogno di più variabili. Come selezionare test_table.name, test_table.id, test_table.ssn?
Dao Lam

2
@DaoLam: Dalla documentazione che mi è piaciuta di: "Il risultato di un comando SQL che produce una singola riga (possibilmente di più colonne) può essere assegnato a una variabile record, variabile di tipo riga o elenco di variabili scalari".
mu è troppo corto il

@muistooshort quindi stai dicendo che posso fare lo stesso e posso usare name.id, name.ssn per recuperare? L'ho provato con IF EXISTS ma non ha funzionato: IF EXISTS (seleziona * nel nome da test_table ...))
Dao Lam

@DaoLam Perché stai combinando INTO con IF EXISTS? Forse dovresti fare una nuova domanda in modo da poter spiegare cosa stai cercando di fare.
mu è troppo corto il

3
Non c'è alcun esempio nella documentazione (o l'ho perso), ma come notato da @muistooshort, puoi selezionare più variabili con una sola selezione:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas

78

Finché stai assegnando una singola variabile, puoi anche usare l'assegnazione normale in una funzione plpgsql:

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

Oppure usa SELECT INTOcome @mu già fornito .

Funziona anche questo:

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

Ma meglio usare uno dei primi due metodi più chiari, come ha commentato @Pavel.

Ho abbreviato ulteriormente la sintassi con un alias di tabella.
Aggiornamento: ho rimosso il mio esempio di codice e suggerisco di utilizzare IF EXISTS()invece come fornito da @Pavel .


1
Questa non è una buona idea - questa funzione non è documentata ed è brutta
Pavel Stehule

2
PL / pgSQL consente il mix di SQL e PL - e talvolta è possibile creare creature davvero strane, ma è meglio mescolare PL e SQL in modo pulito - in istruzioni isolate.
Pavel Stehule,

@PavelStehule: sono d'accordo, il tuo modulo è preferibile.
Erwin Brandstetter,

In realtà preferisco la tua sintassi, ma il problema è quando vuoi gestire gli errori, la tua affermazione non invia TROVATO a vero al contrario della dichiarazione select in, checkout ( postgresql.org/docs/9.1/plpgsql-statements.html )
SENHAJI RHAZI Hamza,

18

Il solito schema è EXISTS(subselect):

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

Questo modello è utilizzato in PL / SQL, PL / pgSQL, SQL / PSM, ...


2

Crea Tavolo di apprendimento:

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

Inserisci tabella di apprendimento dei dati:

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');

Step: 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';

Step: 02

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

Passaggio: 03

DROP FUNCTION get_all();

demo: inserisci qui la descrizione dell'immagine


-2

È possibile utilizzare il seguente esempio per memorizzare un risultato della query in una variabile usando PL / pgSQL:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.