Tôi sẽ không sử dụng một con trỏ rõ ràng để làm điều này. Steve F. không còn khuyên mọi người sử dụng con trỏ rõ ràng khi con trỏ ẩn có thể được sử dụng.
Phương thức với count(*)
là không an toàn. Nếu một phiên khác sẽ xóa hàng đáp ứng điều kiện sau dòng có count(*)
và trước dòng có select ... into
, mã sẽ đưa ra một ngoại lệ sẽ không được xử lý.
Phiên bản thứ hai từ bài đăng gốc không có vấn đề này và nó thường được ưu tiên hơn.
Điều đó nói rằng, có một chi phí nhỏ khi sử dụng ngoại lệ và nếu bạn chắc chắn 100% dữ liệu sẽ không thay đổi, bạn có thể sử dụng count(*)
, nhưng tôi khuyên bạn không nên làm như vậy.
Tôi đã chạy các điểm chuẩn này trên Oracle 10.2.0.1 trên Windows 32 bit . Tôi chỉ nhìn vào thời gian đã trôi qua. Có những bộ dây kiểm tra khác có thể cung cấp thêm thông tin chi tiết (chẳng hạn như số lượng chốt và bộ nhớ được sử dụng).
SQL>create table t (NEEDED_FIELD number, COND number);
SQL>insert into t (NEEDED_FIELD, cond) values (1, 0);
declare
otherVar number;
cnt number;
begin
for i in 1 .. 50000 loop
select count(*) into cnt from t where cond = 1;
if (cnt = 1) then
select NEEDED_FIELD INTO otherVar from t where cond = 1;
else
otherVar := 0;
end if;
end loop;
end;
/
declare
otherVar number;
begin
for i in 1 .. 50000 loop
begin
select NEEDED_FIELD INTO otherVar from t where cond = 1;
exception
when no_data_found then
otherVar := 0;
end;
end loop;
end;
/