Bagaimana cara menggunakan BUAT ATAU GANTI?


98

Apakah saya benar dalam memahami bahwa CREATE OR REPLACE pada dasarnya berarti "jika objek itu ada, lepaskan, lalu buat dengan cara apa pun?"

Jika ya, apa yang saya lakukan salah? Ini bekerja:

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

Dan ini tidak (ORA-00922: opsi hilang atau tidak valid):

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

Apakah saya melakukan sesuatu yang bodoh? Sepertinya saya tidak dapat menemukan banyak dokumentasi tentang sintaks ini.

Jawaban:


154

Ini berfungsi pada fungsi, prosedur, paket, tipe, sinonim, pemicu, dan tampilan.

Memperbarui:

Setelah memperbarui posting untuk ketiga kalinya, saya akan merumuskan ulang ini:

Ini tidak berfungsi pada tabel :)

Dan ya, ada dokumentasi tentang sintaks ini, dan tidak ada REPLACEopsi untuk CREATE TABLE.


33

Salah satu hal baik tentang sintaks ini adalah Anda dapat yakin bahwa a CREATE OR REPLACEtidak akan pernah menyebabkan Anda kehilangan data (yang paling akan hilang adalah kode, yang mudah-mudahan Anda akan menyimpannya di kontrol sumber di suatu tempat).

Sintaks yang setara untuk tabel adalah ALTER, yang berarti Anda harus secara eksplisit menghitung perubahan yang diperlukan.

EDIT: Omong-omong, jika Anda perlu melakukan DROP + CREATE di skrip, dan Anda tidak peduli dengan kesalahan "objek tidak ada" palsu (ketika DROP tidak menemukan tabel), Anda dapat melakukannya ini:

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

23

Tidak ada tabel buat atau ganti di Oracle.

Kamu harus:

DROP TABLE foo;
BUAT TABEL foo (....);

10

CREATE OR REPLACE hanya dapat digunakan pada fungsi, prosedur, tipe, tampilan, atau paket - tidak akan berfungsi pada tabel.


1
CREATE OR REPLACEjuga bekerja untuk sinonim dan pemicu
Richard Mitchell

4

Skrip berikut harus melakukan trik di Oracle:

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


3

Prosedur yang berguna untuk database oracle tanpa menggunakan pengecualian (dalam keadaan Anda harus mengganti user_tables dengan dba_tables dan / atau membatasi tablespace dalam kueri):

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;
/

Sedikit lebih banyak kode daripada contoh lain tetapi juga sedikit lebih jelas dalam tujuannya
grokster

1

Jika Anda melakukan dalam kode maka periksa dulu tabel di database dengan menggunakan query SELECT nama_tabel FROM user_tables WHERE table_name = 'XYZ'

jika record ditemukan maka potong tabel jika tidak buat tabel

Bekerja seperti Buat atau Ganti.


1

Anda dapat menggunakan CORT ( www.softcraftltd.co.uk/cort ). Alat ini memungkinkan untuk membuat atau mengganti tabel di Oracle. Sepertinya:

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

Ini menyimpan data.


1

Jadi saya telah menggunakan ini dan bekerja dengan sangat baik: - ini bekerja lebih seperti DROP JIKA ADA tetapi menyelesaikan pekerjaan

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;
/   

Semoga ini bisa membantu Juga referensi: Kesalahan PLS-00103 di PL / SQL Pengembang


1

'Buat atau ganti tabel' tidak dimungkinkan. Seperti yang dinyatakan orang lain, Anda dapat menulis prosedur dan / atau menggunakan mulai mengeksekusi segera (...). Karena saya tidak melihat jawaban dengan cara membuat tabel (kembali), saya meletakkan skrip sebagai jawaban.

PS: sejalan dengan apa yang disebutkan jeffrey-kemp: skrip di bawah ini TIDAK akan menyimpan data yang sudah ada di tabel yang akan Anda jatuhkan. Karena risiko kehilangan data, di perusahaan kami hanya diperbolehkan untuk mengubah tabel yang ada di lingkungan produksi, dan tidak diperbolehkan untuk menghapus tabel. Dengan menggunakan pernyataan drop table, cepat atau lambat Anda akan mendapatkan polisi perusahaan yang berdiri di meja Anda.

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

Apakah Anda harus konsisten dengan A_TABLE_EXAMPLE dan A_TABLE_X?
Jonathan Leffler

0

Saya akan melakukan sesuatu seperti ini

  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

Jika ini untuk MS SQL .. Kode berikut akan selalu berjalan tidak peduli bagaimana tabelnya sudah ada atau tidak.

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
Maaf, tapi ini Oracle. :-)
Jason Baker

apakah komentar "// apakah ada data di tabel" akurat?
Jeffrey Kemp

maaf sedikit lebih baik, periksa object_id untuk melihat apakah tabel ada di db. seharusnya dikatakan // apakah tabel sudah dibuat di db
JuniorFlip
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.