我在 Oracle 数据库中有超过 300 个视图。
我正在查看结果中查找字符串。例如,我想在视图结果集中查找“Admissionpossible”。
是否有任何查询可以扫描所有视图输出并获取包含此字符串的所有视图的列表。
PS:我不是在创建视图 SQL 命令中寻找任何字符串。我想要这样的:
Select * from vw_ABC
应该有 1+ 列包含此字符串。
如果可能,请告诉我。
谢谢
这样的代码应该浏览所有视图及其
VARCHAR2
列(当您搜索字符串时)并显示视图名称、包含该值的列名称和出现次数。看看有没有帮助。
我的架构中的视图:
SQL> select view_name from user_views;
VIEW_NAME
------------------------------
VEMP
VTEST
其中一个包含您要查找的字符串:
SQL> select * from vtest;
NAME
------------------
Admission Possible
代码及结果:
SQL> DECLARE
2 l_str VARCHAR2 (500);
3 l_cnt NUMBER := 0;
4 BEGIN
5 FOR cur_r IN (SELECT u.table_name, u.column_name
6 FROM user_tab_columns u, user_views t
7 WHERE u.table_name = t.view_name
8 AND u.data_type in ('CHAR', 'VARCHAR2'))
9 LOOP
10 l_str :=
11 'SELECT COUNT(*) FROM '
12 || cur_r.table_name
13 || ' WHERE '
14 || cur_r.column_name
15 || ' like (''%Admission Possible%'')';
16
17 EXECUTE IMMEDIATE (l_str)
18 INTO l_cnt;
19
20 IF l_cnt > 0
21 THEN
22 DBMS_OUTPUT.put_line (
23 l_cnt || ' : ' || cur_r.table_name || '.' || cur_r.column_name);
24 END IF;
25 END LOOP;
26 END;
27 /
1 : VTEST.NAME
PL/SQL procedure successfully completed.
SQL>
请尝试这个:
set serveroutput on;
declare
l_cnt integer;
begin
for rec in (
select
col.owner as schema_name,
col.table_name,
col.column_name,
col.data_type,
'select count(1) from ' || col.owner || '.' || col.table_name || ' where lower(' || col.column_name || ') like ''%addmission possible%''' as str
from
all_tab_columns col
inner join all_views v on (col.owner = v.owner and col.table_name = v.view_name)
where
col.data_type in ('CHAR', 'VARCHAR', 'VARCHAR2', 'NCHAR', 'NVARCHAR2')
and col.owner not in
(
'ANONYMOUS','CTXSYS','DBSNMP','EXFSYS', 'LBACSYS',
'MDSYS', 'MGMT_VIEW','OLAPSYS','OWBSYS','ORDPLUGINS', 'ORDSYS',
'SI_INFORMTN_SCHEMA','SYS','SYSMAN','SYSTEM', 'TSMSYS','WK_TEST',
'WKPROXY','WMSYS','XDB','APEX_040000', 'APEX_PUBLIC_USER','DIP',
'FLOWS_30000','FLOWS_FILES','MDDATA', 'ORACLE_OCM', 'XS$NULL',
'SPATIAL_CSW_ADMIN_USR', 'SPATIAL_WFS_ADMIN_USR', 'PUBLIC',
'OUTLN', 'WKSYS', 'APEX_040200'
)
order by col.owner, col.table_name, col.column_id
) loop
execute immediate (rec.str) into l_cnt;
if l_cnt > 0 then
dbms_output.put_line(rec.schema_name || '.' || rec.table_name || '.' || rec.column_name || ' has match');
end if;
end loop;
end;
/
谢谢。
此 PL/SQL 脚本迭代指定模式中的所有视图,并在视图定义中搜索给定文本或关键字。它使用 DBMS_METADATA.GET_DDL 提取每个视图的 DDL,并使用 DBMS_LOB.INSTR 执行不区分大小写的搜索。此方法有助于通过利用 CLOB 输出来解决处理 LONG 数据类型的问题,从而允许更直接的文本处理。将 &owner 替换为架构名称,将 &inputtext 替换为您要搜索的关键字。
-- To search for text in view definition
DECLARE
v_view_name VARCHAR2(200);
v_ddl CLOB;
BEGIN
-- Loop through all views in a given schema
FOR rec IN (SELECT view_name FROM all_views WHERE owner = '&owner' ORDER BY view_name) LOOP
v_view_name := rec.view_name;
v_ddl := DBMS_METADATA.GET_DDL('VIEW', v_view_name);
-- INPUT THE SEARCH STRING/KEYWORD BELOW
IF DBMS_LOB.INSTR(UPPER(v_ddl), UPPER('&inputtext')) > 0 THEN
DBMS_OUTPUT.PUT_LINE('View Name: ' || v_view_name);
--DBMS_OUTPUT.PUT_LINE('DDL: ' || TO_CHAR(v_ddl));
--DBMS_OUTPUT.PUT_LINE('--------------------------------------------');
END IF;
END LOOP;
END;
/