如何在oracle上打印字段类型而不使用“选择”`

如何在oracle上打印字段类型而不使用“选择”`,oracle,plsql,plsqldeveloper,Oracle,Plsql,Plsqldeveloper,简单问题: 如何打印字段的类型 DESC TABLE_FOO.FIELD_FOO; 结果打印整个表格说明 如何使用命令打印特定字段的详细信息,例如,不使用SELECT?我认为不使用SELECT语句是不可能实现这一点的 DESC OWNER.TABLE\u NAME基本上只是运行这样一个查询(尽管不完全相同,这取决于您的客户机): 如果只想返回单个列,可以执行以下操作: SELECT * FROM ALL_TAB_COLS WHERE OWNER = &theOwner AN

简单问题:

如何打印字段的类型

DESC TABLE_FOO.FIELD_FOO;
结果打印整个表格说明


如何使用命令打印特定字段的详细信息,例如,不使用
SELECT

我认为不使用
SELECT
语句是不可能实现这一点的

DESC OWNER.TABLE\u NAME
基本上只是运行这样一个查询(尽管不完全相同,这取决于您的客户机):

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

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

正如@AlexPoole所建议的,您可以通过编写自己的自定义
过程
函数
来解决这个问题,以准确返回您所需的内容,但我相信“除了
选择
之外,是否有一个内置命令可以准确执行您所需的内容”这个问题的答案是否定的,没有。

我认为不使用
SELECT
语句就不可能实现这一点

DESC OWNER.TABLE\u NAME
基本上只是运行这样一个查询(尽管不完全相同,这取决于您的客户机):

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

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

正如@AlexPoole所建议的,您可以通过编写自己的自定义
过程
函数
来解决这个问题,以准确返回您所需的内容,但我相信“除了
选择
之外,是否有一个内置命令可以准确执行您所需的内容”这个问题的答案是否定的,没有。

至少在我使用的任何客户端中,都没有内置的方法来实现这一点。如注释中所述,
descripe
是围绕数据字典查询的客户机包装器,每个客户机可以以不同的方式实现它-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)
然后:


不完全确定这可能有多有用,或者为什么您希望能够做到这一点。还请注意,它要求客户端检索并显示
dbms\u输出
buffer。你可以,这会让你重新使用select,尽管是一个较短的…

至少在我使用过的任何客户端中,都没有内置的方法来实现这一点。如注释中所述,
descripe
是围绕数据字典查询的客户机包装器,每个客户机可以以不同的方式实现它-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)
然后:


不完全确定这可能有多有用,或者为什么您希望能够做到这一点。还请注意,它要求客户端检索并显示
dbms\u输出
buffer。你可以,这使你回到使用选择,虽然是一个较短的…

我认为你不能不使用选择就这样做。您可能会想出一些方法将DESC的输出路由到一个文件,然后解析该文件以获得所需的内容,但老实说,SELECT将更容易

关系数据库存储它们存储在数据库中的内容的描述,其中所述描述可以通过与数据库中的任何其他信息相同的方式获得,即通过使用SELECT来读取它。存储这些信息的实际表格有点难以解释,但令人高兴的是,Oracle同情我们这些可怜的用户,并提供了以易于阅读的方式呈现这些信息的视图。要获取要执行的字段类型,请选择其中一个*_TAB_COLS视图,其中*为用户、全部或DBA。感兴趣的特定列可能是列名称、数据类型和数据长度


分享和享受。

我认为如果不使用SELECT,您无法做到这一点。您可能会想出一些方法将DESC的输出路由到一个文件,然后解析该文件以获得所需的内容,但老实说,SELECT将更容易

关系数据库存储它们存储在数据库中的内容的描述,其中所述描述可以通过与数据库中的任何其他信息相同的方式获得,即通过使用SELECT来读取它。存储这些信息的实际表格有点难以解释,但令人高兴的是,Oracle同情我们这些可怜的用户,并提供了以易于阅读的方式呈现这些信息的视图。要获取要执行的字段类型,请选择其中一个*_TAB_COLS视图,其中*为用户、全部或DBA。感兴趣的特定列可能是列名称、数据类型和数据长度


分享和享受。

“这是不可能的”也可以是一个答案。
描述
也做了选择,它只是对你隐藏了它。select有什么问题吗?@AlexPoole什么都没有,但是在映射方法x存储过程时,命令更容易嵌入到vim中,速度更快。@AlexPoole仍然有点奇怪,您使用一个字段运行
DESC
,然后oracle会给您一个表DESC。应该给出一个错误或该字段的描述。您可以编写自己的过程并执行该过程,但这似乎有些过分了。但仍然不确定您需要它做什么。“这不可能”也可以是一个答案。
description
也会进行选择,它只是对您隐藏它。选择有什么问题@