열 이름을 가져 오는 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.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에서는 일반적으로 대문자이므로 테이블 및 열 이름을 대문자로 표시합니다. 주위에 큰 따옴표로 만든 경우에만 소문자 또는 혼합 된 대소 문자 만 사용됩니다.


2
그건 그렇고 나는 여기 링크와 함께 jdbc ..를 통해 데이터베이스에 관계없이 이것을 수행하는 일반적인 방법을 찾았습니다 : kodejava.org/examples/163.html
pri_dev

나는 또한 and virtual_column = 'NO'내 쿼리 에 추가 해야했다.
musicin3d apr

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

사용 lower(TABLE_NAME)또는 upper(TABLE_NAME)의 테이블 스캔 할 오라클을 필요로 ALL_TAB_COLUMNS하는 모든 값을 얻기 위해 테이블 TABLE_NAME이 제공된과 비교하기 전에를 UPPER('MyTableName'). 빠른 테스트에서 이것은 성능을 내 목적에 사용할 수 없게 만들었으므로 대소 문자를 구분하는 비교를 계속하겠습니다.
Chris Magnuson 2018

40

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

desc users

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


6
... '테이블의 모든 열 목록을 얻는 방법'에 대한 답을 나타내지 만 질문에 답하지 않습니다. 1) 쿼리가 아닙니다. 2) 제한하지 않습니다. 반환 된 열을 필터링합니다. 3) 결과 집합을 반환합니까?
Ehryk 2014 년

6
upvotes의 부족은하지 않는 desc users몇 가지 질문에 나쁜 대답을하지만,에 좋은 응답하지 않습니다 이 하나 .
Ehryk 2014 년

SQL 쿼리가 아니기 때문에 sql * plus 명령입니다. 자세한 정보를 보려면 this를 확인하십시오 : 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은 Object Relational Mapping이고, 여러분이 찾고있는 것은 메타 데이터 매핑입니다. HQL을 사용하지 않고이 목적을 위해 API 메서드를 사용하거나 SQL을 직접 사용합니다. 예를 들어 JDBC DatabaseMetaData를 사용할 수 있습니다 .

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


TABLE_NAME='"+_db+".users'실패 할 것이다. 당신의 소유자 / 스키마 및 테이블 이름을 분리 할 필요가ALL_TAB_COLUMNS
데이비드 페이버

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

이름은 같지만 소유자가 다른 테이블이 여러 개 있으면 어떻게됩니까?
David Faber

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

-1

이것을 시도 할 수 있습니다.

'테이블 이름'설명

모든 열 이름과 데이터 유형을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.