Oracle搜索视图文本

时间:2018-08-02 08:53:45

标签: oracle oracle11g oracle10g

我有1000多个视图,我想运行一个搜索,该搜索将在SQL中显示包含字符串abc的视图的名称。如何搜索所有存储过程/ SQL(包括视图中的存储过程/ SQL)?当我运行命令时:

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

它返回给我源代码,其中包含字符串abc。但这不包括视图。

2 个答案:

答案 0 :(得分:2)

改为选择ALL_VIEWS(列名也为TEXT)。

不过,您宁愿使用UPPERLOWER函数之一作为

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

因为一旦您将其设置为“ abc”,又一次将其设置为“ ABC”,等等。

[由于ORA-00932而进行编辑]

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

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

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>

答案 1 :(得分:1)

在12c中,您可以轻松使用它

?

这假定您要查找的文本字符串的前4000个字符。您可能还会使报告包含select * from all_views v where lower(v.text_vc) like '%abc%'; > 4000的所有视图以及警告。

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

text_length

PL / SQL将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; 值隐式转换为32K PL / SQL字符串。

(在我的12.2.0.1.0中的测试中,即使我的光标包含LONGORA-06502: PL/SQL: numeric or value error,即使其他视图,在select语句中SYS.DBA_SCHEDULER_RUNNING_JOBS也失败了文本较长的文件已成功处理,我不确定为什么。可能是我看不到此问题。)