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

Apakah PL/pgSQL dan SQL di PostgreSQL keduanya pada tingkat yang sama dengan standar SQL/PSM, bukan sebagai standar SQL saja?

Untuk memperjelas terminologi:

SQL adalah kueri bahasa yang digunakan untuk memilih, memperbarui, menghapus atau membuat data dalam database relasional. Tidak memiliki elemen prosedural seperti loop (FOR , WHILE ) atau pernyataan bersyarat (IF , ELSE ) atau variabel atau kursor.

CREATE FUNCTION memang "pernyataan SQL" tetapi hanyalah "pembungkus" untuk menentukan blok kode yang dieksekusi oleh sesuatu yang berbeda dari "mesin" kueri SQL. Postgres (tidak seperti DBMS lainnya) mendukung beberapa "mesin runtime" yang dapat mengeksekusi blok kode yang diteruskan ke pernyataan "CREATE FUNCTION" - salah satu artefaknya adalah bahwa kode tersebut sebenarnya adalah string sehingga CREATE FUNCTION hanya melihat string, tidak ada yang lain.

Karena SQL tidak memiliki elemen prosedural, Anda tidak dapat mencampur kode prosedural dan kode SQL. Jika Anda ingin menjalankan kode prosedural, Anda perlu memberi tahu server bahwa Anda mengganti "mesin" entah bagaimana. Ini dilakukan melalui (SQL) DO perintah yang lagi-lagi mengambil string yang tidak tahu apa yang harus dilakukan, mengirimkannya ke server dan mengatakan "ini adalah sepotong kode di mana pengguna mengklaim bahwa mesin 'xyz' dapat dijalankan" - xyz adalah PL/pgSQL, Python, Perl atau sesuatu yang sama sekali berbeda.

Ini sama dengan blok PL/SQL anonim di Oracle yang Anda mulai dengan DECLARE - semuanya setelah itu dijalankan oleh mesin runtime yang berbeda di server. MySQL tidak memiliki fitur seperti itu. Satu-satunya cara untuk menjalankan kode prosedural adalah dengan membuat prosedur (atau fungsi), lalu jalankan itu. Itu sebabnya tidak ada yang namanya DO di MySQL.

Satu-satunya produk DBMS yang tidak secara jelas membedakan antara kode prosedural dan "SQL biasa" adalah SQL Server:T-SQL adalah ekstensi ke bahasa SQL yang memungkinkan Anda untuk mencampur "SQL biasa" dan SQL prosedural tanpa memberi tahu backend bahwa kode tersebut membutuhkan mesin yang berbeda untuk dijalankan (yang merupakan sumber kebingungan besar bagi orang yang bermigrasi dari SQL Server ke Postgres atau Oracle).

SQL/PSM adalah standar yang mendefinisikan elemen prosedural yang dapat disematkan ke dalam mesin database yang menggunakan SQL sebagai bahasa kuerinya. Saya tahu tidak ada produk DBMS yang benar-benar mengimplementasikan SQL/PSM. PL/pgSQL Postgres, PL/SQL Oracle, dialek prosedural MySQL agak mirip dengan itu, tetapi jauh dari memenuhi standar SQL/PSM. Saya pikir yang paling dekat dengan standar SQL/PSM adalah DB2 dan mungkin HSQLDB

Itu benar. Tapi kemudian, tidak DBMS sepenuhnya mengimplementasikan standar SQL - tetapi implementasi Postgres mungkin yang paling mendekati standar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah ada yang setara dengan Postgresql SETIAP fungsi agregat pada RDBMS lain?

  2. maven mulai server postgres

  3. Rails, PostgreSQL, dan Pemicu Sejarah

  4. mengapa executeUpdate mengembalikan 1 meskipun tidak ada baris baru yang dimasukkan?

  5. Bagaimana cara menentukan kolom ARRAY dalam migrasi Sekuel Postgresql?