การเพิ่มคอลัมน์ลงในตาราง Oracle OLTP

ฉันกำลังพยายามเพิ่มคอลัมน์ที่ไม่มีค่าลงในตารางที่ใช้บ่อยในฐานข้อมูล Oracle 10 OLTP ในขณะที่แอปพลิเคชันกำลังทำงานและไม่ว่าง การเพิ่มคอลัมน์ที่เป็นค่าว่างเป็นเพียงการเปลี่ยนแปลงพจนานุกรมข้อมูล ดังนั้นการล็อกตารางใดๆ จะถูกระงับไว้ในช่วงเวลาสั้นๆ เท่านั้น (ซึ่งระบบสามารถจัดการได้)

ปัญหาคือ ALTER TABLE ของฉันมักจะล้มเหลวด้วยสิ่งนี้:

ORA-00054: resource busy and acquire with NOWAIT specified

แนวทางปัจจุบันของฉันคือการปัดการเปลี่ยนแปลงโดยเรียกใช้จนกว่าจะไม่มีการล็อคบนโต๊ะ ซึ่งหมายความว่าฉันไม่สามารถเรียกใช้สคริปต์ดังกล่าวใน SQL*Plus ได้ทั้งหมด แต่จำเป็นต้องคัดลอกและวางแต่ละคำสั่งและตรวจสอบให้แน่ใจว่าใช้งานได้

มีวิธีที่ดีกว่า?


person WW.    schedule 10.02.2011    source แหล่งที่มา
comment
โปรดจำไว้ว่ามันจะทำการดีคอมไพล์สิ่งใด ๆ (มุมมอง แพ็คเกจ ทริกเกอร์ ฯลฯ) ที่ขึ้นอยู่กับตาราง ซึ่งอาจไม่ดีนักในสภาพแวดล้อมการใช้งานจริง....   -  person cagcowboy    schedule 10.02.2011
comment
+1 สำหรับความคิดเห็นของ cagcowboy ไม่ดีสำหรับโค้ดในการแก้ไขตารางในสภาพแวดล้อมจริง อาจมีออบเจ็กต์ที่ไม่ถูกต้องจำนวนมาก มันเป็นปัญหาการควบคุมการเปลี่ยนแปลงที่ต้องมีการประสานงาน   -  person tbone    schedule 10.02.2011
comment
11g ได้ปรับปรุงสถานการณ์การคอมไพล์ใหม่เล็กน้อย โดยมีการติดตามการขึ้นต่อกันในระดับที่ต่ำกว่า   -  person Gary Myers    schedule 11.02.2011
comment
ออบเจ็กต์บางอย่างใช้งานไม่ได้และคอมไพล์ใหม่โดยอัตโนมัติเมื่อใช้ครั้งถัดไป ดีกว่าปิดแอปพลิเคชั่นเพื่อหยุดชั่วคราว PL/SQL มีไม่มากนัก ดังนั้นจึงใช้เวลาไม่นาน แอปพลิเคชันจัดการ ORA-04068: สถานะของแพ็คเกจที่มีอยู่ถูกยกเลิกแล้ว   -  person WW.    schedule 11.02.2011


คำตอบ (1)


วิธีการใช้กำลังดุร้ายล่ะ? วางมันไว้ในวงวนไม่สิ้นสุดแล้วออกเมื่อเสร็จแล้ว Pseudocode (ยังไม่ได้ตรวจสอบ):

create or replace 
procedure execDDL(ddl in varchar2) is
   myexp EXCEPTION;
   pragma exception_init (myexp, -54);
begin

 loop
   begin
      execute immediate ddl;
      exit;
   exception
      when myexp then 
         null;
 end loop;
 end;
person Samuel    schedule 10.02.2011
comment
+1 แม้ว่าฉันจะเพิ่มการโทรไปที่ dbms_lock.sleep เพื่อให้บล็อกของคุณไม่ผูกขาดทรัพยากรโดยไม่จำเป็น (รอสักครู่ระหว่างความพยายามสองครั้ง) - person Vincent Malgrat; 10.02.2011
comment
ฉันเดาว่าฉันสามารถทำได้ แต่มันดูไม่หรูหรามากนัก - person WW.; 11.02.2011