I denna version:
SELECT COUNT(*)
INTO isFound
FROM MyTable
WHERE USERNAME = userName
AND ROWNUM = 1;
... tabellens USERNAME
kolumnen jämförs med sig själv, så den kommer alltid att matcha. Du jämför den inte med den lokala variabeln. Om du vill göra det måste du ge variabeln ett annat namn till kolumnen:
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;
Eller som David Aldridge föreslår, använd en etikett för att skilja den lokala variabeln från tabellkolumnen:
<<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;
...
Du kan använda den metoden med namngivna block också; om detta var inuti en funktion kan du referera till en lokal variabel som function_name.variable_name
. Eftersom detta är ett anonymt block spelar etiketten samma roll som function_name
skulle i huvudsak.
Dokumentationen har ett avsnitt om namnupplösning .