как найти пустые таблицы из списка таблиц в PL / SQL? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть список таблиц, таких как table1, table2, .... table35.Мне нужно найти пустые.Есть ли более быстрый способ сделать это?Я погуглил некоторые, но все решения для поиска пустых таблиц в схеме.На этот раз у меня есть список имен таблиц и я хочу найти пустые таблицы.Есть предложения?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Получить все таблицы из DBA_OBJECTS и выполнить цикл:

DECLARE
    v_cnt          NUMBER;
    v_schemaname   VARCHAR(20) := 'myschema';
BEGIN
    FOR i IN (SELECT DISTINCT OWNER, OBJECT_NAME
                FROM DBA_OBJECTS
               WHERE OBJECT_TYPE = 'TABLE' AND OWNER = v_schemaname)
    LOOP
        BEGIN
            EXECUTE IMMEDIATE
                'select count(*) FROM ' || i.owner || '.' || i.object_name || ' WHERE rownum = 1'
                INTO v_cnt;

            IF v_cnt = 0
            THEN
                DBMS_OUTPUT.put_line (
                    i.owner || '.' || i.object_name || ' IS EMPTY');
            END IF;
        EXCEPTION
            WHEN OTHERS
            THEN
                DBMS_OUTPUT.put_line (
                    i.owner || '.' || i.object_name || ' ERROR: ' || SQLCODE);
        END;
    END LOOP;
END;
0 голосов
/ 08 июня 2018

Самый быстрый способ, который я знаю, - это собрать свежую статистику для всех ваших таблиц:

BEGIN dbms_stats.gather_schema_stats(user); END;
/

, а затем найти пустые таблицы в словаре данных:

SELECT table_name 
  FROM user_tables 
 WHERE table_name LIKE 'TABLE%' 
   AND num_rows=0;
0 голосов
/ 08 июня 2018

Один из вариантов заключается в циклическом просмотре всех таблиц вместе с динамическим SQL.Примерно так:

SQL> DECLARE
  2     l_list   VARCHAR2 (50) := 'emp,dept';
  3     l_cnt    NUMBER;
  4  BEGIN
  5     FOR cur_t IN (WITH tabs AS (SELECT l_list FROM DUAL)
  6                       SELECT REGEXP_SUBSTR (l_list,
  7                                             '[^,]+',
  8                                             1,
  9                                             LEVEL)
 10                                 table_name
 11                         FROM tabs
 12                   CONNECT BY LEVEL <= REGEXP_COUNT (l_list, ',') + 1)
 13     LOOP
 14        EXECUTE IMMEDIATE 'select count(*) from ' || cur_t.table_name || ' where rownum = 1'
 15           INTO l_cnt;
 16
 17        DBMS_OUTPUT.put_line (
 18           cur_t.table_name || ' contains ' || l_cnt || ' row(s)');
 19     END LOOP;
 20  END;
 21  /
emp contains 14 row(s)
dept contains 4 row(s)

PL/SQL procedure successfully completed.

SQL>

Вы бы включили условие, которое отображает таблицы, чьи L_CNT = 0.

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