2010-01-10 9 views
6

Sadece bir ülke listesi ve onların ISO ülke kodlarını içeren bir tablo var. Ben gibi bir saklı yordam (aka fonksiyonu) sorgu sarma ediyorum:Bir PostgreSQL saklı yordamından bir recordset döndürmenin en kolay yolu nedir?

CREATE OR REPLACE FUNCTION get_countries(
        ) RETURNS setof record AS $$ 
     SELECT country_code, country_name FROM country_codes 
$$ LANGUAGE sql; 

hata alıyorum: Ben ben üzerinden bir TİP ve daha sonra döngü tanımlayabilirsiniz biliyoruz

ERROR: a column definition list is required for functions returning "record" 

bir imleç gibi kayıtlar, ama IIRC PostgreSQL'in yeni sürümleri için bunu yapmanın daha iyi bir yolu var (8.4.3 kullanıyorum) ama hatırlamaya çalışarak saçlarımı çekiyorum.


Düzenleme:

Bu çalışır:

CREATE OR REPLACE FUNCTION get_countries(
        ) RETURNS setof country_codes AS $$ 
     SELECT country_code, country_name FROM country_codes 
$$ LANGUAGE sql; 

Not "İade SETOF [tablo adı]". Ama en esnek görünmüyor. Birden fazla tablonun birleşimine geri dönmeye kalkarsam dağılır.

+0

olası bir kopyası [PL/pgSQL'de bir kaydın tuple yapısının bildirilmesi] (http://stackoverflow.com/questions/11907563/declaring-the-tuple-structure-of-a-record-in-pl- pgsql) –

cevap

8

Böyle çıkış parametreleri kullanmak mümkün olmalıdır:

CREATE OR REPLACE FUNCTION get_countries() 
RETURNS TABLE(
    country_code text, 
    country_name text 
) 
AS $$ 
    SELECT country_code, country_name FROM country_codes 
$$ LANGUAGE sql; 

Bu:

CREATE OR REPLACE FUNCTION get_countries(country_code OUT text, country_name OUT text) 
RETURNS setof record 
AS $$ SELECT country_code, country_name FROM country_codes $$ 
LANGUAGE sql; 
10

da şahsen tercih (in the PostgreSQL Manual açıklandığı gibi) RETURNS TABLE(...) kullanma seçeneği vardır SETOF tablename ile aynıdır, ancak varolan bir nesneyi başvurmak yerine satır içi tablo yapısını bildirir, böylece birleştirir ve böyle devam eder.

İlgili konular