我正在尝试通过下面的匿名块生成假脱机文件,以便查找特定表格上的视图。
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数据类型,但它是否也无法在游标中获取?如果是,在这种情况下可以选择什么?
答案 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
将阻止您
要生成假脱机文件,您至少有两个选项:
让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;
最后,您的<<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
问题。