过滤all_views上的"文本"列

Vit*_*tas 11 sql oracle views oracle9i ora-00932

有什么办法可以过滤oracle的all_views表上的文本列吗?

例如:

SELECT * 
  FROM ALL_VIEWS 
  WHERE UPPER(TEXT) LIKE '%FOO%';
Run Code Online (Sandbox Code Playgroud)

例外:

ORA-00932: inconsistent datatypes: expected NUMBER got LONG
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
Run Code Online (Sandbox Code Playgroud)

编辑:

DESC ALL_VIEWS
Name             Null     Type           
---------------- -------- -------------- 
OWNER            NOT NULL VARCHAR2(30)   
VIEW_NAME        NOT NULL VARCHAR2(30)   
TEXT_LENGTH               NUMBER         
TEXT                      LONG()         
TYPE_TEXT_LENGTH          NUMBER         
TYPE_TEXT                 VARCHAR2(4000) 
OID_TEXT_LENGTH           NUMBER         
OID_TEXT                  VARCHAR2(4000) 
VIEW_TYPE_OWNER           VARCHAR2(30)   
VIEW_TYPE                 VARCHAR2(30)   
SUPERVIEW_NAME            VARCHAR2(30)   
Run Code Online (Sandbox Code Playgroud)

tbo*_*one 17

不幸的是,您无法通过select语句动态转换为clob.to_lob函数与INSERT语句一起使用,但这意味着您需要设置一个单独的表并使用to_lob进行插入.

您可以在pl/sql中对varchar进行赋值转换,并且大多数时候您会发现all_views中的text_length是<32767,因此这将涵盖"大多数"情况,尽管它只是选择:

declare

  l_search varchar2(1000) := 'union';
  l_char varchar2(32767);

begin
  for rec in (select * from all_views where text_length < 32767)
  loop
    l_char := rec.text;
    if (instr(l_char, l_search) > 0) then
      dbms_output.put_line('Match found for ' || rec.owner || '.' || rec.view_name);
    end if;
  end loop;

end;
Run Code Online (Sandbox Code Playgroud)

在这里,我在文本字段中搜索字符串'union'.

希望有所帮助.


Vin*_*rat 9

不幸的是,您无法在SQL中轻松操作LONG列.

对于您当前的问题,作为一种变通方法,您可以使用*_DEPENDENCIES视图查找依赖于表的所有视图:

SELECT * 
  FROM all_dependencies 
 WHERE type = 'VIEW' 
   AND referenced_owner = 'TABLE_OWNER'
   AND referenced_name = 'YOUR_TABLE';
Run Code Online (Sandbox Code Playgroud)