Anda tidak bisa DECLARE
variabel (global) (ada ada solusi
) atau loop dengan SQL biasa - dengan pengecualian CTE rekursif seperti yang disediakan oleh @bma
(yang sebenarnya berulang lebih dari baris, tidak perulangan, sebenarnya).
Namun , ada DO
pernyataan
untuk kode prosedur ad-hoc tersebut. Diperkenalkan dengan Postgres 9.0. Ini berfungsi seperti fungsi satu kali, tetapi tidak mengambil parameter apa pun dan tidak mengembalikan apa pun. Anda dapat RAISE
pemberitahuan et al, jadi contoh Anda akan berfungsi dengan baik:
DO
$do$
DECLARE
_counter int := 0;
BEGIN
WHILE _counter < 10
LOOP
_counter := _counter + 1;
RAISE NOTICE 'The counter is %', _counter; -- coerced to text automatically
END LOOP;
END
$do$
Jika tidak ditentukan lain, bahasa dalam isi default ke plpgsql
. Anda dapat menggunakan bahasa prosedural apa pun yang terdaftar
meskipun, jika Anda mendeklarasikannya (seperti:LANGUAGE plpython
).
Postgres juga menawarkan generate_series()
untuk menghasilkan set ad-hoc, yang dapat meniadakan kebutuhan untuk perulangan dalam banyak kasus. Coba cari di sini di SO untuk contoh.
Anda juga dapat menggunakan WHERE
klausa dalam CTE pengubah data
dalam SQL biasa untuk memotong kasus dan meniru IF .. THEN .. ELSE .. END
...