根据sql语句获取列的数据类型

时间:2021-03-13 13:48:42
比如:有一天sql语句为:
select userId ,userName from user

我如何在能知道,这条sql的列,就是userId和userName的数据类型

13 个解决方案

#1


all_tab_columns这张表里可以获取
现在的问题是,有办法获取视图中各列的数据类型?

#2


对,从系统视图中查询出列对应的类型

#3


视图里的数据类型,不是在本库决定的啊

是在源库基于基表的数据库定义的类型

#4


?没太理解需求。

#5


引用 4 楼 yixilan 的回复:
?没太理解需求。


就是有个视图,我知道视图的名字,这样就可以查这张视图了,想知道,可以知道视图中各个列的数据类型吗,知道这个问题很傻,估计不可能知道吧,但想问下可以获取吗?

#6


看样子,这个需求,比较BT

#7


select column_name,data_type from user_tab_cols where table_name = upper('VIEW_***')

#8


把这个视图的脚本贴出来。

#9


如果是JAVA,可以用ResultSetMetaData获取。如果是存储过程,可以用DBMS_SQL获取。
参考例子:

sqlplus '/as sysdba'
SQL>SET SERVEROUTPUT ON
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 DBA_USERS', 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;
/

#10


desc user

还有,user是oracle的关键字,尽量不要在业务系统中使用它

#11


desc user;

#12


在sqlplus中执行就okay了。

#13


select a.colname,b.[name] from sys.types b inner join (
select [name] as colName,system_type_id from sys.columns 
where [object_id]= (select [object_id] from sys.tables 
where [name]= 'user')) a 
on a.system_type_id = b.system_type_id

#1


all_tab_columns这张表里可以获取
现在的问题是,有办法获取视图中各列的数据类型?

#2


对,从系统视图中查询出列对应的类型

#3


视图里的数据类型,不是在本库决定的啊

是在源库基于基表的数据库定义的类型

#4


?没太理解需求。

#5


引用 4 楼 yixilan 的回复:
?没太理解需求。


就是有个视图,我知道视图的名字,这样就可以查这张视图了,想知道,可以知道视图中各个列的数据类型吗,知道这个问题很傻,估计不可能知道吧,但想问下可以获取吗?

#6


看样子,这个需求,比较BT

#7


select column_name,data_type from user_tab_cols where table_name = upper('VIEW_***')

#8


把这个视图的脚本贴出来。

#9


如果是JAVA,可以用ResultSetMetaData获取。如果是存储过程,可以用DBMS_SQL获取。
参考例子:

sqlplus '/as sysdba'
SQL>SET SERVEROUTPUT ON
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 DBA_USERS', 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;
/

#10


desc user

还有,user是oracle的关键字,尽量不要在业务系统中使用它

#11


desc user;

#12


在sqlplus中执行就okay了。

#13


select a.colname,b.[name] from sys.types b inner join (
select [name] as colName,system_type_id from sys.columns 
where [object_id]= (select [object_id] from sys.tables 
where [name]= 'user')) a 
on a.system_type_id = b.system_type_id