Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Überprüfen Sie, ob eine Zeile vorhanden ist

In dieser Version:

  SELECT COUNT(*)
    INTO isFound
    FROM MyTable
   WHERE USERNAME = userName
     AND ROWNUM = 1;

... den USERNAME der Tabelle -Spalte wird mit sich selbst verglichen, sodass sie immer übereinstimmt. Sie vergleichen es nicht mit der lokalen Variablen. Wenn Sie das tun möchten, müssen Sie der Variable einen anderen Namen für die Spalte geben:

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;

Oder verwenden Sie, wie David Aldridge vorschlägt, ein Label, um die lokale Variable von der Tabellenspalte zu unterscheiden:

<<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;
...

Sie können diesen Ansatz auch mit benannten Blöcken verwenden; Wenn sich dies innerhalb einer Funktion befände, könnten Sie auf eine lokale Variable als function_name.variable_name verweisen . Da es sich um einen anonymen Block handelt, spielt das Label die gleiche Rolle wie function_name würde, im Wesentlichen.

Die Dokumentation enthält einen Abschnitt zur Namensauflösung .