2015-10-02 12 views
5

Wie ich SELECT * FROM t INTO my_data; Werken nur, wenn:Declare Zeilentyp Variable in PL/pgSQL

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

Habe ich Recht?

Wenn ich nur 2-3 Spalten anstelle aller Spalten erhalten möchte. Wie kann ich my_data definieren?

Das heißt,

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

Antwort

11

bekommen nur 2-3 Spalten statt alle Spalten

Eine Möglichkeit: Verwenden Sie eine record Variable:

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

Beachten Sie, dass die Struktur eines record Typs ist undefiniert bis zur Zuweisung. Sie können also nicht auf Spalten (Felder) verweisen, bevor Sie das tun.

Ein andere Möglichkeit: zuweisen mehr Skalarvariablen:

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

Was Ihr erstes Beispiel: %ROWTYPE ist nur Lärm in Postgres. The documentation:

(.. Da jeder Tisch einen zugehörigen Verbundtyp mit dem gleichen Namen hat, spielt es keine Rolle eigentlich nicht in PostgreSQL, ob Sie %ROWTYPE oder nicht, aber die Form mit %ROWTYPE schreiben ist mehr tragbar)

So:

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