2009-07-06 82 views
8

是否有Oracle函數返回參數的數據類型?Oracle標識數據類型

另外,什麼是最簡單的方法來確定我寫的查詢中的所有列的數據類型?

回答

14

Dump功能:

返回包含以字節爲單位的數據類型代碼,長度VARCHAR2值,並且expr的內部表示。返回的結果總是在數據庫字符集中。對於每個代碼對應的數據類型,請參見表2-1。

+0

想想吧......我寫了一個PL/SQL程序來轉儲查詢的結果到一個臨時表,然後讀取的信息從後USER_TABLE_COLUMNS。 – GameFreak 2009-07-06 15:09:27

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 2009-07-06 14:31:06