2009-07-06 33 views
8

Có một hàm Oracle để trả về kiểu dữ liệu của tham số không?Oracle Xác định Loại Dữ liệu

Cách khác, cách dễ nhất để xác định kiểu dữ liệu của tất cả các cột trong truy vấn mà tôi đã viết là gì?

Trả lời

14

Các Dump Chức năng:

trả về một giá trị VARCHAR2 chứa mã datatype, chiều dài tính bằng byte, và đại diện bên trong của expr. Kết quả trả về luôn nằm trong bộ ký tự cơ sở dữ liệu. Đối với kiểu dữ liệu tương ứng với từng mã, xem Bảng 2-1.

+0

Và suy nghĩ ... Tôi đã viết một chương trình PL/SQL để đổ các kết quả của một truy vấn vào một bảng tạm thời, sau đó đọc các thông tin trở lại từ USER_TABLE_COLUMNS. – GameFreak

4

Nếu bạn đã viết một truy vấn, bạn có thể tạo ra một cái nhìn dựa vào nó và sau đó truy vấn dữ liệu từ điển để xem những gì các cột kiểu dữ liệu là:

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 

Tôi đoán, tuy nhiên, bạn muốn một số cách thức chung để xác định điều này khi chạy. Phương pháp này sẽ không hữu ích vì nó liên quan đến DDL. Trong trường hợp này DBMS_SQL có thể giúp bạn:

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

Thực ra, tôi chỉ muốn xác nhận quy tắc chuyển đổi loại tiềm ẩn trong truy vấn. Tuy nhiên, cách tiếp cận này rất có thể sẽ hữu ích khi thiết kế cơ sở dữ liệu của tôi (và cuối cùng là cơ sở dữ liệu) đáo hạn. – Steven

Các vấn đề liên quan