2017-12-01 11 views
0

Oracle 데이터베이스 테이블을 쿼리하고 열의 데이터 형식을 확인해야합니다. 아래 스크립트가 있지만 TYPE_NAME은 인식되지 않습니다. 난 열의 내용을 확인할 수 있지만 테이블의 실제 유형을 확인해야합니다.커서로 열 유형을 확인하려면 어떻게합니까?

누구든지 어떻게 할 수 있는지 알고 있습니까?

set pagesize 1000; 
variable errorCode number; 

DECLARE 
    cursor c1 is 
     select theColumn from myDatabaseTable; 
    colRec c1%ROWTYPE; 
BEGIN 
    :errorCode := 0; 
    OPEN c1; 

    FETCH c1 INTO colRec; 
    IF colRec.TYPE_NAME <> 'CHAR' THEN 
     :errorCode := 1; 
    END IF; 


    CLOSE c1; 
END; 
/
exit :errorCode; 

답변

1

당신은 데이터 사전보기 중 하나에서 확인할 수 있습니다 TABLE_NAME 및 COLUMN_NAME에 의해 dba_tab_cols, all_tab_cols, 또는 user_tab_cols. 예를 들어

,
select data_type 
from dba_tab_cols 
where table_name = 'MYTABLE' 
and column_name = 'MYCOL' 

당신은 또한 쿼리의 소유자 포함 할거야 dba_tab_cols 또는 all_tab_cols 뷰를 사용하는 경우

:

select data_type 
from dba_tab_cols 
where owner = 'SCHEMA' 
and table_name = 'MYTABLE' 
and column_name = 'MYCOL' 
1

당신은 구문 분석 절차 DBMS_SQL.describe_columns를 사용할 수 귀하 검색어는 CURSOR입니다. 이 프로시 저는 컬럼, 데이터 유형 및 크기를 포함하는 콜렉션을 제공합니다.

col_type - gives you the datatypes. 
col_name - gives you the column_names. 
.. and so on. 

자세한 내용은이 링크를 참조하십시오. 여기

DBMS_SQL.DESCRIBE_COLUMNS

는 일례이다.

declare 
    cur number; 
    cnt number; 
    rec_t dbms_sql.desc_tab; 
begin 
    cur := dbms_sql.open_cursor; 

    dbms_sql.parse(cur, 'select 1 id, ''Stefan'' Name from DUAL', dbms_sql.native); 

    dbms_sql.describe_columns(cur, cnt, rec_t); 

    FOR i IN 1..rec_t.COUNT 
    LOOP 
     dbms_output.put_line(rec_t(i).col_name || ' - TYPE ' || rec_t(i).col_type); 
    END LOOP; 

    dbms_sql.close_cursor(cur); 
end; 
/

유형은 특정 데이터 유형을 나타내는 숫자입니다. 중요한 데이터 유형의 번호를 제공하는 목록은 다음과 같습니다.

Datatype  Number 

VARCHAR2  1 
NVARCHAR2  1 
NUMBER   2 
INTEGER   2 
DATE   12 
CHAR   96 
NCHAR   96 
CLOB   112 
NCLOB   112 
BLOB   113 
BFILE   114 

그래서, 당신은 비교 등

IF rec_t(i).col_type <> 96 THEN ...

을하거나 경우 블록 등

CASE WHEN rec_t(i).col_type = 96 THEN 'CHAR'를 작성하는 경우 블록의 출력에 비교할 수 있습니다 .