Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tại sao chúng ta không thể thực thi thủ tục được lưu trữ trong câu lệnh select trong oracle? có lý do mạnh mẽ nào không?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị thời gian truy cập cuối cùng của một bảng trong Oracle DB

  2. Error System.Data.OracleClient yêu cầu phần mềm máy khách Oracle phiên bản 8.1.7 trở lên khi cài đặt thiết lập

  3. SQL trong so với giao điểm

  4. Sự khác biệt trong Oracle SQL:COUNT (*) so với Bộ kết quả thực tế

  5. Tại sao Oracle không cho bạn biết BẰNG bảng hoặc khung nhìn nào không tồn tại?