2009-07-06 29 views
8

Parametrenin veri türünü döndüren bir Oracle işlevi var mı?Oracle Veri Türünü Tanımla

Alternatif olarak, yazdığım bir sorgudaki tüm sütunların veri türünü belirlemenin en kolay yolu nedir?

cevap

14

Dump fonksiyon:

bir VARCHAR2 bayt veri türü kodu, uzunluğu ihtiva eden bir değer, ve İfade iç temsil döndürür. İade edilen sonuç her zaman veritabanı karakter setindedir. Her bir koda karşılık gelen veri türü için Tablo 2-1'e bakınız.

bir sorgu yazdıysanız
+0

Ve düşünmek ... Ben geçici bir tabloya bir sorgunun sonuçlarını dökümü bir PL/SQL programı yazdım, sonra tekrar gelen bilgileri okumak USER_TABLE_COLUMNS. – GameFreak

4

, bunun dayalı bir görünüm oluşturmak ve sonra veri sözlüğü kolon'durumuna veri türleri ne olacağını anlamak için sorgu yapabilirsiniz:

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 

ben tahmin ediyorum, bununla birlikte, çalışma zamanında bunu belirleyen bir tür jenerik yöntem istersiniz. Bu yöntem, DDL'yi içerdiğinden çok kullanışlı olmaz. Bu durumda DBMS_SQL size yardımcı olabilir:

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

Aslında, bir sorgudaki örtülü tür dönüşüm kurallarını doğrulamak istedim. Ancak, bu yaklaşım büyük olasılıkla benim veritabanı tasarımı (ve sonunda veritabanı) olgunlaştıkça yararlı olacaktır. – Steven