Bagaimana cara membedakan antara SQL dan PL / SQL?

16

Saya tahu pertanyaannya mungkin terdengar terlalu bodoh, tetapi saya tidak pernah mengerti bagian ini.

SQL * Plus berfungsi dengan SQL dan PL / SQL. Bagaimana saya tahu apakah beberapa kode adalah SQL atau PL / SQL? Jika kode saya memiliki for loop, bukankah itu SQL lagi?

PL / SQL adalah ekstensi untuk SQL untuk memiliki loop, conditional dll. Lalu kode SQL apa pun secara default PL / kode SQL? Bukan begitu?

Apakah ada batasan antara SQL dan PL / SQL?

Dua contoh membedakan b / w SQL dan PL / SQL yang memicu pertanyaan ini:

Apa perbedaan antara keduanya membuat pernyataan tabel?

/programming/2267386/oracle-11g-varray-of-objects/2267813#2267813

Lazer
sumber

Jawaban:

12

Ini pertanyaan yang menarik, pastinya. Kebanyakan orang yang terbiasa dengan pengembangan Oracle tidak akan memikirkannya tetapi ketika Anda sampai pada itu, kadang-kadang membingungkan untuk mendefinisikan demarkasi antara SQL dan PL / SQL.

Dengan melihat definisi akronim, Anda mulai mendapatkan gagasan tentang bidang fungsi apa yang masing-masing mencakup:

SQL - Bahasa Query Terstruktur

PL / SQL - Bahasa Prosedural / Bahasa Query Terstruktur

Pembaca yang jeli mungkin memperhatikan bagaimana SQL muncul dua kali 8) Itu karena SQL sering tertanam dalam PL / SQL - PL / SQL adalah bahasa yang dibuat untuk menyediakan bahasa generasi ke-4 yang dipatenkan (4GL) yang sangat baik dimainkan dengan objek basis data di Peramal.

Wikipedia memiliki beberapa materi yang cukup bagus tentang SQL dan PL / SQL

Bagian yang membingungkan adalah di mana PL / SQL dan SQL tumpang tindih sedikit. Ruang lingkup SQL mencakup penyisipan data, kueri, pembaruan, dan penghapusan, yang disebut DML, atau operasi bahasa manipulasi data, tetapi juga mencakup pembuatan, ubah, ganti nama, jatuhkan yang merupakan operasi bahasa definisi data DDL atau definisi data. Di sini di mana beberapa mungkin bingung. Operasi untuk membuat prosedur tersimpan, sesuatu yang ditulis menggunakan PL / SQL, sebenarnya SQL - Anda menggunakan SQL untuk membuat objek database yang mewakili blok PL / SQL.

Demikian juga, Anda dapat menanamkan kode SQL di dalam PL / SQL Anda. Sebagai contoh, loop FOR di PL / SQL dapat didasarkan pada query SQL. Hancurkan pikiranmu sedikit, eh? Anda membuat prosedur menggunakan SQL yang sebenarnya secara internal menggunakan SQL untuk melakukan beberapa tindakan pada catatan dari database.

Hal-hal keren jika Anda bertanya kepada saya.

ScottCher
sumber
2
Memang, garisnya kabur. Anda bisa menulis pernyataan SQL untuk membuat prosedur PL / SQL yang memiliki pernyataan SQL di dalamnya yang memanggil fungsi PL / SQL yang memiliki pernyataan SQL di dalamnya, dll.
Leigh Riffel
1
@Leigh turun lubang kelinci kita pergi!
ScottCher
Saya tidak akan mengatakan garis itu kabur sama sekali. PL / SQL adalah pembungkus prosedural untuk SQL. Kebanyakan PL / SQL berisi pernyataan SQL, meskipun tidak harus. Anda dapat melacak kursor SQL aktual di v$sqldll.
William Robertson
12

Jika dibungkus

  • BEGIN ... END
  • DECLARE ... END
  • CREATE OR REPLACE ... END
  • Merupakan awalan satu baris EXECUTE

