从 Oracle 中的所有视图搜索内容

问题描述 投票:0回答:3

我在 Oracle 数据库中有超过 300 个视图。

我正在查看结果中查找字符串。例如,我想在视图结果集中查找“Admissionpossible”。

是否有任何查询可以扫描所有视图输出并获取包含此字符串的所有视图的列表。

PS:我不是在创建视图 SQL 命令中寻找任何字符串。我想要这样的:

Select * from vw_ABC

应该有 1+ 列包含此字符串。

如果可能,请告诉我。

谢谢

sql oracle-database
3个回答
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>

0
投票

请尝试这个:

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;
/

谢谢。


0
投票

此 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;
/
© www.soinside.com 2019 - 2024. All rights reserved.