Các thủ tục không được phép trong câu lệnh SQL vì việc trộn lẫn kiểu lập trình khai báo và mệnh lệnh sẽ gây nhầm lẫn.
Câu lệnh SQL là một danh sách các điều kiện - Oracle quyết định cách tạo ra tập kết quả phù hợp với các điều kiện đó. Thủ tục được lưu trữ PL / SQL là một tập hợp các hướng dẫn thay đổi mọi thứ theo cách rất dễ đoán.
Trong ví dụ dưới đây, pr
nên bao nhiêu lần được thực thi? Nó được thực thi trước hay sau id = 1
? Nếu các câu lệnh SQL có thứ tự được xác định trước thì trình tối ưu hóa sẽ không thể đẩy các vị từ, hợp nhất các truy vấn con, v.v. và hiệu suất sẽ không thể chấp nhận được.
select *
from table1
where id = 1
and pr;
Ngay cả khi một quy trình đã được sử dụng trong select
danh sách, nó có thể không có ý nghĩa. Ví dụ:select
danh sách bên trong exists
luôn bị bỏ qua.
select * from dual where exists (select pr from dual);
Nhưng trong thực tế, các câu lệnh SQL đôi khi cần phải tương tác với thế giới bên ngoài, và một số logic thủ tục là cần thiết. Các hàm được phép vì chúng thường chỉ cần tính toán một cái gì đó và trả về một giá trị. Các chức năng thường không phụ thuộc vào trạng thái chương trình và có rất nhiều tác dụng phụ. Các chức năng của bạn có thể sử dụng các biến phiên, cập nhật bảng (nếu nó được đặt thành PRAGMA AUTONOMOUS TRANSACTION
), đặt bối cảnh, v.v. Oracle không thể ngăn bạn làm những điều đó, nhưng việc không cho phép các thủ tục trong câu lệnh SQL ít nhất sẽ làm nản lòng mã như vậy.