โดยมีเป้าหมาย คือ
เพื่อ 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
- ทำการอ่านข้อมูล table จาก dba_tables เลือกเฉพาะ table ซึ่งมี schema = p_owner และ prefix_name ขึ้นต้นด้วย p_prefix
- จากนั้นเรียก 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
ไม่มีความคิดเห็น:
แสดงความคิดเห็น