sql >> Database >  >> RDS >> Oracle

Controleer of rij bestaat

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 .



  1. Hoe voorkom je dat een gebruiker andere databases en de tabellen uit andere databases kan zien?

  2. mysql nieuwe gebruiker toegang geweigerd

  3. codeigniter - database:hoe meerdere tabellen bij te werken met een enkele update-query

  4. Update als de naam bestaat, anders invoegen - in SQL Server