2017-12-01 6 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。例えば

、あなたがdba_tab_colsまたはall_tab_colsビューを使用する場合は

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

あなたはまた、クエリで所有者を含めることになるでしょう:

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'を書いて、ケースブロックの出力に比較することができますいずれか。

関連する問題