Использование запроса в условном выражении в PLSQL? - PullRequest
1 голос
/ 16 февраля 2012

Могу ли я сделать что-то подобное в PLSQL?

if (some_query) then
    dbms_output.put_line('Your query returned at least 1 row.');
else
    dbms_output.put_line('Your query returned no rows.');
end if;

Мой пример использования - я хочу проверить, существует ли уже значение в моей базе данных.Если значение уже существует, я сделаю что-то другое, чем если бы значение вообще не существовало.

Ответы [ 4 ]

4 голосов
/ 16 февраля 2012

Если вы проверяете наличие записи, вы можете выбрать COUNT (*) из исходной таблицы на основе ключа, поскольку он всегда будет возвращать значение, которое вы можете проверить:

SQL> set serverout on
SQL> DECLARE
  2      v_check NUMBER;
  3  BEGIN
  4      SELECT COUNT(*)
  5      INTO v_check
  6      FROM DUAL
  7      WHERE DUMMY = 'X'
  8      AND ROWNUM = 1;
  9
 10      if (v_check = 0) then
 11          dbms_output.put_line('Your query returned no rows.');
 12      else
 13          dbms_output.put_line('Your query returned at least 1 row.');
 14      end if;
 15  END;
 16  /
Your query returned at least 1 row.

PL/SQL procedure successfully completed.

SQL>
3 голосов
/ 16 февраля 2012

Вы должны будете сделать что-то вроде

BEGIN
  SELECT 1
    INTO l_foo
    FROM dual
   WHERE EXISTS (<<some query>>);

  dbms_output.put_line( 'Your query returned at least 1 row' );
EXCEPTION
  WHEN no_data_found
  THEN
    dbms_output.put_line( 'Your query returned 0 rows' );
END;

Если запрос не слишком дорогой, он будет почти таким же эффективным и, вероятно, будет немного проще в обслуживании, если вы сделаете что-то более простое

SELECT COUNT(*)
  INTO l_foo
  FROM (<<some query>>)
 WHERE rownum = 1;

IF( l_foo = 1 )
THEN
  dbms_output.put_line( 'Your query returned at least row.' );
ELSE
  dbms_output.put_line( 'Your query returned 0 rows.' );
END IF;
2 голосов
/ 16 февраля 2012

Точно так же, нет.Но есть несколько способов его подделать:

Если вам нужно сделать только одну вещь, сделайте это внутри неявного курсора, который подтверждает, существует ли ваше значение.

for i in ( some_query ) loop

   do_something;

end loop;

Вы также можете установитьзначение здесь и использовать его в if

for i in ( some_query ) loop

   result := True;

end loop;

if result then
   do_something;
else
   do_something_else;
end if;

Или вы можете использовать явный курсор и поймать ошибку no_data_found, которая будет вызвана

declare

  cursor c_blah is
   select my_value
     from my_table
    where id = my_id
          ;

  my_value varchar2(4000);

begin

  open c_blah(my_id);
  fetch c_blah into my_value;
  close c_blah;

  do_something;

  exception when no_data_found then
     do_something_else;

end;
1 голос
/ 16 февраля 2012

Поскольку ваш вариант использования ведет себя одинаково, независимо от того, возвращает ли запрос одну строку или тысячу, используйте EXISTS:

DECLARE
    l_dummy     VARCHAR2(1);
BEGIN
    SELECT NULL
    INTO   l_dummy
    FROM   DUAL
    WHERE  EXISTS (SELECT NULL
                   FROM   <some_query>);
    DBMS_OUTPUT.PUT_LINE('Your query returned at least one row.');
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('Your query returned no rows.');
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...