私はこのようなテーブルから列を取得するための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には初めてです)には、テーブルスペース名しかないので、スキーマ名と同じです(論理的には?)
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では大文字です。それらを二重引用符で囲んで作成した場合、それらは小文字または混在する大文字小文字の区別のみです。
以下のクエリは、Oracleデータベースではうまく機能しました。
select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';
oracleではあなたが使用することができます
desc users
usersテーブルに含まれるすべての列を表示する
これを試すことができます。(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'
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 を参照してください。
場合によっては、スキーマ内のテーブルからすべての列をカンマで区切ったリストが必要になります。そのような場合、コンマ区切りのリストを文字列として取得するこの汎用関数を使用できます。
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
は失敗します。これはめったにありません。ほとんどの場合、これでうまくいきます。
これを試すことができます:
「テーブル名」を記述する
すべての列名とデータ型が返されます
要は、次のように、テーブル名の大文字を書く必要があるということです。
select *
FROM all_tab_columns
where table_name like 'IDECLARATION';
私はこれが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;
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"
DESCRIBE <TABLE_NAME>
- >注:これはスクリプト出力です。