2015-10-02 10 views
5

Come ho scoperto SELECT * FROM t INTO my_data; funziona solo se:Declare tipo variabile di riga in PL/pgSQL

DO $$ 
DECLARE 
my_data t%ROWTYPE; 
BEGIN 
SELECT * FROM t INTO my_data WHERE id = ?; 
END $$; 

ho ragione?

Se voglio ottenere solo 2-3 colonne anziché tutte le colonne. Come posso definire my_data?

Cioè,

DO $$ 
DECLARE 
my_data <WHAT HERE??>; 
BEGIN 
SELECT id,name,surname FROM t INTO my_data WHERE id = ?; 
END $$; 

risposta

11

ottiene solo 2-3 colonne invece di tutte le colonne

Un modo: utilizzare una variabile record:

DO $$ 
DECLARE 
    _rec record; 
BEGIN 
SELECT INTO _rec 
      id, name, surname FROM t WHERE id = ?; 
END $$; 

Si noti che la la struttura di un tipo record non è definita fino a quando non viene assegnata. Quindi non puoi fare riferimento a colonne (campi) prima di farlo.

Un altro modo: assegnare più variabili scalari:

DO $$ 
DECLARE 
    _id int; 
    _name text; 
    _surname text; 
BEGIN 
SELECT INTO _id, _name, _surname 
      id, name, surname FROM t WHERE id = ?; 
END $$; 

quanto riguarda il tuo primo esempio: %ROWTYPE è solo il rumore in Postgres. The documentation:

(.. Dal momento che ogni tavolo ha un tipo composito associato con lo stesso nome, in realtà non importa in PostgreSQL se si scrive %ROWTYPE o no, ma il modulo con %ROWTYPE è più portabile)

Quindi:

DO $$ 
DECLARE 
    my_data t; -- table name serves as type name, too. 
BEGIN 
    SELECT INTO my_data * FROM t WHERE id = ?; 
END $$; 
Problemi correlati