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

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

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

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

2回答

2226閲覧

Oracle のある項目が存在するテーブルの内容を取得したい。

hrsi_teratail

総合スコア93

Oracle Database 10g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

0クリップ

投稿2017/11/15 04:43

Oracle 10g R2 を使用しています。

Oracle のある項目が存在するテーブルの内容を取得したい
と思っております。

SQL

1SELECT 2 COL.TABLE_NAME 3 ,COL.COLUMN_NAME 4 ,COM.COMMENTS 5FROM 6 USER_TAB_COLUMNS COL 7 LEFT JOIN 8 USER_TAB_COMMENTS COM ON 9 COL.TABLE_NAME = COM.TABLE_NAME 10 AND COL.COLUMN_NAME = COL.COLUMN_NAME 11WHERE 1=1 12AND COL.COLUMN_NAME = 'KOUSHINKAISU' 13AND COL.TABLE_NAME LIKE 'M_%' 14ORDER BY 1,2 15;

KOUSHINKAISUが999 以上の対象テーブル名を取得したいのですが、
どのようなSQL記述方法がありますでしょうか?

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

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

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

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

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

guest

回答2

0

複雑に考えすぎかもしれませんが、下記としてみました。

text

1DECLARE 2 v_rows INT; 3 v_cur_hdl1 INT; 4 v_cur_hdl2 INT; 5 v_stmt1 VARCHAR2(4000); 6 v_stmt2 VARCHAR2(4000); 7 8 v_tabname VARCHAR2(200); 9 v_colname VARCHAR2(200); 10 v_comment VARCHAR2(200); 11 v_value NUMBER; 12BEGIN 13 v_stmt1 := ' 14SELECT 15 COL.TABLE_NAME, 16 COL.COLUMN_NAME, 17 COM.COMMENTS 18FROM 19 USER_TAB_COLUMNS COL 20LEFT JOIN 21 USER_TAB_COMMENTS COM 22 ON COL.TABLE_NAME = COM.TABLE_NAME 23 AND COL.COLUMN_NAME = COL.COLUMN_NAME 24WHERE 25 COL.COLUMN_NAME = :colname 26 AND COL.TABLE_NAME LIKE :tabname 27ORDER BY 1,2 28'; 29 30 v_cur_hdl1 := DBMS_SQL.OPEN_CURSOR; 31 DBMS_SQL.PARSE(v_cur_hdl1, v_stmt1, DBMS_SQL.NATIVE); 32 DBMS_SQL.BIND_VARIABLE(v_cur_hdl1, 'colname', 'KOUSHINKAISU'); 33 DBMS_SQL.BIND_VARIABLE(v_cur_hdl1, 'tabname', 'M_%'); 34 DBMS_SQL.DEFINE_COLUMN(v_cur_hdl1, 1, v_tabname, 200); 35 DBMS_SQL.DEFINE_COLUMN(v_cur_hdl1, 2, v_colname, 200); 36 DBMS_SQL.DEFINE_COLUMN(v_cur_hdl1, 3, v_comment, 200); 37 38 v_rows := DBMS_SQL.EXECUTE (v_cur_hdl1); 39 LOOP 40 IF DBMS_SQL.FETCH_ROWS(v_cur_hdl1) > 0 THEN 41 DBMS_SQL.COLUMN_VALUE(v_cur_hdl1, 1, v_tabname); 42 DBMS_SQL.COLUMN_VALUE(v_cur_hdl1, 2, v_colname); 43 DBMS_SQL.COLUMN_VALUE(v_cur_hdl1, 3, v_comment); 44 45 v_stmt2 := 'SELECT ' || v_colname || ' FROM ' || v_tabname || ' WHERE 999 <= ' || v_colname; 46 v_cur_hdl2 := DBMS_SQL.OPEN_CURSOR; 47 DBMS_SQL.PARSE(v_cur_hdl2, v_stmt2, DBMS_SQL.NATIVE); 48 DBMS_SQL.DEFINE_COLUMN(v_cur_hdl2, 1, v_value); 49 50 v_rows := DBMS_SQL.EXECUTE(v_cur_hdl2); 51 LOOP 52 IF DBMS_SQL.FETCH_ROWS(v_cur_hdl2) > 0 THEN 53 DBMS_SQL.COLUMN_VALUE(v_cur_hdl2, 1, v_value); 54 DBMS_OUTPUT.PUT_LINE(v_tabname); 55 EXIT; 56 ELSE 57 EXIT; 58 END IF; 59 END LOOP; 60 DBMS_SQL.CLOSE_CURSOR(v_cur_hdl2); 61 ELSE 62 EXIT; 63 END IF; 64 END LOOP; 65 DBMS_SQL.CLOSE_CURSOR(v_cur_hdl1); 66END;

投稿2017/11/15 08:08

編集2017/11/15 08:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hrsi_teratail

2017/11/20 04:32

ありがとうございます。無事に取得できました!
guest

0

Oracle8i から動的SQLにEXECUTE IMMEDIATEが使えます。

PL/SQL

1SET LINESIZE 200 2SET PAGESIZE 0 3SET TRIMSPOOL ON 4DEFINE C1 = 'KOUSHINKAISU' ; 5SET SERVEROUTPUT ON 6DECLARE 7 CURSOR CUR_TA 8 IS 9 SELECT 10 COL.TABLE_NAME 11 , 'SELECT COUNT(*) AS COUNTS FROM ' || COL.TABLE_NAME || ' WHERE &&C1 >= 999' AS SQL_STRING 12 FROM 13 USER_TABLES TA 14 INNER JOIN 15 USER_TAB_COLUMNS COL 16 ON TA.TABLE_NAME = COL.TABLE_NAME 17 WHERE 18 TA.DROPPED = 'NO' 19 AND COL.COLUMN_NAME = '&&C1' 20 ORDER BY TA.TABLE_NAME ; 21 L_COUNTS NUMBER ; 22BEGIN 23 FOR REC_TA IN CUR_TA LOOP 24 EXECUTE IMMEDIATE REC_TA.SQL_STRING INTO L_COUNTS ; 25 IF L_COUNTS > 0 THEN 26 DBMS_OUTPUT.PUT_LINE(REC_TA.TABLE_NAME || ' ' || TO_CHAR(L_COUNTS)) ; 27 END IF ; 28 END LOOP ; 29END ; 30/ 31

投稿2017/11/16 03:51

編集2017/11/16 09:09
Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問