複用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 查詢所有資料字典的SQLSQL
- Oracle SQL 語句中正規表示式的應用OracleSQL
- Oracle如何複製表的sql語句OracleSQL
- Oracle常用資料字典表Oracle
- sql語句中as的用法SQL
- 匯出Sql Server資料字典的語句SQLServer
- 複製表結構和資料SQL語句SQL
- Oracle表部分資料提取SQL語句OracleSQL
- sql語句中JOIN ON 的使用SQL
- 瞭解Oracle資料字典Oracle
- Oracle sql 語句中帶有特殊的字元處理OracleSQL字元
- oracle資料字典表與檢視Oracle
- oracle資料庫資料字典應用Oracle資料庫
- 【SqlServer】【Oracle】sql複製表定義及複製資料行SQLServerOracle
- Oracle的語句中的提示Oracle
- 資料庫SQL語句中關於explain關鍵字的用法資料庫SQLAI
- sql語句中#{}和${}的區別SQL
- sql語句中as的用法和作用SQL
- sql語句中select……as的用法SQL
- 深入瞭解Oracle資料字典Oracle
- oracle 對於SQL語句中物件名的解析順序OracleSQL物件
- Oracle pl/sql 複製表 資料匯入 匯出OracleSQL
- Oracle的資料字典Oracle
- Oracle 資料庫字典 檢視 基表Oracle資料庫
- oracle 9i刪除public使用者造成資料字典損壞所有sql語句不能操作的故障處理OracleSQL
- Oracle 常用資料字典表、檢視的總結Oracle
- Oracle 常用資料字典檢視、表的總結Oracle
- Oracle中用sql查詢獲取資料庫的所有觸發器,所有儲存過程,所有檢視,所有表...OracleSQL資料庫觸發器儲存過程
- SQL語句中exists和in的區別SQL
- SQL語句中not in 和not exist的區別SQL
- sql語句中as的意思是什麼SQL
- 在sql語句中替換Not In 的方法SQL
- sql語句中常量的處理SQL
- 深入瞭解Oracle資料字典(zt)Oracle
- InnoDB資料字典詳解-系統表
- Oracle AWR中常用到的幾個SQL語句OracleSQL
- oracle 資料字典Oracle
- Oracle 資料字典和資料字典檢視Oracle