หน้าเว็บ

วันจันทร์ที่ 30 มิถุนายน พ.ศ. 2557

pl/sql oracle drop table starting with


        บทความนี้เป็นตัวอย่างของการเขียน pl/sql เพื่อทำการ drop table ครับ (ดู code ดีๆ น่ะครับ  ผม purge ทิ้งเลย คือ  drop แบบไม่ต้องเก็บไว้ใน recycle bin  ถ้าใครจะเอาไปใช้  ดูดีๆ ก่อนน่ะครับ)

โดยมีเป้าหมาย คือ
        เพื่อ drop ทุก table ใน schema ที่เราต้องการ เฉพาะ table ที่มีชื่อขึ้นต้นด้วย Prefix_XXX

        เวลาผม  พัฒนาโปรเจ็คใดๆ  ก็ตาม  ก่อนที่ผมจะตั้งชื่อ table จริงๆ  นั้น  ผมจะมีการตั้ง prefix นำหน้า table ก่อนเสมอครับ  เพื่อความง่ายในการจัดการในภายหลัง  เพราะบางที  เราอาจมีการเรียกใช้ table จากภายนอกที่เราไม่ได้เป็นคนสร้างเอง  ชื่อ table เราอาจซ้ำกับของคนอื่นก็ได้  เพื่อเป็นการป้องกันปัญหาดังกล่าว  ก็ตั้ง prefix ให้มันซ่ะเลยครับ


        เวลาเขียนโปรแกรมจัดการ  มันก็จะได้ง่ายด้วย  หรือบางที prefix ที่เราตั้งขึ้นมา  อาจมีหน้าที่ เฉพาะเจาะจงไว้ทำอะไรบางอย่าง  เช่น  ตัวอย่างที่ผมเจอ  คือ  เขาให้ผมเขียนโปรแกรมเพื่อทำการ backup ข้อมูลทุกปี  ซึ่งมีจำนวน tables ประมาณ 80 tables ถ้าให้ทำมือ  คงไม่ไหว  ผมก็เลยทำการเขียน pl/sql เพื่อ copy ข้อมูล ทั้ง 80 table นั้นมาทำเป็น transaction_log ไว้  อาจจะฟังดูยากตอนเขียนโปรแกรม  แต่แน่นอนครับ code ผมเอาไปใช้กับโปรเจ็คอื่นๆ  ได้อีก  เรียกว่า  เขียนทีเดียวคุ้มครับ  เกริ่นมานานล่ะ  มาดู code drop table กันดีกว่าครับ

procedure drop_from
create or replace procedure run_sql(p_sql varchar2) as
begin 
  execute immediate p_sql;
end; 

create or replace PROCEDURE drop_from(p_owner varchar2, p_prefix varchar2) as
begin
    for tab in (
      select x.TABLE_NAME origin_name
      from dba_tables x 
      where x.owner = p_owner 
            and x.table_name like (p_prefix || '_%')  
    ) loop
         run_sql('drop table "' || p_owner || '"."' || tab.origin_name || '" cascade constraints PURGE');
     end loop;
     
    EXCEPTION
        WHEN OTHERS THEN DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack); 
end;

concept
  1. ทำการอ่านข้อมูล table จาก dba_tables  เลือกเฉพาะ table ซึ่งมี schema = p_owner และ prefix_name ขึ้นต้นด้วย p_prefix
  2. จากนั้นเรียก procedure run_sql เพื่อ drop purge table ที่ select มาได้ครับ  ด้วยคำสั่ง execute immediate ...

using
begin
    drop_from('NA5CENT', 'LOG');
end;

drop table ภายใต้ schema NA5CENT ซึ่งชื่อ table ขึ้นต้นด้วย LOG

ที่มาของภาพประกอบ  http://www.claffisica.org/wp-content/uploads/2014/03/Solid-Light-Wood-Table-Design-Crashed-by-the-Adze-at-the-Dining-Room-with-Its-Little-Piece-on-the-Ground-Seems-Like-a-Natural-936x618.jpg

ไม่มีความคิดเห็น:

แสดงความคิดเห็น