複用Oracle資料字典解析出SQL語句中用到的所有表
原理:每個sql語句都它的執行計劃,並且執行計劃會放在plan_table中,plan_table中有object_name一列,該列表示sql語句中的物件名字,執行計劃對錶很感興趣,所以如果object_type=’TABLE’,那麼object_name就是我們要擷取的table_name
執行步驟:
1、建立tmp_table 表,存放job名job_id,sql語句select_sql,和表名object_name
create table tmp_table(job_idvarchar2(50),select_sql clob,object_name varchar2(50));
模擬資料:
A job中是一條比較短的sql語句
B job中是一條比較長的sql語句
INSERTINTO TMP_TABLE VLAUES(‘A’,q’[A中的內容]’);
INSERTINTO TMP_TABLE VLAUES(‘B’,q’[B中的內容]’);
Commit;
2、建立p儲存過程,根據執行計劃
--以下是用4000以下的A job和4000 以上的B一起執行
create or replace procedure sqljiexiqi as
v_str varchar2(4000);
v_sql varchar2(4000);
v_sql1 varchar2(4000);
v_sql2 varchar2(4000);
v_sql3 varchar2(4000);
v_sql4 varchar2(4000);
v_sql5 varchar2(4000);
v_sql6 varchar2(4000);
v_sql7 varchar2(4000);
v_sql8 varchar2(4000);
v_sql9 varchar2(4000);
begin
dbms_output.enable(8000);
execute immediate 'truncate table tmp_table';
forc in (select job_id, select_sql
from bds.etl_job_info
where length(trim(select_sql)) < 4000
and job_id = 'A') loop
v_sql := 'explain plan SET STATEMENT_ID=''' || c.job_id || ''' for ' ||
c.select_sql;
execute immediate v_sql;
for re in (select distinct object_name
from plan_table
where statement_id = c.job_id
and object_type = 'TABLE') loop
insert into tmp_table
(job_id, select_sql, object_name)
values
(c.job_id, c.select_sql, re.object_name);
end loop;
commit;
endloop;
forc in (select job_id, select_sql
from bds.etl_job_info
where length(trim(select_sql)) > =4000
and job_id ='SJ_AS_CM_MORT_DTL_D') loop
v_str := 'explain plan SETSTATEMENT_ID=''' || c.job_id || ''' for ';
v_sql := substr(c.select_sql, 1,4000);
v_sql1 := substr(c.select_sql, 1 * 4000 + 1, 4000);
v_sql2 := substr(c.select_sql, 2 * 4000 + 1, 4000);
v_sql3 := substr(c.select_sql, 3 * 4000 + 1, 4000);
v_sql4 := substr(c.select_sql, 4 * 4000 + 1, 4000);
v_sql5 := substr(c.select_sql, 5 * 4000 + 1, 4000);
v_sql6:= substr(c.select_sql, 6 * 4000 + 1, 4000);
v_sql7 := substr(c.select_sql, 7 * 4000 + 1, 4000);
v_sql8 := substr(c.select_sql, 8 * 4000 + 1, 4000);
v_sql9 := substr(c.select_sql, 9 * 4000 + 1, 4000);
execute immediate v_str || v_sql || v_sql1 || v_sql2 || v_sql3 ||
v_sql4 || v_sql5 ||v_sql6 || v_sql7 || v_sql8 ||
v_sql9;
for re in (select distinct object_name
from plan_table
where statement_id = c.job_id
and object_type = 'TABLE')loop
insert into tmp_table
(job_id, select_sql, object_name)
values
(c.job_id, c.select_sql, re.object_name);
end loop;
commit;
endloop;
end;
3、執行儲存過程
exec sqljiexiqi;
4、查詢tmp_table表,得到sql中有哪些表
select * from tmp_table;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-752640/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle sql 語句中帶有特殊的字元處理OracleSQL字元
- sql語句中JOIN ON 的使用SQL
- oracle資料庫資料字典應用Oracle資料庫
- 複製表結構和資料SQL語句SQL
- sql語句中#{}和${}的區別SQL
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- 資料庫SQL語句中關於explain關鍵字的用法資料庫SQLAI
- SQL語句中not in 和not exist的區別SQL
- SQL語句中exists和in的區別SQL
- MyBatis在SQL語句中取list的大小MyBatisSQL
- SQL語句在oracle資料庫中的初級應用(上)SQLOracle資料庫
- 表的連線是指在一個SQL語句中通過表與表之間的關連SQL
- MyBatis的使用三(在sql語句中傳值)MyBatisSQL
- InnoDB資料字典詳解-系統表
- SQL語句中 left join 後用 on 還是 where,區別大SQL
- 什麼是Oracle的資料字典?Oracle
- Python 提取出SQL語句中Where的值的方法PythonSQL
- Oracle SQL精妙SQL語句講解OracleSQL
- InnoDB資料字典--字典表載入
- Oracle中刪除表中的重複資料Oracle
- SQL Server 查詢資料庫中所有表資料條數SQLServer資料庫
- 【TUNE_ORACLE】查出所有有“select *”語句的SQL參考OracleSQL
- [20180928]避免表示式在sql語句中.txtSQL
- 如何自動填充SQL語句中的公共欄位SQL
- SQL語句中的AND和OR執行順序問題SQL
- mssql sqlserver 使用sql指令碼 清空所有資料庫表資料的方法分享SQLServer指令碼資料庫
- T-SQL——關於表資料的複製插入SQL
- SQL語句中不同的連線JOIN及SQL中join的各種用法SQL
- SQL語句中聚合函式忽略NULL值的總結SQL函式Null
- sql語句中where一定要放在group by 之前SQL
- 如何剔掉 sql 語句中的尾巴,我用 C# 苦思了五種辦法SQLC#
- SQL Server 2014 匯出資料字典SQLServer
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- Oracle相關資料字典檢視Oracle
- 談談術語表、資料字典、資料目錄分別是什麼
- Oracle OCP(01):使用SQL SELECT語句檢索資料OracleSQL
- PostgreSQL:所有支援的資料型別及建表語句例項SQL資料型別
- Mysql建表語句中顯示雙引號MySql