Cara terbaik dan paling efisien adalah dengan menangkap pengecualian "tabel tidak ditemukan": ini menghindari overhead memeriksa apakah tabel ada dua kali; dan tidak mengalami masalah bahwa jika DROP gagal karena alasan lain (yang mungkin penting) pengecualian masih dimunculkan ke penelepon:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
ADDENDUM
Untuk referensi, berikut ini adalah blok yang setara untuk jenis objek lainnya:
Urutan
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE ' || sequence_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2289 THEN
RAISE;
END IF;
END;
Melihat
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW ' || view_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Pelatuk
BEGIN
EXECUTE IMMEDIATE 'DROP TRIGGER ' || trigger_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4080 THEN
RAISE;
END IF;
END;
Indeks
BEGIN
EXECUTE IMMEDIATE 'DROP INDEX ' || index_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -1418 THEN
RAISE;
END IF;
END;
Kolom
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ' || table_name
|| ' DROP COLUMN ' || column_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -904 AND SQLCODE != -942 THEN
RAISE;
END IF;
END;
Tautan Basis Data
BEGIN
EXECUTE IMMEDIATE 'DROP DATABASE LINK ' || dblink_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2024 THEN
RAISE;
END IF;
END;
Tampilan Terwujud
BEGIN
EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW ' || mview_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -12003 THEN
RAISE;
END IF;
END;
Tipe
BEGIN
EXECUTE IMMEDIATE 'DROP TYPE ' || type_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Paksaan
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ' || table_name
|| ' DROP CONSTRAINT ' || constraint_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2443 AND SQLCODE != -942 THEN
RAISE;
END IF;
END;
Pekerjaan Penjadwal
BEGIN
DBMS_SCHEDULER.drop_job(job_name);
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -27475 THEN
RAISE;
END IF;
END;
Skema Pengguna /
BEGIN
EXECUTE IMMEDIATE 'DROP USER ' || user_name;
/* you may or may not want to add CASCADE */
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -1918 THEN
RAISE;
END IF;
END;
Paket
BEGIN
EXECUTE IMMEDIATE 'DROP PACKAGE ' || package_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Prosedur
BEGIN
EXECUTE IMMEDIATE 'DROP PROCEDURE ' || procedure_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Fungsi
BEGIN
EXECUTE IMMEDIATE 'DROP FUNCTION ' || function_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Tablespace
BEGIN
EXECUTE IMMEDIATE 'DROP TABLESPACE' || tablespace_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -959 THEN
RAISE;
END IF;
END;
Persamaan Kata
BEGIN
EXECUTE IMMEDIATE 'DROP SYNONYM ' || synonym_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -1434 THEN
RAISE;
END IF;
END;
EXECUTE IMMEDIATE 'DROP TABLE mytable';
kalimat (satu untuk setiap tabel dalam skrip), apakah saya harus meletakkan satu handler pengecualian untuk masing-masing, atau apakah cukup untuk membungkus semua senteces dalam satuBEGIN ... EXCEPTION ... END;
blok?IF OBJECT_ID('TblName') IS NOT NULL DROP TABLE TblName
. Tampaknya verbositas dari bahasa SQL sebanding dengan harganya.Itu untuk memeriksa apakah ada tabel dalam skema saat ini. Untuk memeriksa apakah tabel yang diberikan sudah ada dalam skema yang berbeda, Anda harus menggunakan
all_tables
alih-alihuser_tables
dan menambahkan kondisinyaall_tables.owner = upper('schema_name')
sumber
Saya telah mencari yang sama tetapi saya akhirnya menulis prosedur untuk membantu saya:
Semoga ini membantu
sumber
hanya ingin memposting kode lengkap yang akan membuat tabel dan menjatuhkannya jika sudah ada menggunakan kode Jeffrey (pujian kepadanya, bukan aku!).
sumber
Dengan SQL * PLUS, Anda juga dapat menggunakan perintah WHENEVER SQLERROR:
Dengan
CONTINUE NONE
kesalahan dilaporkan, tetapi skrip akan terus berlanjut. DenganEXIT SQL.SQLCODE
script akan diakhiri jika terjadi kesalahan.lihat juga: SETIAP SAJA SQLERROR Docs
sumber
Tidak ada 'DROP TABLE IF EXISTS' di oracle, Anda harus melakukan pernyataan pilih.
coba ini (saya tidak menggunakan sintaks oracle, jadi jika variabel saya ify, tolong maafkan saya):
sumber
Saya lebih suka mengikuti solusi ekonomi
sumber
Metode lain adalah mendefinisikan pengecualian dan kemudian hanya menangkap pengecualian itu membiarkan semua orang lain menyebar.
sumber
Salah satu caranya adalah dengan menggunakan DBMS_ASSERT.SQL_OBJECT_NAME :
Demo DBFiddle
sumber
Sayangnya tidak, tidak ada yang namanya drop jika ada, atau BUAT JIKA TIDAK ADA
Anda bisa menulis skrip plsql untuk memasukkan logika di sana.
http://download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_9003.htm
Saya tidak terlalu menyukai Oracle Syntax, tetapi saya pikir skrip @ Erich akan menjadi seperti ini.
sumber
Anda selalu bisa menangkap kesalahan sendiri.
Ini dianggap praktik buruk untuk terlalu sering menggunakan ini, mirip dengan tangkapan kosong () dalam bahasa lain.
Salam
K
sumber
Saya lebih suka menentukan tabel dan pemilik skema.
Berhati-hatilah dengan sensitivitas case. (lihat klausa "atas" di bawah).
Saya melemparkan beberapa objek yang berbeda untuk menunjukkan bahwa dapat digunakan di tempat selain TABLE.
.............
Dan contoh TABEL:
sumber
// Melakukan kode ini, memeriksa apakah tabel ada dan kemudian membuat tabel maks. ini hanya bekerja dalam satu kompilasi
sumber
Dan jika Anda ingin membuatnya kembali masuk dan meminimalkan drop / membuat siklus, Anda bisa men-cache DDL menggunakan dbms_metadata.get_ddl dan membuat ulang semuanya menggunakan konstruk seperti ini:
declare v_ddl varchar2(4000); begin select dbms_metadata.get_ddl('TABLE','DEPT','SCOTT') into v_ddl from dual; [COMPARE CACHED DDL AND EXECUTE IF NO MATCH] exception when others then if sqlcode = -31603 then [GET AND EXECUTE CACHED DDL] else raise; end if; end;
Ini hanya sampel, harus ada loop di dalam dengan Jenis, nama, dan pemilik menjadi variabel.sumber
Blok seperti ini bisa berguna bagi Anda.
sumber