كيف يمكنني استخدام "إنشاء أو استبدال"؟
سؤال
هل أنا على حق في فهم أن الإنشاء أو الاستبدال يعني في الأساس "إذا كان الكائن موجودًا، فقم بإسقاطه، ثم قم بإنشائه في كلتا الحالتين؟"
إذا كان الأمر كذلك، ما الخطأ الذي أفعله؟هذا يعمل:
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')
هل أفعل شيئًا غبيًا؟لا يبدو أنني قادر على العثور على الكثير من الوثائق حول بناء الجملة هذا.
المحلول
يعمل هذا على الوظائف والإجراءات والحزم والأنواع والمرادفات والمشغلات وطرق العرض.
تحديث:
بعد تحديث المشاركة للمرة الثالثة، سأعيد صياغة هذا:
هذا لا يعمل على الجداول :)
ونعم، هناك توثيق على بناء الجملة هذا، وليس هناك REPLACE
خيار ل CREATE TABLE
.
نصائح أخرى
أحد الأشياء اللطيفة في بناء الجملة هو أنه يمكنك التأكد من أن أ 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;
/
لا يوجد أي إنشاء أو استبدال الجدول في أوراكل.
ويجب عليك:
DROP TABLE foo; CREATE TABLE foo (....);
وCREATE OR REPLACE
لا يمكن استخدامه إلا على وظائف، والإجراءات، وأنواع، وجهات النظر، أو حزم - انها لن تعمل على الجداول
ويجب بعد النصي تفعل خدعة في أوراكل:
BEGIN
EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
WHEN OTHERS THEN
IF sqlcode != -0942 THEN RAISE;
END IF;
END;
ولا يعمل مع الجداول، وظائف فقط وما إلى ذلك.
وهنا هو موقع مع بعض أمثلة .
-- 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;
/
وإجراء مفيدة لقواعد البيانات أوراكل دون استخدام 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;
إذا كنت تفعل في التعليمات البرمجية ثم تحقق أولا لجدول في قاعدة البيانات باستخدام الاستعلام TABLE_NAME SELECT من user_tables أين TABLE_NAME = 'XYZ'
وإذا وجدت سجل ثم باقتطاع الجدول خلاف ذلك خلق الجدول
والعمل مثل إنشاء أو استبدال.
ويمكنك استخدام CORT ( www.softcraftltd.co.uk/cort ). تسمح هذه الأداة لإنشاء أو استبدال الجدول في أوراكل. يبدو:
create /*# or replace */ table MyTable(
... -- standard table definition
);
ويحفظ البيانات.
وهكذا أنا أستعمل هذا وأنها عملت بشكل جيد للغاية: - يعمل أشبه DROP في حالة وجود ولكن يحصل على هذه المهمة
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 خطأ في PL / SQL المطور
و'إنشاء أو استبدال الجدول' غير ممكن. كما ذكر آخرون، يمكنك كتابة إجراء و / أو استخدام تبدأ تنفيذ فورا (...). لأنني لا أرى جوابا على كيفية (إعادة) إنشاء جدول، I مبيكى السيناريو كإجابة.
وPS: في خط ما ذكر جيفري كيمب-: هذا تحت السيناريو سوف NOT حفظ البيانات التي موجود في الجدول أنت ذاهب لإسقاط بالفعل. ونظرا لخطر فقدان البيانات، في شركتنا يسمح فقط لتغيير الجداول الموجودة في بيئة الإنتاج، وأنه لا يجوز لإسقاط الجداول. باستخدام عبارة قطرة الجدول، عاجلا أو آجلا سوف تحصل الشرطة الشركة واقفا على مكتبك.
--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;
وإذا كان هذا هو ل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 (...