2009-07-06 25 views
8

Esiste una funzione Oracle per restituire il tipo di dati del parametro?Oracle Identify Data Type

In alternativa, qual è il modo più semplice per determinare il tipo di dati di tutte le colonne in una query che ho scritto?

risposta

14

Il Dump Funzione:

restituisce un valore VARCHAR2 contenente il codice tipo di dati, lunghezza in byte, e la rappresentazione interna di expr. Il risultato restituito è sempre nel set di caratteri del database. Per il tipo di dati corrispondente a ciascun codice, vedere la Tabella 2-1.

+0

e pensare ... ho scritto un programma PL/SQL per eseguire il dump dei risultati di una query in una tabella temporanea, quindi leggere le informazioni di ritorno da USER_TABLE_COLUMNS. – GameFreak

4

Se hai scritto una query, è possibile creare una vista basata su di esso e poi interrogare il dizionario di dati per vedere quali tipi di dati delle colonne sono:

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 

sto cercando di indovinare, tuttavia, si desidera una sorta di metodo generico per determinarlo in fase di esecuzione. Questo metodo non sarebbe molto utile poiché coinvolge DDL. Nel qual caso DBMS_SQL può aiutare:

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

In realtà, volevo solo confermare le regole di conversione del tipo implicito in una query. Tuttavia, questo approccio sarà molto probabilmente utile quando la mia progettazione del database (e infine il database) maturerà. – Steven