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

Hàm pl / sql được gọi bao nhiêu lần?

Đây là loại tình huống mà một số thử nghiệm hữu ích (điều này được thực hiện vào 10g). Sử dụng truy vấn sau, chúng ta có thể biết rằng các hàm bình thường, sử dụng cùng một tham số (trong trường hợp này là không có tham số nào) sẽ được thực thi mỗi khi chúng được gọi:

select dbms_random.value() from all_tables

Điều này là do Oracle giả định rằng một hàm sẽ không trả về cùng một giá trị nhất quán trừ khi bạn nói với nó theo cách khác. Chúng ta có thể làm điều đó bằng cách tạo một hàm sử dụng deterministic từ khóa:

CREATE FUNCTION rand_det
   RETURN NUMBER
   DETERMINISTIC AS
BEGIN
   RETURN DBMS_RANDOM.VALUE ();
END;

Sử dụng chức năng này thay vì dbms_random trong truy vấn đầu tiên cho chúng ta biết rằng truy vấn chỉ được thực thi một lần, mặc dù có nhiều lệnh gọi. Nhưng điều này chỉ làm rõ select tiết diện. Điều gì sẽ xảy ra nếu chúng ta sử dụng cùng một hàm xác định trong cả select và một where mệnh đề. Chúng tôi có thể kiểm tra điều đó bằng cách sử dụng truy vấn sau:

SELECT rand_det
FROM   all_tables
WHERE  rand_det > .5;

Bạn có thể phải chạy điều này nhiều lần để xem bằng chứng của chúng tôi, nhưng cuối cùng, bạn sẽ thấy danh sách các giá trị nhỏ hơn 0,5. Điều này cung cấp cho chúng tôi bằng chứng rằng ngay cả hàm xác định cũng đang được thực thi hai lần:một lần cho mỗi phần nó xuất hiện. Thay vào đó, bạn có thể sửa đổi hàm xác định của chúng tôi như sau, sau đó chạy truy vấn tiếp theo, truy vấn này sẽ hiển thị 2 dòng được viết cho DBMS_OUTPUT .

CREATE OR REPLACE FUNCTION rand_det
   RETURN NUMBER
   DETERMINISTIC AS
BEGIN
   DBMS_OUTPUT.put_line ('Called!');
   RETURN DBMS_RANDOM.VALUE ();
END;

SELECT rand_det
FROM   all_tables;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể biên dịch PL / SQL với BULK COLLECT và FORALL

  2. Cách biểu diễn khoảng thời gian Oracle trong Java

  3. tham gia nhiều bảng

  4. Làm cách nào để ánh xạ đến và từ một loại phức tạp trong EF4.3 mã đầu tiên?

  5. SQLite cho Oracle