2009-07-06 18 views
8

パラメータのデータ型を返すOracle関数はありますか?Oracle Identify Data Type

また、作成したクエリのすべての列のデータ型を判別する最も簡単な方法は何ですか?

答えて

14

Dump機能:

データ型コード、バイト単位の長さ、およびexprの内部表現を含むVARCHAR2値を返しを。返される結果は、常にデータベース・キャラクタ・セット内にあります。各コードに対応するデータ型については、表2-1を参照してください。

クエリを書いた場合は
+0

そして...私は当時から情報を読み取り、一時テーブルへのクエリの結果をダンプするPL/SQLプログラムを書いて考えますUSER_TABLE_COLUMNS。 – GameFreak

4

、あなたはそれに基づいてビューを作成し、データ・ディクショナリは、カラムのデータ型が何であるかを確認するためにクエリを実行できます。

create view vw_test as 
select 1  an_integer, 
     'abc' a_string, 
     sysdate a_date 
from dual; 

desc vw_test; 

Name  Null  Type 
----------- -------- ------------------ 
AN_INTEGER   NUMBER 
A_STRING    CHAR(3) 
A_DATE    DATE 

私は推測しています、しかし、実行時にこれを判断する一般的な方法が必要です。 DDLが関係するので、この方法はあまり役に立ちません。 DBMS_SQLはあなたを助けることができ、この場合には:

From the DBMS_SQL Doc:

DECLARE 
    c   NUMBER; 
    d   NUMBER; 
    col_cnt  INTEGER; 
    f   BOOLEAN; 
    rec_tab  DBMS_SQL.DESC_TAB; 
    col_num NUMBER; 
    PROCEDURE print_rec(rec in DBMS_SQL.DESC_REC) IS 
    BEGIN 
    DBMS_OUTPUT.NEW_LINE; 
    DBMS_OUTPUT.PUT_LINE('col_type   = ' 
         || rec.col_type); 
    DBMS_OUTPUT.PUT_LINE('col_maxlen   = ' 
         || rec.col_max_len); 
    DBMS_OUTPUT.PUT_LINE('col_name   = ' 
         || rec.col_name); 
    DBMS_OUTPUT.PUT_LINE('col_name_len  = ' 
         || rec.col_name_len); 
    DBMS_OUTPUT.PUT_LINE('col_schema_name  = ' 
         || rec.col_schema_name); 
    DBMS_OUTPUT.PUT_LINE('col_schema_name_len = ' 
         || rec.col_schema_name_len); 
    DBMS_OUTPUT.PUT_LINE('col_precision  = ' 
         || rec.col_precision); 
    DBMS_OUTPUT.PUT_LINE('col_scale   = ' 
         || rec.col_scale); 
    DBMS_OUTPUT.PUT('col_null_ok   = '); 
    IF (rec.col_null_ok) THEN 
     DBMS_OUTPUT.PUT_LINE('true'); 
    ELSE 
     DBMS_OUTPUT.PUT_LINE('false'); 
    END IF; 
    END; 
BEGIN 
    c := DBMS_SQL.OPEN_CURSOR; 

    DBMS_SQL.PARSE(c, 'SELECT * FROM scott.bonus', DBMS_SQL.NATIVE); 

    d := DBMS_SQL.EXECUTE(c); 

    DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab); 

/* 
* Following loop could simply be for j in 1..col_cnt loop. 
* Here we are simply illustrating some of the PL/SQL table 
* features. 
*/ 
    col_num := rec_tab.first; 
    IF (col_num IS NOT NULL) THEN 
    LOOP 
     print_rec(rec_tab(col_num)); 
     col_num := rec_tab.next(col_num); 
     EXIT WHEN (col_num IS NULL); 
    END LOOP; 
    END IF; 

    DBMS_SQL.CLOSE_CURSOR(c); 
END; 
/
+0

実際、クエリで暗黙の型変換ルールを確認したかっただけです。しかし、このアプローチは、私のデータベース設計(そして最終的にはデータベース)が成熟するにつれて、おそらく有用であろう。 – Steven

関連する問題