In questa versione:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... il USERNAME
della tabella la colonna viene confrontata con se stessa, quindi corrisponderà sempre. Non lo stai confrontando con la variabile locale. Se vuoi farlo, dovrai dare alla variabile un nome diverso alla colonna:
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;
Oppure, come suggerisce David Aldridge, usa un'etichetta per distinguere la variabile locale dalla colonna della tabella:
<<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;
...
Puoi usare quell'approccio anche con i blocchi con nome; se fosse all'interno di una funzione potresti fare riferimento a una variabile locale come function_name.variable_name
. Poiché si tratta di un blocco anonimo, l'etichetta svolge lo stesso ruolo di function_name
sarebbe, essenzialmente.
La documentazione contiene una sezione sulla risoluzione dei nomi .