列名をフェッチするOracleクエリ


123

次のようなテーブルから列を取得するためのmySQLクエリがあります。

String sqlStr="select column_name 
from information_schema.COLUMNS 
where table_name='users' 
and table_schema='"+_db+"' 
and column_name not in ('password','version','id')"

Oracle 11gデータベースで上記のクエリを変更するにはどうすればよいですか?スキーマを指定して、特定の列を除外するテーブル「ユーザー」の結果セットとして列名を取得する必要があります。現在、新しいテーブルスペースにすべてのテーブルがあるので、スキーマ名の代わりにテーブルスペース名を指定しますか?

また、このための汎用HQLはありますか?私の新しいOracleデータベース(Oracleは初めてです)では、テーブルスペース名しか持っていないので、スキーマ名(論理的には?)と同じです。

回答:


176

Oracleでのに相当するのinformation_schema.COLUMNSUSER_TAB_COLS、現在のユーザーが所有するテーブル、ALL_TAB_COLSまたはDBA_TAB_COLSすべてのユーザーが所有するテーブルです。

テーブルスペースはスキーマと同等ではなく、テーブルスペース名を指定する必要もありません。

スキーマ/ユーザー名を指定すると、特定のユーザーが所有するOFテーブルのクエリALL_TAB_COLSDBA_TAB_COLS列を作成する場合に役立ちます。あなたの場合、クエリは次のようになると思います:

String sqlStr= "
SELECT column_name
  FROM all_tab_cols
 WHERE table_name = 'USERS'
   AND owner = '" +_db+ "'
   AND column_name NOT IN ( 'PASSWORD', 'VERSION', 'ID' )"

このアプローチでは、SQLインジェクションのリスクがあることに注意してください。

編集:テーブル名と列名はOracleでは通常大文字であるため、大文字にしました。二重引用符で囲んで作成した場合は、小文字または大文字と小文字のみが混在します。


2
ちなみに、jdbcを介したデータベースに関係なくこれを行う一般的な方法を見つけました。ここにリンクがあります。kodejava.org
examples

and virtual_column = 'NO'クエリにも追加する必要がありました。
musicin3d

101

以下のクエリは、Oracleデータベースで機能しました。

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';

26
Oracleでは大文字と小文字が区別されることに注意してください。私は通常使用します...WHERE LOWER(Table_Name) = 'mytablename';

2
@ user565869を使用しますwhere lower(TABLE_NAME) = lower('WHATEVER')。それ以外の場合、テーブル名に大文字が含まれていると、テーブルも見つかりません
AlexanderD

SELECT column_name FROM all_tab_cols WHERE UPPER(Table_Name) = UPPER('tablename');同様に動作します。
user3553260 2016

Oracleを使用するlower(TABLE_NAME)upper(TABLE_NAME)、Oracleにテーブルのテーブルスキャンを実行させて、指定されたと比較する前にのALL_TAB_COLUMNSすべての値を取得する必要があります。クイックテストでは、この目的のためにパフォーマンスが使用できなくなったため、大文字と小文字を区別した比較を行います。TABLE_NAMEUPPER('MyTableName')
Chris Magnuson

40

オラクルではあなたが使うことができます

desc users

usersテーブルに含まれるすべての列を表示するには


6
...これは「テーブルのすべての列のリストを取得する方法」に対する回答を表していますが、尋ねられた質問には答えません。1)クエリではない、2)制限しない/返される列をフィルタリングします。3)結果セットを返しますか?
Ehryk 2014

6
upvotesの欠如はなりませんdesc usersいくつかの質問に悪い答えを、それがに良い答えではありませんこの1
Ehryk 2014

そして、それはsqlクエリではなく、sql * plusコマンドです。:詳細は、このチェックアウトstackoverflow.com/questions/37133666/...
01000001

7

これを試すことができます:(11gで動作し、テーブルからすべての列名を返します。ここでtest_tblはテーブル名であり、user_tab_columnsはユーザーが許可するテーブルの列です)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


1
USER_TAB_COLUMNS実際には、ユーザーが所有するテーブルの列であり、ユーザーに許可されているテーブルの列ではありません。
David Faber

2

Oracleで使用するクエリは次のとおりです。

String sqlStr="select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='"+_db+".users' and COLUMN_NAME not in ('password','version','id')"

そのようなクエリのHQLについて聞いたことがない。ORM実装がそれを処理することは意味がないと思います。ORMはオブジェクトリレーショナルマッピングであり、探しているのはメタデータマッピングです...この目的には、HQLを使用せず、APIメソッドを使用するか、SQLを直接使用します。たとえば、JDBC DatabaseMetaDataを使用できます。

