2009-07-06 22 views
8

¿Hay una función de Oracle para devolver el tipo de datos del parámetro?Oracle Identify Data Type

Alternativamente, ¿cuál es la forma más fácil de determinar el tipo de datos de todas las columnas en una consulta que he escrito?

Respuesta

14

El Dump Función:

devuelve un valor VARCHAR2 contiene el código de tipo de datos, longitud en bytes, y la representación interna de expr. El resultado devuelto siempre está en el conjunto de caracteres de la base de datos. Para el tipo de datos correspondiente a cada código, consulte la Tabla 2-1.

+0

Y pensar ... Escribí un programa PL/SQL para volcar los resultados de una consulta en una tabla temporal, a continuación, lea la información de vuelta de USER_TABLE_COLUMNS. – GameFreak

4

Si has escrito una consulta, se puede crear un punto de vista basado en él y luego consultar el diccionario de datos para ver qué tipos de datos de las columnas son:

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 

supongo, sin embargo, desea algún tipo de forma genérica de determinar esto en tiempo de ejecución. Este método no sería muy útil ya que involucra a DDL. En cuyo caso DBMS_SQL puede ayudarle a:

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

En realidad, solo quería confirmar las reglas implícitas de conversión de tipo en una consulta. Sin embargo, este enfoque probablemente sea útil a medida que madure el diseño de mi base de datos (y eventualmente la base de datos). – Steven

Cuestiones relacionadas