複用Oracle資料字典解析出SQL語句中用到的所有表

來源:互聯網
上載者:User

原理:

每個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;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.