簡體   English   中英

從 Oracle 中的所有視圖搜索內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM