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

时间:2017-07-10 10:05:53

标签: sql oracle

我已经运行了这个查询:

array(3) {
  [0] =>
  string(16) "A Chatbot record"
  [1] =>
  string(19) "Hello, how are you?"
  [2] =>
  string(8) "I'm Fine"
}

但是它会在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'; 列引发错误:

  

ORA-00932:数据类型不一致:预期CHAR得到LONG
  00932. 00000 - “不一致的数据类型:预期%s获得%s”

我该如何解决?

谢谢!

2 个答案:

答案 0 :(得分:3)

您无法对LONG执行任何操作。它是PITA,Oracle仍在数据字典中使用它们。

您可以使用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';

答案 1 :(得分:1)

以下是一些如何打印LONG的代码。您可以根据需要进行更改。

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;