首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle查询all_tab_columns.data_default (类型为LONG)

Oracle查询all_tab_columns.data_default (类型为LONG)
EN

Stack Overflow用户
提问于 2017-07-10 18:05:53
回答 2查看 4K关注 0票数 3

我已经运行了这个查询:

代码语言:javascript
运行
复制
SELECT
    OWNER,
    TABLE_NAME,
    COLUMN_NAME,
    DATA_TYPE,
    DATA_LENGTH,
    (CASE
        WHEN DATA_PRECISION IS NULL THEN 0
        ELSE DATA_PRECISION
     END) DATA_PRECISION,
    (CASE
        WHEN DATA_SCALE IS NULL THEN 0
        ELSE DATA_SCALE
     END) DATA_SCALE,
    NULLABLE,
    COLUMN_ID
    DEFAULT_LENGTH,
    DATA_DEFAULT,
    (CASE
        WHEN DATA_DEFAULT IS NULL THEN '0'
        ELSE DATA_DEFAULT
     END) DATA_DEFAULT1
FROM 
    all_tab_columns
WHERE 
    table_name LIKE 'TABLE1';

但是它在列抛出了一个错误DATA_DEFAULT

ORA-00932:不一致的数据类型:预期的字符变得很长

00932。00000 -“不一致的数据类型:预期的%s得到%s”

我怎么才能解决这个问题呢?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-11 02:07:41

您不能使用LONG。Oracle仍然在数据字典中使用它们,这是一个缺陷。

您可以使用XML:

代码语言:javascript
运行
复制
select owner
     , table_name
     , column_name
     , data_type
     , data_length
     , case
           when data_precision is null then 0
           else data_precision
       end data_precision
     , case
           when data_scale is null then 0
           else data_scale
       end data_scale
     , nullable
     , column_id
     , default_length
     , case
           when default_length is null then '0'
           else
               extractvalue
               ( dbms_xmlgen.getxmltype
                 ( 'select data_default from user_tab_columns where table_name = ''' || c.table_name || ''' and column_name = ''' || c.column_name || '''' )
               , '//text()' )
       end as data_default
from   all_tab_columns c
where  table_name like 'TABLE1';

从12.1开始,您可以编写自己的内联查找函数:

代码语言:javascript
运行
复制
with
     function get_default(tab varchar2, col varchar2) return varchar2
     as
         dflt varchar2(4000);
     begin
         select c.data_default into dflt
         from   user_tab_columns c
         where  c.table_name = upper(tab)
         and    c.column_name = upper(col);
         
         return dflt;
     end get_default;
select owner
     , table_name
     , column_name
     , data_type
     , data_length
     , case
           when data_precision is null then 0
           else data_precision
       end data_precision
     , case
           when data_scale is null then 0
           else data_scale
       end data_scale
     , nullable
     , column_id
     , default_length
     , get_default(c.table_name, c.column_name) as data_default
from   all_tab_columns c
where  table_name like 'TABLE1%'
/

当然,也可以创建一个独立函数或包函数来做同样的事情。

票数 9
EN

Stack Overflow用户

发布于 2017-07-10 18:39:58

这里有一些如何打印你的长整型的代码。你可以随心所欲地改变它。

代码语言:javascript
运行
复制
set serveroutput on
declare
  cursor c1 is
  select 
  OWNER
    ,TABLE_NAME
    ,COLUMN_NAME
    ,DATA_TYPE
    ,DATA_LENGTH
    ,(CASE WHEN DATA_PRECISION IS NULL THEN 0 ELSE DATA_PRECISION END) DATA_PRECISION
    ,(CASE WHEN DATA_SCALE IS NULL THEN 0 ELSE DATA_SCALE END) DATA_SCALE
    ,NULLABLE
    ,COLUMN_ID
    ,DEFAULT_LENGTH
    ,DATA_DEFAULT
  from all_Tab_columns where table_name='ENTITIES' and default_length is not null;
v_long long;
v_varchar2 varchar2(4000);
begin
  for loop1 in c1
  loop
    v_long := loop1.DATA_DEFAULT;
    v_varchar2 := substr(v_long,1,4000);
    dbms_output.put_line(v_varchar2); 
  end loop;
end;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45009225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档