Oracle 搜索视图文本

问题描述 投票:0回答:3

我有超过 1000 个视图,我想运行一个搜索,该搜索将显示 SQL 中包含字符串

abc
的视图名称。如何搜索所有存储过程/SQL,包括我的视图的存储过程/SQL?当我运行命令时:

SELECT *
FROM   all_source
WHERE  text LIKE '%abc%'

它返回我的源代码,其中存在字符串

abc
。但这不包括观点。

oracle-database oracle11g oracle10g
3个回答
15
投票

这在 12c 中变得更容易,您可以在其中使用

select *
from   all_views v
where  lower(v.text_vc) like '%abc%';

这假设您要查找的文本字符串位于前 4000 个字符中。您还可以让报告包含

text_length
> 4000 的任何视图以及警告。

在早期版本中(或为了避免 4000 个字符的限制),您可以尝试像这样的 PL/SQL 循环:

begin
    dbms_output.put_line('Owner                          View name');
    dbms_output.put_line('------------------------------ -------------------------------');

    for r in (
        select v.owner, v.view_name, v.text
        from   all_views v
        where  v.owner <> 'SYS'
    )
    loop
        if lower(r.text) like '%abc%' then
            dbms_output.put_line(rpad(r.owner,31) || r.view_name);
        end if;
    end loop;
end;

PL/SQL 将 SQL

LONG
值隐式转换为 32K PL/SQL 字符串。

(在 12.2.0.1.0 中的测试中,当我的光标包含

ORA-06502: PL/SQL: numeric or value error
select
时,在
SYS.DBA_SCHEDULER_RUNNING_JOBS
语句处失败,即使其他具有较长文本的视图已成功处理,并且我'我不确定为什么。我没有看到这可能有一些问题。)
    


4
投票
SYS."_user_stat"

(列名称也是

ALL_VIEWS
)。

不过,您宁愿使用

TEXT

UPPER
函数之一作为

LOWER

因为一次你可能把它写成“abc”,另一次写成“ABC”,等等。

[编辑,因为 ORA-00932]

哦,是的 - 在 ALL_VIEWS 中,TEXT 列是 LONG 数据类型(而在 ALL_SOURCE 中它是 VARCHAR2,因此 LIKE 不适用于 ALL_VIEWS。

一种选择是创建一个包含所有视图的“临时”表,并在 TEXT 列上应用 TO_LOB 函数,然后从中选择:

select * from all_views where lower(text) like '%abc%'

它的缺点是不可扩展;如果创建新视图,则必须重新创建表。

或者,您可以创建自己的函数来执行该搜索。例如:

SQL> create or replace view my_emp as select empno, ename xxx_ename, job from emp; View created. SQL> create table my_all_views as 2 select owner, view_name, to_lob(text) text 3 from all_views; Table created. SQL> select owner, view_name 2 from my_all_views 3 where lower(text) like '%xxx%'; OWNER VIEW_NAME ------------------------------ ------------------------------ SYS USER_SCHEDULER_JOB_DESTS SYS ALL_SCHEDULER_JOB_DESTS SYS USER_XML_SCHEMAS SYS ALL_XML_SCHEMAS SYS ALL_XML_SCHEMAS2 SCOTT MY_EMP 6 rows selected. SQL>



0
投票

SQL> create or replace function f_search_view (par_string in varchar2) 2 return sys.odcivarchar2list 3 pipelined 4 is 5 begin 6 for cur_r in (select view_name, text from all_views 7 where text_length < 32767) 8 loop 9 if instr(cur_r.text, par_string) > 0 then 10 pipe row(cur_r.view_name); 11 end if; 12 end loop; 13 14 return; 15 end; 16 / Function created. SQL> select * from table(f_search_view('xxx')); COLUMN_VALUE -------------------------------------------------------------------------------- USER_XML_SCHEMAS ALL_XML_SCHEMAS ALL_XML_SCHEMAS2 MY_EMP SQL>

	
© www.soinside.com 2019 - 2024. All rights reserved.