En esta versión:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... el USERNAME
de la tabla la columna se compara consigo misma, por lo que siempre coincidirá. No lo estás comparando con la variable local. Si desea hacer eso, deberá dar a la variable un nombre diferente a la columna:
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;
O como sugiere David Aldridge, use una etiqueta para distinguir la variable local de la columna de la tabla:
<<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;
...
También puede usar ese enfoque con bloques con nombre; si esto estuviera dentro de una función, podría referirse a una variable local como function_name.variable_name
. Dado que se trata de un bloque anónimo, la etiqueta desempeña el mismo papel que function_name
lo haría, esencialmente.
La documentación tiene una sección sobre resolución de nombres .