Oracle搜索视图的文本

Oracle搜索视图的文本,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,我有1000多个视图,我想运行一个搜索,它将显示在SQL中包含字符串abc的视图的名称。如何搜索所有存储过程/SQL,包括视图的存储过程/SQL?当我运行命令时: SELECT * FROM all_source WHERE text LIKE '%abc%' 它返回字符串abc所在的源代码。但这不包括观点 选择所有视图,而列名也是文本 不过,您更愿意使用一个上限或下限函数作为 select * from all_views where lower(text) like '%abc%'

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

SELECT *
FROM   all_source
WHERE  text LIKE '%abc%'
它返回字符串abc所在的源代码。但这不包括观点

选择所有视图,而列名也是文本

不过,您更愿意使用一个上限或下限函数作为

select *
from all_views
where lower(text) like '%abc%'
因为一次你可能会把它叫做“abc”,另一次叫做“abc”,等等

[编辑,因为ORA-00932]

哦,是的-在所有的\u视图中,文本列是一个长数据类型,而在所有的\u源代码中,它是一个VARCHAR2,所以LIKE不能在所有的\u视图上工作

一个选项是创建包含所有视图的临时表&在文本列上应用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>

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

select *
from   all_views v
where  lower(v.text_vc) like '%abc%';
这假定您要查找的文本字符串在前4000个字符中。您还可以让报告包含文本长度>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长值转换为32K PL/SQL字符串


在我在12.2.0.1.0中的测试中,当光标包含SYS.DBA_SCHEDULER_RUNNING_JOBS或SYS.user_stat时,select语句中出现ORA-06502:PL/SQL:numeric或value错误,即使成功处理了其他文本较长的视图,但失败了,我不确定原因。这可能有一些问题,我没有看到。

谢谢。我试过运行这个。获取错误:ORA00932不一致的数据类型:预期字符变长。知道为什么吗?我通过添加一些示例编辑了我的消息;看一看。非常感谢你!!它使用第一种方法工作。