Maka itu adalah PL / SQL. Apa artinya ini di bawah tenda? SQL akan "dikompilasi" ke rencana kueri dan dieksekusi, segera mengembalikan hasil yang ditetapkan jika SELECTatau jumlah baris yang terpengaruh dalam kasus lain, atau kesalahan. Namun PL / SQL lebih terlibat. Setiap objek yang direferensikan di dalamnya diperiksa keberadaannya dan hibah yang diperlukan, kemudian PL / SQL dikompilasi ke kode yang hampir asli , yang dijalankan dengan kecepatan penuh. Ketergantungan dilacak dan jika tabel berubah, maka setiap PL / SQL referensi yang membutuhkan kompilasi ulang. Alasannya adalah kecepatan; karena semuanya dilakukan di muka pada waktu kompilasi, tidak perlu ada pemeriksaan runtime dalam PL / SQL, sedangkan pernyataan SQL harus diperiksa setiap kali (bahkan rencana kueri di-cache, yang disebut soft parse, hak istimewa masih harus diperiksa, dan bahkan parse lunak memiliki biaya yang terkait dengannya).

Ini adalah salah satu "keunggulan mematikan" dari prosedur tersimpan seperti yang dilakukan Oracle; sebenarnya mengeksekusi PL / SQL tersimpan proc atau memicu melakukan jumlah minimum absolut perhitungan untuk mendapatkan hasilnya. Kode aplikasi yang berjalan di luar kernel Oracle di mana tidak dipercaya harus melewati lebih banyak rintangan untuk mendapatkan data. Ini argumen yang sama untuk bahasa tingkat tinggi yang diketik dengan kuat, referensial transparan seperti OCaml atau Haskell - melakukan lebih banyak pekerjaan sekali, pada waktu kompilasi, dan menuai manfaat pada jutaan waktu kode dieksekusi.

Gayus
sumber
2
Untuk menambahkan ke campuran CALL adalah pernyataan SQL yang digunakan untuk menjalankan unit program yang tersimpan, dan ditulis ulang di bawah kap sebagai BEGIN ... AKHIR
Gary
2
Seperti EXECUTE, itu adalah gula sintaksis
Gayus
5

Apakah ada batasan antara SQL dan PL / SQL?

SQL adalah standar *.

PL / SQL adalah ekstensi vendor ke standar SQL *.

* SQL adalah bahasa yang memiliki tata bahasa eksplisit dan aturan untuk bagaimana tata bahasa itu harus diimplementasikan, dan bukan merupakan standar per-se . Namun, karena ada spesifikasi bahasa, yang dapat disepakati semua orang, maka segala sesuatu yang ditulis dalam SQL akan portabel jika program hanya ditulis dalam SQL.

Tetapi karena PL / SQL adalah ekstensi vendor, itu akan memiliki bagian bahasa yang mungkin tidak didukung oleh vendor lain.

jcolebrand
sumber
3
Saya akan mengatakan bahwa PL / SQL adalah standar de facto, sedangkan SQL adalah standar de jure :-)
Gaius
3
@ Gayus dan dari pernyataan itu saja saya akan menebak dua hal: Anda adalah seorang ORA dev, dan menurut Anda TSQL hanya berantakan: p
jcolebrand
@ jcolebrand Pekerjaan DBA pertama saya sebenarnya di Sybase, tapi Anda benar, saya terutama bekerja dengan Oracle hari ini. Saya akan sangat senang jika Anda bisa menulis baik T-SQL atau PL / SQL di kedua database, tetapi bahasa mencerminkan platform mereka (misalnya T-SQL adalah cara itu karena kursor dan kunci mahal dalam SQL Server dan turunannya , dan PL / SQL adalah caranya karena seseorang di Oracle terakhir bekerja di DoD) :-)
Gaius
@ Gayus Ah, ya, argumen lama tentang standar menjadi sangat baik karena ada begitu banyak untuk dipilih. Saya pikir yang baik untuk menunjukkan SQL adalah "standar" dan bahwa PL / SQL adalah milik jadi +1 @jcolebrand.
ScottCher
@ScottCher ~ Terima kasih untuk itu. Saya merasa bodoh mengatakan bahwa itu adalah standar karena tidak ada (afaik) badan standar untuk mencapnya dengan meterai persetujuan dan memberikan nomor. Tapi itu didefinisikan dengan baik dan disepakati. ;)
jcolebrand