如何在oracle数据库(模式)中打印所有表的前5行?

时间:2019-05-30 12:32:56

标签: sql oracle data-dictionary

我想打开一个包含约100个表的数据库(模式), 打开后,我想打印所有表的前5行以及它们的列名。

我的第一步是尝试获取数据库中的架构和表名称。 所以这就是我所用的。

SELECT owner, table_name
  FROM all_tables

预期结果将包含表名称,列名称和表的前5行。

我正在使用Oracle SQL Developer(Oracle数据库)

3 个答案:

答案 0 :(得分:1)

如果运行的是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

答案 1 :(得分:0)

通常,对于这种情况,我们将使用动态SQL。但是在PL / SQL中处理100个不同表的输出是混乱的。因此,您需要生成一个脚本。

步骤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。

答案 2 :(得分:0)

以下是您正在寻找的代码。我使用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;

希望这就是您想要的。