Oracle: если TABLE_A существует, вернуть count (*), иначе вернуть 0; - PullRequest
0 голосов
/ 26 августа 2018

Я хочу использовать только один оператор SQL, я попробовал следующий, но не смог:

SELECT decode(TABLE_COUNT, 0, 0, SELECT COUNT(*) FROM TABLE_A) FROM
(
  SELECT COUNT(*) AS TABLE_COUNT FROM USER_TABLES WHERE TABLE_NAME = 'TABLE_A'
)

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Пример подхода dbms_xmlgen, на который @RaymondNijland ссылается в комментарии:

create table table_a (id) as select level from dual connect by level <= 10;

select nvl(max(to_number(
  xmlquery('/ROWSET/ROW/C/text()'
    passing xmltype(dbms_xmlgen.getxml('select count(*) as c from ' || table_name))
    returning content)
  )), 0) as count
from user_tables
where table_name = 'TABLE_A';

     COUNT
----------
        10

drop table table_a purge;

select nvl(max(to_number(
  xmlquery('/ROWSET/ROW/C/text()'
    passing xmltype(dbms_xmlgen.getxml('select count(*) as c from ' || table_name))
    returning content)
  )), 0) as count
from user_tables
where table_name = 'TABLE_A';

     COUNT
----------
         0

Это можно легко расширить для одновременного запроса нескольких таблиц или всех таблиц в схеме и т. Д., Изменив фильтр и добавив предложение group-by.

0 голосов
/ 26 августа 2018

Предложение WITH может использоваться в этом случае, если эта функция доступна в используемой вами версии Oracle.Ниже показано, как будет выглядеть код.

ПРИМЕЧАНИЕ. Это оператор SELECT, даже если он выглядит как код PL / SQL.Предложение WITH поддерживает использование объявления PL / SQL внутри него.

WITH
FUNCTION getCount(p_table_name IN VARCHAR2)
RETURN NUMBER IS
v_count NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||p_table_name INTO v_count;
  RETURN mycount;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END;
SELECT getCount('hr.employee') FROM DUAL;

WHEN OTHERS перехватывает ошибку, когда таблица не существует, и возвращает 0. Если таблица существует, она возвращает счет изтаблица.

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...