[英]Search content from all views in Oracle
我在 Oracle 數據庫中有 300 多個視圖。
我在視圖結果中尋找一個字符串。 例如,我想在視圖結果集中查找“可能錄取”。
是否有任何查詢可以掃描所有視圖輸出並為我獲取將具有此字符串的所有視圖的列表。
PS:我不是在創建視圖 SQL 命令中尋找任何字符串。我想要這樣:
Select * from vw_ABC
應該有一個+列有這個字符串。
請讓我知道這是否可行。
謝謝
這樣的代碼應該瀏覽所有視圖及其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;
/
謝謝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.