В тази версия:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... USERNAME
на таблицата колона се сравнява със себе си, така че винаги ще съвпада. Не го сравнявате с локалната променлива. Ако искате да направите това, ще трябва да дадете на променливата различно име на колоната:
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;
Или както предлага Дейвид Олдридж, използвайте етикет, за да разграничите локалната променлива от колоната на таблицата:
<<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;
...
Можете да използвате този подход и с именувани блокове; ако това беше във функция, можете да се обърнете към локална променлива като function_name.variable_name
. Тъй като това е анонимен блок, етикетът играе същата роля като function_name
би по същество.
Документацията има раздел за разделяне на имена .