sql >> Base de Datos >  >> RDS >> Oracle

Comprobar si existe fila

En esta versión:

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

... el USERNAME de la tabla la columna se compara consigo misma, por lo que siempre coincidirá. No lo estás comparando con la variable local. Si desea hacer eso, deberá dar a la variable un nombre diferente a la columna:

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;

O como sugiere David Aldridge, use una etiqueta para distinguir la variable local de la columna de la tabla:

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

También puede usar ese enfoque con bloques con nombre; si esto estuviera dentro de una función, podría referirse a una variable local como function_name.variable_name . Dado que se trata de un bloque anónimo, la etiqueta desempeña el mismo papel que function_name lo haría, esencialmente.

La documentación tiene una sección sobre resolución de nombres .