मैं क्रिएट या रिप्लाई का उपयोग कैसे करूं?


98

क्या मैं यह समझने में सही हूं कि क्रिएट या रिप्लिक का मूल अर्थ है "यदि वस्तु मौजूद है, तो उसे छोड़ दें, फिर इसे भी बनाएं?"

यदि हां, तो मैं क्या गलत कर रहा हूं? यह काम:

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')

क्या मैं कुछ बेवकूफी कर रहा हूँ? मुझे इस सिंटैक्स के बारे में अधिक दस्तावेज नहीं मिल पाए हैं।

जवाबों:


154

यह कार्य, प्रक्रिया, पैकेज, प्रकार, समानार्थी, ट्रिगर और विचारों पर काम करता है।

अपडेट करें:

तीसरी बार पोस्ट अपडेट करने के बाद, मैं इसका सुधार करूंगा:

यह तालिकाओं पर काम नहीं करता है :)

और हाँ, इस सिंटैक्स पर प्रलेखन है , और इसके लिए कोई REPLACEविकल्प नहीं है CREATE TABLE


33

वाक्यविन्यास के बारे में एक अच्छी बात यह है कि आप यह सुनिश्चित कर सकते हैं कि 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;
/

23

ओरेकल में कोई सृजन या प्रतिस्थापित तालिका नहीं है।

तुम्हे अवश्य करना चाहिए:

ड्रॉप टेबल फू;
सृजन के लिए फू (....);

10

CREATE OR REPLACE केवल कार्यों, प्रक्रियाओं, प्रकारों, विचारों या पैकेजों पर उपयोग किया जा सकता है - यह तालिकाओं पर काम नहीं करेगा।


1
CREATE OR REPLACEपर्यायवाची और ट्रिगर्स के लिए भी काम करता है
रिचर्ड मिशेल

4

निम्नलिखित स्क्रिप्ट को ओरेकल पर चाल करना चाहिए:

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


3

निर्वासन का उपयोग किए बिना ओरेकल डेटाबेस के लिए एक उपयोगी प्रक्रिया (परिस्थितियों में आपको d__ables के साथ user_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;
/

अन्य उदाहरणों की तुलना में थोड़ा अधिक कोड लेकिन इसके उद्देश्य में थोड़ा अधिक स्पष्ट है
ग्रेटरस्टर

1

यदि आप कोड में कर रहे हैं, तो पहले डेटाबेस में तालिका के लिए जाँच करें क्वेरी का उपयोग करके तालिका का चयन करें_नाम से user_tables से तालिका table_name = 'XYZ'

यदि रिकॉर्ड मिला है, तो अलग करें तालिका अन्यथा तालिका बनाएं

क्रिएट या रिप्लेस जैसे काम।


1

आप CORT ( www.softcraftltd.co.uk/cort ) का उपयोग कर सकते हैं । यह उपकरण ओरेकल में तालिका या रिपोर्ट बनाने की अनुमति देता है। ऐसा लग रहा है:

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 PL / SQL डेवलपर में त्रुटि


1

'तालिका बनाएँ या बदलें' संभव नहीं है। जैसा कि दूसरों ने कहा है, आप एक प्रक्रिया लिख ​​सकते हैं और / या तुरंत उपयोग शुरू कर सकते हैं (...)। चूँकि मुझे टेबल बनाने के तरीके (री) के साथ एक उत्तर दिखाई नहीं देता है, मैंने एक स्क्रिप्ट को उत्तर के रूप में रखा है।

पुनश्च: क्या जेफ्री-केम्प का उल्लेख किया गया है: यह स्क्रिप्ट नीचे दी गई तालिका में पहले से मौजूद डेटा को नहीं बचाएगा। डेटा खोने के जोखिम के कारण, हमारी कंपनी में इसे केवल उत्पादन वातावरण पर मौजूदा तालिकाओं को बदलने की अनुमति है, और इसे टेबल छोड़ने की अनुमति नहीं है। ड्रॉप टेबल स्टेटमेंट का उपयोग करके, जल्द या बाद में आपको कंपनी पुलिस आपके डेस्क पर खड़ी मिलेगी।

--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 के अनुरूप होना चाहिए?
जोनाथन लेफलर

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
क्षमा करें, लेकिन यह ओरेकल है। :-)
जेसन बेकर

क्या टिप्पणी "// तालिका में डेटा है" सटीक है?
जेफरी केम्प

क्षमा करें कि तालिका में db मौजूद है या नहीं, यह देखने के लिए ऑब्जेक्ट कुछ बेहतर है। यह कहना चाहिए // तालिका को पहले से ही डीबी में बनाया गया है
जूनियरफ्लिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.