Theo mặc định, ORA_ROWSCN
được lưu trữ ở cấp khối, không phải ở cấp hàng. Nó chỉ được lưu trữ ở cấp hàng nếu bảng ban đầu được tạo bằng ROWDEPENDENCIES
được kích hoạt. Giả sử rằng bạn có thể phù hợp với nhiều hàng trong bảng của mình trong một khối duy nhất và bạn không sử dụng APPEND
gợi ý để chèn dữ liệu mới trên mực nước cao hiện có của bảng, bạn có thể chèn dữ liệu mới vào các khối đã có một số dữ liệu hiện có trong đó. Theo mặc định, điều đó sẽ thay đổi ORA_ROWSCN
của mọi hàng trong khối khiến truy vấn của bạn đếm nhiều hàng hơn thực tế đã được chèn.
Kể từ ORA_ROWSCN
chỉ được đảm bảo là giới hạn trên vào lần cuối cùng có DML trên một hàng, việc xác định có bao nhiêu hàng được chèn vào ngày hôm nay sẽ phổ biến hơn nhiều bằng cách thêm CREATE_DATE
cột vào bảng mặc định là SYSDATE
hoặc dựa vào SQL%ROWCOUNT
sau INSERT
của bạn đã chạy (tất nhiên, giả sử rằng bạn đang sử dụng một INSERT
duy nhất để chèn tất cả các hàng).
Nói chung, sử dụng ORA_ROWSCN
và SCN_TO_TIMESTAMP
hàm sẽ là một cách có vấn đề để xác định khi nào một hàng được chèn ngay cả khi bảng được tạo bằng ROWDEPENDENCIES
. ORA_ROWSCN
trả về Oracle SCN là Số Thay đổi Hệ thống. Đây là số nhận dạng duy nhất cho một thay đổi cụ thể (tức là một giao dịch). Do đó, không có liên kết trực tiếp nào giữa SCN và thời gian - cơ sở dữ liệu của tôi có thể tạo ra SCN nhanh hơn của bạn một triệu lần và SCN 1 của tôi có thể khác SCN 1. Quy trình nền Oracle SMON
duy trì một bảng ánh xạ các giá trị SCN đến các dấu thời gian gần đúng nhưng nó chỉ duy trì dữ liệu đó trong một khoảng thời gian giới hạn - nếu không, cơ sở dữ liệu của bạn sẽ kết thúc với một bảng nhiều tỷ hàng chỉ lưu trữ SCN thành ánh xạ dấu thời gian. Nếu hàng được chèn nhiều hơn, chẳng hạn như một tuần trước (và giới hạn chính xác phụ thuộc vào cơ sở dữ liệu và phiên bản cơ sở dữ liệu), SCN_TO_TIMESTAMP
sẽ không thể chuyển đổi SCN thành dấu thời gian và sẽ trả về lỗi.