我只想使用一条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'
)
答案 0 :(得分:1)
@RaymondNijland在评论中引用的dbms_xmlgen
方法的示例:
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子句,您可以轻松地将其扩展为一次查询多个表或架构中的所有表等。
答案 1 :(得分:0)
在这种情况下,如果正在使用的Oracle版本中提供了该功能,则可以使用WITH子句。下面是代码的样子。
注意:即使看起来像PL / SQL代码,这也是一条SELECT语句。 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。如果表存在,它将从表中返回计数。
希望这对您有用。