mrFalbin
10/24/2018 - 7:12 AM

поискать во всех моих таблицах

поискать во всех моих таблицах (oracle)

--Задача: поискать во всех моих таблицах какое-нибудь значение (например, слово search)
WITH sql_text AS
 (SELECT /*+ materialize*/
   'select ''' || owner || '.' || table_name ||
   ''' as VALUE /*, 1 as flag*/ from dual where exists ( select null from ' || owner || '.' ||
   table_name || ' where ' ||
   rtrim(REPLACE(MAX(sys_connect_by_path('upper(' || column_name || ')  like upper(''%' ||
                                         
                                         'IT_Петр' --:what_search поисковая фраза
                                         
                                         || '%'') OR ',
                                         ',')) keep(dense_rank LAST ORDER BY LEVEL),
                 ','),
         'OR ') || ')' AS sql_text
    FROM (SELECT '"' || c.table_name || '"' AS table_name,
                 '"' || c.column_name || '"' AS column_name,
                 '"' || c.owner || '"' AS owner,
                 row_number() OVER(PARTITION BY c.owner, c.table_name ORDER BY c.column_id) AS rn
            FROM all_tab_columns c, all_objects o
           WHERE data_type IN ('CHAR', 'VARCHAR2')
             AND c.table_name = o.object_name
             AND o.object_type = 'TABLE'
             AND o.owner = c.owner
             AND o.owner = UPPER(
                                 
                                 'prokatmaster' --:owner   схема БД в которой осуществляется поиск 
                                 
                                 )) v_tab_col
   START WITH rn = 1
  CONNECT BY PRIOR table_name = table_name
         AND PRIOR owner = owner
         AND PRIOR rn = rn - 1
   GROUP BY owner, table_name)
SELECT *
  FROM (SELECT extractvalue(dbms_xmlgen.getxmltype(sql_text), '/ROWSET/ROW/VALUE') AS VALUE
          FROM sql_text)
 WHERE VALUE IS NOT NULL