テーブルスペースはスキーマとは関係ないと思います。AFAIKテーブルスペースは、主にDBAを悩ませるべき論理的な内部技術的な目的で使用されます。テーブルスペースの詳細については、Oracleのドキュメントを参照してください。


TABLE_NAME='"+_db+".users'失敗します。所有者/スキーマとテーブル名を区切る必要がありますALL_TAB_COLUMNS
David Faber

2

列名を取得できる唯一の方法は、次のクエリを使用することでした。

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'

2

ポイントは、ヒキガエルでは次のようにテーブル名の大文字を書かなければならないということです:

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';

1

私はこれがOracleで便利だと思います:

SELECT 
    obj.object_name, 
    atc.column_name, 
    atc.data_type, 
    atc.data_length 
FROM 
    all_tab_columns atc,
    (SELECT 
        * 
     FROM 
         all_objects
     WHERE 
        object_name like 'GL_JE%'
        AND owner = 'GL'
        AND object_type in ('TABLE','VIEW')   
    ) obj
WHERE 
    atc.table_name = obj.object_name
ORDER BY 
    obj.object_name, 
    atc.column_name;

この答えは非常に読みにくいです。再フォーマットをご検討ください。
chharvey、2015

同じ名前で所有者が異なる複数のテーブルがある場合はどうなりますか?
デビッドファーバー

1

場合によっては、スキーマ内のテーブルのすべての列をコンマで区切ったリストが必要になります。このような場合は、カンマ区切りのリストを文字列としてフェッチするこの汎用関数を使用できます。

CREATE OR REPLACE FUNCTION cols(
    p_schema_name IN VARCHAR2,
    p_table_name  IN VARCHAR2)
  RETURN VARCHAR2
IS
  v_string VARCHAR2(4000);
BEGIN
  SELECT LISTAGG(COLUMN_NAME , ',' ) WITHIN GROUP (
  ORDER BY ROWNUM )
  INTO v_string
  FROM ALL_TAB_COLUMNS
  WHERE OWNER    = p_schema_name
  AND table_name = p_table_name;
  RETURN v_string;
END;
/

したがって、クエリから関数を呼び出すだけで、すべての列を含む行が生成されます。

select cols('HR','EMPLOYEES') FROM DUAL;

EMPLOYEE_ID,FIRST_NAME,LAST_NAME,EMAIL,PHONE_NUMBER,HIRE_DATE,JOB_ID,SALARY,COMMISSION_PCT,MANAGER_ID,DEPARTMENT_ID

注: LISTAGGすべての列の合計の長さが4000文字を超えると失敗しますが、これはまれです。ほとんどの場合、これで十分です。


0
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0;->これは、ResultSetであるQuery Resultであることに注意してください。これは他のフォーマットにエクスポート可能です。また、クエリ結果Textフォーマットにエクスポートできます。私がしたときのエクスポートは以下のようになりますSELECT * FROM SATURN.SPRIDEN WHERE ROWNUM = 0;

    "SPRTELE_PIDM" "SPRTELE_SEQNO" "SPRTELE_TELE_CODE" "SPRTELE_ACTIVITY_DATE" "SPRTELE_PHONE_AREA" "SPRTELE_PHONE_NUMBER" "SPRTELE_PHONE_EXT" "SPRTELE_STATUS_IND" "SPRTELE_ATYP_CODE" "SPRTELE_ADDR_SEQNO" "SPRTELE_PRIMARY_IND" "SPRTELE_UNLIST_IND" "SPRTELE_COMMENT" "SPRTELE_INTL_ACCESS" "SPRTELE_DATA_ORIGIN" "SPRTELE_USER_ID"「SPRTELE_CTRY_CODE_PHONE "" SPRTELE_SURROGATE_ID "" SPRTELE_VERSION "" SPRTELE_VPDI_CODE "

  2. DESCRIBE <TABLE_NAME> ->注:これはスクリプト出力です。


-1

以下のクエリを使用して、DB2の特定の列を使用するテーブル名のリストを取得できます。

SELECT TBNAME                
FROM SYSIBM.SYSCOLUMNS       
WHERE NAME LIKE '%COLUMN_NAME'; 

注:ここで、COLUMN_NAMEを検索する列名に置き換えます。


おそらく、回答するDB2の質問を探す必要がありますか?Oracleを検索する人がDB2の答えを必要とするのではないかと思います。
RichardTheKiwi

1
この答えは実際に私を助けました。OracleモードでDB2を使用していますが、all_tab_colsをサポートしていません。
wm_eddie 2013

-1

あなたはこれを試すことができます:

「テーブル名」について説明する

すべての列名とデータ型を返します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.