Как напечатать первые 5 строк всех таблиц в базе данных оракула (схема)? - PullRequest
0 голосов
/ 30 мая 2019

Я хочу открыть базу данных (схему), которая содержит около 100 таблиц, После его открытия я хотел бы напечатать верхние 5 строк всех таблиц вместе с именами их столбцов.

Моим первым шагом было попытаться получить схему и имена таблиц в базе данных. вот что я использовал для этого.

SELECT owner, table_name
  FROM all_tables

Ожидаемый результат будет содержать имя таблицы, имена столбцов и 5 верхних строк таблицы.

Я использую Oracle SQL Developer (база данных Oracle)

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Вы можете попробовать это, если вы используете Oracle 12c и выше.

SET SERVEROUTPUT ON
SET FEEDBACK OFF
DECLARE
     x SYS_REFCURSOR;
BEGIN
     FOR tabs IN ( SELECT rownum as rn,owner,table_name
                   FROM all_tables where owner='HR'
                   and ROWNUM < 10
                 ) LOOP


 OPEN x FOR 'SELECT '''|| tabs.owner||'.'|| tabs.table_name||''' 
     as "table" FROM DUAL';

 dbms_sql.return_result(x);

          OPEN x FOR 'select * from '
                     || tabs.owner
                     ||'.'
                     || tabs.table_name
                     || ' FETCH FIRST 5 ROWS ONLY ';

          dbms_sql.return_result(x);
     END LOOP;
END;
/

выход

table
----------
HR.REGIONS

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

table
------------
HR.LOCATIONS

LOCATION_ID STREET_ADDRESS                           POSTAL_CODE  CITY                           STATE_PROVINCE            CO
----------- ---------------------------------------- ------------ ------------------------------ ------------------------- --
       1000 1297 Via Cola di Rie                     00989        Roma                                                     IT
       1100 93091 Calle della Testa                  10934        Venice                                                   IT
       1200 2017 Shinjuku-ku                         1689         Tokyo                          Tokyo Prefecture          JP
       1300 9450 Kamiya-cho                          6823         Hiroshima                                                JP
       1400 2014 Jabberwocky Rd                      26192        Southlake                      Texas                     US

table
--------------
HR.DEPARTMENTS

DEPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           10 Administration                        200        1700
           20 Marketing                             201        1800
           30 Purchasing                            114        1700
           40 Human Resources                       203        2400
           50 Shipping                              121        1500
0 голосов
/ 30 мая 2019

Ниже приведен код, который вы ищете. Я использовал представление USER_TAB_COLUMNS, чтобы рассматривать только таблицы, принадлежащие вашей схеме, в которой вы выполняете код.

Не стесняйтесь форматировать вывод в соответствии с вашими потребностями.

SET SERVEROUT ON

DECLARE
    LV_QUERY    VARCHAR2(32767);
    LV_RESULT   VARCHAR2(32767);
BEGIN
    DBMS_OUTPUT.PUT_LINE('---------------------------------------');
    DBMS_OUTPUT.PUT_LINE('---------------------------------------');
    FOR I IN (
        SELECT
            C.TABLE_NAME,
            LISTAGG(C.COLUMN_NAME, ' || ''****'' || ') WITHIN GROUP(
                ORDER BY
                    C.COLUMN_ID
            ) COLS
        FROM
            USER_TAB_COLUMNS C
        GROUP BY
            C.TABLE_NAME
        ORDER BY
            1
    ) LOOP
        LV_QUERY := 'SELECT '
                    || q'#RTRIM(XMLAGG(XMLELEMENT(E,VALS,CHR(10)).EXTRACT('//text()') ORDER BY 1).GetClobVal(),CHR(10)) FROM#'
                    || '(SELECT '
                    || I.COLS
                    || ' AS VALS FROM '
                    || I.TABLE_NAME
                    || ' FETCH FIRST 5 ROWS ONLY)';

        BEGIN
--    DBMS_OUTPUT.PUT_LINE(lv_query);
            EXECUTE IMMEDIATE LV_QUERY
            INTO LV_RESULT;
            DBMS_OUTPUT.PUT_LINE(CHR(10));
            DBMS_OUTPUT.PUT_LINE('TABLE NAME : ' || I.TABLE_NAME);
            DBMS_OUTPUT.PUT_LINE('COLUMN NAMES : '
                                 || REPLACE(REPLACE(REPLACE(I.COLS, '*', ''), '||', ''), '''', '**'));

            DBMS_OUTPUT.PUT_LINE(LV_RESULT);
        EXCEPTION
            WHEN NO_DATA_FOUND THEN
                DBMS_OUTPUT.PUT_LINE('NO DATA IN TABLE : ' || I.TABLE_NAME);
        END;

        DBMS_OUTPUT.PUT_LINE(CHR(10));
        DBMS_OUTPUT.PUT_LINE('---------------------------------------');
        DBMS_OUTPUT.PUT_LINE('---------------------------------------');
    END LOOP;

END;

Надеюсь, это то, что вы ищете.

0 голосов
/ 30 мая 2019

Обычно мы используем динамический SQL для такого рода вещей. Но работать с выводом 100 разных таблиц в PL / SQL грязно. Итак, вам нужно сгенерировать скрипт.

Шаг 1: Запустите это в SQL Developer.

select 'prompt ' || owner ||'.' || table_name ||chr(10)
       ||'select * from ' || owner ||'.' || table_name
       || ' where rownum <=5;'
from all_tables
order by  owner, table_name;

Шаг 2: Вырезать и вставить результат в рабочую таблицу SQL. Если вам не повезло больше, чем мне, вам нужно будет редактировать надоедливые двойные кавычки в начале и конце каждой строки (я думаю, что это особенность SQL Developer, вызванная разрывом строки).

Шаг 3: Запустите (отредактированный) вывод в виде скрипта, и панель «Вывод скрипта» даст вам нужные результаты.


Можно ли мне указать имя схемы (базы данных)

Добавить where owner = '&schema_name' после from all_tables. Или просто используйте USER_TABLES, если вас интересует схема, к которой вы подключены.

...