Nesta versão:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... o
USERNAME
da tabela coluna está sendo comparada com ela mesma, então sempre corresponderá. Você não está comparando com a variável local. Se você quiser fazer isso, precisará dar à variável um nome diferente para a coluna: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;
Ou, como sugere David Aldridge, use um rótulo para distinguir a variável local da coluna da tabela:
<<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;
...
Você também pode usar essa abordagem com blocos nomeados; se isso estivesse dentro de uma função, você poderia se referir a uma variável local como
function_name.variable_name
. Como este é um bloco anônimo, o rótulo desempenha o mesmo papel que function_name
seria, essencialmente. A documentação tem uma seção sobre resolução de nomes .