Oracle搜索视图的文本
我有1000多个视图,我想运行一个搜索,它将显示在SQL中包含字符串abc的视图的名称。如何搜索所有存储过程/SQL,包括视图的存储过程/SQL?当我运行命令时: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%'
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不一致的数据类型:预期字符变长。知道为什么吗?我通过添加一些示例编辑了我的消息;看一看。非常感谢你!!它使用第一种方法工作。