繁体   English   中英

如何从sql查询结果中获取所有字段的数据类型。 我正在使用oracle DB

[英]How can I get the data types of all fields from the sql query result. I am using oracle DB

我正在使用以下查询

SELECT T1.ID, 
       T1.MID,
       T2.VID
       case when T1.MID = 0 then 'FALSE' else 'TRUE' end AS ISACTIVE
FROM Table1 T1 LEFT JOIN Table2 T2 ON T1.MID = T2.MID  

我想知道字段“ ISACTIVE”的数据类型。 我正在使用oracle SQL Developer。 有什么方法可以描述查询结果?

在这种情况下,它将是varchar2(5),因为两个文字值的长度不同。

我知道的唯一方法是创建一个对象并对其进行测试。

SQL> create table tst as
  2   (select case when dummy='X' then 'FALSE' else 'TRUE' end  col1
  3    from dual);

Table created.

SQL> desc tst
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------

 COL1                                               VARCHAR2(5)

SQL> drop table tst;

Table dropped.

SQL> create table tst as
  2   (select case when dummy='X' then 'FALSE' else 'TRUEy' end  col1
  3    from dual);

Table created.

SQL> desc tst
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------

 COL1                                               CHAR(5)

SQL>

这是使用DBMS_SQL包获取数据类型的匿名块的草稿。

解码语句基于all_tab_cols视图:

从all_views中选择文本,其中view_name ='ALL_TAB_COLS';

set serveroutput on;
declare
  cursor_num integer;
  ret_num integer;
  num_cols integer;
  type_tab dbms_sql.desc_tab2;
  data_typ varchar2(512 char);
  l_query clob;
begin
  l_query := 'select case when dummy=''x'' then ''true'' else ''false'' end, 1.2, date''2015-01-01''  from dual';

  cursor_num := dbms_sql.open_cursor;

  dbms_sql.parse(cursor_num,l_query,dbms_sql.native);
  dbms_sql.describe_columns2(cursor_num,num_cols,type_tab);

  for i in 1..num_cols
  loop
    select  decode(type_tab(i).col_type, 1, decode(type_tab(i).col_charsetform, 2, 'NVARCHAR2', 'VARCHAR2'),
                       2, decode(type_tab(i).col_scale , null,
                                 decode(type_tab(i).col_precision, null, 'NUMBER', 'FLOAT'),
                                 'NUMBER'),
                       8, 'LONG',
                       9, decode(type_tab(i).col_charsetform, 2, 'NCHAR VARYING', 'VARCHAR'),
                       12, 'DATE',
                       23, 'RAW', 24, 'LONG RAW',
                       69, 'ROWID',
                       96, decode(type_tab(i).col_charsetform, 2, 'NCHAR', 'CHAR'),
                       100, 'BINARY_FLOAT',
                       101, 'BINARY_DOUBLE',
                       105, 'MLSLABEL',
                       106, 'MLSLABEL',
                       112, decode(type_tab(i).col_charsetform, 2, 'NCLOB', 'CLOB'),
                       113, 'BLOB', 114, 'BFILE', 115, 'CFILE',
                       178, 'TIME(' ||type_tab(i).col_scale|| ')',
                       179, 'TIME(' ||type_tab(i).col_scale|| ')' || ' WITH TIME ZONE',
                       180, 'TIMESTAMP(' ||type_tab(i).col_scale|| ')',
                       181, 'TIMESTAMP(' ||type_tab(i).col_scale|| ')' || ' WITH TIME ZONE',
                       231, 'TIMESTAMP(' ||type_tab(i).col_scale|| ')' || ' WITH LOCAL TIME ZONE',
                       182, 'INTERVAL YEAR(' ||type_tab(i).col_precision||') TO MONTH',
                       183, 'INTERVAL DAY(' ||type_tab(i).col_precision||') TO SECOND(' ||
                             type_tab(i).col_scale || ')',
                       208, 'UROWID',
                       'UNDEFINED') 
    into data_typ from dual;

    dbms_output.put_line('Column ' || i || ' is of type ' || data_typ);
  end loop;
  dbms_sql.close_cursor(cursor_num);
end;
/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM