在ORACLE的select语句中获取字段的数据类型

时间:2014-04-09 12:10:27

标签: sql oracle function types

我可以使用select语句获取我选择的每列的数据类型而不是值吗?

例如:

SELECT a.name, a.surname, b.ordernum 
FROM customer a
JOIN orders b
ON a.id = b.id

,结果应该是这样的

name    | NVARCHAR(100)
surname | NVARCHAR(100)
ordernum| INTEGER

或者它可以像这样排成一行,但并不重要:

name           |   surname     |  ordernum
NVARCHAR(100)  | NVARCHAR(100) |   INTEGER

由于

7 个答案:

答案 0 :(得分:13)

您可以查询数据库中的all_tab_columns视图。

SELECT  table_name, column_name, data_type, data_length FROM all_tab_columns where table_name = 'CUSTOMER'

答案 1 :(得分:9)

我使用DUMP()

找到了一种非常直观的方法
SELECT DUMP(A.NAME), 
       DUMP(A.surname), 
       DUMP(B.ordernum) 
FROM   customer A 
       JOIN orders B 
         ON A.id = B.id

它会返回类似的内容:

每栏

'Typ=1 Len=2: 0,48'

Type=1表示VARCHAR2/NVARCHAR2
Type=2表示NUMBER/FLOAT
Type=12表示DATE等。

您可以参考此oracle doc获取信息Datatype Code
或者这是一个简单的映射Oracle Type Code Mappings

答案 2 :(得分:3)

我遇到了同样的情况。作为一种解决方法,我刚刚创建了一个view(如果你有权限)并描述它并稍后删除它。 :)

答案 3 :(得分:3)

我通常创建一个视图并使用DESC命令:

CREATE VIEW tmp_view AS 
SELECT 
      a.name
    , a.surname
    , b.ordernum 
FROM customer a
  JOIN orders b
    ON a.id = b.id

然后,DESC命令将显示每个字段的类型。

DESC tmp_view

答案 4 :(得分:1)

如果您没有在Oracle中创建视图的权限,请使用MS访问“hack”: - (

在MS Access中,使用sql创建一个pass through查询(但添加where子句只选择1条记录),从视图中创建一个select查询(非常重要),选择all *,然后从中创建一个make表。选择查询。当它运行时,它将创建一个包含一条记录的表,所有数据类型都应该“匹配”oracle。 即Passthrough - >选择 - > MakeTable - >表

我确信还有其他更好的方法,但如果你的工具和权限有限,这将有效。

答案 5 :(得分:0)

此外,如果您有Toad for Oracle,则可以突出显示该语句并按 CTRL + F9 ,您将获得一个很好的列视图和他们的视图数据类型。

答案 6 :(得分:0)

you can use the DBMS_SQL.DESCRIBE_COLUMNS2

    SET SERVEROUTPUT ON;
DECLARE
    STMT CLOB;
    CUR NUMBER;
    COLCNT NUMBER;
    IDX NUMBER;
    COLDESC DBMS_SQL.DESC_TAB2;
BEGIN
    CUR := DBMS_SQL.OPEN_CURSOR;
    STMT := 'SELECT  object_name , to_char(object_id), created FROM    DBA_OBJECTS where rownum<10';

    SYS.DBMS_SQL.PARSE(CUR, STMT, DBMS_SQL.NATIVE);
    DBMS_SQL.DESCRIBE_COLUMNS2(CUR, COLCNT, COLDESC);
    DBMS_OUTPUT.PUT_LINE('Statement: ' || STMT);
    FOR IDX IN 1 .. COLCNT
    LOOP
        CASE COLDESC(IDX).col_type
        WHEN 2 THEN
            DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': NUMBER');
        WHEN 12 THEN
            DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': DATE');
        WHEN 180 THEN
            DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': TIMESTAMP');
        WHEN 1 THEN
            DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': VARCHAR'||':'|| COLDESC(IDX).col_max_len);
        WHEN 9 THEN
            DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': VARCHAR2');
        -- Insert more cases if you need them
        ELSE
            DBMS_OUTPUT.PUT_LINE('#' || TO_CHAR(IDX) || ': OTHERS (' || TO_CHAR(COLDESC(IDX).col_type) || ')');
        END CASE;
    END LOOP;
    SYS.DBMS_SQL.CLOSE_CURSOR(CUR);
EXCEPTION 
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE()) || ': ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
        SYS.DBMS_SQL.CLOSE_CURSOR(CUR);
END;
/


full example in the below url

https://www.ibm.com/support/knowledgecenter/sk/SSEPGG_9.7.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0055146.html