我有超过 1000 个视图,我想运行一个搜索,该搜索将显示 SQL 中包含字符串
abc
的视图名称。如何搜索所有存储过程/SQL,包括我的视图的存储过程/SQL?当我运行命令时:
SELECT *
FROM all_source
WHERE text LIKE '%abc%'
它返回我的源代码,其中存在字符串
abc
。但这不包括观点。
这在 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
语句处失败,即使其他具有较长文本的视图已成功处理,并且我'我不确定为什么。我没有看到这可能有一些问题。)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>
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>