ฉันจะใช้สร้างหรือแทนที่ได้อย่างไร


102

ฉันเข้าใจถูกต้องหรือไม่ว่าโดยทั่วไปแล้ว CREATE OR REPLACE หมายถึง "ถ้ามีวัตถุอยู่ให้วางมันแล้วสร้างด้วยวิธีใดก็ได้"

ถ้าเป็นเช่นนั้นฉันทำอะไรผิด? ใช้งานได้:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

และสิ่งนี้ไม่ (ORA-00922: ไม่มีตัวเลือกหรือไม่ถูกต้อง):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')

ฉันทำอะไรโง่ ๆ หรือเปล่า? ดูเหมือนว่าฉันจะหาเอกสารเกี่ยวกับไวยากรณ์นี้ไม่ได้มากนัก

คำตอบ:


156

ใช้งานได้กับฟังก์ชันโพรซีเดอร์แพ็กเกจประเภทคำพ้องความหมายทริกเกอร์และมุมมอง

อัปเดต:

หลังจากอัปเดตโพสต์เป็นครั้งที่สามฉันจะปรับรูปแบบนี้ใหม่:

สิ่งนี้ใช้ไม่ได้บนโต๊ะ :)

และใช่มีเอกสารในรูปแบบนี้และไม่มีทางเลือกสำหรับREPLACECREATE TABLE


33

สิ่งที่ดีอย่างหนึ่งเกี่ยวกับไวยากรณ์คือคุณสามารถมั่นใจได้ว่า a CREATE OR REPLACEจะไม่ทำให้ข้อมูลสูญหาย (ส่วนใหญ่ที่คุณจะเสียคือรหัสซึ่งหวังว่าคุณจะถูกเก็บไว้ในการควบคุมแหล่งที่มาที่ใดที่หนึ่ง)

ไวยากรณ์ที่เท่ากันสำหรับตารางคือ ALTER ซึ่งหมายความว่าคุณต้องระบุการเปลี่ยนแปลงที่จำเป็นอย่างชัดเจน

แก้ไข: อย่างไรก็ตามหากคุณต้องการทำ DROP + CREATE ในสคริปต์และคุณไม่สนใจข้อผิดพลาด "ไม่มีวัตถุ" ปลอม (เมื่อ DROP ไม่พบตาราง) คุณสามารถทำได้ นี้:

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/

24

ไม่มีตารางสร้างหรือแทนที่ใน Oracle

คุณต้อง:

วางตาราง foo;
สร้างตาราง foo (.... );

11

CREATE OR REPLACE สามารถใช้ได้เฉพาะกับฟังก์ชันโพรซีเดอร์ประเภทมุมมองหรือแพ็กเกจเท่านั้นซึ่งจะไม่ทำงานบนตาราง


1
CREATE OR REPLACEยังใช้งานได้กับคำพ้องความหมายและทริกเกอร์
Richard Mitchell

4

สคริปต์ต่อไปนี้ควรทำเคล็ดลับบน Oracle:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;


3

ขั้นตอนที่เป็นประโยชน์สำหรับฐานข้อมูล oracle โดยไม่ต้องใช้ exeptions (ภายใต้สถานการณ์ที่คุณต้องแทนที่ user_tables ด้วย dba_tables และ / หรือ จำกัด พื้นที่ตารางในแบบสอบถาม):

create or replace procedure NG_DROP_TABLE(tableName varchar2)
is
   c int;
begin
   select count(*) into c from user_tables where table_name = upper(tableName);
   if c = 1 then
      execute immediate 'drop table '||tableName;
   end if;
end;

3
-- To Create or Replace a Table we must first silently Drop a Table that may not exist
DECLARE
  table_not_exist EXCEPTION;
  PRAGMA EXCEPTION_INIT (table_not_exist , -00942);
BEGIN
   EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS');
   EXCEPTION WHEN table_not_exist THEN NULL;
END;
/

โค้ดมากกว่าตัวอย่างอื่นเล็กน้อย แต่ก็ชัดเจนกว่าเล็กน้อยในจุดประสงค์
grokster

1

