oracle實用sql(12)--查詢資料是否在某個使用者下各個表的各個列
--存放使用者的使用者名稱,表名,列名,列型別,批次號(表中50個列分一個批次)。owner根據自己的需求改
--drop table tb_all_column
create table tb_all_column as
select owner, table_name, column_name, data_type,trunc(row_number() over (partition by owner,table_name order by 1)/50) lot
from dba_tab_columns a
where table_name not like 'BIN$%'
and data_type in('VARCHAR2','CHAR','NVARCHAR2','NCHAR','CLOB')
and owner='SCOTT'
--存放使用者的使用者名稱,表名,批次號,is_search是否檢查過,is_exists表中是否存在滿足條件的表。owner根據自己的需求改
--後面可以透過查詢表tb_search,來確認有沒有檢查完,有沒有滿足條件的表
--drop table tb_search
create table tb_search as
select distinct owner, table_name,lot, 'N' is_search, 'N' is_exists
from tb_all_column
order by owner, table_name,lot;
--處理
declare
v_search varchar2(50) := 'xxx';
i_count integer;
begin
--對於沒有檢查過的表進行檢查
for i in (select owner,
table_name,
lot,
'select /*+parallel(t 8)*/ count(1) from ' || owner || '.' || table_name ||
' t where 1=2 ' || col_where i_sql
from (select a.owner,
a.table_name,
a.lot,
to_char(replace(wmsys.wm_concat('or ' ||
a.column_name ||
' like ' || '''%' ||
v_search || '%'' '),
',',
'')) col_where
from tb_all_column a, tb_search b
where a.owner = b.owner
and a.table_name = b.table_name
and a.lot = b.lot
and b.is_search = 'N'
group by a.owner, a.table_name, a.lot)) loop
--這裡我只是把滿足條件的表找出來,也可以透過rowid的方式把表中指定的行記錄下來。
execute immediate i.i_sql
into i_count;
--如果沒有滿足條件的記錄,只標記 is_search = 'Y';如果有滿足條件的記錄,標記 is_search = 'Y', is_exists = 'Y'
if i_count = 0 then
begin
update tb_search
set is_search = 'Y'
where owner = i.owner
and table_name = i.table_name
and lot = i.lot;
commit;
end;
else
begin
update tb_search
set is_search = 'Y', is_exists = 'Y'
where owner = i.owner
and table_name = i.table_name
and lot = i.lot;
commit;
end;
end if;
end loop;
end;
-------------listagg版
--存放使用者的使用者名稱,表名,列名,列型別,批次號。owner根據自己的需求改
--drop table tb_all_column
create table tb_all_column as
select owner, table_name, column_name, data_type,trunc(row_number() over (partition by owner,table_name order by 1)/50) lot
from dba_tab_columns a
where table_name not like 'BIN$%'
and data_type in('VARCHAR2','CHAR','NVARCHAR2','NCHAR','CLOB')
and owner='SYSMAN'
--存放使用者的使用者名稱,表名,批次號,is_search是否檢查過,is_exists表中是否存在滿足條件的表。owner根據自己的需求改
--後面可以透過查詢表tb_search,來確認有沒有檢查完,有沒有滿足條件的表
--drop table tb_search
create table tb_search as
select distinct owner, table_name,lot, 'N' is_search, 'N' is_exists
from tb_all_column
order by owner, table_name,lot;
declare
v_search varchar2(50) := 'from mgmt$metric_current';
i_count integer;
begin
--對於沒有檢查過的表進行檢查
for i in (select owner,
table_name,
lot,
'select /*+parallel(t 4)*/ count(1) from ' || owner || '.' || table_name ||
' t where 1=2 ' || col_where i_sql
from (select a.owner,
a.table_name,
a.lot,
listagg('or "' ||a.column_name || '" like ' || '''%' ||v_search || '%'' ')
within group (order by a.column_name) col_where
from tb_all_column a, tb_search b
where a.owner = b.owner
and a.table_name = b.table_name
and a.lot = b.lot
and b.is_search = 'N'
group by a.owner, a.table_name, a.lot)) loop
--這裡我只是把滿足條件的表找出來,也可以透過rowid的方式把表中指定的行記錄下來。
execute immediate i.i_sql
into i_count;
--如果沒有滿足條件的記錄,只標記 is_search = 'Y';如果有滿足條件的記錄,標記 is_search = 'Y', is_exists = 'Y'
if i_count = 0 then
begin
update tb_search
set is_search = 'Y'
where owner = i.owner
and table_name = i.table_name
and lot = i.lot;
commit;
end;
else
begin
update tb_search
set is_search = 'Y', is_exists = 'Y'
where owner = i.owner
and table_name = i.table_name
and lot = i.lot;
commit;
end;
end if;
end loop;
end;
-------------x$表
--drop table tb_all_colum
create table tb_all_column as
select kqfcotob table_id,kqfconam column_name
from x$kqfco a
where kqfcodty=1
--drop table tb_search
create table tb_search as
select kqftaobj table_id,kqftanam table_name, 'N' is_search, 'N' is_exist from x$kqfta;
declare
v_search varchar2(50) := '1438';
i_count integer;
begin
--對於沒有檢查過的表進行檢查
for i in (select table_name,
'select /*+parallel(t 2)*/ count(1) from ' || table_name ||
' t where 1=2 ' || col_where i_sql
from (select b.table_name,
to_char(replace(wmsys.wm_concat('or "' ||
a.column_name ||
'" like ' || '''%' ||
v_search || '%'' '),
',',
'')) col_where
from tb_all_column a, tb_search b
where a.table_id = b.table_id
and b.is_search = 'N'
group by b.table_name)) loop
--這裡我只是把滿足條件的表找出來,也可以透過rowid的方式把表中指定的行記錄下來。
execute immediate i.i_sql
into i_count;
--如果沒有滿足條件的記錄,只標記 is_search = 'Y';如果有滿足條件的記錄,標記 is_search = 'Y', is_exists = 'Y'
if i_count = 0 then
begin
update tb_search
set is_search = 'Y'
where table_name = i.table_name;
commit;
end;
else
begin
update tb_search
set is_search = 'Y', is_exist = 'Y'
where table_name = i.table_name ;
commit;
end;
end if;
end loop;
end;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2132813/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 各個scn的查詢方法
- SQL Server資料庫檢視一個資料表各列的註釋SQLServer資料庫
- Sql查詢 一個表中某欄位的資料在另一個表中某欄位中不存在的SQL
- SQL2008查詢某資料庫中的某個值是否存在SQL資料庫
- 如何查詢某個資料表中除某個欄位的所有資訊???
- Oracle 查詢各個 “表空間/資料檔案” 的空間使用比情況Oracle
- 在Oracle 中查詢某個欄位存在於哪幾個表 (轉)Oracle
- 查詢某個表的索引資訊索引
- ORACLE資料庫各個版本PATCHOracle資料庫
- SQLSERVER查詢某個資料庫有幾張表SQLServer資料庫
- oracle 匯出某個使用者下的表Oracle
- oracle GlodenGate 在各個平臺下的安裝Oracle
- SQL Server中各個系統表的作用SQLServer
- Oracle 查詢某個session正在執行的sql語句OracleSessionSQL
- [Linux shell]查詢某目錄下檔案是否包含某個字串Linux字串
- oracle中檢視某個表的索引是否有效Oracle索引
- mysql查詢每個班的各學科平均分的sql語句MySql
- Oracle 查詢多個資料Oracle
- efcore 跨表查詢,實現一個介面內查詢兩個不同資料庫裡各自的表資料資料庫
- Android SDK下各個資料夾作用Android
- aix下檢視各個資料夾大小AI
- 查詢資料庫每個表佔用的大小資料庫
- JS 中 this 在各個場景下的指向JS
- SQL多個表實現聯合查詢SQL
- 如何用exp 匯出 某個表的某幾列資料
- Oracle中對兩個資料表交集的查詢(轉)Oracle
- mongodb查詢資料庫中某個欄位中的值包含某個字串的方法MongoDB資料庫字串
- 查詢某個表最後修改時間
- 記一個實用的sql查詢語句SQL
- Linux - 查詢目錄下的所有檔案中是否含某個字串Linux字串
- SQL 兩個表組合查詢SQL
- SAP QM 檢驗批上各個MIC質檢結果的查詢報表?
- jquery各個版本下載jQuery
- C++查詢一個數是否在陣列中find用法C++陣列
- 查詢oracle各元件的版本Oracle元件
- 查詢一個表的一列插入到另一個表
- 在dba_tables 這個資料字典查不到某個表
- 設計一個介面支援各種查詢條件