Dans cette version :
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... le USERNAME
de la table colonne est comparée à elle-même, elle correspondra donc toujours. Vous ne le comparez pas avec la variable locale. Si vous voulez faire cela, vous devrez donner à la variable un nom différent à la colonne :
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, comme le suggère David Aldridge, utilisez une étiquette pour distinguer la variable locale de la colonne du tableau :
<<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;
...
Vous pouvez également utiliser cette approche avec des blocs nommés; si c'était à l'intérieur d'une fonction, vous pouvez faire référence à une variable locale comme function_name.variable_name
. Puisqu'il s'agit d'un bloc anonyme, l'étiquette joue le même rôle que function_name
serait, essentiellement.
La documentation contient une section sur la résolution de noms .