当前位置: 首页 > 知识库问答 >
问题:

Oracle查询所有_tab_列。data_默认值(长型)

姜楷
2023-03-14

我已运行此查询:

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\u DEFAULT中抛出一个错误:

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

我怎样才能解决这个问题?

谢谢

共有2个答案

秦鸿羽
2023-03-14

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

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;
常茂
2023-03-14

您不能对LONG做任何事情。Oracle仍然在数据字典中使用它们的PITA。

您可以使用XML:

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开始,您可以内联编写自己的查找函数:

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%'
/

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

 类似资料:
  • 问题内容: 我试图识别具有默认值NULL或未设置默认值的数据库列。为此,我正在执行查询。 在此查询的输出中,我正在获取未设置默认值(空)的列,但是我没有在获取默认值是NULL的列 问题答案: 在oracle中(至少11g),如果您不为列提供默认值,就好比给它。 看这个例子 更新 感谢@pratik garg的评论,现在我了解到您所要求的是一种查询列的方法。 由于如@PratikGrag所述,当您定

  • 例如: 是否有一种方法可以指定默认情况下总是添加的所有条件,而不在代码本身中提及它?在Hibernate core中有一个注释,但它不能用于mongo文档。

  • 问题内容: 我有一张带有Clob列的表。需要执行基于Clob列内容的搜索。然而 失败但 似乎很好。oracle如何处理Clob列上的过滤。它仅支持’like’子句,不支持=,!=等。是否与其他数据库(如mysql,postgres等)相同 另外,在像Hibernate这样的实现JPA的框架中如何处理这种情况? 问题答案: 是的,这是不允许的(此限制不影响S IN PL / SQL比较)采用比较运营

  • 问题内容: 我正在运行一个非常简单的查询,但是对于某些结果,一个字段中的值为空。如果该值为null,如何将其设置为“字符串”? 就像是 它将在sql server 2005上运行 谢谢 问题答案: 使用以下内容: 或@Lieven指出: COALESCE的动态之处在于您可以定义更多的参数,因此,如果第一个为null,则获取第二个参数,如果第二个为null,则获取第三个,依此类推…

  • 问题内容: 在Oracle 11g中工作时,我需要在表中存在一个输入值时选择一个与该输入值相对应的数据,而在不存在时选择一个静态默认值。我能找到的最好的方法是编写如下代码: 似乎必须有一些惯用的方法来执行此操作,而这并不依赖于对的奇怪使用,但我找不到它。有谁知道更好的方法吗? 问题答案: 这应该是您所做的工作的简单版本:

  • 我试图在jQuery数据表中包含一个不可见的列,该列可以设置为default,以代替数据源中遇到的null或未定义的列。 假设我正在使用一个6列数据表。前5列可见。第6列设置为不可见。并且它必须包含true或false,而不管数据源对象是否具有相应的键。在DataTable的列定义中,我尝试了这个方法,但没有成功。 根据API,我认为仅在为空时才起作用。也许这就是它不起作用的原因。我提供了超文本标