Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Verifique se a linha existe


Nesta versão:
  SELECT COUNT(*)
    INTO isFound
    FROM MyTable
   WHERE USERNAME = userName
     AND ROWNUM = 1;

... o USERNAME da tabela coluna está sendo comparada com ela mesma, então sempre corresponderá. Você não está comparando com a variável local. Se você quiser fazer isso, precisará dar à variável um nome diferente para a coluna:
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, como sugere David Aldridge, use um rótulo para distinguir a variável local da coluna da tabela:
<<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;
...

Você também pode usar essa abordagem com blocos nomeados; se isso estivesse dentro de uma função, você poderia se referir a uma variável local como function_name.variable_name . Como este é um bloco anônimo, o rótulo desempenha o mesmo papel que function_name seria, essencialmente.

A documentação tem uma seção sobre resolução de nomes .