15

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

例如:

SELECT * 
  FROM ALL_VIEWS 
  WHERE UPPER(TEXT) LIKE '%FOO%';

例外:

ORA-00932: inconsistent datatypes: expected NUMBER got LONG
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

编辑:

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)   
4

5 回答 5

20

不幸的是,您无法通过 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;

在这里,我在文本字段中搜索字符串“union”。

希望有帮助。

于 2012-02-10T15:26:40.553 回答
12

不幸的是,您不能在 SQL 中轻松操作 LONG 列。

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

SELECT * 
  FROM all_dependencies 
 WHERE type = 'VIEW' 
   AND referenced_owner = 'TABLE_OWNER'
   AND referenced_name = 'YOUR_TABLE';
于 2012-02-10T14:28:34.553 回答
4

搜索 TEXT_VC 而不是 TEXT

SELECT * 
 FROM ALL_VIEWS 
 WHERE UPPER(TEXT_VC) LIKE '%FOO%';
于 2018-07-20T15:30:01.437 回答
0
  1. 在 Oracle Developer 上运行并导出到 Excel

    SELECT view_name, text from all_views where owner = 'MyDb'

甲骨文开发人员

  1. 将 Excel 文件导入 SQL Server(到 [ALL_VIEWS] 表)

    SELECT [VIEW_NAME], [TEXT] FROM [MyDb].[dbo].[ALL_VIEWS] WHERE [TEXT] LIKE '%FOO%'

于 2017-04-24T15:29:15.967 回答
0

如果您使用的是 12c 之前的版本(text_vc仅存在于 12.1+ 中)并且您可以通过前 4000 个字符充分扫描您的视图,则以下查询将起作用。

with parsed_all_views as (
  select owner, view_name, text_length, TEXT as VARCHAR_TEXT
  from xmltable( '/ROWSET/ROW' passing dbms_xmlgen.getXMLType(
    'select TEXT, owner, view_name, text_length  '
    ||' from all_views WHERE owner = ''**YOUR_SCHEMA_NAME**'' '
  ) columns  TEXT varchar2(4000), owner varchar2(32), view_name  
  varchar2(32), text_length  varchar2(32)) 
)

select * from parsed_all_views where upper(VARCHAR_TEXT) like '%DISTINCT%'
于 2018-10-29T18:13:27.467 回答