سؤال

هل أنا على حق في فهم أن الإنشاء أو الاستبدال يعني في الأساس "إذا كان الكائن موجودًا، فقم بإسقاطه، ثم قم بإنشائه في كلتا الحالتين؟"

إذا كان الأمر كذلك، ما الخطأ الذي أفعله؟هذا يعمل:

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 (...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top