0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データベースの各種情報を取得したい!!

Last updated at Posted at 2019-03-19

TODO

  • 解決したコード情報を記載!! ※解説含めた補足情報も(差分書く!?)

スキーマの全テーブル/カラム情報を取得したい!!

getALL_TAB_COLUMNS.sql
SET PAGESIZE 2000;
SET LINESIZE 200;
SET LONGCHUNKSIZE 200;
SET LONG 10000;

SELECT
    TABLE_NAME ||','|| COLUMN_NAME ||','|| DATA_TYPE ||','|| DATA_LENGTH ||','|| DATA_PRECISION ||','|| DATA_SCALE
  FROM ALL_TAB_COLUMNS TC
  WHERE OWNER='SYSTEM'
  ORDER BY TABLE_NAME,COLUMN_ID;

【参考サイト情報】
 ◆[ Oracle ] テーブル定義情報の取得 ( ALL_TAB_COLUMNS )
  https://hensa40.cutegirl.jp/archives/1195
 ◆【Oracle】テーブルのカラム情報をSQLで取得する方法
  https://qiita.com/riekure/items/b54c8a21d77e5fe1776d
 ◆【Oracle】テーブル定義情報を確認する方法(テーブル名やカラム名、データ型で検索)
  https://notepad-blog.com/content/90/

スキーマの全テーブルのレコード数を取得したい!!

tryTableCount.sql
-- 案1
select table_name,
to_number(extractvalue(xmltype(dbms_xmlgen.getxml(
  'select count(*) X from '||table_name)),'/ROWSET/ROW/X')) count
from all_tables
where owner = 'schema_name' 

-- 案2
select owner, table_name,
  to_number(
    extractvalue(
      xmltype(dbms_xmlgen.getxml(
        'select count(*) c from ' || owner || '.' || table_name))
      ,'/ROWSET/ROW/C')) "count"
from all_tables
where owner in ('hoge','fufu')
order by owner, table_name; 

-- 案3
select table_name,
  to_number(extractvalue(xmltype(dbms_xmlgen.getxml(
    'select count(*) c from '||owner||'.'||table_name
      )),'/ROWSET/ROW/C')) as count
from all_tables
where owner = 'EDW'

これだとテーブルがありませんでエラーとなってしまうので...(失敗の原因はわかったので、後で追記)

tableCountNG.sql
SELECT
  table_name,
  TO_NUMBER(
    extractvalue(
      xmltype(
        dbms_xmlgen.getxml('SELECT COUNT(*) c FROM '||table_name))
      ,'/ROWSET/ROW/C')) count
FROM user_tables;

以下のPL/SQLを試してみる...

tableCount1.sql
puts 'The best way to log and share programmers knowledge.'
DECLARE
  CURSOR c1 IS SELECT table_name, CONSTRAINT_name FROM user_constraints WHERE index_name IS NOT NULL;
BEGIN
  FOR r1 IN c1 LOOP
    SELECT r1.table_name AS table_name ,COUNT(*) AS count FROM r1.table_name;
  END LOOP;
END;
/
tableCount2.sql
set echo off
set heading off
set pagesize 0
set linesize 10000
set trimout on
set trimspool on
set feedback off

set serveroutput on size 1000000

col spool_file_name new_value spool_file_name for a100
select lower(username)||'_table_count_'|| to_char(sysdate,'YYYYMMDDHH24MISS') || '.csv' spool_file_name from user_users;

spool &spool_file_name
declare
        cursor cu is select segment_name from user_segments where segment_type = 'TABLE';
        sql_stmt varchar2(200);
        cnt number(20);
begin
        for rec in cu loop
                sql_stmt := 'select count(ROWID) from '||rec.segment_name;
                execute immediate sql_stmt into cnt;
                dbms_output.put_line(rec.segment_name||','||cnt);
        end loop;
end;
/
spool off

exit
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?