Oracle
 sql >> Database >  >> RDS >> Oracle

Controlla se la riga esiste

In questa versione:

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

... il USERNAME della tabella la colonna viene confrontata con se stessa, quindi corrisponderà sempre. Non lo stai confrontando con la variabile locale. Se vuoi farlo, dovrai dare alla variabile un nome diverso alla colonna:

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;

Oppure, come suggerisce David Aldridge, usa un'etichetta per distinguere la variabile locale dalla colonna della tabella:

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

Puoi usare quell'approccio anche con i blocchi con nome; se fosse all'interno di una funzione potresti fare riferimento a una variabile locale come function_name.variable_name . Poiché si tratta di un blocco anonimo, l'etichetta svolge lo stesso ruolo di function_name sarebbe, essenzialmente.

La documentazione contiene una sezione sulla risoluzione dei nomi .