Contoh yang diberikan dapat diganti seluruhnya dengan RETURN QUERY
:
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
yang akan menjadi banyak lebih cepat.
Secara umum Anda harus menghindari iterasi sedapat mungkin, dan sebagai gantinya mendukung operasi berorientasi set.
Di mana return next
over a loop tidak dapat dihindari (yang sangat jarang, dan sebagian besar terbatas pada saat Anda membutuhkan penanganan pengecualian) Anda harus mengatur OUT
nilai parameter atau parameter tabel, lalu return next
tanpa argumen.
Dalam hal ini masalah Anda adalah baris SELECT yr.y, 'hi';
yang tidak melakukan apa-apa. Anda mengasumsikan bahwa tujuan implisit dari SELECT
adalah parameter keluar, tapi bukan itu masalahnya. Anda harus menggunakan parameter out sebagai variabel loop seperti yang dilakukan @peterm, menggunakan tugas atau menggunakan SELECT INTO
:
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
y := yr.y;
result := 'hi';
RETURN NEXT;
END LOOP;
RETURN;