PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengapa fungsi PL/pgSQL memiliki efek samping, sedangkan fungsi SQL tidak?

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 :

  1. Jika tidak ada lainnya tabel bernama "foo" di search_patch (belum), Postgres mengeluh ketika mencoba membuat fungsi:

    ERROR:  relation "foo" does not exist
    
  2. Jika tabel lain bernama "foo" sudah ada di search_patch (dan Anda tidak menggunakan nama kolom yang bertentangan), Postgres akan merencanakan INSERT 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. “PERINGATAN:Ditemukan ketidakcocokan antara sl_table dan pg_class.” di Slony-I

  2. Kemajuan dalam peningkatan online

  3. Bagaimana cara saya terhubung ke PostgreSQL tanpa menentukan nama database?

  4. Batasan yang ditentukan DEFERRABLE AWAL SEGERA masih DEFERRED?

  5. Saya terus mendapatkan hubungan kesalahan [TABLE] tidak ada