62

Come conservare il risultato della query nella variabile utilizzando PostgreSQL stored procedureConservare il risultato della query nella variabile utilizzando PostgreSQL stored procedure

ho una stored procedure

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 eles part 
end if; 
end; 
return -- return my process result here 
$BODY$ 
LANGUAGE plpgsql VOLATILE 

nella procedura di cui sopra ho bisogno di memorizzare

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

questa query risultato tornando al nome della variabile

come elaborarlo? per favore fatemelo sapere

risposta

91

Penso che stai cercando SELECT INTO:

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

che tirerà il name da test_table dove id è l'argomento di vostra funzione e lasciare nella variabile name. Non lasciare il prefisso del nome della tabella su test_table.name o avrai lamentele su un riferimento ambiguo.

+3

grazie potente !!!!!!!!! – Sathish

+1

Cosa succede se ho bisogno di più variabili. Come selezionare test_table.name, test_table.id, test_table.ssn? –

+1

@DaoLam: Dalla documentazione mi è piaciuto: "Il risultato di un comando SQL che produce una singola riga (probabilmente di più colonne) può essere assegnato a una variabile di registrazione, una variabile di tipo riga o un elenco di variabili scalari." –

36

Finché si sta assegnando una singola variabile, è possibile utilizzare anche l'assegnazione pianura in una funzione plpgsql:

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

Oppure utilizzare SELECT INTO come @mu already provided.

Questo funziona anche:

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

Ma meglio utilizzare uno dei primi due, i metodi più chiare, come ha commentato @Pavel.

Ho accorciato la sintassi con un alias di tabella in aggiunta.
Aggiornamento : Ho rimosso il mio esempio di codice e suggerisco di utilizzare IF EXISTS() invece di provided by @Pavel.

+0

Questa non è una buona idea - questa funzionalità non è documentato ed è brutto –

+2

PL/pgSQL consente il mix di SQL e PL - ea volte è possibile creare creature davvero strane, ma è meglio mixare PL e SQL in modo pulito - in dichiarazioni isolate. –

+0

@PavelStehule: Sono d'accordo, il tuo modulo è preferibile. –

14

Lo schema abituale è 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 è usato in PL/SQL, PL/pgSQL, SQL/PSM, ...

1

Creare Learning Tabella:

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

Inserisci dati Tabella apprendimento:

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

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

Fase: 02

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

Fase: 03

DROP FUNCTION get_all(); 

Demo: enter image description here