web-dev-qa-db-ja.com

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

私はこのようなテーブルから列を取得するための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データベースで上記のクエリを変更する方法スキーマを指定して、特定の列を除いたテーブル「users」の結果セットとして列名を取得する必要があります。現在、すべてのテーブルを新しいテーブルスペースに入れています。スキーマ名の代わりにテーブルスペース名を指定しますか。

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

104
pri_dev

information_schema.COLUMNSとOracleで同等のものは、現在のユーザーが所有するテーブルの場合はUSER_TAB_COLS、すべてのユーザーが所有するテーブルの場合はALL_TAB_COLSまたはDBA_TAB_COLSです。

表領域はスキーマと同じではありません。また、表領域名を指定する必要もありません。

特定のユーザーが所有するOF列の列に対してALL_TAB_COLSまたはDBA_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インジェクションが発生する可能性があります。

EDIT:テーブル名と列名を大文字にしました。これらは通常Oracleでは大文字です。それらを二重引用符で囲んで作成した場合、それらは小文字または混在する大文字小文字の区別のみです。

150
Sathyajith Bhat

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

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
90
Karthik N G

oracleではあなたが使用することができます

desc users

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

35
Arsalan Sheikh

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

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 

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

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'
2
MrElbow

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はオブジェクトリレーショナルマッピングであり、あなたが探しているものはメタデータマッピングです。たとえば、JDBC DatabaseMetaData を使用できます。

テーブルスペースはスキーマとは関係がないと思います。 AFAIKテーブルスペースは主にDBAを悩ます論理的な内部の技術的な目的のために使用されます。表領域の詳細については、 Oracle doc を参照してください。

2
yair

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

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

注:すべての列の合計長が4000文字を超えるとLISTAGGは失敗します。これはめったにありません。ほとんどの場合、これでうまくいきます。

0
Kaushik Nayak

これを試すことができます:

「テーブル名」を記述する

すべての列名とデータ型が返されます

0
Reza Rahimi

要は、次のように、テーブル名の大文字を書く必要があるということです。

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
0
Ghadir Farzaneh

私はこれが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;
0
Dave C.
  1. SELECT * FROM <SCHEMA_NAME.TABLE_NAME> WHERE ROWNUM = 0; - >これはQuery Result、ResultSetです。これは他のフォーマットにエクスポート可能です。また、クエリ結果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> - >注:これはスクリプト出力です。

0
Uddhav Gautam