หากคุณกำลังทำในโค้ดให้ตรวจสอบตารางในฐานข้อมูลก่อนโดยใช้คิวรี SELECT table_name FROM user_tables WHERE table_name = 'XYZ'

หากพบบันทึกให้ตัดทอนตารางเป็นอย่างอื่นสร้างตาราง

ทำงานเหมือนสร้างหรือแทนที่


1

คุณสามารถใช้ CORT ( www.softcraftltd.co.uk/cort ) เครื่องมือนี้อนุญาตให้สร้างหรือแทนที่ตารางใน Oracle ดูเหมือนว่า:

create /*# or replace */ table MyTable(
  ... -- standard table definition
);

มันเก็บรักษาข้อมูล


1

ดังนั้นฉันจึงใช้สิ่งนี้และได้ผลดีมาก: - ทำงานเหมือน DROP IF EXISTS แต่ทำงานให้เสร็จ

DECLARE
       VE_TABLENOTEXISTS EXCEPTION;
PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942);


    PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS
              VS_DYNAMICDROPTABLESQL VARCHAR2(1024);
                    BEGIN
                       VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME;  
                    EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL;

                    EXCEPTION
                        WHEN VE_TABLENOTEXISTS THEN
                             DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....');
                        WHEN OTHERS THEN
                             DBMS_OUTPUT.PUT_LINE(SQLERRM);
                    RAISE;
                    END DROPTABLE;

    BEGIN
      DROPTABLE('YOUR_TABLE_HERE');
END DROPTABLE;
/   

หวังว่านี่จะช่วยอ้างอิง: PLS-00103 Error ใน PL / SQL Developer


1

"สร้างหรือแทนที่ตาราง" ไม่ได้ ตามที่คนอื่นระบุไว้คุณสามารถเขียนขั้นตอนและ / หรือใช้ start execute ทันที (... ) เนื่องจากฉันไม่เห็นคำตอบเกี่ยวกับวิธีสร้างตารางอีกครั้งฉันจึงวางสคริปต์เป็นคำตอบ

PS: ตามสิ่งที่ jeffrey-kemp กล่าวถึง: สคริปต์ด้านล่างนี้จะไม่บันทึกข้อมูลที่มีอยู่แล้วในตารางที่คุณจะวาง เนื่องจากความเสี่ยงในการสูญเสียข้อมูลที่ บริษัท ของเราจึงได้รับอนุญาตให้แก้ไขตารางที่มีอยู่ในสภาพแวดล้อมการผลิตเท่านั้นและไม่อนุญาตให้วางตาราง โดยใช้คำสั่งวางตารางไม่ช้าก็เร็วคุณจะได้รับตำรวจประจำ บริษัท ยืนอยู่ที่โต๊ะทำงานของคุณ

--Create the table 'A_TABLE_X', and drop the table in case it already is present
BEGIN
EXECUTE IMMEDIATE 
'
CREATE TABLE A_TABLE_X
(
COLUMN1 NUMBER(15,0),
COLUMN2  VARCHAR2(255 CHAR),
COLUMN3  VARCHAR2(255 CHAR)
)';

EXCEPTION
WHEN OTHERS THEN
  IF SQLCODE != -955 THEN -- ORA-00955: object name already used
     EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X';
  END IF;
END;

คุณต้องสอดคล้องกับ A_TABLE_EXAMPLE และ A_TABLE_X หรือไม่
Jonathan Leffler

0

ฉันจะทำอะไรแบบนี้

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';

-4

ถ้าเป็น MS SQL .. โค้ดต่อไปนี้จะรันเสมอไม่ว่าตารางจะมีอยู่แล้วหรือไม่

if object_id('mytablename') is not null //has the table been created already in the db
Begin
     drop table mytablename
End

Create table mytablename (...

1
ขออภัยนี่คือ Oracle :-)
Jason Baker

ความคิดเห็น "// มีข้อมูลในตาราง" ถูกต้องหรือไม่
Jeffrey Kemp

ขออภัยดีกว่าเล็กน้อย object_id ตรวจสอบว่ามีตารางอยู่ในฐานข้อมูลหรือไม่ มันควรจะบอกว่า // มีการสร้างตารางแล้วในฐานข้อมูล
JuniorFlip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.