質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

2回答

1142閲覧

Oracleのログインユーザから閲覧可能なテーブルの一覧と、その全テーブルのカラムを出力するbatについて

King_of_Flies

総合スコア382

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/07/28 02:08

編集2020/07/28 02:48

お久しぶりです。
皆様のお力をお借りしたいです。

【やりたいこと】
ローカルのbat実行で、
対象環境のOracleDBから
テーブル,ビューの一覧と、そのテーブルごとの全カラムを出力する

【実施想定】
ローカルにはconf.batと、getTblName.bat、getViewName.bat、getColName.bat,DBMaintTool.batを用意

conf.batにはoracle接続に必要な環境情報を保持
getTblName.batにはテーブルの一覧を出力するsqlを発行しそれをList1に保存
getViewName.batにはビューの一覧を出力するsqlを発行しそれをList2に保存
getColName.batには、List1,List2をそれぞれループさせ、各テーブルの物理名からカラム一覧を出力

DBMaintTool.batはこれらすべてのbatの呼び出しを行う
また、これらに伴うlogが出力可能であれば、本batにてlogを出力したい。

以下途中経過となりますが、不明点があります。
①batからsqlをsqlplusに投げ、結果をリスト格納する方法
②batからリスト内の文字列を順次取り出し、別のsql分の中に格納し結果取得する方法
③最終的な【やりたいこと】で記載した出力結果をexcelなどに出力する方法

分からないことだらけで恐縮ですが、ご回答お願いいたします。

以下、現状で想定しているbatとsqlのコードとなります。

bat

1rem conf.bat 2rem 共通環境情報/Oracle接続情報 3set DB_USER=*** 4set DB_PASS=*** 5set DB_HOST=*** 6set DB_PORT=*** 7set DB_NAME=***

bat

1rem getTblName.bat 2

bat

1rem getViewName.bat

bat

1rem getColName.bat

bat

1rem DBMaintTool.bat 2@ echo off 3setlocal enabledelayedexpansion 4 5rem ------------------------- 6rem 内部変数定義 7rem ------------------------- 8set errcode=0 9 10rem ------------------------- 11rem バッチ処理開始ログコンソール出力 12rem ------------------------- 13echo バッチ開始:%date% %time:~0,8% 14 15rem 環境情報セット 16call conf.bat 17 18rem SQLplus開始 19sqlplus %DB_USER%/%DB_PASS%@%DB_HOST%:%DB_PORT%/%DB_NAME% 20 21rem ------------------------- 22rem 実行結果取得 23rem ------------------------- 24set errcode=%errorlevel% 25 26rem ------------------------- 27rem バッチ処理終了ログコンソール出力 28rem ------------------------- 29if %errcode% == 0 ( 30 echo %msgtext%正常終了:%date% %time:~0,8% 31 exit %errcode% 32) else ( 33 echo %msgtext%異常終了:%date% %time:~0,8% 34 exit %errcode% 35) 36 37rem 最終的な結果(テーブル名一覧、ビュー一覧、それぞれのテーブル、ビューのカラム一覧を出力) 38--実施方法不明 39

sql

1-- テーブル一覧取得クエリ(getTblName.batから呼び出し想定) 2SET ECHO OFF 3SET FEEDBACK OFF 4SET PAGESIZE 50000 5SET TERMOUT OFF 6SET TRIMSPOOL ON 7SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED 8SPOOL list_table_name.log 9SELECT TABLE_NAME 10FROM USER_TABLES 11WHERE DROPPED = 'NO' -- Oracle10g以降はWindowsでいうゴミ箱機能が追加されたので条件の追加が必要 12ORDER BY TABLE_NAME; 13SPOOL OFF

sql

1-- ビュー一覧取得クエリ(getViewName.batから呼び出し想定) 2SET ECHO OFF 3SET FEEDBACK OFF 4SET PAGESIZE 50000 5SET TERMOUT OFF 6SET TRIMSPOOL ON 7SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED 8SPOOL list_table_name.log 9SELECT VIEW_NAME 10FROM USER_VIEWS 11WHERE DROPPED = 'NO' -- Oracle10g以降はWindowsでいうゴミ箱機能が追加されたので条件の追加が必要 12ORDER BY VIEW_NAME; 13SPOOL OFF 14

sql

1-- テーブルのカラム一覧取得クエリ 2SELECT 3 ,COLUMN_NAME 4FROM 5 ALL_TAB_COLUMNS 6WHERE 7 TABLE_NAME = 'LIST1' --どう実施するか不明 8ORDER BY 9 COLUMN_ID 10;

sql

1-- ビューのカラム一覧取得クエリ 2SELECT 3 ,COLUMN_NAME 4FROM 5 ALL_TAB_COLUMNS 6WHERE 7 VIEW_NAME = 'LIST2' --どう実施するか不明 8ORDER BY 9 COLUMN_ID 10;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/07/28 02:16

DBツールを利用して定義を出力する、というのは無しですか?
King_of_Flies

2020/07/28 02:20

何分テーブル総数が多いため、UIでやると厳しいと感じておりますが、 SQLDeveloperにて一括出力は可能なのでしょうか?
King_of_Flies

2020/07/28 02:29

新しいツールを入れるのは少し厳しいと考えています。 現状利用可能なものはsqldeveloperですね・・・
King_of_Flies

2020/07/28 02:34

やりたいことは上記が当てはまると思っています。 ただしバグなどが許されないという観点から oracleの正規ツールを利用しての出力を求められております・・・。
sazi

2020/07/28 03:13 編集

ところでoracleのバージョンは? 12c以降なら、MARKUP CSV ONが使えるのは知っていますか?
King_of_Flies

2020/07/28 04:13

バージョンは17.4.0.355です。 MARKUP CSV ON>これはわからないです。単一テーブルをcsv出力する方法はわかります。
guest

回答2

0

取り敢えずディクショナリのデータをCSVで抽出してフィルターするなりでも良いんじゃないですか。
ディクショナリの内容はリファレンスもあるわけですし。
ユーザーズ・ガイド C データ辞書
データディクショナリ編

オプション使わないと、SELECT結果をCSV形式にするのは大変です。
Oracle 12cR2 新機能 「CSVレポートの作成」を試す
[Oracle]sqlplusの出力をCSV形式で出すための簡単な方法

投稿2020/07/28 04:27

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sqlplusで実行する部分だけ

SQL

1SET ECHO OFF 2SET FEEDBACK OFF 3SET PAGESIZE 50000 4SET TERMOUT OFF 5SET TRIMSPOOL ON 6SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED 7SPOOL list_table_name.log 8SELECT TABLE_NAME 9FROM USER_TABLES 10WHERE DROPPED = 'NO' -- Oracle10g以降はWindowsでいうゴミ箱機能が追加されたので条件の追加が必要 11ORDER BY TABLE_NAME; 12SPOOL OFF

ALL_TAB_COLUMNS ログインユーザーから見えるすべてのユーザーが対象になるから、 USER_TAB_COLUMNS が対象になるし、上記の USER_TABLES.DROPPED = 'NO' の条件も必要。

SELECTの次に , があるとエラーになります。

Oracleのバージョンくらいは明示しましょう。

追記

DDLスキーマのCREATE TABLEなどを取得 を抜粋すれば使える案件では?

投稿2020/07/28 02:42

編集2020/07/28 10:15
Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問