[sql] 열 이름을 가져 오는 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 데이터베이스에서 위의 쿼리를 어떻게 변경합니까? 스키마를 지정하여 특정 열을 제외한 테이블 ‘사용자’에 대한 결과 집합으로 열 이름을 가져와야합니다. 지금은 새 테이블 스페이스에 모든 테이블이 있는데 스키마 이름 대신 테이블 스페이스 이름을 지정해야합니까?

또한 이것에 대한 일반적인 HQL이 있습니까? 내 새 Oracle 데이터베이스 (Oracle을 처음 사용)에는 테이블 스페이스 이름 만 있으므로 스키마 이름과 동일합니다 (논리적으로?)



답변

Oracle에 해당하는 information_schema.COLUMNS것은 USER_TAB_COLS현재 사용자가 소유 한 테이블 ALL_TAB_COLS또는 DBA_TAB_COLS모든 사용자가 소유 한 테이블에 대한 것입니다.

테이블 스페이스는 스키마와 동일하지 않으며 테이블 스페이스 이름을 제공 할 필요도 없습니다.

특정 사용자가 소유 한 테이블의 열 을 쿼리 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 주입의 위험이 있습니다.

편집 : Oracle에서는 일반적으로 대문자이므로 테이블 및 열 이름을 대문자로 표시합니다. 주위에 큰 따옴표로 만든 경우에만 소문자 또는 혼합 된 대소 문자 만 사용됩니다.


답변

아래 쿼리는 Oracle 데이터베이스에서 저에게 효과적이었습니다.

select COLUMN_NAME from ALL_TAB_COLUMNS where TABLE_NAME='MyTableName';


답변

오라클에서는 사용할 수 있습니다.

desc users

사용자 테이블에 포함 된 모든 열을 표시하려면


답변

시도해 볼 수 있습니다. (11g에서 작동하며 테이블의 모든 열 이름을 반환합니다. 여기서 test_tbl은 테이블 이름이고 user_tab_columns는 사용자가 허용하는 테이블의 열입니다)

select  COLUMN_NAME  from user_tab_columns
where table_name='test_tbl'; 


답변

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은 Object Relational Mapping이고, 여러분이 찾고있는 것은 메타 데이터 매핑입니다. HQL을 사용하지 않고이 목적을 위해 API 메서드를 사용하거나 SQL을 직접 사용합니다. 예를 들어 JDBC DatabaseMetaData를 사용할 수 있습니다 .

테이블 스페이스는 스키마와 관련이 없다고 생각합니다. AFAIK 테이블 스페이스는 주로 DBA를 괴롭히는 논리적 내부 기술 목적으로 사용됩니다. 테이블 스페이스에 대한 자세한 내용은 Oracle doc를 참조하십시오 .


답변

열 이름을 가져올 수있는 유일한 방법은 다음 쿼리를 사용하는 것입니다.

select COLUMN_NAME
FROM all_tab_columns atc
WHERE table_name like 'USERS'


답변

요점은 두꺼비에서 다음과 같이 테이블 이름 대문자를 써야한다는 것입니다.

select *
FROM all_tab_columns
where table_name like 'IDECLARATION';