如何使用低特权的PL-SQL获得Oracle中的列数据types?

我对Oracle数据库中的几个表有“只读”访问权限。 我需要获取某些列的模式信息。 我想使用类似于MS SQL的sp_help东西。

我在这个查询中列出了我感兴趣的表格:

 SELECT * FROM ALL_TABLES 

当我运行这个查询时,Oracle告诉我“在模式中没有find表”,是的,参数是正确的。

 SELECT DBMS_METADATA.GET_DDL('TABLE', 'ITEM_COMMIT_AGG', 'INTAMPS') AS DDL FROM DUAL; 

使用我的Oracle通用转换器9000后,我猜测这是行不通的,因为我没有足够的权限。 鉴于我的约束我怎样才能得到一个列的数据types和数据长度我已经阅读访问与PL-SQL语句?

ALL_TAB_COLUMNS应该可以从PL / SQL中查询。 DESC是一个SQL * Plus命令。

 SQL> desc all_tab_columns; Name Null? Type ----------------------------------------- -------- ---------------------------- OWNER NOT NULL VARCHAR2(30) TABLE_NAME NOT NULL VARCHAR2(30) COLUMN_NAME NOT NULL VARCHAR2(30) DATA_TYPE VARCHAR2(106) DATA_TYPE_MOD VARCHAR2(3) DATA_TYPE_OWNER VARCHAR2(30) DATA_LENGTH NOT NULL NUMBER DATA_PRECISION NUMBER DATA_SCALE NUMBER NULLABLE VARCHAR2(1) COLUMN_ID NUMBER DEFAULT_LENGTH NUMBER DATA_DEFAULT LONG NUM_DISTINCT NUMBER LOW_VALUE RAW(32) HIGH_VALUE RAW(32) DENSITY NUMBER NUM_NULLS NUMBER NUM_BUCKETS NUMBER LAST_ANALYZED DATE SAMPLE_SIZE NUMBER CHARACTER_SET_NAME VARCHAR2(44) CHAR_COL_DECL_LENGTH NUMBER GLOBAL_STATS VARCHAR2(3) USER_STATS VARCHAR2(3) AVG_COL_LEN NUMBER CHAR_LENGTH NUMBER CHAR_USED VARCHAR2(1) V80_FMT_IMAGE VARCHAR2(3) DATA_UPGRADED VARCHAR2(3) HISTOGRAM VARCHAR2(15) 

您可以使用desc命令。

 desc MY_TABLE 

这将为您提供列名称,无论是否有效,数据types(以及适用的长度)

注意:如果您试图获取不同SCHEMA中的表的信息,请使用all_tab_columns视图,因为我们的应用程序出于安全目的使用了不同的SCHEMA,所以存在此问题。

使用以下内容:

例如:

 SELECT data_length FROM all_tab_columns WHERE upper(table_name) = 'MY_TABLE_NAME' AND upper(column_name) = 'MY_COL_NAME' 

我发现这种情况的最佳解决scheme是

 select column_name, data_type|| case when data_precision is not null and nvl(data_scale,0)>0 then '('||data_precision||','||data_scale||')' when data_precision is not null and nvl(data_scale,0)=0 then '('||data_precision||')' when data_precision is null and data_scale is not null then '(*,'||data_scale||')' when char_length>0 then '('||char_length|| case char_used when 'B' then ' Byte' when 'C' then ' Char' else null end||')' end||decode(nullable, 'N', ' NOT NULL') from user_tab_columns where table_name = 'TABLE_NAME' and column_name = 'COLUMN_NAME'; 

@Aaron Stainback,谢谢你的纠正!

 select t.data_type from user_tab_columns t where t.TABLE_NAME = 'xxx' and t.COLUMN_NAME='aaa' 

Oracle:获取表中完整数据types的列表:

 select data_type || '(' || data_length || ')' from user_tab_columns where TABLE_NAME = 'YourTableName' 
 select column_name, data_type || '(' || data_length || ')' as datatype from all_tab_columns where TABLE_NAME = upper('myTableName') 

快速和肮脏的方式(例如看看数据如何存储在甲骨文)

 SQL> select dump(dummy) dump_dummy, dummy , dump(10) dump_ten from dual DUMP_DUMMY DUMMY DUMP_TEN ---------------- ----- -------------------- Typ=1 Len=1: 88 X Typ=2 Len=2: 193,11 1 row selected. 

将显示表sys.dual中的虚拟列具有typ = 1(varchar2),而10是Typ = 2(数字)。