Oracle
 sql >> Base de données >  >> RDS >> Oracle

Vérifier si la ligne existe

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 .