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

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

ただいまの
回答率

90.51%

  • Oracle Database 10g

    31questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 316

hrsi_teratail

score 68

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

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

SELECT
    COL.TABLE_NAME
   ,COL.COLUMN_NAME
   ,COM.COMMENTS
FROM
    USER_TAB_COLUMNS COL
        LEFT JOIN 
            USER_TAB_COMMENTS COM ON 
                    COL.TABLE_NAME = COM.TABLE_NAME
                AND COL.COLUMN_NAME = COL.COLUMN_NAME 
WHERE  1=1
AND COL.COLUMN_NAME = 'KOUSHINKAISU'
AND COL.TABLE_NAME LIKE 'M_%'
ORDER BY 1,2
;


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

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

DECLARE
   v_rows INT;
   v_cur_hdl1 INT;
   v_cur_hdl2 INT;
   v_stmt1 VARCHAR2(4000);
   v_stmt2 VARCHAR2(4000);

   v_tabname VARCHAR2(200);
   v_colname VARCHAR2(200);
   v_comment VARCHAR2(200);
   v_value   NUMBER;
BEGIN
   v_stmt1 := '
SELECT
   COL.TABLE_NAME,
   COL.COLUMN_NAME,
   COM.COMMENTS
FROM
   USER_TAB_COLUMNS COL
LEFT JOIN
   USER_TAB_COMMENTS COM
   ON COL.TABLE_NAME = COM.TABLE_NAME
   AND COL.COLUMN_NAME = COL.COLUMN_NAME
WHERE
   COL.COLUMN_NAME = :colname
   AND COL.TABLE_NAME LIKE :tabname
ORDER BY 1,2
';

   v_cur_hdl1 := DBMS_SQL.OPEN_CURSOR;
   DBMS_SQL.PARSE(v_cur_hdl1, v_stmt1, DBMS_SQL.NATIVE);
   DBMS_SQL.BIND_VARIABLE(v_cur_hdl1, 'colname', 'KOUSHINKAISU');
   DBMS_SQL.BIND_VARIABLE(v_cur_hdl1, 'tabname', 'M_%'); 
   DBMS_SQL.DEFINE_COLUMN(v_cur_hdl1, 1, v_tabname, 200);
   DBMS_SQL.DEFINE_COLUMN(v_cur_hdl1, 2, v_colname, 200); 
   DBMS_SQL.DEFINE_COLUMN(v_cur_hdl1, 3, v_comment, 200); 

   v_rows := DBMS_SQL.EXECUTE (v_cur_hdl1); 
   LOOP
      IF DBMS_SQL.FETCH_ROWS(v_cur_hdl1) > 0 THEN
         DBMS_SQL.COLUMN_VALUE(v_cur_hdl1, 1, v_tabname); 
         DBMS_SQL.COLUMN_VALUE(v_cur_hdl1, 2, v_colname); 
         DBMS_SQL.COLUMN_VALUE(v_cur_hdl1, 3, v_comment); 

         v_stmt2 := 'SELECT ' || v_colname || ' FROM ' || v_tabname || ' WHERE 999 <= ' || v_colname;
         v_cur_hdl2 := DBMS_SQL.OPEN_CURSOR;
         DBMS_SQL.PARSE(v_cur_hdl2, v_stmt2, DBMS_SQL.NATIVE);
         DBMS_SQL.DEFINE_COLUMN(v_cur_hdl2, 1, v_value);

         v_rows := DBMS_SQL.EXECUTE(v_cur_hdl2);
         LOOP
            IF DBMS_SQL.FETCH_ROWS(v_cur_hdl2) > 0 THEN
               DBMS_SQL.COLUMN_VALUE(v_cur_hdl2, 1, v_value);
               DBMS_OUTPUT.PUT_LINE(v_tabname);
               EXIT;
            ELSE
               EXIT;
            END IF;
         END LOOP;
         DBMS_SQL.CLOSE_CURSOR(v_cur_hdl2);
      ELSE
         EXIT;
      END IF;
   END LOOP;
   DBMS_SQL.CLOSE_CURSOR(v_cur_hdl1);
END;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/20 13:32

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

    キャンセル

0

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

SET LINESIZE 200
SET PAGESIZE 0
SET TRIMSPOOL ON
DEFINE C1 = 'KOUSHINKAISU' ;
SET SERVEROUTPUT ON
DECLARE
    CURSOR CUR_TA
    IS
        SELECT
            COL.TABLE_NAME
          , 'SELECT COUNT(*) AS COUNTS FROM ' || COL.TABLE_NAME || ' WHERE &&C1 >= 999' AS SQL_STRING
        FROM
            USER_TABLES TA
        INNER JOIN
            USER_TAB_COLUMNS COL
        ON  TA.TABLE_NAME = COL.TABLE_NAME
        WHERE
            TA.DROPPED = 'NO'
        AND COL.COLUMN_NAME = '&&C1'
        ORDER BY TA.TABLE_NAME ;
    L_COUNTS NUMBER ;
BEGIN
    FOR REC_TA IN CUR_TA LOOP
        EXECUTE IMMEDIATE REC_TA.SQL_STRING INTO L_COUNTS ;
        IF L_COUNTS > 0 THEN
            DBMS_OUTPUT.PUT_LINE(REC_TA.TABLE_NAME || ' ' || TO_CHAR(L_COUNTS)) ;
        END IF ;
    END LOOP ;
END ;
/

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Oracle Database 10g

    31questions

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