2009-07-06 7 views
8

Есть ли функция Oracle для возврата типа данных параметра?Oracle Identify Data Type

В качестве альтернативы, какой самый простой способ определить тип данных всех столбцов в запросе, который я написал?

ответ

14

Dump Функция:

возвращает значение 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