Anda sendiri yang menebalkan kalimat kunci dalam manual:
Seluruh isi fungsi SQL diurai sebelum salah satu dijalankan.
Baca juga tentang Tahap Parser dalam manual.
Ini terdiri dari dua bagian utama:parser dan proses transformasi . Mengutip manual:
proses transformasi mengambil pohon yang diserahkan kembali oleh parser sebagai input dan melakukan interpretasi semantik yang diperlukan untuk memahami tabel, fungsi, dan operator mana yang dirujuk oleh kueri.
Jika fungsi SQL berisi perintah ini:
CREATE TABLE foo (...);
INSERT INTO foo VALUES(...);
Kedua pernyataan direncanakan pada waktu yang hampir bersamaan (berdasarkan snapshot yang sama dari katalog sistem). Oleh karena itu, INSERT
tidak dapat melihat tabel "foo" yang mungkin dibuat dengan CREATE
. sebelumnya memerintah. Itu menciptakan salah satu masalah berikut :
-
Jika tidak ada lainnya tabel bernama "foo" di
search_patch
(belum), Postgres mengeluh ketika mencoba membuat fungsi:ERROR: relation "foo" does not exist
-
Jika tabel lain bernama "foo" sudah ada di
search_patch
(dan Anda tidak menggunakan nama kolom yang bertentangan), Postgres akan merencanakanINSERT
berdasarkan tabel yang sudah ada sebelumnya. Biasanya hal itu menghasilkan kesalahan pada waktu eksekusi , jika ada nilai yang menyebabkan konflik di tabel (salah!). Atau, dengan sedikit nasib buruk, ia bahkan mungkin menulis ke tabel itu tanpa pesan kesalahan! Bug yang sangat licik.
Itu tidak bisa terjadi dengan PL/pgSQL fungsi, karena memperlakukan perintah SQL seperti pernyataan yang disiapkan, direncanakan dan dieksekusi secara berurutan . Jadi setiap pernyataan dapat melihat objek yang dibuat pada pernyataan sebelumnya.
Akibatnya, pernyataan yang tidak pernah dikunjungi bahkan tidak pernah direncanakan - tidak seperti fungsi SQL. Dan rencana eksekusi untuk pernyataan dapat di-cache dalam sesi yang sama - juga tidak seperti fungsi SQL. Baca detail tentang caching rencana dalam fungsi PL/pgSQL di manual di sini.
Setiap pendekatan memiliki kelebihan untuk beberapa kasus penggunaan. Bacaan lebih lanjut:
- Perbedaan antara bahasa sql dan bahasa plpgsql pada fungsi PostgreSQL