如何在没有`SELECT`的情况下在oracle上打印字段类型

时间:2014-06-12 14:44:23

标签: oracle plsql plsqldeveloper

简单问题:

如何打印字段的类型?

DESC TABLE_FOO.FIELD_FOO;

结果打印整个表格描述。

如何使用命令打印特定字段详细信息,即没有SELECT

3 个答案:

答案 0 :(得分:2)

我不相信如果不使用SELECT声明就可以实现这一目标。

DESC OWNER.TABLE_NAME;基本上只是运行这样的查询(尽管不完全一样,取决于你的客户端):

SELECT *
  FROM ALL_TAB_COLS
 WHERE OWNER = &theOwner
   AND TABLE_NAME = &theTable;

如果您只想返回单个列,可以执行以下操作:

SELECT *
  FROM ALL_TAB_COLS
 WHERE OWNER = &theOwner
   AND TABLE_NAME = &theTable
   AND COLUMN_NAME = &theColumn;

正如@AlexPoole建议的那样,您可以通过编写自己的自定义PROCEDUREFUNCTION来完成此操作,以准确返回您需要的内容,但我相信问题的答案“是内置的除了SELECT以外的命令,它完全符合您的需要“是不,没有。

答案 1 :(得分:2)

没有内置的方法可以做到这一点,至少在我使用的任何客户中都是这样。正如评论中所提到的,describe是围绕数据字典查询的客户端包装器,并且每个客户端都可以以不同方式实现它 - SQL * Plus和SQL Developer似乎略有不同,并且实际上不需要客户端来支持此命令一点都不。

只是为了好玩,如果你真的想要,你可以创建一个程序来确定和格式化数据类型与desc相同,如:

create or replace procedure col_data_type (p_table_name varchar2,
  p_column_name varchar2)
as
  l_data_type varchar2(30);
begin
  select data_type
    || case when data_type = 'VARCHAR2' then '(' || data_length || ')' end
    || case when data_type = 'NUMBER' and data_precision is not null then
      '(' || data_precision
        || case when data_scale is not null and data_scale > 0 then
          ',' || data_scale end
      || ')' end
  into l_data_type
  from user_tab_columns
  where table_name = p_table_name
  and column_name = p_column_name;

  dbms_output.put_line(l_data_type);
end col_data_type;
/

对于其他数据类型可能有更多特殊格式,但这些是显而易见的。然后,您可以使用execute调用它。使用虚拟表:

create table t42(i integer, n1 number, n2 number(10), n3 number(10,5),
  v varchar2(10), c clob)

然后:

set serveroutput on
exec col_data_type('T42','I');
NUMBER
exec col_data_type('T42','N1');
NUMBER
exec col_data_type('T42','N2');
NUMBER(10)
exec col_data_type('T42','N3');
NUMBER(10,5)
exec col_data_type('T42','V');
VARCHAR2(10)
exec col_data_type('T42','C');
CLOB

不完全确定可能有多么有用,或者为什么你想要能够做到这一点。另请注意,它需要客户端检索并显示dbms_output缓冲区。你可以make it a function instead,它会让你回到使用选择,虽然是较短的...

答案 2 :(得分:1)

我不认为你可以不使用SELECT就可以做到这一点。您可以想出一些方法将DESC的输出路由到文件,然后解析出来以获得您想要的内容,但老实说 - SELECT会更容易。

关系数据库存储它们存储在数据库中的描述,其中所述描述可以与数据库中的任何其他信息相同的方式获得,即通过使用SELECT来读取它。存储这个的实际表格有点难以解释,但很高兴Oracle对我们糟糕的用户表示同情并提供了以易于阅读的方式呈现此信息的视图。要获取要执行的字段类型,请选择一个* _TAB_COLS视图,其中*是USER,ALL或DBA。感兴趣的特定列可能是COLUMN_NAME,DATA_TYPE和DATA_LENGTH。

分享并享受。