Trong phiên bản này:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... USERNAME
của bảng đang được so sánh với chính nó, vì vậy nó sẽ luôn khớp. Bạn không so sánh nó với biến cục bộ. Nếu bạn muốn làm điều đó, bạn sẽ cần đặt tên biến khác cho cột:
declare
isFound NUMBER;
localUserName VARCHAR2(30);
begin
isFound := 0;
userName := 'aaaaaa';
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = localUserName
AND ROWNUM = 1;
IF isFound > 0 THEN
dbms_output.put_line('Found');
ELSE
dbms_output.put_line('Not found');
END IF;
end;
Hoặc như David Aldridge đề xuất, hãy sử dụng nhãn để phân biệt biến cục bộ với cột bảng:
<<local>>
declare
isFound NUMBER;
userName MyTable.USERNAME%TYPE;
begin
isFound := 0;
userName := 'aaaaaa';
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = local.userName
AND ROWNUM = 1;
...
Bạn cũng có thể sử dụng cách tiếp cận đó với các khối được đặt tên; nếu điều này nằm trong một hàm, bạn có thể tham chiếu đến một biến cục bộ là function_name.variable_name
. Vì đây là khối ẩn danh nên nhãn đóng vai trò giống như function_name
về cơ bản sẽ.
Tài liệu có phần về giải pháp tên .