Konstruksi ini tidak mungkin:
IF EXECUTE 'EXISTS (SELECT 1 FROM mytable)' THEN ...
Anda dapat menyederhanakan menjadi:
IF EXISTS (SELECT 1 FROM mytable) THEN ...
Tetapi contoh Anda mungkin disederhanakan. Untuk SQL dinamis dieksekusi dengan EXECUTE
, baca manualnya di sini. Anda dapat memeriksa variabel khusus FOUND
segera setelah menjalankan perintah DML apa pun untuk melihat apakah ada baris di sini yang terpengaruh:
IF FOUND THEN ...
Namun:
Perhatikan khususnya bahwa
EXECUTE
mengubah outputGET DIAGNOSTICS
, tetapi tidak mengubahFOUND
.
Penekanan saya yang berani. Untuk EXECUTE
biasa lakukan ini sebagai gantinya:
...
DECLARE
i int;
BEGIN
EXECUTE 'SELECT 1 FROM mytable'; -- something dynamic here
GET DIAGNOSTICS i = ROW_COUNT;
IF i > 0 THEN ...
Atau jika tepat - khususnya dengan hanya satu baris hasil - gunakan INTO
klausa dengan EXECUTE
untuk mendapatkan hasil dari kueri dinamis secara langsung. Saya mengutip manualnya di sini:
Jika baris atau daftar variabel disediakan, itu harus sama persis dengan struktur hasil kueri (ketika variabel record digunakan, variabel record akan mengonfigurasi dirinya sendiri untuk mencocokkan struktur hasil secara otomatis). Jika beberapa baris dikembalikan, hanya baris pertama yang akan ditetapkan ke
INTO
variabel. Jika tidak ada baris yang dikembalikan, NULL ditetapkan keINTO
variabel.
...
DECLARE
_var1 int; -- init value is NULL unless instructed otherwise
BEGIN
EXECUTE format('SELECT var1 FROM %I WHERE x=y LIMIT 1', 'my_Table')
INTO _var1;
IF _var1 IS NOT NULL THEN ...