In deze versie:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... de USERNAME
. van de tafel kolom wordt vergeleken met zichzelf, dus het zal altijd overeenkomen. Je vergelijkt het niet met de lokale variabele. Als je dat wilt doen, moet je de variabele een andere naam geven aan de kolom:
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;
Of zoals David Aldridge suggereert, gebruik een label om de lokale variabele te onderscheiden van de tabelkolom:
<<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;
...
Je kunt die aanpak ook gebruiken met benoemde blokken; als dit in een functie was, zou je naar een lokale variabele kunnen verwijzen als function_name.variable_name
. Aangezien dit een anoniem blok is, speelt het label dezelfde rol als function_name
zou, in wezen.
De documentatie heeft een sectie over naamresolutie .