select userId ,userName from user
我如何在能知道,这条sql的列,就是userId和userName的数据类型
13 个解决方案
#1
all_tab_columns这张表里可以获取
现在的问题是,有办法获取视图中各列的数据类型?
现在的问题是,有办法获取视图中各列的数据类型?
#2
对,从系统视图中查询出列对应的类型
#3
视图里的数据类型,不是在本库决定的啊
是在源库基于基表的数据库定义的类型
是在源库基于基表的数据库定义的类型
#4
?没太理解需求。
#5
就是有个视图,我知道视图的名字,这样就可以查这张视图了,想知道,可以知道视图中各个列的数据类型吗,知道这个问题很傻,估计不可能知道吧,但想问下可以获取吗?
#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的关键字,尽量不要在业务系统中使用它
还有,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
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
就是有个视图,我知道视图的名字,这样就可以查这张视图了,想知道,可以知道视图中各个列的数据类型吗,知道这个问题很傻,估计不可能知道吧,但想问下可以获取吗?
#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的关键字,尽量不要在业务系统中使用它
还有,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
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