Prosedur tidak diperbolehkan dalam pernyataan SQL karena mencampur gaya pemrograman deklaratif dan imperatif membingungkan.
Pernyataan SQL adalah daftar kondisi - terserah Oracle untuk memutuskan bagaimana menghasilkan set hasil yang cocok dengan kondisi tersebut. Prosedur tersimpan PL/SQL adalah sekumpulan instruksi yang mengubah banyak hal dengan cara yang sangat dapat diprediksi.
Pada contoh di bawah ini, berapa kali harus pr
dieksekusi? Apakah dieksekusi sebelum atau sesudah id = 1
? Jika pernyataan SQL memiliki urutan yang telah ditentukan sebelumnya, maka pengoptimal tidak akan dapat mendorong predikat, menggabungkan subkueri, dll., dan kinerja tidak dapat diterima.
select *
from table1
where id = 1
and pr;
Bahkan jika prosedur digunakan dalam select
daftar, itu mungkin tidak masuk akal. Misalnya, select
daftar di dalam exists
selalu diabaikan.
select * from dual where exists (select pr from dual);
Namun dalam kenyataannya pernyataan SQL terkadang perlu berinteraksi dengan dunia luar, dan beberapa logika prosedural diperlukan. Fungsi diperbolehkan karena biasanya hanya menghitung sesuatu dan mengembalikan nilai. Fungsi biasanya tidak bergantung pada status program dan memiliki banyak efek samping. Fungsi Anda bisa gunakan variabel sesi, perbarui tabel (jika disetel ke PRAGMA AUTONOMOUS TRANSACTION
), mengatur konteks, dll. Oracle tidak dapat menghentikan Anda melakukan hal-hal itu, tetapi prosedur pelarangan dalam pernyataan SQL setidaknya akan mencegah kode tersebut.