光标中LONG数据类型出错

时间:2013-07-26 12:28:41

标签: oracle

我正在尝试通过下面的匿名块生成假脱机文件,以便查找特定表格上的视图。

declare
cursor c1 is select view_name,text from users_view;
rt c1%rowtype;
begin
open c1;
loop
fetch c1 into rt;
exit when c1%notfound;
dbms_output.put_line(rt.view_name || '|' || rt.text);
end loop;
end;

当我运行它时,我收到类似“数字或值错误”的错误,但是如果我从游标定义中删除了文本(LONG)列,则该块会没有任何错误。

据我所知,我们不能在where子句中使用LONG数据类型,但它是否也无法在游标中获取?如果是,在这种情况下可以选择什么?

2 个答案:

答案 0 :(得分:2)

在这种情况下,错误表示您已达到缓冲区限制 - dbms_output.put_line不会处理如此大量的数据。

在仔细研究问题之后,这不是dbms_output.put_line问题,不是,正如Alex Poole在你的问题的评论中指出的那样,这是光标问题。所以我建议你使用简单的Select语句(答案中的选项#2)。如果你去寻找解决方法

create table <<name>> as 
  select view_name
       , to_lob(text) 
   from user_views 
例如,您将能够使用光标,但dbms_output.put_line将阻止您

要生成假脱机文件,您至少有两个选项:

  1. 使用UTL_FILE包将数据写入文件。
  2. 让SQL * PLUS完成这项工作。例如:

    set feedback off;
    set termout off;
    set colsep "|";
    set long 20000;   -- increase the size if it's not enough
    set heading off;
    set linesize 150; -- increase the size if it's not enough
    
    
    spool <<file path\file name>>
    
    select view_name
         , text
      from user_views
    
    spool off;
    
  3. 最后,您的<<file path\file name>>文件中会有类似的输出:

    ALL_APPLY_CONFLICT_COLUMNS    |select c.object_owner, 
                                  |       c.object_name,
                                  |       c.method_name,
                                  |       c.resolution_column, c.column_name,
                                  |       c.apply_database_link
                                  |  from all_tab_columns o, 
                                  |       dba_apply_conflict_columns c
                                  | where c.object_owner = o.owner
                                  |   and c.object_name = o.table_name   
                                  |   and c.column_name = o.column_name  
    

答案 1 :(得分:2)

不直接解决long问题,但如果您想查找哪些视图引用特定表,而不是搜索视图源,则可以查询数据字典:

select owner, type, name
from all_dependencies
where referenced_type = 'TABLE'
and referenced_owner = user -- or a specific schema
and referenced_name = '<my_table_name>';

这也将列出表格上的任何触发器等,因此如果您只对视图感兴趣,可以添加and type = 'VIEW'

当然,这可能只是给你一个较小的视图列表,以便更详细地检查每个视图如何使用它,但它比手动搜索所有300个视图更容易......这可能意味着您不需要获取超过32k字符的大型视图文本,这些文本首先会导致long问题。