我想打开一个包含约100个表的数据库(模式), 打开后,我想打印所有表的前5行以及它们的列名。
我的第一步是尝试获取数据库中的架构和表名称。 所以这就是我所用的。
SELECT owner, table_name
FROM all_tables
预期结果将包含表名称,列名称和表的前5行。
我正在使用Oracle SQL Developer(Oracle数据库)
答案 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;
希望这就是您想要的。